객체지향프로그래밍(14) - 상속(4), 상속의 용도

is-a, has-a, 계층구조

Featured image

🔚 짧게 하는 복습

✅ 1. 메소드 함수 호출 원리를 안다.

✅ 2. this 포인터의 원리와 쓰임을 안다.

✅ 3. 참조자 반환 함수의 주의할 점과 활용을 안다.

혹시 기억이 안 난다면, 다시 돌아가자


저번 시간까지는 상속과 클래스를 기술적인 관점에서 다루어 보았다.

이번 시간에서는 OOD(객체지향 설계)의 관점에서 실제로 어떻게 사용이 되는지 확인해보겠다.

크게 Is-a 관계, Has-a 관계, 계층 구조(Class Hierarchies) 세 가지 정도의 관계를 나타낼 때 상속을 사용한다.

하나씩 살펴보자.


Is-a 관계

우리가 지금까지 다룬 상속 관계의 대부분은 Is-a 관계이다.

Is-a 관계란 상위 클래스가 하위 클래스들을 집합적으로 포함하는 관계이다.

아래 두 가지의 Class Diagram을 보자.

첫 번째 예는 포켓몬과 치코리타, 리아코, 브케인의 관계이다.

치코리타는 포켓몬이다. 리아코는 포켓몬이다. 브케인은 포켓몬이다.

(Chicorita is a Pokemon, Riako is a Pokemon, Bukein is a Pokemon)

하위 클래스들을 상위 클래스인 포켓몬이 모두 포함하는 관계이다.

두 번째 예도 다르지 않다.

사람은 동물이다. 고양이도 동물이다.

(Human is an animal, Cat is an animal)

이러한 관점에서 위아래가 집합적으로 포함 관계일 때 is-a 관계를 사용한다.

장점으로는 역시 유지보수가 편하고, 특정한 위치에서 상속을 늘리면 되니까 확장성이 좋다.


has-a 관계

다음으로 다룰 관계는 has-a 관계이다.

has-a 관계는 객체 간의 구성을 나타낼 때 많이 쓰인다.

보통 상위 클래스를 하위 클래스에서 말 그대로 구성함으로 포함되는 관계를 말한다.

정의만 들으면, is-a 관계와 has-a 관계가 무엇이 다른지 헷갈리지만, 실제 활용을 보면 더 쉽게 느껴진다.

예제를 보며 이해해보자.

#include <iostream>

// 엔진 클래스 정의
class Engine {
private:
    std::string type;
public:
    Engine(std::string _type) : type(_type) {}
    void start() {
        std::cout << "Starting the " << type << " engine." << std::endl;
    }
};

// 자동차 클래스 정의 (엔진을 상속하여 사용)
class Car : public Engine {
public:
    Car(std::string engineType) : Engine(engineType) {}
    void start() {
        Engine::start(); // 상속받은 엔진의 start 메서드 호출
    }
};

int main() {
    Car myCar("V6"); // V6 타입의 엔진을 가진 자동차 생성
    myCar.start();   // 자동차 시작

    return 0;
}

예시 코드에서 자동차는 엔진인가? 상식적으로도 그렇지 않다.

자동차가 엔진을 포함한다. (Car has an engine)

이렇게 해석되는 것이 맞다.

이처럼 has-a 관계는 구성품 등을 나타낼 때 많이 사용된다.

사실 상속보다는 합성(Composition)이라는 관계로 나타내는 것이 더 일반적이다. (추후 강의에 다룰 예정이다.)


계층 구조(Class Hierarchies)

계층 구조(Class Hierarchies)는 is-a나 has-a 관계의 확장이다.

두 관계를 통해서 클래스들을 연속적으로 나타냈을 때, 나타나는 구조를 계층 구조라고한다.

즉, 위에서 본 예제들도 하나의 계층 구조가 될 수 있고, 아래와 같은 큰 그림도 계층 구조라고 할 수 있다.

계층 구조의 큰 특징은 위로 갈수록 추상적이고, 아래로 내려올수록 구체적이라는 특징이 있다.

특히 상위 몇몇 클래스들은 아예 사용되지 않는 예도 있는데, 이는 오직 계층 구조로서만 의미가 있는 추상 클래스라고 한다. (지금은 이것이 왜 필요한지 굳이 알 필요없다.)


📖 오늘의 핵심(다 알기 전까지는 넘어가지 말자❗)

✅ 1. is-a 관계의 정의와 예시를 안다.

✅ 2. has-a 관계의 정의와 예시를 안다.

✅ 3. 계층 구조의 정의를 안다

⚠️ has-a 관계는 상속을 잘 하지 않는다. (읽어볼 거리 참조)

💣 과제, 없음

🔜 더 공부해보기,

읽어볼 거리(1) - 합성(Composition)이란?