[typescript] 9. class 상속과 포함 관계
1. 상속(IS-A)
1) 개념
상속은 class간의 계층을 만들어서 코드 중복을 줄이는 객체지향 프로그래밍 방법 입니다.
상속관계에는 부모 class 와 자식 class라는 개념이 존재하며, class를 상속을 받는 다는 것은 자식 class가
부모 class의 공개된 속성과 method를 사용 할 수 있다는 것을 의미 합니다.
typescript에서 자식 class는 1개의 부모 class만 상속 받을 수 있습니다.
2) 상속 관려 용어 동의어 정리
* 부모 class = base class = super class
* 자식 class = derived classs = sub class
3) 상속(IS-A) 관계를 만드는 방법
상속(IS-A) 관계를 만들려면 다음 문장을 만들 었을 때 말이 되어야 합니다.
"자식 Class is a 부모 Class 이다."
Ex) 고양이 is a 동물이다.
강아지 is a 동물이다.
즉, 상속(IS-A) 관계를 만들기 위해서는 부모 Class는 자식 Class의 공통점을 가지고 있어야 한다.
위 예시에서 고양이와 강지의 공통점은 모두 4발로 걷는다 이다. 그러므로 부모 Class(동물)에는 발이라는 속성을
만들어 4개로 하면 됩니다.
또한 고양이 , 강아지 모두 짖습니다. 그래서 "짖다" 라는 method를 부모 Class(동물)에 만들어 주면 됩니다.
4) 구현 방법
상기 3)의 내용을 가지고 부모, 자식 class를 만들어 보겠습니다.
(1) 개념적 구현
A. 부모 Class
- 속성 : 발 4 개
- 속성 : 종(동물)
- method : 짖다.
B. 강아지 자식 Class
- 속성 : 종(고양이)
- method : 강아지 짖기
B. 강아지 자식 Class
- 속성 : 종(강아지)
- method : 고양이 짖기
(2) Code 구현
- 상속을 구현하기 위해선 extends를 가지고 구현 합니다.
- 부모 Class의 생성자를 호출 하기 위해서 super() method를 자식 class의 생성자에서 호출 합니다.
A. 부모 Class Code 구현
/**
* 부모 Class
*/
class Animal {
// 발 속성
foots: number;
// 종 속성
ancestorSpcies: string;
constructor() {
this.ancestorSpcies = "동물";
this.foots = 4;
}
// 짖는 method
bark(): string {
return "짖는다 크릉!!!";
}
}
B. 강아지 자식 Class 구현
/**
* 강아지 자식 class
*/
class Dog extends Animal {
species: string;
constructor() {
super();
this.species = "강아지";
}
work() {
// 부모 class의 속성을 사용 ancestorSpcies , foots
console.log(this.ancestorSpcies + "인 " + this.species + this.foots + "발로 걷는다.");
}
dogbark() {
// 부모 class의 method를 사용
console.log(this.species + "는 " + this.bark() + "왈왈");
}
}
C. 고양이 자식 Class 구현
/**
* 고양이 자식 class
*/
class Cat extends Animal {
species: string;
constructor() {
super();
this.species = "고양이";
}
work() {
// 부모 class의 속성을 사용 ancestorSpcies , foots
console.log(this.ancestorSpcies + "인 " + this.species + this.foots + "발로 걷는다.");
}
catbark() {
// 부모 class의 method를 사용
console.log(this.species + "는 " + this.bark() + "야옹!!");
}
}
A. 실행 코드
let dog1: Dog = new Dog();
dog1.work();
dog1.dogbark();
let cat1: Cat = new Cat();
cat1.work();
cat1.catbark();
2. 포함(HAS-A)
1) 개념
class가 다른 class를 포함한는 관계 입니다. 풀어서 말하면 포함하는게 갖는 것이기 때문에 HAS-A 관계 입니다.
포함(HAS-A) 관계는 크게 2개로 나눠 집니다.
(1) 합성(composition) 관계 (강한 관계)
- A Class가 B Class를 생성자함수에서 생성하여 속성으로 포함 하는 것입니다.
- A Class를 instance생성 후 제거 될시 B Class instance 역시 제거 됩니다.
(instance 생명 주기를 함께 합니다)
(2) 집합(aggregation) 관계 (약한 관계)
- A Class가 B Class를 생성자함수의 매개변수로 받아서 속성으로 포함하는 것입니다.
- A Class를 instance생성 후 제거 될시 B Class instance는 따로 제거해 줘야 합니다.
(instance 생명 주기가 개별 적입니다.)
2) 구현 방법
(1) 합성(composition) 관계 (강한 관계)
/**
* engine
*/
class Engine {
make: string;
constructor() {
this.make = "korea";
}
}
// 포함관계 Class
class KoreaCar {
engine: Engine;
constructor() {
this.engine = new Engine();
}
}
let mycar = new KoreaCar();
(2) 집합(aggregation) 관계 (약한 관계)
/**
* engine
*/
class Engine {
make: string;
constructor() {
this.make = "korea";
}
}
// 집합 관계 Class
class AmericaCar {
engine: Engine;
constructor(engine: Engine) {
this.engine = engine;
}
}
let engine = new Engine();
let supercar = new AmericaCar(engine);
'ProgrammingLang > typescript' 카테고리의 다른 글
[typescript] 11. 오버라이딩과 오버로딩 그리고 추상 class (0) | 2019.05.05 |
---|---|
[typescript] 10. class 접근 제한자, super VS this, setter/ getter (0) | 2019.05.04 |
[typescript] 8. class 와 instance (0) | 2019.05.01 |
[webpack] 에러 발 생시 해결 방법 (0) | 2019.04.21 |
[typescript] 7. 함수 (선언적 함수, 익명 함수, 콜백 함수) (0) | 2018.12.06 |