[TIL] Inheritance(상속) vs Composition(포함)

swing·2021년 8월 3일
1

[TIL]

목록 보기
6/10

이 글은 학습한 내용을 본인의 생각을 통해 해석하고 정리한 TIL 입니다.
부족한 내용이나 틀린 사항은 언제든 댓글로 남겨주세요 !! 🙋‍♂️

📌 개요

객체 지향 프로그래밍 방법 중 중요한 개념인 상속과 포함이라는 개념을 접했다.
두 단어의 의미가 비슷해서 객체지향 프로그래밍에서 코드 중복을 줄일 수 있는 방법들 정도로만 이해했었다.
사실은 매우 다른 개념인 상속과 포함 ! 이 글을 통해 박살을 내보도록 하자 🔥


💁🏻 축약해 보자면 ?!

상속 : Dog is a animal.

포함 : My car has a engine.

상속은 IS-A , 포함은 HAS-A 이 개념을 가지고 출발해보자 !


👉 Inheritance(상속)

상속은 Class간의 계층을 만들어서 코드 중복을 줄이는 OOP의 방법이다.
부모 Class와 자식 Class의 개념이 있으며 , 자식 Class가 부모 Class를 상속받는 다는 것은 부모 Class의 instance와 method를 사용할 수 있다는 얘기이다.

코드 예시

// 부모 Class Animal
class Animal {
    foots: number;
    ancestorSpcies: string;
  
    constructor() {
        this.ancestorSpcies = "동물";
        this.foots = 4;
    }
    
    bark(): string {
        return "멍멍!";
    }
}

// 자식 Class Dog
class Dog extends Animal {
    species: string;
  
    constructor() {
        super();
        this.species = "강아지";
    }

    work() {
        console.log(this.ancestorSpcies + "인 " + this.species + this.foots + "발로 걷는다.");
    }

    dogbark() {
        // 부모 class의 method를 사용
        console.log(this.species + "는 " + this.bark() + "짖는다");
    }
}

이처럼 상속은 자식Class IS-A 부모 Class 관계가 성립한다.
그래서 자식에서 부모의 instance와 method를 사용할 수 있게 된다.


👉 Composition(포함)

포함은 Class가 다른 Class를 포함하는 관계이다.
또한 포함 관계에서는 합성 관계와 집합 관계가 있다.

합성 관계(강한 관계)는 A Class가 B Class를 생성자함수에서 생성하여 속성으로 포함하는 것이다. A Class의 instance가 사라지면 B Class에서도 해당 instance에 영향을 받는 것이 제거된다. 그래서 instance 생명 주기를 함께 한다.

집합 관계(약한 관계)는 A Class가 B Class를 생성자함수의 매개변수로 받아서 속성으로 포함하는 것이다.A Class의 instance가 사라지면 B Class의 instance를 따로 제거해 줘야 한다. 즉 instance 생명 주기가 개별적이다.

코드 예시

// 합성 관계
// 포함되는 Engine Class
class Engine {
    make: string;
    constructor() {
        this.make = "korea";
    }
}

// Engine Class를 포함하는 KoreaCar Class
class KoreaCar {
    engine: Engine;
    constructor() {
        this.engine = new Engine();
    }
}
let mycar = new KoreaCar();

// 집합 관계
// 포함되는 Engine Class
class Engine {
    make: string;
    constructor() {
        this.make = "korea";
    }
}

// Engine Class를 생성자함수의 매개변수로 받는 AmericaCar Class
class AmericaCar {
    engine: Engine;
    constructor(engine: Engine) {
        this.engine = engine;
    }
}

let engine = new Engine();
let supercar = new AmericaCar(engine);

이처럼 포함은 A Class HAS-A B Class 관계가 성립한다.
그래서 서로의 속성에 영향을 받는 개별적인 객체들을 조합하는 방법이다.


💁 끝으로,,

이렇게 상속과 포함 , 포함에서도 합성 관계와 집합 관계에 대해 알아보았다.
객체지향 프로그래밍에서 코드의 중복을 줄이기 위해 탄생한 개념들이라 헷갈렸는데 이 둘의 차이점을 명확히 알게 되었다.
IS-A와 HAS-A 라는 핵심 개념을 통해 앞으로도 기억에 남을 것 같다 !

참고

[TypeScript] class 상속과 포함 관계

profile
if(기록📝) 성장🌱

0개의 댓글