[JAVA][패스트캠퍼스]추상 클래스 응용

31036 단어 JavafastcampusJava

템플릿 메서드

  • 템플릿 : 틀이나 견본을 의미

  • 템플릿 메서드 : 추상 메서드나 구현된 메서드를 활용하여 전체의 흐름(시나리오)를 정의해놓은 메서드, final로 선언하여 재정의 할 수 없게 함

  • 템플릿 메서드 패턴 : 디자인 패턴의 일종, 프레임 워크에서 많이 사용되는 설계패턴, 추상 클래스로 선언된 상위 클래스에서 추상 메서드를 이용하여 전체 구현의 흐름을 정의하고 구체적인 각 메서드 구현은 하위 클래스에 위임함
    하위 클래스가 다른 구현을 했다고 해서 템플릿 메서드에 정의된 시나리오대로 수행됨

Car.java

package template;

public abstract class Car {

	public abstract void drive();
	public abstract void stop();

	public void startCar() {
		System.out.println("시동을 켜라");
	}

	public void turnOff() {
		System.out.println("시동을 꺼라");
	}
	
	public void washCar() {
		
	}
	//final키워드를 쓰게되면 하위클래스에서 재정의할 수 없는 메서드가 됨
	final public void run() {
		startCar();
		drive();
		stop();
		turnOff();
		washCar();
	}

}

AICar.java

package template;

public class AICar extends Car{

	@Override
	public void drive() {
		System.out.println("자율 주행합니다.");
		System.out.println("자동차가 스스로 방향을 바꿉니다.");
	}

	@Override
	public void stop() {
		System.out.println("스스로 멈춥니다.");
	}

	
}

ManualCar.java

package template;

public class ManualCar extends Car{

	@Override
	public void drive() {
		System.out.println("사람이 운전합니다.");
		System.out.println("사람이 핸들을 조작합니다.");
	}

	@Override
	public void stop() {
		System.out.println("브레이크를 밟아서 정지합니다.");
	}

}

CarTest.java

package template;

public class CarTest {

	public static void main(String[] args) {
		AICar aicar=new AICar();
		aicar.run();
		System.out.println("-------------");
		Car manualcar=new ManualCar();
		manualcar.run();
	}
}

final예약어

  • final변수는 값이 변경될 수 없는 상수임
  • public static final double PI=3.14; -> 오직 한번만 값을 할당할 수 있음
  • final메서드는 하위 클래스에서 재정의(overriding)할 수 없음
  • final클래스는 더 이상 상속되지 않음 ex) java의 String클래스

템플릿 메서드 활용하기

Player.java

package template;

import gamelevel.PlayerLevel;

public class Player {
	//PlayerLevel로 선언하면 상속받은 모든 클래스에 있는 개체들을 대입할 수 있음
	private PlayerLevel level;
	
	public Player() {
		level=new BeginnerLevel();
		level.showLevelMessage();
		
	}
	
	
	public PlayerLevel getLevel() {
		return level;
	}
	
	
	//upgradeLevel메서드의 level생성자에 의해서 각 BeginnierLevel,AdvancedLevel,SuperLevel을 불러들일수있다.
	public void upgradeLevel(PlayerLevel level) {
		this.level=level;
		level.showLevelMessage();
		
	}
	public void play(int count) {
		level.go(count);
	}
}

PlayerLevel.java

package gamelevel;

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();
	}

}

BeginnerLevel.java

package template;

import gamelevel.PlayerLevel;

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

}

AdvancedLevel.java

package template;

import gamelevel.PlayerLevel;

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


}

SuperLevel.java

package template;

import gamelevel.PlayerLevel;

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


}

MainBoardPlay.java

package template;

public class MainBoardPlay {

	public static void main(String[] args) {
		//if문으로 정의할 필요없이 상속을 통하여 다형성있는 코드로 정의할 수 있다.
		Player player=new Player();
		player.play(1);
		
		AdvancedLevel aLevel=new AdvancedLevel();
		player.upgradeLevel(aLevel);
		player.play(2);
		
		SuperLevel sLevel=new SuperLevel();
		player.upgradeLevel(sLevel);
		player.play(3);
	}
}

결과 :
====== 초급자 레벨 입니다. ======
천천히 달립니다.
jump 못하지롱
turn 못하지롱
====== 중급자 레벨 입니다. ======
빨리 달립니다.
높이 jump 합니다.
높이 jump 합니다.
turn 못하지롱
====== 고급자 레벨 입니다. ======
엄청 빠르게 달립니다.
아주 높게 jump 합니다.
아주 높게 jump 합니다.
아주 높게 jump 합니다.
turn 합니다.

좋은 웹페이지 즐겨찾기