*상수란 무엇인가?
상수는 변수의 반대 개념이다. 변수(variable)가 변하는 것이라면(vary) 상수는 변하지 않는다. (constant) 항상 똑같다.
둘다 수는 수인데 하나는 변하는 수고 다른 하나는 변하지 않는다.
*C++에는 두 가지 타입의 상수가 있다.
리터럴과 심볼릭 상수다(literal and symbolic)
1. 리터럴 상수(Literal Constant)
리터럴 상수는 숫자 그 자체를 말한다. 아래에서 int 는 데이터의 타입, age는 변수이름 그리고 25가 리터럴 상수이다.
int age = 25;
당연한 말 같지만 당연한 것을 다시 들여다 봐야 제대로 알 수 있는게 컴퓨터의 세계다.
숫자는 고유값이 있어서 변하지 않는다. 25는 1이 25개 모인 것을 상징하는 숫자이다. 25가 어느날 갑자기 변수가 되서 두배인 50이 되거나 영문자 "S" 를 의미하게 바뀌지는 않는다. 변하지 않는다는 성질을 가진 수 이므로 상수라고 한다. 리터럴이라고 하는 것은 말 그대로 literally speaking 에서의 뜻이다. 다르게 해석할 여지가 없는 상수이다.
* 25 = 50 <- 리터럴 상수니까 숫자 25에 50을 대입하는 것은 불가능하다.
2. 심볼릭 상수 (Symbolic Constants)
심볼릭 상수도 변하지 않는 수인데 변수처럼 문자로된 이름을 가진 상수이다.
예를 들어 자연계에서 변하지 않는 수가 있다. 원주율을 구할 때 쓰는 파이다.
파이는 무한히 반복되는 소수지만 프로그램에서는 그렇게 사용할 수 없으니까 3.14로 사용한다고 하자.
1) const 상수
const 키워드로 상수를 만들 수 있다. 상수를 사용하기 전에 한번 초기화가 가능하다.
const int PI = 3.14;
두번 째에 값을 대입하려고 하면 오류 메시지를 낸다. 값이 여러번 변하면 상수가 아니라 변수이다.
2) #define 상수
define 상수의 경우 상수를 만들기 위해 그렇게 추천되는 방법은 아니지만 관습적으로 많이 사용하고 있다.
#define은 상수를 만드는게 아니라 문자열을 치환하는 전처리기이다. 아래와 같이 정의하면 30이된다. 단순히 문자열을 30으로 치환하는 개념으로 보면된다. 컴파일러는 어떤 변수나 상수를 보는게 아니라 그냥 30만 보게 된다.
#define MAX_STUDENT 30
define 보다 const 의 의미 전달이 더 뛰어나기 때문에 const 키워드를 많이 쓰게 될 것이다.
3) ENUM 상수
상수의 세트를 만든다. 관련된 상수들로 묶을 수 있다는 장점이 있다. 값을 할당하지 않으면 자동적으로 0부터 하나씩 카운트 해서 만든다.
enum Color { RED=100, BLUE, GREEN=500, WHITE, BLACK=700 };
int main()
{
cout << "RED : " << RED << endl;
cout << "BLUE : " << BLUE << endl;
cout << "GREEN : " << GREEN << endl;
cout << "WHITE : " << WHITE << endl;
cout << "BLACK : " << BLACK << endl;
return 0;
}
* 심볼릭 상수를 중요하게 봐야하는데 그 이유는 심볼릭 상수를 쓰는게 의미상으로 이해하기 쉽고 만약 상수값의 변경이 필요할 때 빨리 변경 가능하기 때문이다.
예를 들어 학생수의 최대치를 정해놓은 값이 있다고 하자. MAX_STUDENT = 99 라고 해놨다. 그런데 학생수를 늘려야 하는 경우가 생기면 리터럴 상수는 모든 99 를 변경해야 한다. 99가 꼭 학생수를 의미하지 않는다면 여러 군데 같은 상수가 들어가 있어서 수정도 쉽지가 않다. 심볼릭 상수를 사용하면 맨위에 하나만 고치면 해결이 된다.
그리고 99라고 써있으면 의미를 알 수 없지만 MAX_STUDENT 라 써 있으면 빨리 이해할 수 있다. 심볼릭 상수를 잘 사용하는 것은 필수 기술이다.
여기까지 C++의 상수에 대하여 설명한다.