각진 세상에 둥근 춤을 추자
[Java] 템플릿 메서드 - 게임 캐릭터레벨 기능 구현하기 본문
템플릿 메서드를 활용한 게임 관련 프로그램을 구현해 본다.
게임 캐릭터의 경험치가 쌓이거나 어떤 이벤트를 통해 레벨이 올라간다.
플레이어의 레벨이 다르면 해당 레벨에 따라 할 수 있는 기능도 다를 것이다.
이와 같은 상황을 구현해 본다.
Player가 게임을 한다.
게임에서 Player의 레벨에 따라 할 수 있는 기능은 세 가지이다.
run( ), jump( ), turn( )이다.
- 초보자 레벨: 천천히 달릴 수 있습니다. -> run( )
- 중급자 레벨: 빠르게 달리고 점프할 수 있습니다. -> run( ), jump( )
- 고급자 레벨: 엄청 빠르게 달리고 점프하고 턴할 수 있습니다. -> run( ), jump( ), turn( )
모든 레벨의 player에게 필살기 메서드 go(int count)를 제공한다.
한 번 run하고, 매개변수로 전달된 count만큼 jump하고 한 번 turn한다.
해당 레벨에서 불가능한 기능을 요청하면 할 수 없다는 메시지를 출력한다.
Player 클래스와 PlayerLevel 클래스는 포함(HAS-A) 관계이다.
게임에서 모든 Player는 자신의 레벨이 있기 때문에, Player 클래스에서 PlayerLevel을 멤버 변수로 갖는다.
PlyaerLevel 클래스를 추상 클래스로 만들어 모든 레벨에서 공통으로 수행하는 기능을 구현하고,
각 레벨마다 달라지는 기능은 추상 메서드로 만들었다.
그리고 PlayerLevel을 상속받은 하위 클래스 BeginnerLevel, AdvancedLevel, SuperLevel에서는 추상 메서드로 선언한 부분을
나름의 필요에 맞게 구체적으로 구현한다.
(1) Player 클래스 구현하기
package ch09_3;
public class Player {
// Player가 가지는 level 변수 선언
private PlayerLevel level;
// 디폴트 생성자
public Player() {
level = new BeginnerLevel(); // 처음 생성되면 BeginnerLevel
level.showLevelMessage(); // 레벨 메시지 출력
}
public PlayerLevel getLevel() {
return level;
}
public void upgradeLevel(PlayerLevel level) {
this.level = level;
level.showLevelMessage();
}
public void play(int count) {
level.go(count);
};
}
(2) PlayerLevel 클래스 구현하기
package ch09_3;
public abstract class PlayerLevel {
public abstract void run();
public abstract void jump();
public abstract void turn();
public abstract void showLevelMessage();
// 재정의되면 안되므로 final 선언
final public void go(int count) {
run();
for (int i=0; i<count; i++) {
jump();
}
turn();
}
}
(3) BeginnerLevel 클래스 구현하기
package ch09_3;
public class BeginnerLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("천천히 달립니다.");
}
@Override
public void jump() {
System.out.println("Jump 할 줄 몰라 ㅠㅠ");
}
@Override
public void turn() {
System.out.println("Turn 할 줄 몰라 ㅠㅠ");
}
@Override
public void showLevelMessage() {
System.out.println("--- 초보자 레벨입니다 ---");
}
}
(4) AdvancedLevel 클래스 구현하기
package ch09_3;
public class AdvancedLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("높이 Jump합니다.");
}
@Override
public void turn() {
System.out.println("Turn 할 줄 몰라 ㅠㅠ");
}
@Override
public void showLevelMessage() {
System.out.println("--- 중급자 레벨입니다 ---");
}
}
(5) SuperLevel 클래스 구현하기
package ch09_3;
public class SuperLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("엄청 빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("아주 높이 Jump합니다.");
}
@Override
public void turn() {
System.out.println("한 바퀴 돕니다.");
}
@Override
public void showLevelMessage() {
System.out.println("--- 고급자 레벨입니다 ---");
}
}
(6) 테스트 프로그램 작성하기
package ch09_3;
public class MainBoard {
public static void main(String[] args) {
Player player = new Player();
player.play(1);
AdvancedLevel aLevel = new AdvancedLevel();
player.upgradeLevel(aLevel);
player.play(2);
SuperLevel sLevel = new SuperLevel();
player.upgradeLevel(sLevel);
player.play(3);
}
}
'Java' 카테고리의 다른 글
[Java] 인터페이스 (0) | 2022.09.21 |
---|---|
[Java] final 예약어 (0) | 2022.09.21 |
[Java] 템플릿 메서드 (0) | 2022.09.20 |
[Java] 추상 클래스 (0) | 2022.09.20 |
[Java] 다운캐스팅과 instanceof (0) | 2022.09.20 |