프로그래밍C++ 주니어 개발자

C++에서 const 클래스 메서드란 무엇입니까? 그 사용은 프로그램의 안전성과 구문에 어떤 영향을 미칩니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

문제 역사:

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 메서드는 객체의 상태를 변경할 수 없습니다 (mutable 필드는 제외)
  • const 메서드는 const 객체 및 const 참조에 대해 호출할 수 있습니다
  • const 메서드는 비상수 객체에서도 호출될 수 있습니다

함정 질문.

메서드에서 const는 반환 값 앞에 쓰나요, 아니면 괄호 뒤에 쓰나요?

오직 괄호 뒤에만: int getValue() const; — 반환 값 타입 앞에 쓰는 것은 잘못입니다 (예: const int get();).

const 메서드가 비const 클래스 메서드를 호출할 수 있나요?

아니요, const 메서드는 const 객체일 경우에만 다른 const 메서드를 호출할 수 있습니다.

메서드의 const와 반환 값의 const는 어떻게 다른가요?

int get() const (메서드는 상태를 변경하지 않음) const int get(); (반환 값은 변경할 수 없지만, 메서드는 내부 데이터를 변경할 수 있음)

일반적인 오류 및 안티 패턴

  • const로 표시해야 하는 메서드(겟터 및 검증)를 const로 표시하지 않음
  • const 메서드를 통해 const 상태에서 객체의 상태를 변경하려고 시도함 (캐스트 또는 mutable 사용)
  • 반환 값 타입 앞에 const를 두어 const 메서드라고 잘못 생각함

실생활 사례

부정적인 경우

메서드가 상태를 변경하지 않는데 const가 누락되어 있습니다. 이를 const 객체에 대해 호출할 수 없어 분석 도구 및 API 사용에 방해가 됩니다.

장점:

  • const를 어디에 두어야 할지 고민할 필요가 없어 코드 작성이 더 빠르다

단점:

  • const 참조로 객체를 사용할 수 없게 됨
  • 의도하지 않은 곳에서 객체가 변경될 수 있음

긍정적인 경우

모든 겟터, 검증 및 보조 메서드가 const로 선언되어 있으며, const 및 비const 객체에 대해 테스트가 수행되었습니다.

장점:

  • 사용의 안전성
  • const 컨테이너, 알고리즘 및 API와의 호환성

단점:

  • const 정확성을 유지하기 위한 규율이 필요함
  • 때때로 테스트 및 목 객체 작성을 어렵게 만듭니다 (mutable을 통해 가변 멤버가 필요한 경우)