추상 클래스2

1. 추상 클래스와 템플릿 메서드

템플릿 메서드

  • 추상 메서드나 구현된 메서드를 활용하여 전체 기능의 흐름(시나리오)을 정의하는 메서드

  • final로 선언하면 하위 클래스에서 재정의 할 수 없음
  • 프레임워크에서 많이 사용되는 설계 패턴
  • 추상 클래스로 선언된 상위 클래스에 템플릿 메서드를 활용하여 전체적인 흐름을 정의, 하위 클래스에서 구현되어야 하는 부분은 추상 메서드로 선언

후크(Hook) 메서드

  • 추상 클래스에 빈 구현부로 정의된 메서드
  • 하위 클래스에서 선택적으로 오버라이드해서 사용할 수 있음

  • 템플릿 메서드 사용 예시
public abstract class Car {
	//템플릿 메서드
	public abstract void drive();
	public abstract void stop();
	public abstract void wiper();
	
	//후크 메서드
	public void washCar() {}; 
	
	public void startCar() {
		System.out.println("시동을 켭니다.");
	}
	
	public void turnOff() {
		System.out.println("시동을 끕니다.");
	}
	
	public final void run() { //하위 메서드에서 수정하면 안 되는 부분은 final로 저장
		startCar();
		drive();
		wiper();
		stop();
		washCar();
		turnOff();
	}
}
public class ManualCar extends Car {

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

	@Override
	public void stop() {
		System.out.println("사람이 브레이크로 정지합니다.");
	}

	@Override
	public void wiper() {
		System.out.println("수동으로 와이퍼를 조작합니다.");
	}
	
}
public class AICar extends Car {

	@Override
	public void drive() {
		System.out.println("자율주행합니다.");
	}

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

	@Override
	public void wiper() {
		System.out.println("비나 눈의 양에 따라 자동으로 조절됩니다.");
	}

	@Override
	public void washCar() {
		System.out.println("자동 세차를 진행합니다.");
	}
	
}
public class CarTest {
	public static void main(String[] args) {
		Car myCar = new ManualCar();
		myCar.run();
		
		Car yourCar = new AICar();
		yourCar.run();
	}
}
/* [출력 결과]
시동을 켭니다.
사람이 운전합니다.
수동으로 와이퍼를 조작합니다.
사람이 브레이크로 정지합니다.
시동을 끕니다.
시동을 켭니다.
자율주행합니다.
비나 눈의 양에 따라 자동으로 조절됩니다.
자동차가 스스로 멈춥니다.
자동 세차를 진행합니다.
시동을 끕니다.
*/

Tip. final예약어

  • final 변수는 오직 한 번만 값을 할당할 수 있다.
  • final 메서드는 하위 클래스에서 오버라이딩할 수 없다
  • final 클래스는 상속되지 않는다

태그:

카테고리:

업데이트: