문제 역사:
C++에서 const 한정자는 안전성 측면에서 도입되었습니다: 객체의 내부 상태를 변경하지 않을 함수들을 표시하기 위함입니다. 클래스의 경우, const 메서드는 엄격한 캡슐화와 우발적인 오류 방지가 필요한 프로젝트에서 필수적입니다.
문제:
만약 getter, 보조 함수 및 검증 메서드를 const로 표시하는 것을 잊으면 const 객체에 대해 호출할 수 없습니다. const 메서드가 없다면 컴파일러는 원치 않는 데이터 변경을 방지할 수 없습니다.
해결책:
메서드 선언 시 서명 뒤에 const를 추가합니다 (전에는 추가하지 않습니다!). 이것은 메서드를 일반 객체 및 const로 선언된 객체 모두에 대해 호출할 수 있게 하여 상태 변경 오류를 피하게 해줍니다. 이러한 메서드 내에서는 클래스 멤버를 변경할 수 없으며(mutable 제외) 읽기 전용으로만 사용할 수 있습니다.
코드 예시:
class Counter { int value; public: int getValue() const { return value; } // const Counter에 대해 호출할 수 있음 }; void print(const Counter& c) { std::cout << c.getValue(); }
주요 특징:
메서드에서 const는 반환 값 앞에 쓰나요, 아니면 괄호 뒤에 쓰나요?
오직 괄호 뒤에만: int getValue() const; — 반환 값 타입 앞에 쓰는 것은 잘못입니다 (예: const int get();).
const 메서드가 비const 클래스 메서드를 호출할 수 있나요?
아니요, const 메서드는 const 객체일 경우에만 다른 const 메서드를 호출할 수 있습니다.
메서드의 const와 반환 값의 const는 어떻게 다른가요?
int get() const (메서드는 상태를 변경하지 않음)
const int get(); (반환 값은 변경할 수 없지만, 메서드는 내부 데이터를 변경할 수 있음)
메서드가 상태를 변경하지 않는데 const가 누락되어 있습니다. 이를 const 객체에 대해 호출할 수 없어 분석 도구 및 API 사용에 방해가 됩니다.
장점:
단점:
모든 겟터, 검증 및 보조 메서드가 const로 선언되어 있으며, const 및 비const 객체에 대해 테스트가 수행되었습니다.
장점:
단점: