이번 장의 핵심 질문은 이것이다.
" 왜 Data 멤버는 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; // no access to this int
int readOnly; // read-only access to this int
int readWrite; // read-write access to this int
int writeOnly; // write-only access to this int
};
데이터 변수는 private
그리고 이것에 접근하거나 수정하는 함수를 통해서 readOnly, writeOnly 같은 기능으로도 구현이 가능하다.
또한 Boundary Check, 특정 접근 제한 등의 세부 제어도 가능해진다.
캡슐화를 통해서 자연스럽게 가능해지는 것이다.
C++ 에서 데이터 변수가 public 이라는 것은 캡슐화가 되지 않았다는 것을 의미한다.
그리고 이것은 '더 이상 바꿀 수 없다.' 라는 의미가 된다.
public 으로 오픈된 데이터에 대해서 어떤 사용자가 얼마나 많은 코드에서 직접 접근을 했는지 모두 파악해야 하기 때문이다.
프로젝트가 커질 수록 문제는 심각해지는데,
해당 프로젝트에서 해당 데이터에 접근하는 코드를 작성한 모든 부분을 수정 해야 하고,
테스트도 전부 다시 진행해야 하며, 문서도 다시 작성하고, 컴파일도 다시 해야 한다.
public이 protected 가 되어도 사실 크게 바뀌지 않는다.
두 경우 모두 해당 데이터 멤버에 대해, 나중에 수정해야 하는 상황에서 파악조차 힘들 만큼 엄청 많은 코드를 모두 수정해야 하는 것이다.
그렇기 때문에 반드시 클래스의 데이터 멤버는 private 가 되도록 해야한다.
항목 23) 멤버 함수보다는 비멤버 비프렌드 함수를 사용하자. (0) | 2022.08.27 |
---|---|
항목 21) 함수에서 객체를 반환해야 할 경우에 참조자를 반환하지 말자 (0) | 2022.08.27 |
항목 20) 값 전달 보다는 상수객체 참조자 전달 방식을 고려하자. (0) | 2022.08.27 |
항목 19) 클래스 설계는 타입 설계와 똑같이 취급하자 (0) | 2021.12.05 |
항목 18) 좋은 인터페이스 설계: 제대로 쓰기에는 쉽게, 엉터리로 쓰기에는 어렵게 (0) | 2021.12.05 |
댓글 영역