프로그래밍C++ 개발자

C++에서 캡슐화 메커니즘은 어떻게 작동하며 private/protected/public 한정자가 필요한 이유는 무엇인가요?

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

답변.

캡슐화는 객체 지향 설계의 원칙으로, 객체의 내부 구조를 숨기고 필요한 공용 인터페이스만 제공하는 것을 의미합니다.

문제의 역사: 객체 지향 프로그래밍의 처음부터 주요 과제 중 하나는 객체의 내부 상태를 외부에서 잘못 변경하는 것으로부터 보호하고 논리를 엄격하게 제어하는 것이었습니다.

문제: 캡슐화가 없으면 모든 데이터와 메서드가 외부 코드에 접근 가능해져 객체의 상태 제어를 잃고 찾기 힘든 오류가 발생할 수 있습니다.

해결책: C++에서는 세 가지 접근 제한자 private, protected, public를 사용합니다. private는 클래스 외부에서 멤버에 접근하는 것을 금지하고, protected는 상속받은 클래스에만 접근을 허용하며, public은 멤버를 인터페이스의 일부로 만듭니다.

코드 예:

class Stack { private: int *data; int top; public: Stack(); void push(int val); int pop(); };

주요 특징:

  • 클래스 멤버에 대한 접근 제어
  • 인터페이스와 구현의 명확한 분리
  • 사용자가 영향을 받지 않고 내부 구조를 변경할 수 있도록 허용

함정 질문.

private 멤버는 클래스 외부에서 어떤 식으로든 변경할 수 없다?

거짓입니다. friend 함수, friend 클래스 또는 비안전한 방법(예: 포인터 캐스팅 또는 정의되지 않은 동작을 통한 접근)을 사용할 수 있습니다.

상속 시 한정자가 적용되는 순서는 어떻게 되나요 (private, protected, public)?

상속이 private로 선언되면, 기본 클래스의 모든 public 및 protected 멤버는 파생 클래스의 private 멤버가 됩니다.

protected 상속과 private 상속의 차이는 무엇인가요?

protected 상속에서는 기본 클래스의 모든 public 및 protected 멤버가 파생 클래스의 protected 멤버가 되고, private 상속에서는 모두 private 멤버가 됩니다.

일반적인 오류 및 안티 패턴

  • 모든 구조를 열어두기 (모두 public)
  • 포인터를 저장하고 외부에서 접근할 수 있도록 하기 (캡슐화 위반)
  • 인터페이스와 구현을 함께 숨기기 (너무 강력한 제한)

사례 연구

부정적 사례

모든 클래스 멤버가 public으로 선언되어 있어 외부 코드가 구조를 변경하고 객체의 불변성을 위반할 수 있습니다.

장점:

  • 빠른 프로토타입 작성

단점:

  • 보장된 정확성이 없음; 대규모 프로젝트에서 많은 오류 발생

긍정적 사례

필요한 public 메서드만 사용하고 나머지 데이터는 숨겨져 (private) 있어 상태가 보호됩니다.

장점:

  • 코드 유지보수 용이
  • 버그 최소화

단점:

  • 내부 목적에 대해 불필요할 수 있는 래퍼 (getter/setter)를 작성해야 할 수도 있습니다.