Volatile 키워드

휘발성, 그 뜻 그대로 언제든지 그 값이 변할 수 있음을 의미합니다.

const 키워드와 함께 변수의 성질을 바꾸는 역할을 하는 타입 한정자입니다. 하지만, 그 사용빈도가 낮아 책이나 자료들에서도 잘 다루어지지 않는 키워드입니다.

- 타입 한정자 (const도 마찬가지) : 타입에 특정 속성을 더해주는 키워드

volatile 키워드가 지정된 변수는 최적화를 수행하지 않습니다.


변수의 최적화

변수의 최적화는 말 그대로 최적화를 시켜주는 컴파일러의 기능인데 프로그래머는 사람이기 때문에 실수를 하기 마련입니다.

- 물론 모든 잘못을 컴파일러가 보완 할 수는 없습니다.

예를 들면,

int a;

a = 0;

a = 1;

a = 3;

이런 식의 코드가 있다고 한다면, a에는 최종적으로 3의 값이 들어가게 되며 이전의 작업인 0과 1은 의미가 없게 됩니다. 따라서 재정의를 하는 경우에는 컴파일러가 알아서 위의 두 작업을 삭제합니다.

- 이를 통해 수행시간의 이득을 가져올 수 있습니다.


하지만,

만약 메모리를 참조하여 하드웨어에 명령을 내리는 코드라고 가정하고 a를 메모리 쓰기 변수라고 한다면

a = 0;

a = 1;

a = 3;

이라는 명령어 자체가 하나의 지시 기능을 가지게 될 것입니다.

따라서, a = 0;, a = 1; 의 두 작업이 최적화를 통해 없어진다면 0, 1에 해당하는 작업을 실행하지 못하게 될 것입니다.



이런 상황을 방지하고자 volatile 키워드가 존재하게 됩니다.

volatile int a = 0;

a = 0;

a = 1;

a = 3;

이렇게 선언하게 된다면, a = 0;, a = 1;, a = 3; 의 변수 대입 작업을 전부 실행하게 됩니다.

- 유사하게 하드웨어 메모리에서 변하는 값을 가져와 실행하는 변수들에도 volatile 키워드는 필수입니다.


즉, 외부 요인에 의해 변수 값이 변경될 가능성이 있는 변수에는 volatile을 써주셔야 합니다.

- Memory-mapped I/O

- 인터럽트 서비스 루틴

- 멀티 쓰레드 환경

등등..


사용빈도는 낮지만 상황에 따라서는 꼭 필요한 키워드입니다.

Posted by 긍정왕오킹