공부/이모저모

C++ 클래스 안의 멤버함수 const 키워드

JUNFUTURE 2024. 2. 13. 11:11

함수 뒤의 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 객체에서 사용할 수 없다.