카테고리 없음
객체지향 프로그래밍 14. 추상클래스 응용(템플릿 메서드 패턴)
코딩펭귄
2023. 12. 16. 17:24
라이브러리
- jdk에 많은 라이브러리가 있고, 이걸 프로그래머가 가져다가 프로그래밍에 씀
- 프로그래밍의 전반적인 제어권(flow)는 프로그래머에게 있음
프레임워크
- 프레임워크 (ex.안드로이드) 도입 :흐름이 다 정해져있음
- 프로그래머가 하는 일 : place hole(구멍을 메꾸는 일) 세부적인 기능을 구성하는것이 프로그래머가 하는 일
-> 템플릿메서드는 프레임워크에서 많이 쓰는 설계 패턴!
템플릿 메서드
- 템플릿이라는 틀을 가진 메소드. 시나리오를 정의해놓고, 시나리오에따라 흐름이 흘러가고, 그 안에 추상메서드가 있고, 추상메서드를 메서드패턴을 가진 클래스를 상속받은 클래스가 구현하는 것
- 추상 메서드나 구현 된 메서드를 활용하여 코드의 흐름(시나리오)를 정의하는 메서드
- final로 선언하여 하위 클래스에서 재정의 할 수 없게 함(흐름이 변하면 안되므로) -> 흐름은 변하면 안되므로, 상속받은 하위클래스가 재 정의를 할 수 없음 : 클래스에 'final'이 들어가면 상속을 할(받을) 수 없음!
- 프레임워크에서 많이 사용되는 설계 패턴
- 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의 하고 하위 클래스에서 다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현 하도록 함
'fianl' 키워드
- 변수에 쓰이면: 상수
- 메소드에 쓰이면 : 재정의 못함
- 클래스에 쓰이면 : 상속 못함
예제
public abstract class Car {
// abstract로구현한 메소드는 각각의 하위클래스에서 구현하여 사용
public abstract void drive(); //출발
public abstract void stop(); //멈춤
public abstract void wiper();
//Car, AICar 공통사항이므로void
public void startCar() {
System.out.println("시동을 켭니다.");
}
public void turnOff() {
System.out.println("시동을 끕니다.");
}
//추상메서드가아니라 구현된, 내용이없는 메소드이므로 추상메소드가 아니므로 오류가나지 않음
// -> 필요한경우 하위클래스에서 재정의함
public void washCar(){}
//변하면 안되는 순서이므로 fianl 로 선언 -> 하위클래스에서 변환 못함
//시나리오에 해당하는 부분
final public void run() {
startCar();
drive();
wiper();
stop();
turnOff();
washCar();
}
}
public class ManualCar extends Car{
@Override
public void drive() {
System.out.println("사람이 운전합니다.");
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("자율 주행합니다.");
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 aiCar = new AICar();
aiCar.run();
System.out.println("=================");
Car manualCar = new ManualCar();
manualCar.run();
}
}
//결과
시동을 켭니다.
자율 주행합니다.
자동차가 스스로 방향을 바꿉니다.
스스로 와이퍼를 조작합니다.
스스로 멈춥니다.
시동을 끕니다.
자동세차를 합니다.
=================
시동을 켭니다.
사람이 운전합니다.
사람이 핸들을 조작합니다.
와이퍼를 조작하여 사용합니다.
브레이크를 밟아서 정지합니다.
시동을 끕니다.
자바 파일에서 사용하는 상수 값 정의
public static final 키워드를 사용하면 new 하지 않고, Define.~해서 사용할수있다
public class Define {
public static final int MIN = 1;
public static final int MAX = 999999;
public static final double PI = 3.14;
public static final String GREETING = "Good Morning!";
public static final int MATH_CODE = 1001;
public static final int CHEMISTRY_CODE = 1002;
}
public class UsingDefine {
public static void main(String[] args) {
System.out.println(Define.GREETING);
System.out.println(Define.MIN);
System.out.println(Define.MAX);
System.out.println(Define.MATH_CODE);
System.out.println(Define.CHEMISTRY_CODE);
System.out.println("원주률은" + Define.PI + "입니다.");
}
}
출처 : 한번에끝내는Java/Spring웹개발마스터초격자패키지Online