각진 세상에 둥근 춤을 추자

[Java] 템플릿 메서드 - 게임 캐릭터레벨 기능 구현하기 본문

Java

[Java] 템플릿 메서드 - 게임 캐릭터레벨 기능 구현하기

circle.j 2022. 9. 20. 23:47

템플릿 메서드를 활용한 게임 관련 프로그램을 구현해 본다.

게임 캐릭터의 경험치가 쌓이거나 어떤 이벤트를 통해 레벨이 올라간다.

플레이어의 레벨이 다르면 해당 레벨에 따라 할 수 있는 기능도 다를 것이다.

이와 같은 상황을 구현해 본다.

 


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