📚책읽기

[C++] C++ 코드의 재활용, has-a 관계, explicit/const, private 상속, 컨테인먼트, protected 상속, using, 다중상속, 가상 기초 클래스

공대 컴린이 2023. 2. 16. 11:23
728x90

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 { ... } ;

728x90