본문 바로가기

Language/C++

[C++] OOP 상속성 - 상속(Inheritance)

728x90
반응형

상속(inheritance)

상속이란 기존에 존재하는 클래스를 이용하여 해당 클래스의 속성이나 기능 즉 멤버 변수와 함수를 물려받아 그대로 사용하거나 기능을 개선 또는 확장하여 사용하는 것을 뜻한다. 새로운 클래스 B를 만드는데 클래스 A와 기본적인 부분은 유사하나 다른 기능 몇 개가 추가되고 기존 기능보다 좀 더 확장된 기능을 가진 클래스라면 A에서 기능을 물려받아 사용할 수 있게 하는 것이다.

 

이때 기존에 존재하는 클래스를 상위 클래스(super class) 또는 부모 클래스(parent class)라고 하며 상속을 통해 작성되는 클래스를 파생 클래스(derived class) 또는 자식 클래스(child class)라고 한다.

class 자식클래스명 : 접근제어자 부모클래스명[, 접근제어자 부모클래스명 2, ...]{
    자식클래스 멤버;
};

 

접근 제어자는 부모 클래스의 멤버를 사용할 수 있는 자식 클래스의 접근 제어 권한을 설정한다. 즉, 상속 시 어떤 접근제어자를 설정하느냐에 따라 자식 클래스에서 부모 클래스 멤버에 대한 접근 여부가 결정된다. 생략할 경우 디폴트값인 private로 설정된다.

 

① private - 부모 클래스의 모든 멤버는 자식 클래스에서 private로 지정

② protected - 부모 클래스의 public으로 지정된 멤버는 protected로 지정되며 나머지는 부모클래스의 접근 권한과 동일하게 지정

③ public - 부모 클래스에서 지정한 권한은 자식 클래스의 멤버들에게도 똑같이 지정

상속 부모 클래스 멤버 자식 클래스
public public public, 접근 가능
  protected protected, 접근 가능
  private private, 접근 불가
protected public protected, 접근 가능
  protected protected, 접근 가능
  private private, 접근 불가
private public private, 접근 불가
  protected private, 접근 불가
  private private, 접근 불가

 

멤버 함수 오버라이딩

상속을 통해 자식 클래스가 부모 클래스의 멤버들을 지정한 접근제어자에 의해 물려받게 된다. 앞서 보인 것처럼 똑같은 기능을 그대로 사용해야 한다면 그냥 호출하면 되지만 기능의 확장이나 전혀 다른 동작을 해야 한다면 오버라이딩을 통해 재정의 해야한다.

 

오버라이딩은 2가지 방법을 통해 진행할 수 있다.

① 자식 클래스에서 직접 오버라이딩

② virtual(가상) 함수를 이용하여 오버라이딩

virtual 함수는 다형성 부분에서 자세하게 정리하자.

 

자식 클래스에서 오버라이딩 하는 예시이다.

부모 클래스인 Person은 멤버 변수로 name이라는 사람의 이름을 저장하는 변수와 해당 사람의 정보를 출력하는 기능을 가진 PrintInfo 함수를 가지고 있다. 이 클래스를 상속받아 Student라는 자식 클래스를 생성하고 멤버 변수인 stu_num을 만들었다. Person에서 구현한 해당 사람의 정보를 출력하는 기능을 자식 클래스에서 좀 더 확장시켜 학번까지 출력하기 위해 오바라이딩을 통해 기능을 재정의하였다.

따라서 Student 클래스를 통해 stu1이라는 객체를 생성하여 PrintInfo 함수를 호출하면 Person에서 정의한 함수와 다른 기능을 수행하게 되며 범위지정연산자(::)를 사용하여 부모클래스의 멤버 함수도 호출 가능하다.

 

다중 상속(multiple inheritance)

다중 상속은 두 개 이상의 여러 클래스가 하나의 자식 클래스가 상속받는 것을 의미한다. 쉼표(,)를 사용하여 여러 개의 클래스를 동시에 상속받으며 잘 사용되지 않는다. (Java의 경우 다중 상속을 지원하지 않는다!)

class 자식 클래스명 : 접근제어자 부모 클래스1, 접근제어자 부모클래스2, ... {
    클래스 멤버
};

AB클래스는 public으로 A, B 두 개의 클래스를 상속받았다. 따라서 자식 클래스에서 A, B의 멤버 변수 num과 dnum에 모두 접근 가능하다. 둘 다 동일한 접근 제어자로 상속받고자 하면 접근 제어자를 2번 쓸 필요는 없다.

 

다중 상속은 문제를 해결할 수 있지만 많은 문제점들을 발생시킬 수 있기 때문에 사용하지 않는 것이 좋다.

728x90
반응형