이 글은 학습한 내용을 본인의 생각을 통해 해석하고 정리한 TIL 입니다.
부족한 내용이나 틀린 사항은 언제든 댓글로 남겨주세요 !! 🙋♂️
객체 지향 프로그래밍 방법 중 중요한 개념인 상속과 포함이라는 개념을 접했다.
두 단어의 의미가 비슷해서 객체지향 프로그래밍에서 코드 중복을 줄일 수 있는 방법들 정도로만 이해했었다.
사실은 매우 다른 개념인 상속과 포함 ! 이 글을 통해 박살을 내보도록 하자 🔥
상속 : Dog is a animal.
포함 : My car has a engine.
상속은 IS-A
, 포함은 HAS-A
이 개념을 가지고 출발해보자 !
상속은 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를 사용할 수 있게 된다.
포함은 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 라는 핵심 개념을 통해 앞으로도 기억에 남을 것 같다 !
참고