C++에서 const
연산자 이해하기
C++을 사용할 때, 클래스의 메서드 선언에 const
키워드가 추가된 것을 만나게 될 수 있습니다. 이는 실제로 무엇을 의미하는지 확신이 없을 경우 혼란스러울 수 있습니다. 이 포스트에서는 C++ 메서드에서 const
연산자의 역할을 명확히 하고, 그 중요성과 기능성을 보여주기 위해 예제를 사용할 것입니다.
메서드 선언에서 const
는 무엇을 의미하나요?
C++ 클래스에서 const
키워드로 메서드를 선언하면, 다음과 같이 나타납니다:
class A {
public:
void Foo() const;
};
이는 해당 메서드가 객체의 상태를 수정할 수 없음을 나타냅니다. 즉, 이 함수는 컴파일러에게 클래스의 멤버 변수를 변경하지 않겠다고 약속하며, 이는 객체 처리 시 더 큰 안전성과 명확성을 제공합니다.
const
함수의 규칙
- 계약 의무:
const
로 함수를 선언함으로써, 이 함수가 멤버 변수의 값을 변경하지 않을 것이며, 비-const 멤버 함수를 호출하지 않을 것임을 명시합니다. - const 객체와의 호환성:
const
로 선언된 객체에서const
함수를 호출할 수 있습니다. 예를 들어:
const A *A1 = new A();
A1->Foo(); // OK
이 코드는 Foo()
가 객체 A1
의 상태를 변경하지 않기 때문에 문제없이 작동합니다.
비-const 함수의 필요성
다음 예제를 고려해 보세요:
class A {
public:
void Foo() const; // Const 함수
void Moo(); // 비-const 함수
private:
int m_nState; // 상태를 나타내는 int
int GetState() const { return m_nState; }
void SetState(int val) { m_nState = val; }
};
const A *A1 = new A();
A *A2 = new A();
A1->Foo(); // OK
A1->Moo(); // 오류 - const 객체 인스턴스에서 비-const 함수를 호출할 수 없음
예제에서의 사용
A1
에서Foo()
를 호출하는 것은 허용됩니다. 왜냐하면 이는const
메서드이기 때문입니다.- 비-const 메서드인
Moo()
를 호출하려고 하면 오류가 발생합니다. 이 메서드는 객체의 상태를 수정하기 때문입니다.
mutable
의 역할
때때로, 주변 객체가 논리적으로 const
로 간주될 때 특정 멤버 변수를 변경 가능하게 하고 싶을 수 있습니다. 이런 경우, mutable
키워드로 변수를 선언할 수 있습니다. 예를 들면:
class A {
private:
mutable int m_nState; // const 함수 안에서 수정 가능
};
이렇게 하면 m_nState
멤버를 수정할 수 있으면서도 메서드를 const
로 선언할 수 있습니다. 본질적으로 이는 컴파일러에게 이 변수의 변경을 무시하라고 지시하여 내부 상태 변화를 관리하면서도 일관된 인터페이스를 유지할 수 있게 합니다.
주요 요점 요약
const
메서드는 멤버 변수를 수정하지 않겠다고 약속합니다.const
객체에서const
메서드를 호출할 수 있습니다.const
객체에서 비-const 메서드를 호출할 수 없습니다.const
함수에서 수정이 필요할 멤버는mutable
을 사용하세요.
결론
C++에서 const
연산자를 이해하는 것은 안전하고 효과적인 코드를 작성하는 데 필수적입니다. 특히 수정되어서는 안 되는 객체를 관리할 때 더욱 그렇습니다. 이러한 규칙을 준수함으로써, 더 유지 보수 가능하고 예측 가능한 코드를 C++ 애플리케이션에서 생성할 수 있습니다. const
키워드는 우연한 변경을 방지하는 데 도움이 될 뿐만 아니라, 나중에 코드를 읽는 사람에게 의도를 명확히 문서화할 수 있습니다.