카테고리 없음

객체지향 프로그래밍 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