Do It Java Day20
추상 클래스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 클래스는 상속되지 않는다