접근 제어는 OOP의 기본 원칙으로, 클래스의 내부 데이터를 캡슐화하고 보호하는 역할을 합니다.
질문 역사:
클래식 C++는 세 가지 접근 수정자를 지원합니다: public, protected, private. 이 개념은 클래스의 내부 구현을 보호하고 인터페이스와 구현을 분리하기 위해 도입되었습니다.
문제:
정확한 접근 제어가 없으면 클래스 사용자가 객체의 내부 상태를 우연히 변경하거나 클래스의 불변성을 위반할 수 있습니다. 잘못 설계된 접근은 코드 유지보수와 확장을 복잡하게 만듭니다.
해결책:
수정자를 사용하여 외부 세계가 사용할 수 있는 것과 객체의 서비스 용도로만 사용할 수 있는 것을 명확히 구분합니다.
코드 예:
class Sample { private: int secret; protected: void setSecret(int s) { secret = s; } public: Sample(int s) : secret(s) {} int getSecret() const { return secret; } };
주요 특징:
protected에만 접근할 수 있음 (하지만 private는 불가).friend 함수나 friend 클래스를 통해 다른 클래스의 private 멤버에 접근할 수 있나요?
네, friend 키워드는 클래스의 private 및 protected 멤버에 대한 전체 접근을 제공합니다. 이러한 접근은 캡슐화를 위반하지 않도록 매우 신중하게 사용해야 합니다.
예:
class PrivData { private: int secret; friend void accessSecret(const PrivData& d); }; void accessSecret(const PrivData& d) { std::cout << d.secret; }
포인터나 형 변환을 통해 이름을 알고 있는 private 멤버에 접근할 수 있나요?
네, 형 변환이나 메모리 조작을 통해 가능하나 (예: 'pointer-to-member trick'), 이는 언어 기준을 위반하고 정의되지 않은 동작을 초래할 수 있습니다. 이렇게 하면 안 됩니다.
상속 시: 부모 클래스의 private 멤버가 자식 클래스에 접근 가능해지나요?
아니요, private 멤버는 파생 클래스에 직접적으로 접근할 수 없으며, 접근은 오직 public/protected 접근 메서드를 통해서만 가능합니다.
부정적인 사례
큰 프로젝트에서 모든 클래스 멤버가 프로토타입 속도를 위해 public으로 선언되었습니다.
장점:
단점:
긍정적인 사례
모든 것이 접근 수준에 따라 엄격하게 구분되어 있고, friend 함수는 오직 단위 테스트에만 사용됩니다.
장점:
단점: