변수 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 파라미터의 값이 실수로 바뀌지 않도록 하는 기능을 한다.
'C' 카테고리의 다른 글
[C/C++]임시 변수 없이 두 개의 정수 값을 교환하기 (2) | 2023.11.08 |
---|---|
[C]Type Casting (0) | 2018.01.11 |
[C]kbhit(), getch(), 방향키입력 (0) | 2018.01.09 |
[C]gotoxy() 콘솔 커서 이동 함수(SetConsoleCursorPosition) (0) | 2018.01.09 |
[C/C++][함수]반환형 (0) | 2018.01.08 |