728x90
interface와 유사하지만 클래스 기능의 제한의 목적보다는(할 수는 있지만)
불필요하게 중복되는 기능의 구현을 최소화하기 위해서 사용한다.
이번에는 파티를 만드는 예시보다 포켓몬의 진화의 예시가 좋을 것 같다.
포켓몬은 진화단계가 있다면 특정 레벨이상에서 레벨이 오를때 진화를 할 수 있으며 최종진화의 경우 더 이상 진화를 할 수 없다.
구현 예시
귀여운 치코리타의 진화로 예시를 들겠다. 치코리타의 진화 체계는 치코리타 -> 베이리프 -> 메가니움 순서로 이루어진다.
치코리타 -> 베이리프로는 레벨 16때 진화하며
베이리프 -> 메가니움으로는 레벨 32때 진화한다.
치코리타의 레벨을 쭉쭉 올려보자!
class Pokemon {
constructor(
protected name: string,
protected level: number,
protected levelToEvolve: number = 0
) {}
protected isLevelToEvolve() {
return this.levelToEvolve != 0 && this.level >= this.levelToEvolve;
}
private evolve(): void {
console.log(`${this.name} 진화! 레벨: ${this.level}`);
}
levelup(): Pokemon {
if (this.level <= 100) this.level++;
if (this.isLevelToEvolve()) {
this.evolve();
}
return new Pokemon(this.name, this.level, this.levelToEvolve);
}
}
class Chikorita extends Pokemon {
constructor(level: number) {
console.log("치코리타 탄생");
super("치코리타", level, 16);
}
levelup(): Pokemon {
super.levelup();
if (super.isLevelToEvolve()) {
return new Bayleef(this.level);
} else {
return this;
}
}
}
class Bayleef extends Pokemon {
constructor(level: number) {
console.log("베이리프 탄생");
super("베이리프", level, 32);
}
levelup(): Pokemon {
super.levelup();
if (super.isLevelToEvolve()) {
return new Meganium(this.level); // super.level == undefined
} else {
return this;
}
}
}
class Meganium extends Pokemon {
constructor(level: number) {
console.log("메가니움 탄생");
super("메가니움", level);
}
}
let myChikorita: Chikorita = new Chikorita(15);
for (let i = 0; i < 50; i++) {
myChikorita = myChikorita.levelup();
/*
치코리타 탄생
치코리타 진화! 레벨:16
베이리프 탄생
베이리프 진화! 레벨:32
메가니움 탄생
*/
}
super
- 현재 instance의 부모 클래스를 의미한다
super.name
을 출력시 부모 클래스에 정의된 name이 없으므로undefined
가 출력된다. 만약super.name
을 출력하고 싶다면 부모 클래스에서 name 정의시 static으로 정의하면 된다.
- 부모 클래스의 constructor를 호출시 사용한다.
this
- 현재 instance의 클래스를 의미한다
- 현재 클래스의 constructor를 호출시 사용한다.
'TypeScript' 카테고리의 다른 글
typescript 로 OOP 개념 익히기 - 6. Composition(구성) (0) | 2021.03.23 |
---|---|
typescript 로 OOP 개념 익히기 - 5. Polymorphism(다형성) (0) | 2021.03.20 |
typescript 로 OOP 개념 익히기 - 3. Abstraction(추상화) (0) | 2021.03.19 |
typescript 로 OOP 개념 익히기 - 2. Encapsulation(캡슐화) (0) | 2021.03.19 |
typescript 로 OOP 개념 익히기 - 1. Introduction (0) | 2021.03.19 |