저의 velog에 작성된 글은 모두 저의 주관적인 생각 및 이해를 바탕으로 작성된 글이므로
정확하지 않은 내용을 있을 수 있음을 알립니다.
[교재] 윤성우 열혈 C++ 프로그래밍
const, 처음 접한다면 이걸 왜 쓰는지 의문이 드는 keyword다.. 오늘은 const 키워드를 왜 사용하고 어떻게 사용하는 것인지에 대해 간단히 작성해보려고 한다
const는 constant의 약어로 '상수'라는 의미를 갖는다. 상수란 𝛑 = 3.141592...라고 말하는 것처럼 "변하지 않는 값"을 의미한다.
먼저, Q1 질문에 답해보자
Q1. 다음 코드는 정상적으로 실행이 되는가?
int num = 5;
num = 3;
정답은 '그렇다'이다.
그렇다면 또 Q2 질문에 답해보자
Q. 다음 코드는 정상적으로 실행이 되는가?
const int num = 5;
num = 3;
정답은 '그렇지 않다'이다. 그 이유는 위에서 언급한 const 때문이다.
이야기했듯 const는 "변하지 않는 값"을 의미한다. Q1에서의 예시는 num 변수가 일반적인 int 변수로 선언되어 초기화와 값 할당이 자유롭지만, Q2에서처럼 변수가 const 변수로 선언된 경우 초기화 이후 값을 변경할 수 없다.(컴파일 에러가 난다)
const의 개념에 대해 알았으니 const를 사용하는 방법에 대해 알아보자!
const도 어쨌든 변수이기 때문에 "그냥 일반 변수처럼 선언하고 초기화하면 되는거 아니야?"라고 질문할 수 있다. 하지만 일반 변수와 다르게 const를 사용할 때는 조금 유의해야할 사항이 있다.
const 변수는 선언과 동시에 초기화 해야한다!
그 이유는 조금 생각해보면 금방 알아차릴 수 있을텐데, const 변수는 선언 이후에 값을 변경할 수 없기 때문이다.
const int a;
a = 10;
바로 위의 상황 처럼말이다..! const 변수 a가 선언되면 이제 더이상 a에는 값을 할당할 수 없는데 'a = 10'을 하게 되면 컴파일 에러가 발생한다. 그럼 위의 경우에 a에는 어떤 값이 들어가게 될까..? 바로 garbage value (쓰레기 값)..
그러므로 반드시 아래와 같이 선언과 동시에 초기화 해야한다!
const int a = 10;
필자도 이걸 처음봤을 때, 이게 뭔가..했다
const는 사용하는 위치에 따라 의미가 조금씩 달라진다. 의미가 달라진다는 의미는 const(상수화)되는 주체가 달라진다는 의미이다.
Q3. 1, 2번 중 컴파일 에러가 발생하는 부분은?
int a = 5;
int b = 3;
const int* num = &a;
*num = 6; // 1번
num = &b; // 2번
정답은 1번이다. 이유는 뒤에 설명하기로 하고 다음 예제를 살펴보자
Q4. 1, 2번 중 컴파일 에러가 발생하는 부분은?
int a = 5;
int b = 3;
int* const num = &a;
*num = 6; // 1번
num = &b; // 2번
이번 정답은 2번이다. 두 예제를 비교해보며 왜 그런지 살펴보자
Q3에서..
const int* num = &a;
Q4에서..
int* const num = &a;
위의 코드를 한글로 해석해보자! 여기서 상수화되는 주체가 누구인지에 집중하자
Q3에서..
"a의 주소를 가르키는 int* num"을 상수화
Q4에서..
"a의 주소를 담고있는 num"을 상수화한 int* 형 변수
즉, Q3에서는 *num을 상수화한 것이고, Q4에서는 num을 상수화하고 int* 자료형으로 만든 것이다!
따라서 Q3에서는 *num을 상수화 하였으므로 *num에 새로운 값을 할당하지는 못하지만, num에는 새로운 값을 할당할 수 있다.(num은 상수화되지 않았기 때문)
하지만 Q4에서는 num을 상수화 하였으므로 num에 새로운 값을 할당하지는 못하지만, *num에는 새로운 값을 할당할 수 있는 것이다!
오늘 const의 개념과 사용, 더불어 다소 헷갈릴 수 있는 const의 위치에 따른 의미를 해석해보았다. 글을 읽으며 궁금증이 해소되었기를 바란다.