[Effective C++] #21 클래스 데이터 멤버, 접근 제어, 접근 지정자
Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 4장 "설계 및 선언", 항목 22 "데이터 멤버가 선언될 곳은 private 영역임을 명심하자"에 해당하는 내용입니다.
접근 제어 (public, protected, private)
C++의 멤버 접근 제어 관련하여, public, protected, 그리고 private 영역에 대해 먼저 알아보겠습니다. 접근 제어 개념은 C++의 세 가지 중요 요소 중 "캡슐화"와 관련이 있습니다. C++의 "캡슐화"는 객체지향적 측면에서 두 가지를 생각해 볼 수 있습니다. 하나는 객체의 상태(데이터 필드)와 행위(메서드)를 묶어두는 것이고, 다른 하나는 인터페이스와 구현의 분리입니다. 사용자에게 인터페이스는 제공하지만, 상세 구현 내용은 은닉하여 유지합니다. 이를 통해, 클래스의 재사용성과 유지보수 측면에서 이점을 갖습니다. C++의 클래스는 내부에 3가지 접근 지정자를 가질 수 있습니다. public의 경우 파생 클래스, 외부 메소드 등 모든 함수에서 접근이 가능합니다. protected의 경우, 해당 클래스의 자식 클래스(상속 클래스)에서만 접근 가능하며 private는 오직 해당 클래스의 내부에서만 접근이 가능합니다. public -> protected -> private 순서로 캡슐화의 정도를 가늠할 수 있겠죠.
private 데이터 멤버
데이터 멤버는 private 영역에 정의해야만 하는 세 가지 이유가 존재합니다 - 문법적 일관성, 세밀한 접근 제어, 캡슐화. private 멤버는 오직 해당 클래스의 public 멤버 함수가 유일한 접근 수단입니다. private 멤버에 접근하기 위해 우리는 클래스의 함수들만 사용하면 되는 편리함이 생기며, 코드 작성 시 문법적 일관성을 유지할 수 있습니다. 더불어, 클래스의 데이터 멤버 중 외부에 노출해선 안 되는 멤버들이 존재합니다. 예를 들면, 데이터 멤버의 값이 해당 클래스 객체의 고유의 속성을 표현하는 값이라면, 외부에서 이 데이터 멤버에 새로운 값을 넣을 수 있도록 허용해선 안 되겠죠. 마지막 이유는 가장 중요한 "캡슐화"입니다. "캡슐화"를 통해 얻을 수 있는 재사용성과 유지보수성은 포기할 수 없는 부분입니다.
캡슐화의 이점
구현상의 융통성 제공. "캡슐화"란, 인터페이스만 사용자에게 제공하고, 세부 구현과정은 은닉합니다. 이를 통해, 클래스의 불변 속성 및 사전 조건과 사후 조건을 항상 유지할 수 있게 됩니다. 따라서, 세부 구현 과정을 메모리 환경과 개발 환경에 맞게 수정할 수 있으며, 인터페이스만 제공받는 사용자 입장에서 따로 준비 과정이 필요 없습니다. 따라서, "캡슐화"는 구현상의 융통성을 제공합니다. "캡슐화되지 않았다"는 "바꿀 수 없다"와 같은 의미를 갖게 되죠.
protected 데이터 멤버
데이터 멤버의 변경 가능성은 "캡슐화"와 반비례합니다. protected 영역에 선언된 데이터 멤버들의 경우 파생 클래스에서 접근이 가능합니다. 따라서, protected 데이터 멤버의 변경 혹은 제거는 경우에 따라서 수많은 파생 클래스에 영향을 끼칩니다. public 보다 숨긴 정도가 높다고 해서, "캡슐화" 정도 또한 약간 향상되겠지만, 큰 차이가 없다고 볼 수 있습니다. 따라서, public 혹은 protected 영역에 쓰인 데이터 멤버들 때문에, 엄청난 양의 코드를 재작성하고, 테스트하며. 컴파일하고, 문서 또한 재 작성해야 합니다.
private와 private가 아닌 나머지(protected, public) 멤버로 구분합시다.
'언어 > Effective C++' 카테고리의 다른 글
[Effective C++] #34 사용자 정의 기본 멤버 함수 (0) | 2022.01.31 |
---|---|
[Effective C++] #23 비 멤버, 비 프렌드 함수 (0) | 2022.01.28 |
[Effective C++] #21 함수의 객체 반환, 참조자 반환 (0) | 2022.01.27 |
[Effective C++] #20 값에 의한 전달, 참조자에 의한 전달 (0) | 2022.01.24 |
[Effective C++] #19 클래스 설계 (0) | 2022.01.24 |