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를 호출시 사용한다.

+ Recent posts