정구리의 우주정복

[Java] abstract, extend, override, template method 사용해보기 본문

STUDY/K-DIGITAL

[Java] abstract, extend, override, template method 사용해보기

Jungry_ 2022. 9. 10. 17:37
반응형
  1. PlayerLevel.java // 다양한 기능들이 정의되어있는 추상 클래스 , 여기에 template-method 도 정의되어 있음 
  2. Player.java //Has-a 관계로 PlayerLevel 을 필드값으로 갖는 클래스
  3. BeginnerLevel, AdvenceLevel, SuperLevel.java // 각 레벨이 정의되어있는 클래스 
  4. MainBoardGame.java // 실제 동작을 담당하는 실행클래스 

 

PlayerLevel.java

package ch02.quiz.case04;

public abstract class PlayerLevel {

	public abstract void run();
	public abstract void jump();
	public abstract void turn();
	public abstract void showLevelMessage();
	
	//templat message
	public final void go(int count) {
		run();
		for(int i=0; i<count; i++) {
			jump();
		}
		turn();
	}
}

PlayerLevel 에는 추상 메소드인 run , jump, turn , showLevelMessage() 가 정의되어있다 

그리고 template method 인 go 를 정의해놓았다

go 는 매개변수로 int count 를 받고 run() 을 한번 실행하고 jump() 를 count 만큼 실행하고 turn() 을 한번 하는 method 이다

 

package ch02.quiz.case04;

public class Player {
	
	//field
	private PlayerLevel level; //Player has a Playerlevel
	
	//생성자 
	public Player() {
		level = new BeginnerLevel();
		level.showLevelMessage();
	}
	
	public PlayerLevel getLevel() {
		return level;
	}
	public void upgradeLevel(PlayerLevel level) {
		this.level =level; //upgrade 한 레벨이 담긴다 
		
		level.showLevelMessage();
	}
	public void play(int count) {
		level.go(count);
	} 
}

Player는 PlayerLevel 을 has-a 관계로 가지고 있는 class이다 ! 

PlaterLevel 을 level 이라는 이름으로 가져왔다 

 

우선 생성자를 만들게 되면 level = new BiginnerLevel(); 이 된다 (맨 초보자 레벨로 설정해주는 것) 그리고 level.showLevelMessage() 를 실행한다.

 

getLevel() 은 return value가 PlayerLevel 인 메소드다 return 으로 level 을 넘겨준다 

 

upgradeLevel(PlayerLevel level) 은 level 에 새로운 값을 넣어주게되는 method 이다 

 

play는 (int count) 를 입력받아 go => template method 를 실행하는 메소드 !

 

BiginnerLevel, AdvancedLevel, SuperLevel.java

package ch02.quiz.case04;

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("******** 초급자 레벨 입니다 ********");
	}

}
package ch02.quiz.case04;

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("******** 중급 레벨 입니다 ********");
	}

}
package ch02.quiz.case04;

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("turn 합니다 ");
	}

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

}

 

3개는 형태가 똑같아서 그냥 하나로 만들었다 PlayerLevel 을 extends 한다 !!! 추상클래스이기 때문에 그 안의 추상메소드들을 다 정의해줘야한다 (저번에도 말했지만 만약 사용하지 않는 기능이 있으면 그냥 정의만 하고 안에 내용은 안적어도된다) 각 파일마다 어떻게 동작할지 Override 를 해주자 

 

 

MainBoardPlay.java

package ch02.quiz.case04;

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

 

실제 동작하는 클래스이다 !

Player 를 새로 선언해주고 .play(int count) 값을 넣어서 실행시켜본다

 

그리고 AdvanceLevel 을 가져와서 player의 upgradeLevel 을 해줘서 level 을 advancedLevel 로 바꿔준다

그리고 다시 play 를 해보고 

 

SuperLevel 로 바꾸고 다시 또 play 해보자 

 

대충 이런 결과가 나오게 된다 !!

반응형
Comments