[Java] 추상 클래스 - 템플릿 메서드 활용하기

나영원·2020년 8월 30일
0

Java_basic

목록 보기
47/60

위의 예제는 PlayerLevel를 상위 클래스로 하여 3가지 하위 레벨 클래스를 가지고 있고 Player가 PlayerLevel을 사용하게 되는 구조를 가지고 있고 그것을 관계도로 표현하면 다음과 같습니다.

public abstract class PlayerLevel {

	public abstract void run();
	public abstract void jump();
	public abstract void turn();
	public abstract void showLevelMessage();
	
	final public void go(int count){
		run();
		for(int i=0; i<count;i++) {
			jump();
		}
		turn();
	}
}
  • 상위클래스인 PlayerLevel을 abstract 클래스로 선언하고 하위클래스에서 공통으로 사용될 run(),jump(),turn(),showLevelMessage();를 abstract메서드로 작성합니다.

  • PlayerLevel클래스에 메서드들을 어떤순서로 작동시킬지 정의한 템플릿 메서드 go()를 작성하고 jump는 for문을 통해 입력횟수만큼 반복되도록 합니다.

public class BeginnerLevel extends PlayerLevel{

	public void run() {
		System.out.println("천천히 달립니다");
	}

	public void jump() {
		System.out.println("Jump 못하지롱");
	}

	public void turn() {
		System.out.println("turn 못하지롱");
	}

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

BeginnerLevel 클래스를 작성하고 abstract 메서드들에 출력문을 작성합니다. 아래의 Advanced클래스와 SuperLevel클래스도 해당 레벨에 맞게 작성해줍니다.

public class Advanced extends PlayerLevel {

	public void run() {
		System.out.println("빨리 달립니다");
		
	}

	public void jump() {
		System.out.println("높이 Jump 합니다");
		
	}

	public void turn() {
		System.out.println("turn 못하지롱");
		
	}

	public void showLevelMessage() {
		System.out.println("******** 중급자 레벨입니다 ********");
		
	}
}
public class SuperLevel extends PlayerLevel {
	
	public void run() {
		System.out.println("엄청 빨리 달립니다");
		
	}

	public void jump() {
		System.out.println("아주 높이 Jump 합니다");
		
	}

	public void turn() {
		System.out.println("turn 합니다");
		
	}

	public void showLevelMessage() {
		System.out.println("******** 고급자 레벨입니다 ********");
		
	}
}
public class Player {
	
    //1번
	private PlayerLevel level;
	
	public Player() {
		level = new BeginnerLevel();
		level.showLevelMessage();
	}
	
	public PlayerLevel getLevel() {
		return level;
	}

	public void setLevel(PlayerLevel level) {
		this.level = level;
	}
    //2번
	public void upgradeLevel(PlayerLevel level) {
		
		this.level = level;
		level.showLevelMessage();
		
	}

	public void play(int count) {
		level.go(count);
	}
}
  • 1번 : Player 클래스를 작성하고 PlayerLevel을 자료형으로 하는 level변수를 선언하고 Player 생성자를 만들면서 level에 New BeiginnerLevel 인스턴스를 생성해서 대입하고 shoLevelMessage()메서드를 사용해 현재 레벨을 출력 합니다.. prviate 변수인 level을 읽고 쓰기 위한 get/set 메서드도 추가합니다

  • 2번 : upgradeLevel()메서드를 작성하고 새로운 level을 입력하면 지금 있는 멤버변수 level에 대입하고 showLevelMessage()메서드를 사용해 현재 레벨을 출력합니다.

public class PlayerTest {

	public static void main(String[] args) {
		//1번
		Player player = new Player();
		player.play(1);
		//2번
		PlayerLevel aLevel = new Advanced();
		player.upgradeLevel(aLevel);
		player.play(2);
		
		PlayerLevel sLevel = new SuperLevel();
		player.upgradeLevel(sLevel);
		player.play(3);
	}

}
//결과
******** 초급자 레벨입니다 ********
천천히 달립니다
Jump 못하지롱
turn 못하지롱
******** 중급자 레벨입니다 ********
빨리 달립니다
높이 Jump 합니다
높이 Jump 합니다
turn 못하지롱
******** 고급자 레벨입니다 ********
엄청 빨리 달립니다
아주 높이 Jump 합니다
아주 높이 Jump 합니다
아주 높이 Jump 합니다
turn 합니다
  • 1번 Player 생성자를 통해 player를 생성하고 plya()메서드를 사용해 BegginerLevel에서의 플레이를 실행시봅니다.

  • 2번 레벨 업그레이드를 위해 PlayerLevel 타입으로 Advnaced 인스턴스를 생성하여 upgradeLevel()메서드를 통해 level에 대입합니다. 그후 play()메서드를 사용하면 중급자 레벨로 플레이하는 것을 볼 수 있습니다. SuperLevel도 동일하게 업그레이드하고 플레이 할 수 있습니다.

profile
배우는 개발 일기

0개의 댓글