C++ 코드의 재활용
1. public 상속을 이용한다.
2. 다른 클래스에 속하는 객체를 클래스 멤버로 사용하기 (컨테인먼트, 컴포지션, 레이어링)
3. private 상속이나 protected 상속을 사용하기
has - a 관계
- 새로운 클래스가 다른 클래스의 객체를 포함하는 관계
- 컨테인먼트, private 상속, protected 상속은 일반적으로 has-a 관계를 나타낸다.
- has-a 관계인 컨테인먼트에서는 기초클래스로부터 상속받을 때 인터페이스 없이 구현만을 획득한다. 인터페이스를 획득하는 것은 is-a 관계(public상속)의 역할이다.
실수를 줄이는 C++ 제한
- explicit : 하나의 매개변수를 사용하는 생성자들이 암시적 변환 기능을 정지시킨다.
ex) 프로그래머가 실수로 doh[0] 대신 doh 라고 타이핑했다면 컴파일러가 대입 연산자를 에러로 잡아낼 수 있다.
- const : 데이터를 변경시키는 메서드들의 사용을 제한한다.
- 프로그램의 실행 시에 일어나는 에러보다는 컴파일 시에 일어나는 에러가 여러 모로 낫기 때문에 위와 같은 제한자를 효과적으로 사용할 줄 알아야 한다.
private 상속
- private 상속에서는 기초클래스의 public 멤버와 protected 멤버가 파생 클래스의 private 멤버가 된다.
- 즉, 기초클래스의 메서드들이 파생 객체의 public 인터페이스의 일부가 되지 않는다. 그러나 파생 클래스의 멤버 함수들 안에서 그것들을 사용할 수 있다.
- 기초클래스의 public 메서드도 파생 클래스의 private 메서드가 된다. 즉, 파생 클래스가 기초클래스의 인터페이스를 상속하지 않는다.
- private 상속은 has-a 관계이다.
private 상속과 컨테인먼트
- private 상속은 컨테인먼트와 동일한 기능(구현은 획득하지만 인터페이스는 획득하지 않는 것)을 제공한다.
- 컨테인먼트 접근 방식은 객체 이름을 사용하여 메서드를 호출하고, private 상속은 클래스 이름과 사용 범위 결정 연산자를 사용한다.
- 컨테인먼트와 private 상속 중, has-a 관계를 모델링하려면 사용이 쉬운 컨테인먼트를 이용하는 경우가 많다.
이유1. 내포된 클래스를 나타내는 객체가 명시적으로 이름이 지정되어있다.
이유2. 상속은 다중상속의 문제를 일으킬 수 있다.
protected 상속
- 기초클래스의 public 멤버와 protected 멤버가 파생 클래스의 protected 멤버가 된다.
- private 상속과 protected 상속의 주된 차이점은, private 상속은 3세대 클래스가 기초클래스 인터페이스의 내부적인 사용권을 얻지 못한다는 점이고, protected 상속은 public 기초 메서드들이 2세대 protected가 되므로 3세대에서 내부적으로 사용할 수 있다.
using으로 접근 다시 정의하기
- protected 파생이나 private 파생을 사용할 때 기초클래스의 public 멤버들을 public으로 사용할 수 있게 하고싶다면, using 선언을 사용하여 파생 클래스에서 사용할 특정 기초 클래스 멤버를 지정할 수 있다.
다중상속 (Multiple Inheritance : MI)
- 다중상속은 기초클래스를 하나 이상 가지는 클래스를 서술한다.
- public 다중상속은 is-a 관계를 나타내고, private와 protected 다중 상속은 has-a 관계를 나타낸다.
가상 기초 클래스
- 가상 기초 클래스는 하나의 공통 조상을 공유하는 여러 개의 기초 클래스로부터 공통 조상의 유일 객체를 상속하는 방식으로 객체를 파생시키는 것을 허용한다.
- class Singer : virtual public Worker { ... } ;
'📚책읽기' 카테고리의 다른 글
[C++] RTTI, dynamic_cast, typeid (0) | 2023.02.21 |
---|---|
[C++] 클래스 템플릿, 데이터형 매개변수, 접근방식, 템플릿 특수화, 부부적인 특수화 (0) | 2023.02.16 |
[C++] 가상 함수 테이블, 접근 제어(protected,private), 추상화 기초 클래스, 순수 가상 함수, 디폴트 생성자, 객체리턴/참조리턴, 기초클래스 파괴자, 프렌드 상속 (0) | 2023.02.14 |
[C++] 다형, 가상메서드, 정적결합/동적결합, 업캐스팅, 다운캐스팅 (0) | 2023.02.14 |
[C++] 큐, 스택, 단순 링크드 리스트, 클래스 상속, public 파생, public 상속 (0) | 2023.02.14 |