3 min to read
객체지향프로그래밍(14) - 상속(4), 상속의 용도
is-a, has-a, 계층구조

🔚 짧게 하는 복습
✅ 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 관계는 상속을 잘 하지 않는다. (읽어볼 거리 참조)
💣 과제, 없음
🔜 더 공부해보기,
Comments