JAVA Programming

[41] final 템플릿메소드 활용하기 + 다형성이해-자식 , 추상클래스

꾸준히개발하자 2020. 7. 16. 10:55

 

템플릿 메소드 활용 하기

상속개념 , 다형성 개념 과  템플렛메소드 개념도 이해하고 넘어가야 한다. 

 

 

abstract class 추상 클래스 선언 

템플릿 메소드 go() 

package TempletEx;

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) { // 템플릿 메소드 생성 - 이순서대로 실행해야 하기 때문에  final로  선언 
		
		run();
		for(int i = 0; i < count; i++ ) { // 카운트 만큼 점프 한다.
			jump();
		}
		turn();
		
	}	
}

 

초보자 클래스 BeginnerLevel 클래스 

package TempletEx;

public class BeginnerLevel extends PlayerLevel {

	@Override
	public void run() {
		System.out.println("천천히 달립니다.");
	}
	@Override
	public void jump() {
		System.out.println("점프를 못하지롱");
	}
	@Override
	public void turn() {
		System.out.println("turn 못하지롱");
	}
	@Override
	public void showLevelMessage() {
		System.out.println("****** 초급자 레벨 입니다. *****");
	}
}

 

중급자 레벨 AdvancedLevel 클래스 

package TempletEx;

public class AdvancedLevel extends PlayerLevel {

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

	@Override
	public void jump() {
		System.out.println("높이 점프합니다.");
	}

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

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

}

 

고급자 레벨 SuperLevel 입니다. 

package TempletEx;

public class SuperLevel extends PlayerLevel {

	@Override
	public void run() {
		System.out.println("엄청 빠르게 달립니다.");
	}

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

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

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

 

Player 레벨에  

PlayerLevel 클래스를 선언합니다. 이때 상속받는 클래스들을 level 변수에 대입합니다. 

 

기본생성자에서 

level 변수에   초보자클래스를 대입합니다. 

 

upgradeLevel() 메소드를 통해  PlayerLevel 클래스이 level 변수를 매개변수로 가져옵니다.

지금 내 래밸을  가져온 래밸로 지정합니다.  this.level = level;

 

play() 메소드를 통해  count 를 매개변수로 받고 

level 은 카운트 점프수만큼 증가합니다. 

package TempletEx;

import java.util.Scanner;

public class Player {

		private PlayerLevel level; // 이 레벨 변수에  playLevel 에 상속받은 모든애들이 대입될수있다.  ( 다형성 의 장점 ) 
								   // PlayerLevel 이라는 클래스 타입 사용 
		public Player() { 
			level = new BeginnerLevel();
			level.showLevelMessage(); // 초보자 레벨입니다.
			
		}
		public PlayerLevel getLevel() {
			return level;
		}
		public void upgradeLevel(PlayerLevel level) {  // BegineerLevel 로 업그레이드 할수도 있고 Super타입으로도 업그레이드 할수있으니 
			this.level = level; // 나이 레벨을 업그레이드 레벨로 해준다
		}
		public void play(int count) {
			level.go(count);
		}
}

 

실행 클래스 

Player 가 생성되면 초보자 래벨을 부여받습니다.

 

중급자를 생성하고나서 

기존에 만든 Player에다가 upgradeLevel(중급자객체) 를 대입하고 

play() 메소드를 실행하면 2번 점프수만큼  2번 출력됩니다.

 

고급자를 생성하고 나서 

기존에 만든 Player 에다가  upgradeLevel(고급자객체) 를 대입하고 나서

play 메소드를 실행하면  점프가 3번 출력됩니다. 

 

package TempletEx;

public class MainBoardPlay {
		public static void main(String[] args) {
			
			Player player = new Player();
			player.play(1);
			
			AdvancedLevel aLevel = new AdvancedLevel();
			aLevel.showLevelMessage();
			player.upgradeLevel(aLevel);
			player.play(2);

			
			SuperLevel sLevel = new SuperLevel();
			sLevel.showLevelMessage();
			player.upgradeLevel(sLevel);
			player.play(3);
		}
}