Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch08. 추상 클래스(2) - 추상 클래스 응용 [템플릿 메서드] 본문

JAVA 문법

Ch08. 추상 클래스(2) - 추상 클래스 응용 [템플릿 메서드]

밍응애 2021. 3. 6. 20:04

* 템플릿 메서드

- 템플릿 메서드

: 추상메서드나 구현된 메서드를 활용하여 전체의 흐름(시나리오)를 정의해 놓은 메서드

: 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();
		

	}

}