[c++] 상속의 이해

조히·2023년 5월 10일
0

컨트롤 클래스 (핸들러 클래스)

기능의 처리를 실제로 담당하는 클래스

기능 제공의 핵심이 되기 때문에 모든 객체지향 프로그램에서 반드시 존재하는 클래스

상속을 사용하는 이유

데이터가 담긴 클래스와 그것을 관리하는 핸들러 클래스.
데이터가 담긴 클래스의 종류가 많아질 경우 핸들러 클래스에서 변경할 부분이 많아짐
→ 확장성이 떨어짐
하지만, 상속을 사용하면 핸들러 클래스에서 변경이 거의 없어짐

상속의 방법과 결과

class UnivStudent : public Person
{
	...
}

UnivStudent 클래스가 Person 클래스를 상속
→ UnivStudent 객체에는 UnivStudent 클래스에 선언된 멤버, Person 클래스에 선언되어 있는 멤버 존재

상속의 대상이 되는 클래스의 멤버까지도 객체 내에 존재

상속받은 클래스의 생성자 정의

  • 상속받은 클래스에서는 상속한 클래스의 초기화할 의무를 가짐
  • 상속받은 클래스의 생성자에서 상속한 클래스의 생성자를 호출하는 형태로 초기화
UnivStudent(char* myname, int myage, char *mymajor)
	: Person(myname, myage)
{
	...
}

이니셜라이저를 이용해 상속하는 클래스의 생성자 호출

상속에 대한 접근제한

접근제한의 기준은 클래스
→ 상속 받은 클래스에서 상속하는 클래스의 private 선언 멤버에 접근 불가

정보의 은닉은 하나의 객체 내에서도 진행

상속 용어의 정리

상위 클래스 ↔ 하위 클래스
기초(base) 클래스 ↔ 유도(derived) 클래스
슈퍼(super) 클래스 ↔ 서브(sub) 클래스
부모 클래스 ↔ 자식 클래스

✨ 유도 클래스의 객체 생성과정

  • 유도 클래스의 객체생성 과정에서 기초 클래스의 생성자는 100% 호출
  • 유도 클래스의 생성자에서 기초 클래스의 생성자 호출을 명시하지 않으면, 기초 클래스의 void 생성자 호출

class SoDerived : public SoBase

SoDerived dr3(23,24);

  1. 메모리 공간 할당
  2. SoDerived의 생성자 호출
  3. 상속하는 것을 확인 후, 이니셜라이저 확인 → 기초 클래스 생성자 호출
  4. 해당하는 기초 클래스 생성자 호출이 완료되면 기초 클래스 멤버변수 초기화
  5. 유도 클래스의 생성자 실행 완료되며, 유도 클래스 멤버변수 초기화

SoDerived dr1;

  1. 메모리 공간 할당
  2. SoDerived의 생성자 호출
  3. 상속하는 것을 확인 후, 이니셜라이저 명시 X
  4. 기초 클래스의 void 생성자를 대신 호출, 기초 클래스 멤버변수 초기화
  5. 유도 클래스의 나머지 부분 실행 완료

클래스의 멤버는 해당 클래스의 생성자를 통해 초기화

유도 클래스 객체의 소멸과정

  • 유도 클래스의 객체가 소멸될 때는, 유도 클래스의 소멸자가 실행되고 난 다음에 기초 클래스의 소멸자 실행
  • 스택에 생성된 객체의 소멸순서는 생성순서와 반대

생성자에서 동적 할당한 메모리 공간은 소멸자에서 해제

protected 선언

접근의 범위 : private < protected < pulic

protected로 선언된 멤버변수는 이를 상속하는 유도 클래스에서 접근 가능

기초 클래스와 유도 클래스 사이에서도 '정보은닉'은 지켜지는게 좋음

세가지 형태의 상속

class Derived : public Base // public 상속
{
	...
}
class Derived : protected Base // protected 상속
{
	...
}
class Derived : private Base // private 상속
{
	...
}

protected 상속 : protected보다 접근의 범위가 넓은 멤버는 protected로 변경시켜 상속
private 상속 : private 상속을 다시 상속할 경우, 의미 없는 상속이 됨
public 상속 : private을 제외한 나머지는 그냥 그대로 상속

상속을 위한 조건

상속을 위한 기본 조건 : IS-A 관계의 성립

  • 무선 전화기 is a 전화기
  • 노트북 컴퓨터 is a 컴퓨터

HAS-A 관계도 상속의 조건은 되지만 복합 관계로 이를 대신하는 것이 일반적

상속으로 묶인 두 개의 클래스는 강한 연관성을 띔

profile
Juhee Kim | Game Client Developer

0개의 댓글