시작은 미미하나 끝은 쥬쥬하리라.

Study/Passionate C++ Programming

[열혈 C++ 프로그래밍] (7) 상속의 이해

코딩뚜벅이 2024. 1. 24. 21:25

상속의 이해

  • 상속 서론
  • 상속 문법
  • protected선언, 상속 형태
  • 상속 조건

상속 서론

B클래스가 A클래스를 상속하게 되면 B클래스가 객체를 생성할 때, 객체 내부에 A클래스 멤버도 존재


상속의 필요 이유 : 프로그램에 기능 추가 -> 객체의 추가 작성, 변수의 추가 작성 등 보수 작업 필요
-> 연관된 일련의 클래스들에게 공통 규약을 적용시키기 위함
-> 프로그램의 확장성 저하 = 상속을 통해 문제 해결


상속의 대상 : 상위 클래스, 기초 클래스, 슈퍼 클래스, 부모 클래스


상속 클래스 : 하위 클래스, 유도 클래스, 서브 클래스, 자식 클래스
-> 유도 클래스의 생성자는 기초 클래스의 멤버를 초기화 해야하는 의무를 지님
-> 기초 클래스의 생성자를 명시적으로 호출하여 초기화를 진행(직접적인 초기화는 아님)
-> 기초 클래스에서도 유도 클래스의 private 멤버 변수 접근 불가능
-> 유도 클래스에서 기초 클래스의 생성자를 호출하면서 이니셜라이징 진행

 


 

 

상속 문법

유도 클래스 객체 생성 과정 :
1. 유도 클래스 객체의 메모리 공간 할당(기초 클래스의 멤버 변수도 포함)
2. 유도 클래스의 생성자 호출 및 기초 클래스 생성자 호출(이니셜라이징 : 몸체보다 이니셜라이징 처리 우선)
3, 기초 클래스의 생성자 호출 및 실행
4. 기초 클래스 생성자 실행 이후 유도 클래스로 돌아와서 몸체 부분 코드 실행
-> 1. 메모리 공간 할당 -> 2. 유도 클래스 생성자 호출 -> 3. 기초 클래스 생성자 호출/실행
-> 4. 유도 클래스 실행 -> 5. 객체 생성 완료
+ 유도 클래스 생성자에서 기초 클래스 생성자 호출을 명시하지 않았을 경우 : 기초 클래스 void 생성자 자동호출


유도 클래스 소멸 :
-> 별도의 소멸자 명시 필요 없음 : 소멸자는 오버로딩 할 수 없기 때문
-> 생성자는 기초에서 유도 클래스 순으로 생성, 소멸은 유도에서 기초 클래스 순으로 실행
-> 기초 클래스 멤버의 소멸은 기초 클래스에 명시

 


 

protected  선언, 상속 형태

상속 관계에서 protected 선언 시 유도 클래스에서 기초 클래스 멤버 접근 가능
-> public 선언 시, private 접근 불가, public 접근 가능


유도 클래스에서 기초 클래스 초기화 :
1. public 선언 시 -> public 상속, protected 상속, private 상속 불가
2. private 선언 시 -> public을 private으로 상속, protected를 private으로 상속, private 상속X
3. protected 선언 시 -> public을 protected로 상속, protected 상속, private 상속 불가

 

 

- 일반적인 상황에서 protected 변수는 main()에서 접근 불가(private 변수도 동일)

 

- Derived는 Base클래스를 private으로 상속
- num1은 기초 클래스의 private 멤버 변수로 유도 클래스에 접근 불가
- num2는 기초 클래스의 protected 멤버 변수로 유도 클래스에서 private 형태로 상속을 받았지만 외부 함수인 main에서 사용 불가
- num3는 기초 클래스의 public 변수로 접근 가능

 


 

상속 조건

상속 조건 : IS-A 조건, HAS-A 조건
IS-A 조건 :
ex) 무선 전화기는 일종의 전화기입니다. -> 무선 전화기(유도 클래스) is a 전화기(기초 클래스)
-> 상속이 될수록 기능이 많아짐 : 컴퓨터 -> 노트북 -> 태블릭
-> 기초 클래스에 가까워질수록(상속의 깊이가 얕아질수록) 일반화
-> 기초 클래스는 모든 유도클래스의 공통점 집합
HAS-A 조건 :
ex) 경찰은 총을 소유한다. -> 경찰(유도클래스) has a 총(기초 클래스)
-> HAS-A 조건을 통한 상속 시, 클래스간 의존도(커플링)가 높아짐 :커플링이 낮을수록 좋은 설계
-> HAS-A 조건을 통한 상속 시, 다중 상속을 사용해야하는 상황이 자주 나옴
-> 상속이 아닌 객체를 클래스의 멤버 변수로 호출하는 형태로 사용하여 표현