스토리텔링 개발자

[Effective C++] 22. 데이터 멤버 확실히 숨기기 본문

개발/Effective C++

[Effective C++] 22. 데이터 멤버 확실히 숨기기

김디트 2024. 6. 17. 11:14
728x90

항목 22 : 데이터 멤버가 선언될 곳은 private 영역임을 명심하자.

 

 

 

데이터 멤버를 숨기는 경우의 장점
  1. 문법적 일관성 (항목 18 참조)
    • 데이터 멤버가 모두 비공개라면, 즉 공개 인터페이스가 함수 뿐이라면
    • 멤버 접근을 시도할 때 괄호 사용 여부에 대한 고민이 필요 없어지므로 일관성이 생긴다.
  2. 데이터 멤버 접근성에 대해 정교한 제어가 가능
    • 읽기 / 쓰기 접근 권한을 직접 구현하여 세밀하게 제어할 수 있다.

 

 

 

 캡슐화(encopsulation)
  • 함수를 통해서만 데이터 멤버에 접근할 수 있도록 한다.
  • class SpeedDataCollection
    {
        ...
    public:
        void addValue(int speed);
        double averageSoFar() const;
        ....
    };

    • averageSoFar 함수 구현 방법
      1. 속도 데이터 전체의 평균값을 담는 데이터 멤버를 클래스 안에 마련해 둔다.
        • SpeedDataCollection 객체 하나의 크기가 조금 커지는 대신 효율이 증대한다.
        • 저장된 평균값을 반환하기만 하면 되는 인라인 함수(항목 30 참조)가 되기 때문이다.
      2. 함수가 호출될 때마다 평균값을 계산한다.
        • 함수 자체의 속도는 느려지지만, 객체 하나의 크기는 첫 번째 방법보다 작다.
    • 정답은 없으며 환경에 맞춰서 둘 중 택일하면 된다.
  • 내부 구현을 환경에 맞춰서 이리 저리 바꿀 수 있으며, 사용자 기준으로는 컴파일만 다시 하면 되는 이점이 있다.
  • 구현상의 융통성을 누릴 수 있게 된다. 예를 들면 아래와 같은 형식으로..
    • 데이터 멤버를 읽고 쓸 때 다른 객체에 알림 메시지를 보낸다.
    • 클래스 불변속성 및 사전조건(precondition), 사후조건(postcondition)을 검증한다.
    • 스레딩 환경에서 동기화를 건다.
    • 즉, C# 등의 언어가 지원하는 프로퍼티(property)와 같다고 할 수 있다.

 

 

 

캡슐화의 중요성
  • 캡슐화를 통해서 클래스의 불변속성을 확실히 보장할 수 있다.
  • 또한 캡슐화는 현재의 구현을 나중에 바꾸기로 결정할 수 있는 권한이라고 할 수 있다.
    • public 멤버 데이터로 구현하고 사용자가 사용해 버렸다면 사용자의 코드가 깨질 수 있으므로 쉽게 구현을 수정할 수 없게 된다.
    • 즉, public으로 구현했다. = 캡슐화 되지 않았다 = 바꿀 수 없다.

 

 

 

protected 데이터 멤버의 경우는 어떨까
  • 어쨌든 public 데이터 멤버보다는 더 많이 가려져 있다.. 고 생각할 수 있으나 사실상 똑같다.
  • 클래스 구현이 바뀌면(즉 클래스에서 제거되면) 깨질 수 있는 코드의 양에 반비례해서 그 데이터 멤버는 캡슐화 정도가 감소한다.(항목 23 참조)
    • public의 경우
      • 망가지는 코드가 파악이 힘들 정도로 많다.
    • protected의 경우
      • 파생 클래스에서 망가지는 코드가 파악이 힘들 정도로 많다.
    • 어차피 파악이 안 된다면, 둘 다 캡슐화 되지 않은 것과 마찬가지다.

 

 

 

  • 그러므로 캡슐화 관점에서 쓸모 있는 접근 수준은 이 둘 뿐이다.
    • private 멤버, 캡슐화 제공
    • 나머지, 캡슐화 없음
728x90
Comments