시간이 흘러서 다시 이 글을 보니 const에 대해 아주 딱딱하게 잘 적어놨다. 프로그래밍 서적에서 개념을 찾아볼 때마다 '설명을 왜 이렇게밖에 못하지?'라고 생각했는데, 내가 딱 그꼴이다. 내가 공부한 개념 하나에도 많은 역사와 설명이 내포되어 있는데 그 내용들을 다 적기 귀찮고, 또 그걸 알고 있는 상태에서 서적을 보게 되면 '아!책에서 설명을 잘해놨네.'라고 생각이 든다. 사실 책에 있는 내용이 정답이긴 하다. 개발을 시작할 땐 그 정답을 '나에게는 와닿지 않는 개념'인 상태로 시작할뿐.
아무튼 const에 대해 다시 설명하자면, 시간을 거슬러서 define 키워드에 대해서 먼저 설명해야 한다.
프로그래밍에 define이라는 키워드가 있다.
const 란 기본적으로 변수를 상수화 시키는 제한자이다. 기본적으로 개발을 하면서 변경하지 않아야 하는 값에 대해 상수화 시키기 위해 사용된다. 예를들어, const int MONTH = 12; 로 지정하면, #define MONTH 12; 로 지정한 것과 같은 효과이다.
따라서 const로 지정한 변수에 대해서는 선언할 때 초기화하며, 이후에 값을 변경할 수가 없다.
const int MONTH;
MONTH = 12;
따라서 이러한 문법은 좋지않다. const 상수를 선언할 때 초기화 하지 않으면 변경할 수 없는 값으로 미확정 되기 때문이다.
const를 사용하는 경우를 크게 두 가지로 나누자면,
변수를 const로 선언하는 경우와, 멤버 함수를 const로 선언하는 경우가 될 것이다.
< 변수에 const를 붙이는 경우 >
1-1. (포인터가 아닌) 변수에 const를 붙이는 경우
const int MONTH = 12
1-2. 포인터 변수에 const를 사용하는 경우
이 경우에는 const를 붙이는 위치에 따라서 변경할 수 없는 값이 달라진다. 데이터형 앞에 const 가 붙는 경우에는 포인터 변수에 들어가는 값을 변경할 수가 없고, 데이터형 뒤에 const가 붙는 경우에는, 포인터 변수의 주소 값을 변경할 수가 없다.
const int* _MAX = &Total;
- 데이터형 앞에 const 가 붙는 경우 : 포인터 변수에 들어가는 값을 변경할 수가 없다.
_MAX = &Minimum; // 가능
*_MAX = 10; // 에러
int* const _MAX = &Total;
- 데이터형 뒤에 const가 붙는 경우 : 포인터 변수의 주소 값을 변경할 수가 없다.
_MAX = &Minimum; // 에러
*_MAX = 10; // 가능
< 함수에 const를 붙이는 경우 >
2-1. 매개변수를 const로 선언하는 경우
void CTest::Show(const char *s) {...}
void CTest::Show(const char *s) {...}
- Show 메서드 안에서 매개변수 s를 변경하지 않는 경우에 이렇게 사용한다.
2-2. 멤버 함수를 const로 선언하는 경우
void CTest::Show(char *s) const {...}
- Show 메서드에서 멤버 변수의 값을 변경하지 않는 경우에 이렇게 사용한다. 이 함수 내부에서 멤버 변수의 값을 읽기만 하고 멤버 변수의 상태는 바꾸지 않는다는 의미로 사용합니다.
- 멤버 함수가 선언된 클래스의 멤버 변수가 아닌, Show 함수 내부에서 선언된 지역 변수는 변경해도 상관없다.
2-3. 리턴에 const를 붙이는 경우
const int CTest::Show(char *s) {...}
- 함수의 리턴 값이 포인터 값일 때, 함수를 호출한 쪽에서 포인터를 통해 리턴 값을 수정하여 사용하는 경우가 있다. 이 때 리턴 값을 수정할 수 없도록 함수의 리턴형에 CONST를 붙여서 사용할 수 있다.
- 예를 들면, 아래와 같은 CTest 클래스가 있다고 하자.
▶ 그럼 #define과의 차이는 무엇인지?
const로 변수를 선언하면 read-only data memory에 값이 올라가고, 디버깅 심볼이 생성된다. 따라서 디버깅 시에 값을 확인하기 위해서는 const가 더 편할 것이다. define으로 선언하면 pre-compile 시에 선언된 값이 치환된다. 그렇기 때문에 const로 선언하면 추가적으로 메모리를 차지하지는 않는다.
-> 추가적으로, #define과 같은 의미로 사용된 const는 컴파일러가 친절하게 삭제해주기 때문에 메모리에 따로 올라가지 않는다. 또한 const는 데이터형을 지정할 수 있기 때문에 #define 보다 좀 더 안전하다고 할 수 있다.
▶ 그리고 const와 #define 중에 어떤게 더 좋을까?
결론적으로는 const가 더 좋다.
-
데이터형을 명시적으로 지정할 수 있다는 점
-
C++의 활동 범위 규칙(scoping rules)에 의해 그 정의를 특정 함수나 파일에서만 사용할 수 있도록 제한할 수 있다.
-
배열이나 구조체와 같이 보다 복잡한 데이터형에도 const를 사용할 수 있다는 점
-
#define으로 선언하면, 데이터형을 명시할 수 없지만 const로 선언하면 데이터형을 명시할 수 있다. 여기까진 차이점. 데이터형을 명시할 수 있다고해서 뭐가 더 좋을지는 아직 모르겠다.
-
const로 선언하면, 해당 변수는 read-only variable 로 지정된다.
댓글