본문 바로가기
C

[C]변수 const

by Junk_Seo 2018. 1. 11.
반응형

변수 const

변수에 const 키워드를 붙여서 사용할 경우 그 변수를 읽기 전용(상수화) 시킨다는 뜻이다. 

즉 const를 붙여서 읽기 전용(상수화) 된 변수는 그 값을 변경할 수 없는데, const 키워드를 어디에 붙이느냐에 따라서

그 의미가 조금씩 달라진다.

 

const 키워드는 상수화 키기고 싶은 곳 뒤에 붙여서 그것을 읽기 전용(상수화) 시킨다.

 

기본 type const

const int nData = 10;

const 키워드를 붙여서 int형 변수 nData의 값을 읽기 전용(상수화) 시키고 있다. 

기본적인 사용 방법으로 const 키워드가 맨 앞에 위치해 있지만 원래 위치는 다음과 같다.

int const nData = 10;

이렇게 상수화 시키고 싶은 type의 뒤에 위치했지만 다른 키워드(signed, static...)와 같이 맨 앞에 붙여서 사용이 가능하도록 하고 있다.

즉 위의 두 const 선언은 동일하다.

이렇게 const를 붙여서 상수화 시킬 경우 다음과 같이 nData의 값을 변경하는 것이 불가능하다.

const int nData = 10;
nData = 20; (x) // error

 

Pointer Type const

포인터 type에 const 키워드를 붙일 경우 어디에 붙이느냐에 따라서 의미가 달라지기 때문에 사용에 신중해야 한다.

int nData = 10;
const int * pData1 = &nData;
int const * pData2 = &nData;
int * const pData3 = &nData;

이렇게 3 가지 경우의 수가 나오는데 첫 번째와 두 번째는 같은 의미 이므로 const의 위치에 따라 두 가지의 의미를 가지게 된다.

 

첫 번째의 경우

int nData1 = 10;
int nData2 = 20;
const int * pData = &nData1; // == int const * pData = &nData1;
*pData = 10 (x) // error
pData = &nData2; (o)

위의 코드를 보면 Pointer 변수 pData 가 int형 변수 nData1을 가리킨 뒤 pData 변수를 가지고 nData1의 값을 변경하는 것이 불가능 하지만 pData가 가리키는 것을 변경하는 것은 가능하다.

즉, const가 int 뒤에 붙어있기 때문에  int* 가 아닌 int를 상수화 시키고 있다는 의미이다.

 

두 번째의 경우

int nData1 = 10;
int nData2 = 20;
int * const pData = &nData1; // == int const * pData = &nData1;
*pData = 10 (o) 
pData = &nData2; (x) //error

위의 코드를 보면 const 키워드가 int * 뒤에 붙어있다. 때문에 Pointer 변수 pData가 가리키는 곳의 값을 변경할 수는 있지만 pData가 가리키는 곳을 변경할 수는 없다.

즉, const가 int * 뒤에 붙어서 int *를 상수화 시키고 있다는 의미이다.

 

사용 목적

const 키워드는 변수를 초기화하고 그 값을 변경하고 싶지 않을 때 사용하거나, 함수의 인자에 붙어서 이 인자가 in 파라미터라는 것을 의미하도록 할 때 사용한다.

 

함수의 인자에 붙을 때는 call by value에는 사용하지 않고, call by reference의 경우에 사용한다.

즉, in 파라미터로 Pointer 변수나, Reference 변수로 사용할 때 사용한다.

void func(const int* pData, int* pResult);

위의 경우처럼 in 파라미터와 out 파라미터의 형식이 모두 Pointer인 경우 명시적으로 in 파라미터라는 것을 알리기 위해 const를 붙이며

또 함수 안에서 in 파라미터의 값이 실수로 바뀌지 않도록 하는 기능을 한다.

반응형