2010년 01월 23일
const에 대하여 깊이있게 알아보자.
C 언어에서 한정자의 종류는 총 세가지가 있다.
const, volatile, restrict.
이 중에서 자주 쓰이는 const에 대하여 깊이 있게 설명하고자 한다.
흔히 알고 있기론 const는 값이 변경되는것을 막아주는 한정자로 알고 있으며,
프로그래머의 실수를 막아주는 중요한 키워드이다.
다음의 예를 보자.
int val = 2000;
const int *pVal1 = &val;
1. *pVal1 = 44;
2. pVal1 = &val;
위의 구문 중 에러가 나는 부분은 어느 것일까?
정답은 제 1 문장이다. 이 문장은 값의 변경을 한정하는 const가 붙어 있기 때문이다.
어떻게 하면 쉽게 알 수 있을까?
바로 pointer to 라는 문장을 기점으로 영어 문장을 만들어서 해석하면 된다.
const int *pVal1; 를 한번 영어로 해석해 보자.
분명 pointer to가 기점이라고 말한 바 있다.
*를 pointer to라고 표현하고 to 뒤에는 문장에서 처음부터 *까지의 키워드들을 써주면 된다.
즉 pointer to const int 가 될 것이다.
그 다음으로 pointer to 앞에는 무엇이 붙을까?
바로 *와 변수명까지 붙은 키워드들을 붙이면 된다.
이 문장에서는 *와 변수명사이에 아무런 키워드가 없으므로 변수명만 붙인다.
완성된 문장을 보자.
변수명 pVal1 pointer to const int 가 된다.
해석 : pVal1 변수는 const int 값을 가리킨다.
즉 pointer to 앞의 주어는 메모리 주소값이 되는 것이고, 뒤에 있는 목적어는 실제 값을 나타내는 키워드들이 되는 것이다.
const int 가 무엇인가? 그렇다. 값의 변경을 막는것이다. 하지만 pointer to 앞에는 아무것도 없으므로
주소 변경에는 아무런 상관이 없다.
고로 const int *pVal1; 은 변수값은 변경 불가능하되, 메모리 주소값은 변경 가능하다는 뜻이다.
두번째 문장을 보겠다.
int *const pVal2 = &val;
1. *pVal2 = 44;
2. pVal2 = &val;
과연 에러가 나는 구문은 무엇일까?
일단 위에서 설명한 대로 영어로 한번 바꿔 보겟다.
포인터가 있으므로
pointer to 를 먼저 써보겠다.
그리고 to 뒤에는 변수 값에 대한 키워드들이 오게되는데
선언문에서 처음부터 *까지를 적어주면 된다.
pointer to int 가 될 것이다.
다음으로,
pointer to 앞에는 메모리 주소에 대한 키워드들이 오게 되는데
선언문에서 *부터 마지막까지를 적어주면 된다.
const pVal2 pointer to int 이렇게 문장이 완성이 되었다.
한번 해석을 해보자.
메모리 주소를 나타내는 const pVal2는 const 한정자가 있으므로 메모리 주소 변경이 불가능하겠다.
그러므로 2번 구문은 틀렸다!!
하지만 pointer to int 에서 단순히 int밖에 없다는 것을 볼 수 있는데 여기엔 const 키워드가 없으므로
값 변경이 가능하다는 것을 알 수 있다.
그러므로 1번 구문은 맞다!!!
연습삼아 다음 두 예제를 해석해 보자.
int const* pVal3 = &val;
1. *pVal3 = 44;
2. pVal3 = &val;
const int *const pVal4 = &val;
3. *pVal4 = 44;
4. pVal4 = &val;
풀이를 해보겠다.
int const* pVal3 에 대해서는
pVal3 pointer to int const 가 된다.
즉, 메모리 주소는 변경가능하고 값은 변경이 불가능하다.
const int *const pVal3에 대해서는
const pVal3 pointer to const int 가 된다.
즉, 메모리 주소, 값 모두 변경이 불가능하다.
양쪽 다 const가 붙어 있지 않은가??
참고로
const int와 int const는 동일한 의미를 갖습니다.
const int * ptr;
int const * ptr;
그러나 const 선언을 자료형의 이름 앞에 두는 것이 일반적입니다.
이상으로 const 한정자 키워드에 대하여 간단히 설명하였다.
궁금한 점이 있다면 댓글로 ~ ^^
by firingcode
const, volatile, restrict.
이 중에서 자주 쓰이는 const에 대하여 깊이 있게 설명하고자 한다.
흔히 알고 있기론 const는 값이 변경되는것을 막아주는 한정자로 알고 있으며,
프로그래머의 실수를 막아주는 중요한 키워드이다.
다음의 예를 보자.
int val = 2000;
const int *pVal1 = &val;
1. *pVal1 = 44;
2. pVal1 = &val;
위의 구문 중 에러가 나는 부분은 어느 것일까?
정답은 제 1 문장이다. 이 문장은 값의 변경을 한정하는 const가 붙어 있기 때문이다.
어떻게 하면 쉽게 알 수 있을까?
바로 pointer to 라는 문장을 기점으로 영어 문장을 만들어서 해석하면 된다.
const int *pVal1; 를 한번 영어로 해석해 보자.
분명 pointer to가 기점이라고 말한 바 있다.
*를 pointer to라고 표현하고 to 뒤에는 문장에서 처음부터 *까지의 키워드들을 써주면 된다.
즉 pointer to const int 가 될 것이다.
그 다음으로 pointer to 앞에는 무엇이 붙을까?
바로 *와 변수명까지 붙은 키워드들을 붙이면 된다.
이 문장에서는 *와 변수명사이에 아무런 키워드가 없으므로 변수명만 붙인다.
완성된 문장을 보자.
변수명 pVal1 pointer to const int 가 된다.
해석 : pVal1 변수는 const int 값을 가리킨다.
즉 pointer to 앞의 주어는 메모리 주소값이 되는 것이고, 뒤에 있는 목적어는 실제 값을 나타내는 키워드들이 되는 것이다.
const int 가 무엇인가? 그렇다. 값의 변경을 막는것이다. 하지만 pointer to 앞에는 아무것도 없으므로
주소 변경에는 아무런 상관이 없다.
고로 const int *pVal1; 은 변수값은 변경 불가능하되, 메모리 주소값은 변경 가능하다는 뜻이다.
두번째 문장을 보겠다.
int *const pVal2 = &val;
1. *pVal2 = 44;
2. pVal2 = &val;
과연 에러가 나는 구문은 무엇일까?
일단 위에서 설명한 대로 영어로 한번 바꿔 보겟다.
포인터가 있으므로
pointer to 를 먼저 써보겠다.
그리고 to 뒤에는 변수 값에 대한 키워드들이 오게되는데
선언문에서 처음부터 *까지를 적어주면 된다.
pointer to int 가 될 것이다.
다음으로,
pointer to 앞에는 메모리 주소에 대한 키워드들이 오게 되는데
선언문에서 *부터 마지막까지를 적어주면 된다.
const pVal2 pointer to int 이렇게 문장이 완성이 되었다.
한번 해석을 해보자.
메모리 주소를 나타내는 const pVal2는 const 한정자가 있으므로 메모리 주소 변경이 불가능하겠다.
그러므로 2번 구문은 틀렸다!!
하지만 pointer to int 에서 단순히 int밖에 없다는 것을 볼 수 있는데 여기엔 const 키워드가 없으므로
값 변경이 가능하다는 것을 알 수 있다.
그러므로 1번 구문은 맞다!!!
연습삼아 다음 두 예제를 해석해 보자.
int const* pVal3 = &val;
1. *pVal3 = 44;
2. pVal3 = &val;
const int *const pVal4 = &val;
3. *pVal4 = 44;
4. pVal4 = &val;
풀이를 해보겠다.
int const* pVal3 에 대해서는
pVal3 pointer to int const 가 된다.
즉, 메모리 주소는 변경가능하고 값은 변경이 불가능하다.
const int *const pVal3에 대해서는
const pVal3 pointer to const int 가 된다.
즉, 메모리 주소, 값 모두 변경이 불가능하다.
양쪽 다 const가 붙어 있지 않은가??
참고로
const int와 int const는 동일한 의미를 갖습니다.
const int * ptr;
int const * ptr;
그러나 const 선언을 자료형의 이름 앞에 두는 것이 일반적입니다.
이상으로 const 한정자 키워드에 대하여 간단히 설명하였다.
궁금한 점이 있다면 댓글로 ~ ^^
by firingcode
# by | 2010/01/23 22:54 | c/c++ | 트랙백 | 덧글(0)



