출처 : https://www.techprevue.com/

 

드디어! 클래스의 마지막 포스팅입니다!

오늘은 상속에 대해서 보다 깊게 다룰 예정입니다!

아래에서 내용을 확인하시죠!!

 

목차


    0. 상속

    우리가 각종 입출력 라이브러리를 사용할 때 라이브러리끼리 상속 관계에 있는 경우가 있습니다.

    iostream의 아래에 fstream이나 stringstream이 있는 것처럼 말이죠.

    이렇게 더 상위 개념의 클래스가 존재하는 경우는 클래스끼리 상속된 경우입니다.

    상위 클래스의 요소들을 하위 클래스에서는 굳이 구현해주지 않아도 되고, 대신 추가적인 기능들만 더 넣어줄 수 있죠.

    공통적인 기능들을 중복해서 구현할 필요가 없어지기 때문에 굉장히 편해집니다!

    출처 : https://www.cplusplus.com/img/iostream.gif

     

    우리가 만드는 함수 역시 상속이 가능합니다.

    만약 B 클래스가 있고, B 클래스의 요소를 모두 가진 자식 클래스인 D 클래스를 만들어주고 싶다면

     

    class D: public B{ }

     

    형식으로 만들 수 있습니다.

    이렇게 상속을 해주면, D에서는 B의 요소들에 접근할 수 있게 됩니다.

    다만 생성자, 소멸자, 비멤버함수, 할당연산자, 가상함수(virtual function)는 상속되지 않습니다.

     

    B 앞에 붙은 public은 상속 형식으로, 상속 형식에 따라 B와 D 요소들의 관계가 결정됩니다.

    B의 private요소들은 어떤 경우에도 접근할 수 없고, public요소들은 접근할 수 있습니다.

    protected는 현재 객체에서는 private취급이지만, 상속은 해줄 수 있다는 차이가 있습니다.

    다만 상속받은 클래스에서 protected 요소들은 다시 재상속할 수는 없습니다.

     

    아래는 class B와 class D를 이용한 상속의 상세한 예시입니다.

     

    또한 하나의 클래스를 여러 클래스에게 상속할 수도 있고, 하나의 클래스가 여러 클래스를 상속받을 수도 있습니다.

     

    Base의 요소인 num1과 Derived의 요소인 num2를 이용해서 실제로 간단한 상속을 구현했습니다.

     


    1. 가상함수

    가상함수기본 클래스 내에서 선언되어 파생 클래스에 의해 재정의되는 내장 함수입니다.

    기본 클래스는 Base, 파생 클래스는 Derived라고 생각하시면 되겠죠?!

     

    가상함수는 기본 클래스 내의 함수 앞에 virtual을 붙여서 만들어줄 수 있습니다.

    상속받는 클래스에서 재정의할 경우 함수의 매개변수부분과 명령문 사이에 override를 붙여주면 됩니다.

    만약 더 이상 재정의하지 않는 경우 final을 붙여주면 됩니다. (추가적인 재정의를 막습니다)

     

    가상 함수 선언의 규칙은 아래와 같습니다.

    • 가상함수의 선언은 반드시 public:에 위치해야 합니다.
    • static일 수 없고, friend일 수도 없습니다.
    • 리턴형과 매개변수는 상속이 되더라도 변할 수 없습니다.
    • 가상 생성자는 만들 수 없습니다.

     

    위 예시코드를 실제로 구현하여 돌린 결과입니다.

    br과 dr의 주소값을 b와 d로 할당하면 각각의 클래스의 함수를 사용하고

    포인터 변수들도 b와 d의 주소값으로 할당해도 마찬가지입니다.

    다만 Base의 f함수를 사용하겠다고 한다면 모두 base를 출력합니다.

     

    만약 다른 .cpp, .h파일에서 상속을 하는 경우 선언부에서 virtual과 override를 붙여줍니다.

     


    2. 추상 클래스

    추상 클래스를 이해하기 위해서는 먼저 순수 가상 함수에 대한 이해가 필요합니다.

     

    순수 가상 함수함수의 정의가 이뤄지지 않고 선언만 된 함수를 말합니다.

    순수가상함수의 예

     

    이렇게 선언된 순수 가상 함수가 있다면 이를 추상 클래스(Abstract Class)라고 부릅니다.

    이런 추상 클래스는 상속받은 클래스들이 공통적으로 가진 요소들을 쉽게 파악하고 빼먹지 않고 상속받아서 함수를 바꿀 수 있도록 도와줍니다.

     

    사람들은 모두 의사소통을 하지만, 각기 다른 언어를 사용합니다.

    한국인은 한국어, 중국인은 중국어, 일본인은 일본어와 같이 말이죠.

    이런 경우 사람 클래스에서 말하는 부분을 순수 가상 함수로 설정하고,

    한국인, 중국인, 일본인 클래스에서는 말하는 부분에서 한국어, 중국어, 일본어를 사용하도록 만들어 줄 수 있습니다.

    훨씬 깔끔하게 정리할 수 있겠죠?

     

    아래는 모양, 타원, 원으로 나뉜 클래스들로 만든 예시입니다.

    여기서 추상 클래스는 Shape가 되겠죠!

     


    이것으로 Class의 모든 포스팅이 끝났습니다.

    어려운 관문을 모두 통과했으니, 다음 포스팅에서는 조금 편하게 데이터 구조에 관한 이야기를 할 수 있겠네요!

    그렇다면 다음 포스팅에서 뵙도록 하겠습니다! 감사합니다 :)

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기