본문 바로가기
C++/Effective C++

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

by 멍청이 개발자 2024. 1. 21.
반응형

이번항목은 뭔가 길게 설명되어 있지만 사실 축약하면 별 내용이아니라서 간단하게만 설명하려고 한다. 우선, 제목 그대로 데이터 멤버가 선언될 곳은 private 영역이어야 한다. 우리가 데이터를 public 영역에 구현한다면 데이터가 외부에 노출될 가능성이 있다. 즉 캡슐화를 하지 못한다는 것이다. 또한 public 영역에 구현을 해놓았다면 멤버값이 어디서 사용되는지 알아내기가 정말 어렵다. 그래서 앞으로는 private영역에 우선 선언을 하자. 그리고 아래 방법을 이용하자.

class AccessLevels {
public:
    ...
    int getReadOnly() const { return readOnly; }
    
    void setReadWrite(int value) { readWrite = value; }
    int getReadWrite() const { return readWrite; }
    
    void setWriteOnly(int value) { writeOnly = value; }
private:
    int noAccess; // 아예 접근 안됨
    
    int readOnly; // 읽기만 가능함
    
    int readWrite; // 읽기 쓰기 모두 가능함
    
    int writeOnly; // 쓰기만 가능함
};

자, 이런식으로 멤버의 쓰임을 예상하여 위와 같이 구현을 한다면 나중에 디버깅을 할때에도 저 함수에 브레이크 포인트를 잡아 값이 변경되는 지점을 한 번에 잡아낼 수 있다. 여러모로 편리하니 이런 방식을 쓰도록 하자. 

 

두 번째 내용은 좀 복잡하게 뭐라 쓰여있는데 나는 여기서 좀 핵심이라고 생각되는 부분만 설명하겠다. 위에서 public 영역에 선언하지 말랬다고 이제 protected를 사용해서 쓰는 사람이 분명 있을텐데 이것도 public에 선언하는거나 별 다름이 없다. 단순히 외부에서 접근을 못하는것 뿐이지 이로부터 파생된 객체들은 별도의 함수 없이도 멤버를 참조하거나 값을 변경할 수 있게된다. 그러면 결국 public에 선언한것과 아무런 차이가 없게 된다는 것이다. 그러므로 앞으로는 멤버를 선언할때 항상 private에만 선언을 하도록 하자. 그 후 멤버를 외부에서 참조해야할 일이 있을때 그때 별도로 함수를 만들어 주도록 하자. 

반응형