Super Coding Addict
Ch08. 추상 클래스(2) - 추상 클래스 응용 [템플릿 메서드] 본문
* 템플릿 메서드
- 템플릿 메서드
: 추상메서드나 구현된 메서드를 활용하여 전체의 흐름(시나리오)를 정의해 놓은 메서드
: final로 선언하여 재정의할 수 없게 함
- 템플릿 메서드 패턴
: 디자인 패턴의 일종
: 프레임워크에서 많이 사용되는 설계 패턴
: 추상클래스로 선언된 상위클래스에서 추상메서드를 이용하여 전체 구현의 흐름을 정의하고, 구체적인 각 메서드의 구현은 하위클래스에 위임
: 하위클래스가 다른 구현을 하더라도, 템플릿 메서드에 정의된 시나리오대로 수행됨
* final 예약어
- final변수는 값이 변경될 수 없음 상수
public static final double PI = 3.14;
//오직 한 번만 값을 할당할 수 있음
- final 메서드는 하위 클래스에서 재정의(overriding)할 수 없음
- final 클래스는 더 이상 상속되지 않음
ex) Java의 String클래스
* public static fianl 상수 값 정의하여 사용하기
- 프로젝트 구현시 여러 파일에서 공유해야 하는 상수값은 하나의 파일에 선언하여 사용하면 편리
--> static이므로 메모리에서 한 번만 잡히게 됨
- 예제 : Car 추상클래스 구현
# Car 추상클래스
package ch8.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() {} //구현의 확장을 함
//모든 차가 washCar를 헤야 한다면 abstract로 정의
final public void run() { //시나리오가 되는 메서드들 -> 재정의하면 안되므로 final로 선언
startCar();
drive();
stop();
turnOff();
washCar();
}
}
--> drive(), stop() 메서드는 추상메서드로 Car클래스를 상속하는 클래스들이 구현하게 됨
--> startCar(), turnOff(), washCar() 메서드는 일반메서드로 Car클래스를 상속하는 클래스들에서 재정의 가능
--> washCar()는 추상메서드는 아니지만 바디가 없는데 세차를 하는 기능을 Car클래스를 상속하는 클래스 중 특정클래스만 재정의하여 사용하기 위해서임
=> 만약 모든 차가 세차 기능을 수행해야 하면 abtract로 선언하여 상속하는 클래스에서 무조건 재정의하게 할 수 있음
--> run()메서드는 상속하는 모든 클래스 지켜져야할 로직, 즉 시나리오가 되는 메서드로 상속하는 클래스에서 순서를 바꾸는 등 재정의할 수 없게 하기 위하여 final로 선언
# AICar 클래스 -- Car클래스 상속
package ch8.template;
public class AICar extends Car{
@Override
public void drive() {
System.out.println("자율 주행합니다.");
System.out.println("자동차가 스스로 방향을 바꿉니다.");
}
@Override
public void stop() {
System.out.println("스스로 멈춥니다.");
}
@Override
public void washCar() {
System.out.println("자동 세차 합니다.");
}
}
--> ManualCar와 달리 자동세차기능이 있으므로 추상메서드가 아니지만 washCar()를 재정의하여 사용
# ManualCar -- Car클래스 상속
package ch8.template;
public class AICar extends Car{
@Override
public void drive() {
System.out.println("자율 주행합니다.");
System.out.println("자동차가 스스로 방향을 바꿉니다.");
}
@Override
public void stop() {
System.out.println("스스로 멈춥니다.");
}
@Override
public void washCar() {
System.out.println("자동 세차 합니다.");
}
}
# CarTest클래스(메인)
package ch8.template;
public class CarTest {
public static void main(String[] args) {
AICar aICar = new AICar();
aICar.run();
System.out.println("=========================");
Car manulCar = new ManualCar();
manulCar.run();
}
}
'JAVA 문법' 카테고리의 다른 글
Ch8. 추상 클래스 (1) (0) | 2021.03.06 |
---|---|
Ch11. 컬렉션 프레임 워크 - 제네릭 프로그래밍 (0) | 2021.03.04 |
Ch10. 자바 기본 클래스 (6) - String, Wrapper 클래스 (0) | 2021.03.03 |
Ch10. 자바 기본 클래스 (5) - 코딩해보기 (0) | 2021.03.02 |
Ch10. 자바 기본 클래스 (4) - Class 클래스 (0) | 2021.03.01 |