Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 함수 선언 끝에 붙는 'const' 키워드, 정확한 의미와 사용법

C++ 코드를 읽다 보면 멤버 함수 선언의 가장 끝에 const 키워드가 붙어 있는 경우를 종종 발견하게 됩니다. 과연 이 const는 어떤 의미를 가질까요?

함수 선언 끝에 const를 붙이면 해당 함수가 상수 멤버 함수(constant member function)로 지정됩니다. 상수 멤버 함수란, 호출된 객체의 멤버 변수를 수정할 수 없는 함수를 의미합니다. 즉, 함수 내부에서 객체의 상태를 변경하려는 시도 자체가 컴파일 오류로 처리됩니다. 객체를 안전하게 다루기 위해 프로그램에서 상수 멤버 함수를 사용하는 것이 권장됩니다.

상수 멤버 함수 예제

다음은 상수 멤버 함수의 동작을 보여주는 간단한 예제입니다.

#include<iostream>
using namespace std;
class MyClass {
    int value;
    public:
        MyClass(int val = 0) {
            value = val;
        }
        int getVal() const {
            //value = 10; [이 줄은 함수가 상수이므로 컴파일 시점 오류를 발생시킵니다]
            return value;
        }
};

위 예제에서 getVal() 함수는 const로 선언되었기 때문에 내부에서 value = 10;과 같이 멤버 변수를 수정하는 코드를 작성하면 컴파일 오류가 발생합니다. 반면 값을 단순히 반환하는 것은 문제없이 허용됩니다.

출력 결과는 다음과 같습니다.

The value is: 80

const 객체에서 비상수 함수 호출하기

상수 멤버 함수와 관련된 또 하나의 중요한 규칙이 있습니다. 상수 멤버 함수는 일반 객체든 const 객체든 어디서든 호출할 수 있지만, 비상수(non-const) 함수는 const 객체에서 호출할 수 없습니다.

이를 확인해 보는 예제입니다.

#include<iostream>
using namespace std;
class MyClass {
    int value;
    public:
        MyClass(int val = 0) {
            value = val;
        }
        int getVal(){
            return value;
        }
};
main() {
    const MyClass ob(80);
    cout<< "The value is: " << ob.getVal();
}

위 코드에서는 obconst로 선언된 객체인데, 비상수 함수인 getVal()을 호출하고 있습니다. 따라서 컴파일러는 다음과 같은 오류를 발생시킵니다.

[Error] passing 'const MyClass' as 'this' argument of 'int
MyClass::getVal()' discards qualifiers [-fpermissive]

정리

함수 선언 끝의 const는 "이 함수는 호출한 객체의 멤버 변수를 변경하지 않는다"는 약속입니다. 이 약속 덕분에 컴파일러는 const 객체에서도 해당 함수의 호출을 안전하게 허용합니다. 따라서 객체의 상태를 읽기만 하는 함수(getter 등)에는 항상 const를 붙여주는 습관을 들이면 코드의 안전성과 가독성이 크게 향상됩니다.