-
[C++] 상속(1) - 개념C++ 2022. 12. 31. 01:52
개념은 java랑 똑같다.
개념은 스킵하고
코드랑 중요내용만 적는다
일단 기본 원칙어케 보면 가장 중요한 원칙
아래의 모든걸 관통하는 원칙
클래스 멤버는 해당 클래스의 생성자를 통해서 초기화해야한다즉, class A의 멤버변수는 A 생성자로
class B의 멤버변수는 B 생성자로 해야함
상속되어있어도 마찬가지 이 법칙은 불변임 ㅇㅇ
상속에서 가장 중요한 것은 "부모클래스의 초기화"임
1. 자식클래스의 생성자는 부모클래스의 멤버까지 초기화해야할 의무가 있을까?
ㅇㅇ 무조건
2.그럼 자식클래스는 부모클래스의 멤버를 어떻게 초기화하는 것이 좋을까?자식클래스의 생성자에서 부모클래스의 생성자까지 호출하여 초기화해주어야한다
자식 클래스의 생성자는 부모클래스의 멤버를 초기화할 의무를 지닌다
그래서 자식 클래스의 생성자는 부모클래스의 생성자를 호출하는 형태로 부모클래스의 멤버를 초기화한다
자식 클래스에서 이니셜라이져로 상속하는 클래스의 생성자 호출을 명시할 수 있다
[중요1]
class Footballplayer : public Human
여기서 FootballPlayer 클래스가 Human 클래스를 상속받았다고 해서FootballPlayer 클래스가 Human 클래스의 private 멤버변수까지 "직접" 접근하고 참조할 수 있을까?
ㄴㄴ 정답은 불가능이다.
private 키워드의 접근제한 기준은 "클래스"이다.
그러므로 player의 private 멤버는 아무리 player 클래스를 상속받은 footballplayer 클래스라도
클래스 자체가 다르므로 접근 불가능하다!!
그러므로 footballplayer 클래스에서 해당 private 멤버에 접근하려면public으로 선언된 getter setter 함수를 통해 간접적으로 접근해야한다
[중요2]
// FootballPlayer가 Player를 상속하고 있고 class FootballPlayer : public Player // FootballPlayer 생성자로 Player생성자를 명시적으로 호출하지 않아도 FootballPlayer MasonMount(){ } // 위 생성자가 실행될때 Player 클래스의 void형 생성자, // 즉 Player() 생성자가 자동으로 호출되게 설계되어있다!위 설명을 잘 읽자
아래 두 개는 그냥 C++이 설계된 방식이다.
왜 이렇게 만들었는지 이해가 되는거 같기도 하고 아닌거 같기도 하고...
이럴땐 그냥 외워두자.
뭐 납득이 가는 룰? 원칙? 설계방식? 이긴 하다.
1. 자식클래스 객체 생성과정에서 부모클래스의 생성자는 100% 호출된다( 명시하지 않아도 호출된다)
2. 자식클래스의 생성자에서 부모클래스의 생성자 호출을 명시하지 않으면, 부모클래스의 void 생성자가 호출된다
[중요 3]
마지막으로 중요한 이론적인 설명을 할 것이다.
OPP의 5가지 원칙 중 하나인
개방-폐쇄 원칙(Open-Closed Principle)을 여기서부터 신경써야한다.
상속을 도입하는 시점부터 신경 ㄱㄱ
개방-폐쇄 원칙, 일명 OCP는
객체의 확장에 대해서는 개방적이고 수정에 대해서는 폐쇄적이어야 한다 는 원칙이다.
즉, 객체 기능의 확장을 허용하고 스스로의 변경은 피해야 한다.
이 말이 무슨 말인가 하면
최대한 부모클래스의 변경은 피하고
자식클래스에서의 구현을 통해 새로운 기능을 도입하는게 좋다는 것이다!
이럴려면 뭘 잘해놔야할까?
맞다. 부모클래스를 잘 설계해야한다.
이게 사실 추상클래스, 추상메서드에 가면 훨씬 더 잘 와닿는 개념이긴하지만
추상클래스를 선언하는거 자체가 상속의 범주안에 속하는 짓이기 때문에 여기서부터 강조하겠다.
어렵게 생각할 필요없이, OCP 원칙은 추상화를 의미하는 것으로 보면 된다.

부모클래스인 Animal 클래스에 Abstract Method로 eat sleep 함수를 정의. 따라서 자식클래스들은 위 추상메서드를 구현만 하면 된다. 자식클래스 내 함수를 구현만 해주면 잘 돌아간다! Animal 클래스를 손 대지 않아도 가능한 것이다! 즉, OCP는 다형성과 확장을 가능케 하는 객체지향의 장점을 극대화하는 설계 원칙으로써,
객체를 추상화함으로써 확장엔 열려있고 변경엔 닫혀있는 유연한 구조를 만들어 사용하게끔 유도하는 것이다.
그래서 클래스를 추가해야한다면 기존 코드를 크게 수정할 필요없이,
적절하게 상속 관계에 맞춰 추가만 한다면 유연하게 확장을 할 수 있다.
OCP를 수행하기 위해, 부모클래스를 정의할때 다음과 같은 순서로 따져가며 정의하면 좋다.
- 먼저 변경(확장)될 것과 변하지 않을 것을 엄격히 구분한다.
- 이 두 모듈이 만나는 지점 (교집합) 에 추상화(추상클래스) 를 정의한다.
- 구현체에 의존하기보다 정의한 추상화에 의존하도록 코드를 작성 한다.
'C++' 카테고리의 다른 글
[C++] 다형성(polymorphism) (0) 2023.01.04 [C++] 상속(2) - 간단한 예시 (1) 2022.12.31 [C++] 복사생성자의 호출시기 (1) 2022.12.30 [C++] 복사생성자(copy constructor) (0) 2022.12.27 [C++] 생성자(constructor) (1) 2022.12.26