정구리의 우주정복
[Java] abstract, extend, override, template method 사용해보기 본문
- PlayerLevel.java // 다양한 기능들이 정의되어있는 추상 클래스 , 여기에 template-method 도 정의되어 있음
- Player.java //Has-a 관계로 PlayerLevel 을 필드값으로 갖는 클래스
- BeginnerLevel, AdvenceLevel, SuperLevel.java // 각 레벨이 정의되어있는 클래스
- 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 해보자
대충 이런 결과가 나오게 된다 !!
'STUDY > K-DIGITAL' 카테고리의 다른 글
[MySQL] 다중 테이블 조인 (자그마치 4개나 !) (0) | 2022.09.22 |
---|---|
[MySQL] mysql 명령어들 정리 (2) | 2022.09.22 |
[Java] abstract ,down-casting 활용해보기 (0) | 2022.09.10 |
[Java] 상속이랑 등등 (2) | 2022.09.06 |
[Java] 상속 , override 정복하기 (1) | 2022.09.05 |