일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- effective stl
- Effective c++
- 참조자
- reference
- 언리얼
- 스마트 포인터
- c++
- 반복자
- 예외
- 메타테이블
- 영화
- 영화 리뷰
- 암시적 변환
- 비교 함수 객체
- virtual function
- 루아
- 오블완
- UE4
- Vector
- lua
- exception
- implicit conversion
- Smart Pointer
- 게임
- 다형성
- operator new
- 상속
- more effective c++
- 티스토리챌린지
- resource management class
Archives
- Today
- Total
스토리텔링 개발자
[Effective C++] 22. 데이터 멤버 확실히 숨기기 본문
728x90
항목 22 : 데이터 멤버가 선언될 곳은 private 영역임을 명심하자.
데이터 멤버를 숨기는 경우의 장점
- 문법적 일관성 (항목 18 참조)
- 데이터 멤버가 모두 비공개라면, 즉 공개 인터페이스가 함수 뿐이라면
- 멤버 접근을 시도할 때 괄호 사용 여부에 대한 고민이 필요 없어지므로 일관성이 생긴다.
- 데이터 멤버 접근성에 대해 정교한 제어가 가능
- 읽기 / 쓰기 접근 권한을 직접 구현하여 세밀하게 제어할 수 있다.
캡슐화(encopsulation)
- 함수를 통해서만 데이터 멤버에 접근할 수 있도록 한다.
-
class SpeedDataCollection { ... public: void addValue(int speed); double averageSoFar() const; .... };
- averageSoFar 함수 구현 방법
- 속도 데이터 전체의 평균값을 담는 데이터 멤버를 클래스 안에 마련해 둔다.
- SpeedDataCollection 객체 하나의 크기가 조금 커지는 대신 효율이 증대한다.
- 저장된 평균값을 반환하기만 하면 되는 인라인 함수(항목 30 참조)가 되기 때문이다.
- 함수가 호출될 때마다 평균값을 계산한다.
- 함수 자체의 속도는 느려지지만, 객체 하나의 크기는 첫 번째 방법보다 작다.
- 속도 데이터 전체의 평균값을 담는 데이터 멤버를 클래스 안에 마련해 둔다.
- 정답은 없으며 환경에 맞춰서 둘 중 택일하면 된다.
- averageSoFar 함수 구현 방법
- 내부 구현을 환경에 맞춰서 이리 저리 바꿀 수 있으며, 사용자 기준으로는 컴파일만 다시 하면 되는 이점이 있다.
- 구현상의 융통성을 누릴 수 있게 된다. 예를 들면 아래와 같은 형식으로..
- 데이터 멤버를 읽고 쓸 때 다른 객체에 알림 메시지를 보낸다.
- 클래스 불변속성 및 사전조건(precondition), 사후조건(postcondition)을 검증한다.
- 스레딩 환경에서 동기화를 건다.
- 즉, C# 등의 언어가 지원하는 프로퍼티(property)와 같다고 할 수 있다.
캡슐화의 중요성
- 캡슐화를 통해서 클래스의 불변속성을 확실히 보장할 수 있다.
- 또한 캡슐화는 현재의 구현을 나중에 바꾸기로 결정할 수 있는 권한이라고 할 수 있다.
- public 멤버 데이터로 구현하고 사용자가 사용해 버렸다면 사용자의 코드가 깨질 수 있으므로 쉽게 구현을 수정할 수 없게 된다.
- 즉, public으로 구현했다. = 캡슐화 되지 않았다 = 바꿀 수 없다.
protected 데이터 멤버의 경우는 어떨까
- 어쨌든 public 데이터 멤버보다는 더 많이 가려져 있다.. 고 생각할 수 있으나 사실상 똑같다.
- 클래스 구현이 바뀌면(즉 클래스에서 제거되면) 깨질 수 있는 코드의 양에 반비례해서 그 데이터 멤버는 캡슐화 정도가 감소한다.(항목 23 참조)
- public의 경우
- 망가지는 코드가 파악이 힘들 정도로 많다.
- protected의 경우
- 파생 클래스에서 망가지는 코드가 파악이 힘들 정도로 많다.
- 어차피 파악이 안 된다면, 둘 다 캡슐화 되지 않은 것과 마찬가지다.
- public의 경우
- 그러므로 캡슐화 관점에서 쓸모 있는 접근 수준은 이 둘 뿐이다.
- private 멤버, 캡슐화 제공
- 나머지, 캡슐화 없음
728x90
'개발 > Effective C++' 카테고리의 다른 글
[Effective C++] 24. 비멤버 함수 구현으로 암시적 변환 지원 (0) | 2024.06.18 |
---|---|
[Effective C++] 23. 비멤버 비프렌드 함수 (0) | 2024.06.18 |
[Effective C++] 21. 참조자를 리턴하면 안되는 상황 (1) | 2024.06.14 |
[Effective C++] 20. const & 전달하기 (0) | 2024.06.13 |
[Effective C++] 19. 클래스 설계 (0) | 2024.06.12 |
Comments