const 키워드는 결국 변수의 값이 변경되지 않음을 명시함. 즉, 상수화시킴.


하지만 const 키워드는 정말 다양한 위치에서 사용되기에 혼동이 옴.

크게 변수 선언에 사용되는 위치와 함수 선언에 사용되는 위치 2개로 나뉨.


변수 선언 시

<const> 자료형 <const> 포인터 <const> 변수명;

   (1번)               (2번)               (3번)

함수 선언 시

<const> 자료형 <const> 포인터 함수명(parameter1, parameter2 ...) <const> { }

   (4번)               (5번)                                                             (6번)

변화를 뜻하는 변수에 const 키워드를 붙이는 이유는 그 값이 더이상 바뀌지 않기에 바뀌면 안된다는 것을 명시하는 것.

(어떻게보면 방어적 프로그래밍, 또는 설계의 한 부분이다.)


(1번) 변수 선언시 자료형 앞에 올 때





위 사진들을 유심히 살펴보자. 컴파일러가 컴파일 이전에 오류를 내는 부분이 어디인지 알려준다.

그리고 오류 문구는 Error: expression must be a modifiable lvalue 라는 구문이다.


즉, 상수라서 변경할 수 없다는 뜻이다. 위 구문을 잘 관찰해보면 위 구문이 의미하는 바는 이렇다.


const int a로 선언했다면 a = value의 표현식을 오류로 나타낸다.

const int* b로 선언했다면 *b = value의 표현식을 오류로 나타낸다. (즉, b = address의 표현식은 문제없다.)

const int** c로 선언했다면 **c = value의 표현식을 오류로 나타낸다. (즉, *c = address의 표현식은 문제없다.)


결론적으로 맨 앞에 const의 의미는 변수명이나 포인터에 따른 상수화가 아니다!!


바로 오직 타입(int)에 대한 상수화이다. 


조금 말이 헷갈린데, const int** c로 선언했지만 c의 주소를 바꾸거나, *c 즉 b의 주소를 바꾸는 것은 문제가 안된다.

오직 **c로 접근할 때에만 const 형식에 부딪힌다. 그렇기에 맨 앞의 const의 의미는 포인터나 변수명에 상관없이

int 타입에 대한 상수화가 진행된 것이다. 그래서 위의 예시들도 모두 int값을 변경하려 할 때, 오류를 내보낸다.


결론) 

const int a 든

const int* a 든

const int** a 든


const로 묶인 부분은 int형 뿐이다. 그래서 결국은 이런 표현이 된다.


(const int) a

(const int)* a

(const int)** a



참조: http://tapito.tistory.com/31


+ Recent posts