C++언어 공부/개념 공부

2024.01.30 C++ 언어 공부 5일 차 (상속 관련)

코딩입문시작 2024. 1. 30. 19:16

주석처리 안에 한 것처럼 하게 될 경우, 소멸자 호출이 6번 일어난다. 소멸자 3번만 호출하도록, 바로 배열 안에 객체를 만든 것이다.

 

포인터로도 짜본 예시이다.

클래스 타입의 배열은 소멸자가 객체별로 따로 호출이 되어야 하기에 delete 를 아래와 같이 사용할 수 없다.
▶delete[] students; 

소멸자 호출을 for문을 통해 일일이 해줘야 한다! 

 

상속

  • 이미 정의되어 있는 클래스의 모든 특성을 물려 받아 새로운 클래스를 작성하는 기법이다.
  • 자식 클래스의 객체가 생성될 때, 자식의 멤버 변수 및 메소드 뿐만 아니라 부모 클래스의 멤버도 포함한다.

상속 필기(1)
상속 필기(2)

상속을 설명하자면, 공통된 기능을 부모 클래스로 만든 후에, 자식 클래스는 각자 객체마다 가지고 있는 특정 기능을 각각 넣어준 것이다.

 

상속의 개념

 

예시를 들어, 사람이란 클래스와 학생이란 클래스가 있다고 가정을 해보자. 사람이란 클래스 내에는 이름, 나이, 취미 등과 같은 속성과 함께, 일어나기, 잠자기, 먹기, 공부하기 등과 같은 행동이 정의되어 있다. 그리고 학생이란 클래스 내에도 마찬가지로 이름, 나이, 취미, 소속 학교와 같은 속성과 잠자기, 먹기, 공부하기 등과 같은 행동으로 정의되어 있다. 그런데 생각해보면, 학생도 역시 사람이란 부류에 속하므로 학생은 사람에 포함된다. 사 람 클래스와 학생 클래스가 공통적으로 가지는 속성(이름, 나이, 취미..)을 보시면, 이런 생각이 들지 않나? 학생 클래스 내에서 따로 정의, 선언할 필요 없이 사람 클래스 내의 속성, 행동들을 물려받아 쓰면 어떨까? 코드의 양도 줄어들고, 프로그램의 유연성이 높아지는 등 여러가지 이점을 누릴 수 있다.


상속의 효과

  1. 기존의 클래스를 재활용한다.
  2. 공통되는 부분을 상위 클래스에 통합하여 반복을 제거하고 유지, 보수를 편리하게 한다
  3. 소프트웨어의 생산성이 향상된다. 

상속을 사용한 구조 (C++ 에서 클래스를 상속하는 것)

  • 클래스를 상속시키려면 상속받을 클래스의 이름 옆에 : 와 접근 제한자, 그리고 상속할 클래스의 이름을 붙여주면 된다. 아래 그림을 참고하자. 

C++에서 클래스를 상속한 구조

 

부모클래스 public 자식클래스 public 접근 제어자 public 일때 (1)

 

부모 클래스 public 자식 클래스 public 접근 제어자 public 일 때 (2)
이렇게 바꿔 쓸 수도 있다.

참고 자료 : [C++언어] 상속이란? 예제로 살펴보기(Inheritance) (tistory.com)

 

[C++언어] 상속이란? 예제로 살펴보기(Inheritance)

목차 [C++언어] 상속이란? 상속이란 부모 클래스(Base Class)와 자식 클래스(Derived Class) 두개의 클래스가 있을 때 자식 클래스에서 부모 클래스의 method 나 attribute를 물려 받아서 동일하게 가지는 것

scribblinganything.tistory.com

 

부모 클래스 private 자식 클래스 public 접근제어자 public (1)
부모 클래스 private 자식 클래스 public 접근 제어자 public (2)
부모 클래스 private 자식 클래스 public 접근 제어자 public(3)

 

부모 클래스 private에 선언된 name을 자식 클래스 내에서 사용하려면 반드시 부모 클래스를 상속 받는 : 를 써주어야 하고, 부모 클래스에서는 name을 사용할 수 있기 때문에, public 내에서 name을 반환하는 함수를 만들고 자식 클래스에서 사용해야 한다.

 

참고 자료 : [C++언어]Class의 Protected 수정, 출력하여 사용하는 법 (예제 포함) (tistory.com)

 

[C++언어]Class의 Protected 수정, 출력하여 사용하는 법 (예제 포함)

목차 [C++언어]Class의 Protected 수정, 출력하여 사용하는 법 앞서 포스트에서 상속(Inheritance)에 대해 알아 보았습니다. https://scribblinganything.tistory.com/435 [C++언어] 상속이란? 예제로 살펴보기(Inheritance)

scribblinganything.tistory.com

 

부모 클래스 public 자식 클래스 public 접근 제어자 private (1)
부모 클래스 public 자식 클래스 public 접근 제어자 private(2)
부모 클래스 public 자식 클래스 public 접근 제어자 private(3)

 

정리 : 부모 클래스에서 protected로 제한된 멤버는 오로지 자식 클래스 내에서만 접근할 수 있습니다. (자식 클래스 내에서만 접근이 가능하지, 메인 함수라던가 다른 외부 영역에서 접근하는건 허락하지 않습니다.)

 

참고 자료 : C++ 강좌 12편. 상속(Inheritance) (hexabrain.net)

 

C++ 강좌 12편. 상속(Inheritance)

1. 상속(Inheritance)이란? 여러분이 알고계시는 '상속(Inheritance)'은 무엇인가요? 물론, 이미 타 언어에서 상속을 미리 만나보신 분들도 있겠지만, 아닌 분들도 계실겁니다. 상속은 "일정한 친족적 관

blog.hexabrain.net

 

업캐스팅

  • 업캐스팅을 하면 여러 자식 클래스들의 부모 클래스가 동일 할 경우, 해당 부모 클래스에 여러 자식 클래스를 일괄적으로 처리가 가능하다.

※ 부모 클래스 public, 자식 클래스 public, 접근 제어자 public 일 때!!

업캐스팅 다운캐스팅은 엑세스가 가능한, public public 일때만 가능하다.

 

업캐스팅 및 다운 캐스팅은 주소로 접근하여, 클래스를 제한하거나 늘려 (함수를) 사용하는 방법이다.

 

상속 엑세스 지정 ( 접근 제어자와 관련 )

상속 엑세스 지정자 기반 클래스 (부모) 파생 클래스 (자식)
public public public
private 엑세스 불가능
protected protectected 로 접근 가능
private public private
private 엑세스 불가능
protected private
protected public protected
private 엑세스 불가능
protected protected



가상 함수 (virtual function)

  • 부모 클래스의 메소드에 virtual을 붙이게 되면 가상 함수가 되면서, 부모 포인터로 업캐스팅 했을 시, 오버라이딩(재정의) 된 함수를 사용하게 해주는 방법이다. 
  • ※ 가상 함수가 존재하는 경우, 소멸자에도 virtual 키워드를 추가해줘야 자식 클래스의 소멸자가 호출된다. 이 작업을 하지 않는다면 자식 클래스의 소멸자가 호출되지 않는다.