[열혈C++] 상속의 조건

Yoons·2023년 8월 9일
0
post-thumbnail

❗️Notice❗️

저의 velog에 작성된 글은 모두 저의 주관적인 생각 및 이해를 바탕으로 작성된 글이므로 
정확하지 않은 내용을 있을 수 있음을 알립니다.

[교재] 윤성우 열혈 C++ 프로그래밍

Intro

상속은 객체지향언어를 배우는 이유 중에 하나이다. 상속은 코드의 재사용성과 가독성을 높여준다는 장점이 있다. 하지만 상속은 잘 쓰면 너무나 좋은 코드가 되지만, 잘못 사용하면 기능 하나 추가될 때마다 많은 코드를 고쳐야하는, 말 그대로 쓰레기 코드가 되기도 한다.

이번에는 이와 관련하여 "언제 상속해야하는가?", 즉 '상속의 조건'에 대해 알아보고자 한다.


Is-A

Is-A 관계는 일종의 (is a kind of)의 의미를 가지는 관계를 말한다.

예를 들어 컴퓨터(Computer)와 노트북(Laptop)의 관계를 본다고 하자. 이때 노트북은 컴퓨터의 한 종류이므로 Laptop is a kind of Computer이라고 볼 수 있다. 따라서 Is-A 관계를 만족한다.

이는 컴퓨터가 가진 기능을 노트북이 모두 포함하면서 추가적인 기능이 있다고 이해해도 무관하므로, 이 관계를 코드로 표현해보면 아래와 같이 나타낼 수 있다.

class Computer {
private:
	// computer의 멤버 변수
public:
	// computer의 멤버 함수 (computer의 기능)
}

class Notebook {
private:
	// Notebook 멤버 변수
public:
	// computer의 기능
    // + Notebook의 추가적인 기능
}

하지만 위의 코드에서 Notebook이 Computer의 기능을 포함하므로 이를 위해 코드를 또 한번 작성하는 것은 좋지 않다. 따라서 상속을 사용하면 아래와 같이 나타낼 수 있다.

class Computer {
private:
	// computer의 멤버 변수
public:
	// computer의 멤버 함수 (computer의 기능)
}

class Notebook : public Computer { // Computer class를 상속함
private:
	// Notebook의 멤버 변수
public:
    // Notebook의 기능
}

노트북은 컴퓨터의 기능을 포함하므로 상속을 통해 코드를 간결하게 작성할 수 있다. 따라서 클래스가 Is-A 관계를 가질 때는 상속 이용하는 것이 좋다.


Outro

이번 포스팅에서는 상속의 조건에 대해 알아보았다. Is-A 관계를 소개했는데, 사실 Has-A 관계도 있다. 그럼에도 불구하고 소개하지 않은 이유는 Has-A 관계는 상속의 조건에 포함되지 않는다고 생각하는게 더 나을 것 같기 때문이다.

상속은 코드를 간결하게 하고 여러번 재사용이 가능하다는 점에서 확실한 장점이 있지만, 상속을 한다는 것은 클래스간에 '깊은 관계'를 가진 다는 것이고, 이는 상속클래스에 더 많은 책임을 부과한다는 이야기이다.

예를 들어 A, B, C, D라는 4개의 클래스가 있는데 B는 A를, C는 B를, D는 C를 상속한다면 A가 많은 책임을 갖게 될 수 밖에 없다.

이러한 특성 때문에 상속의 개념은 써야할 때와 쓰지 말아야 할 때를 확실히 구분하여 사용할 필요가 있다.

이때 Has-A 관계는 굳이 상속을 사용하지 않아도 '캡슐화'라는 개념을 통해 문제를 해결할 수 있다. Has-A 관계에 대해 더 깊게 알고 싶다면 따로 공부하는 것도 좋은 방법이다.

profile
모든 글은 저의 눈물을 머금으며 작성한 글이니..재밌게 봐주세요 :) 깃헙 맞팔@

0개의 댓글