함수 뒤의 const
C++ 을 이용해 개발하다 보면 클래스의 멤버함수안에
아래와 같은 문구를 마주할 수도있다.
unsigned int get_data(int) const;
unsigned int -> return type
(int) -> 매개변수
인 것은 알겠는데, 함수 뒤에 붙는 const가 뭘까?
chat gpt에 물어보니, 아래와 같이 대답했다.
const 키워드는 이 함수가 해당 객체의 멤버 함수임을 나타냅니다.
이것은 멤버 함수가 객체의 상태를 변경하지 않음을 보장합니다.
이해가 잘 안된다.
왜냐하면 const의 의미는 주로 변수에 사용될때
const int num = 10;
와 같이 쓰여 num이라는 변수(본인) 자체를 바꿀 수 없다는 키워드로 사용되는데,
(그러니까 나는 안바뀔꺼니까 (상수니까) 외부에서 값을 바꿀수 없어!!)
함수 뒤에 붙으면 이 함수가 객체의 상태를 변경하지 않을 것이라는 키워드로 사용되어
수동/능동의 관점에서 의미가 달라지기 때문이다.
그러니까..
const int num = 10;
unsigned int get_data(int) const;
위 처럼 변수에 const를 붙이면,
const가 붙은 무언가(변수)를 바꿀 수 없다. (수동적)
아래 처럼 함수에 const를 붙이면,
const가 붙은 무언가(함수)가 객체의 상태를 변경할 수 없다. (능동적)
처럼 수동/능동의 관점에서 뜻이 두개로 나뉘어 굉장히 헷갈린다.
아무튼 그렇다고 하니, 'const가 붙은 무언가(함수)가 객체의 상태를 변경할 수 없다. (능동적)'의 의미가 무엇인지 살펴보자.
멤버함수가 객체의 상태를 변경하지 않음을 보장
class MyClass {
public:
void setValue(int val) { data = val; }
int getValue() const { return data; }
private:
int data;
};
이런 클래스가 있을때
int main() {
MyClass obj;
obj.setValue(5); // 상태 변경
std::cout << obj.getValue() << std::endl; // 출력: 5
const MyClass constObj = obj; // const 객체 생성
// constObj.setValue(10); // 이 줄은 에러를 발생시킵니다.
// 위의 주석을 해제하면 컴파일 에러가 발생합니다. const 객체는 상태 변경을 허용하지 않습니다.
std::cout << constObj.getValue() << std::endl; // 출력: 5
return 0;
}
위와 같이 동작한다.
실질적으로 멤버함수에 붙는 const 키워드의 기능은
const 객체를 생성했을때 사용할 수 있는 함수들을 정해주는 역할이다.
만약에 const가 안 붙은 멤버함수는
const 객체에서 사용할 수 없다.