const는 값의 변경을 막는 키워드입니다.
const int N = 10;
N = 9; // error
N++; //error
N += 1; // error
위의 예시들과 같이 const로 선언된 변수에 변형을 가하면 error가 납니다.
const는 변수가 아닌 함수에도 적용할 수 있습니다.
게다가 함수 앞에, 뒤에, 파라미터에도 적용할 수 있습니다. 하나씩 차근차근 보도록 하겠습니다.
1. 함수 앞에 const가 붙은 경우
const int add(int a, int b) {
return a + b;
}
return값이 상수 취급이 됩니다. 사실 위의 add 함수의 경우, return값이 상수가 되는 것이 의미가 없습니다.
int N을 선언한 뒤, N에 const로 선언된 함수의 반환값을 넣으나 그냥 int로 선언된 함수의 반환값을 넣으나 문제가 없기 때문입니다.
그렇다면 과연 언제 의미가 있는가? 라고 하면 레퍼런스 타입의 함수인 경우 유의미하게 됩니다.
일반 레퍼런스로 선언된 변수에 상수 레퍼런스의 함수 반환값을 넣는 것은 불가하기 때문입니다.
// 레퍼런스가 아닌 경우의 실험을 위한 준비물
int tempInt = 1;
const int tempConstInt = 1;
// 레퍼런스인 경우의 실험을 위한 준비물
int& tempRefInt = tempInt;
const int& tempConstRefInt = tempInt;
// 레퍼런스가 아닌 경우라면 상수를 받든 변수를 받든 항상 OK
int N1 = tempInt; // OK
const int N2 = tempInt; // OK
int N3 = tempConstInt; // OK
const int N4 = tempConstInt; // OK
// 레퍼런스인 경우, 일반 레퍼런스에 const한 값을 넣으면 안됨.
int& ref1 = tempRefInt; // OK
const int& ref2 = tempRefInt; // OK
int& ref3 = tempConstRefInt; // ==== NO ====
const int& ref4 = tempConstRefInt; // OK
ref3과 같은 경우처럼 일반 레퍼런스에 상수 레퍼런스를 넣는 것이 불가하므로, 값이 변경되면 안 되는 레퍼런스를 반환해야 할 때 const 키워드를 함수 앞에 붙이게 됩니다.
레퍼런스에 대한 설명이 더 필요하다면 https://easycoding91.tistory.com/entry/C-%EA%B0%95%EC%A2%8C-%EC%B0%B8%EC%A1%B0%EC%9E%90Reference%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%ED%95%A8%EC%88%98-%ED%99%9C%EC%9A%A9 를 참고하는 것을 추천합니다.
2. 함수 뒤에 const가 붙은 경우
class myTest {
public:
int a, b;
myTest(int a, int b) {
this->a = a;
this->b = b;
}
// 함수 뒤에 const키워드를 쓰는 것은 멤버 함수(메소드)만 가능
int sum(int x) const {
return a + b + x;
}
};
멤버 함수(메소드) 내에서 멤버 변수를 바꾸지 못하게 하는 키워드 입니다. 변수의 변경 및 변경하게 하는 함수도 사용이 불가합니다.
단, mutable로 선언된 멤버 변수라면 변경이 가능합니다.
class myTest {
public:
int a, b;
mutable int c;
myTest(int a, int b) {
this->a = a;
this->b = b;
}
void swapAB() {
int temp = a;
a = b;
b = temp;
}
void leaveAB() const {
}
int sum(int& x) const {
int n = 0;
n++; // 멤버 변수가 아니므로 OK
x++; // 멤버 변수가 아니므로 OK
c++; // mutable로 선언된 멤버 변수는 OK
a++; // ==== 멤버 변수이므로 NO ====
b++; // ==== 멤버 변수이므로 NO ====
swap(a, b); // ==== 멤버 변수의 값을 바꾸는 외부 함수도 사용 불가 ====
swapAB(); // ==== 멤버 변수의 값을 바꾸는 멤버 함수도 사용 불가 ====
leaveAB(); // 값의 변동이 없다고 명시(const)한 함수라면 사용 가능
return a + b + x;
}
};
코드와 주석을 읽어보시면 어렵지 않게 이해할 수 있을 겁니다.
3. 파라미터에 const가 붙은 경우
int add (const int a, const int b) {
return a + b;
}
설명이 없어도 직관적으로 이해할 수 있을 겁니다. 파라미터의 값을 변하지 않게 해줍니다.
int add (const int a, const int& b) {
int N = a;
N++; // OK
a++ // ==== NO ====
return a + b;
}
'프로그래밍 언어 정리 > C, C++' 카테고리의 다른 글
[C/C++] 포인터와 상수 (2) | 2023.04.23 |
---|---|
[C/C++] bad_array_new_length (0) | 2023.03.27 |
[C/C++] call by value, call by address(pointer), call by reference (0) | 2023.02.28 |
[C++] NULL과 nullptr (0) | 2023.02.19 |