개발공부/객체 지향 핵심

[Java] 16. 복습해보기 - GameLevel

환타몬 2022. 2. 2. 19:03

추상 클래스와 템플릿 메서드

Player가 있고 Player는 GameLevel 속성을 가집니다. 각 GameLevel 단계 마다 run(), jump(), turn() 세 가지 기능이 업그레이드 됩니다.

초보자 레벨 : 천천히 달립니다. run() 만 가능

중급자 레벨 : 빠르게 달리고, 점프할 수 있습니다. run(), jump() 가능

고급자 레벨 : 엄청 빠르게 달리고, 높게 점프하고, 턴할 수 있습니다. run(), jump(), turn() 가능

Player는 한번에 하나의 레벨 상태만을 가질 수 있습니다.

Player가 play() 중에 레벨에 있는 go(int count) 라는 메서드를 호출하면 run() 하고 count 횟수 만큼 jump() 하고 turn() 합니다. 다음 클래스 다이어그램을 참고하여 각 레벨에서 go() 가 호출 될때 다음과 같이 출력 되도록 하세요.

 

 

 

- PlayerLevel.java

package com.ch16;

public abstract class PlayerLevel {
	
	public abstract void run();
	public abstract void jump(int i);
	public abstract void turn();
	public abstract void showLevelMessage();
	
	final public void go(int num) {
		run();
		jump(num);
		turn();
		showLevelMessage();
	}
}

1. PlayerLevel 라는 추상 클래스를 생성 후, run, jump, turn, showLevelMessage를 추상메서드로 생성한다.

2. go(int)를 통해서 run, jump, turn, showLevelMessage를 출력함.

 

-Player.java

package com.ch16;

public class Player{
	private PlayerLevel level;
	
	public Player() {
		
		level = new BeginnerLevel();
	}
	
	public PlayerLevel getLevel() {
		return level;
	}
	
	public void upgradeLevel(PlayerLevel level) {
		this.level = level;
	}
	
	public void play(int i) {
		level.go(i);
	}
}

1. Player를 생성할 때 BeginnerLevel()로 생성한다.

2. private 한 속성인 level을 getLevel 이라는 메서드로 값을 가져온다.

3. upgradeLevel메서드는 PlayerLevel 타입의 level 변수로 값을 변경한다. 

4. play 메서드를 통해 level 객체의 go 메서드를 실행시킨다. 

 

- BeginnerLevel.java

package com.ch16;

public class BeginnerLevel extends PlayerLevel{

	@Override
	public void run() {
		System.out.println("Slow run");
		
	}

	@Override
	public void jump(int i) {
		System.out.println("Can not jump");
	}

	@Override
	public void turn() {
		System.out.println("Can not turn");
		
	}

	@Override
	public void showLevelMessage() {
		System.out.println("********* 초급자 레벨입니다 **********");
		
	}
	
	

}

 

- AdvancedLevel.java

package com.ch16;

public class AdvancedLevel extends PlayerLevel {

	@Override
	public void run() {
		System.out.println("Fast run");
		
	}

	@Override
	public void jump(int i) {
		for (int j=0; j<i; j++) {
			System.out.println("High jump");
		}
		
	}

	@Override
	public void turn() {
		System.out.println("Can not turn");
		
	}

	@Override
	public void showLevelMessage() {
		System.out.println("********* 중급자 레벨입니다 **********");
		
	}
	
}

 

 

- SuperLevel.java

package com.ch16;

public class SuperLevel extends PlayerLevel{
	@Override
	public void run() {
		System.out.println("So Fast run");
		
	}

	@Override
	public void jump(int i) {
		for (int j=0; j<i; j++) {
			System.out.println("Very High jump");
		}
		
	}

	@Override
	public void turn() {
		System.out.println("turn");
		
	}

	@Override
	public void showLevelMessage() {
		System.out.println("********* 고급자 레벨입니다 **********");
		
	}

}


1. 추상클래스를 extends 했기 때문에 추상메서드들을 Overriding하여 완성시켜 주어야 한다.

2.Biginner, Advanced, Super Level에 각각 알맞는 값들을 출력해준다.

 

 

테스트코드를 만들어 실행시킨다.


-PlayerTest.java

package com.ch16;

public class PlayerTest {

	public static void main(String[] args) {
		Player player = new Player();
		player.play(1);
		
		AdvancedLevel aPlayer = new AdvancedLevel();
		player.upgradeLevel(aPlayer);
		player.play(2);
		
		SuperLevel sPlayer = new SuperLevel();
		player.upgradeLevel(sPlayer);
		player.play(3);
	}
}

처음 Player 생성자를 호출할 때 BeginnerLevel로 생성하였기 때문에 player객체의 play메서드를 실행하면 BeginnerLevel에 대한 값이 호출된다.

그 후 AdvancedLevel 의 생성자로 객체를 생성하고, player 객체의 level을 upgradeLevel 메서드를 통해서 셋팅한다.

반복해서 SuperLevel 의 객체를 생성해서 마찬가지로 셋팅해준다.