형 한정어
형태를 변하지 않는 값으로 만드는 것을 형 한정이라고 전에 배운 적이 있었다.
여기서 배울 형 한정어에는 두 가지가 있는데, const(콘스트)와 volatile(발로틀)키워드다. 여기서 const는 상수화를 해주고, volatile는 결론이 (컴파일러가) 최적화를 하지 않는다고 정해주는 것이다. 이 둘은 변수선언에 쓰이게 된다.
const
형 한정어 const는 c언어는 모르지만, c++에서 중요하게 쓰인다. 변수선언 시에 앞에 const를 붙여주게 되면, Readonly(읽기전용)이 되는 것이다. 그래서 변수의 초깃값을 정해주면 그 상태로 상수처럼 된다. 사실 const가 붙은 변수는 상수와 똑같기 때문에 이름이 있는 상수라고 해서, ‘심볼릭 상수’라고도 한다.
const는 위의 경우보다 포인터에 많이 쓰인다. 변수를 선언해주고 포인터로 지정하면 변수를 부르지 않고도, 변수의 값을 포인터로 바꿀 수 있는 것은 배웠었다. 이때 포인터 앞에 const를 붙여주면, 포인터가 읽기전용이 되기에, 포인터로 치는 사고를 줄일 수 있다.(포인터에 대입해서 변수의 값이 바뀌는 것을 방지한다)
추가로 const는 선언과 정의가 같이 되는 것이 일반적이다. 선언만 해버리면, 읽기전용이기에 정의를 할 수가 없다.(대입연산자로 정의하기 전에, 자동변수라면 이미 처음의 쓰레기 값으로 변수가 상수화 된다)
volatile
코드로 삽질한 부분, 필요가 없는 부분은 컴파일러가 계산하지 않는다. 어떻게 보면 치사한데(?) 그런 것을 최적화라고 한다. 근데 이것을 막는 법이 있다. 변수 앞에 volatile가 붙으면, 이것이 들어간 코드가 삽질이라도, 다른 코드의 이유로 변경됐을지 모르겠다고 보고 읽는다. 그렇기에 최적화를 하지 않고 그대로 읽는 것이다.(다른 경우는 몰라도, 형 한정어volatile는 장치제어, 임베디드 개발자일 경우, 최적화가 생명이기에 중요히 다루게 된다)
사용자 정의 자료형
typedef가 붙으면, 그다음의 자료형이, 이름으로 정의된다. typedef unsigned int UINT;라면 unsigned int를 UINT로 대신 쓸 수 있는 것이다. 이렇게 새로운 자료형을 사용자가 만드는 것을 ‘사용자 정의 자료형‘이라 한다.
이것은 구조체, 열거형 상수와 같이 활용되는데, 긴 열거형 상수를 짧은 사용자 정의 자료형으로 만들어 줄 수 있기 때문이다.
열거형 상수
그럼 열거형 상수는 뭘까? enum ACTION {MOVE, JUMP, ATTACK};의 형식인데, 어떻게 보면 문법적으로 쓰는 주석 같은 것이다. MOVE, JUMP, ATTACK이 각각 0, 1, 2의 정수형 상수를 의미하게 되며, 이것을 enum ACTION action = MOVE;와 같이 해주면 MOVE의 값이(0이) action에 들어가게 되는 것이다.(정수형 상수에 이름을 붙인 ‘심볼릭 상수’를 여러 개 정의하는 것이다)
열거형의 변수 값은 맨 처음부터 1씩 증가하면서 자동 할당된다. (아무 것도 없으면 0부터 시작한다) 따로 따로 값을 설정해 주고 싶으면 =‘값‘ 으로 해주면 된다.