본문 바로가기
Programming Language/Java

[자바] 추상 클래스 - (2) 템플릿 메서드

by ggyongi 2021. 10. 24.
반응형

- 추상 클래스의 활용

추상 클래스를 활용하여 템플릿 메서드를 구현할 수 있다. 이는 일종의 디자인 패턴으로 봐도 무방하다.

 

아래의 run 함수가 템플릿 메서드를 의미한다.

템플릿, 말그대로 하나의 틀을 만드는 과정이다.

run() 안에는 자동차의 시동을 키고~운전하여~시동을 끄는 과정이 순서대로 호출되고 있다.

package first_project;

public abstract class Car {
	public abstract void drive();
	public abstract void stop();
	
	public void startCar() {
		System.out.println("시동을 켭니다.");
	}
	
	public void turnOff() {
		System.out.println("시동을 끕니다.");
	}
	
	final public void run() {
		startCar();
		drive();
		stop();
		turnOff();
	}
		
}

  

package first_project;

public class AICar extends Car {

	@Override
	public void drive() {
		System.out.println("자율 주행합니다.");
	}

	@Override
	public void stop() {
		System.out.println("스스로 멈춥니다.");
	}

}

 

package first_project;

public class ManualCar extends Car {

	@Override
	public void drive() {
		System.out.println("사람이 운전합니다.");
	}

	@Override
	public void stop() {
		System.out.println("브레이크로 정지합니다.");
	}

}

 

package first_project;

public class CarTest {

	public static void main(String[] args) {
		System.out.println("==자율 주행 자동차==");
		Car myCar = new AICar();
		myCar.run();
		
		System.out.println("==일반 주행 자동차==");
		Car hisCar = new ManualCar();
		hisCar.run();
	}

}

결과

==자율 주행 자동차==
시동을 켭니다.
자율 주행합니다.
스스로 멈춥니다.
시동을 끕니다.
==일반 주행 자동차==
시동을 켭니다.
사람이 운전합니다.
브레이크로 정지합니다.
시동을 끕니다.

 

- 템플릿 메서드의 역할

시동을 키고, 달리고, 멈추고, 시동을 끄는 순서와 같은 변하지 않는 시나리오를 템플릿 메서드로 정의한다.

호출되는 메서드가 추상 메서드라면 차종에 따라 구현 내용이 바뀔 수는 있지만 순서는 바뀌지 않는다.

템플릿 메서드가 하위 클래스에서 재정의 되는 것을 막기위해 앞에 final 예약어를 붙여준다. 

이러면 하위 클래스에서 템플릿 메서드를 재정의할 수 없다.

템플릿 메서드는 로직 흐름이 이미 정해져 있는  프레임워크에서 많이 사용하는 기본 구현 방식이다. 

 

 

- final 예약어

사용 위치 설명
변수 final 변수는 상수를 의미
메서드 final 메서드는 하위 클래스에서 재정의할 수 없음
클래스 final 클래스는 상속할 수 없음

 

 

- 여러 파일에서 공유하는 상수만들기

package first_project;

public class Define {
	public static final int MIN = 1;
	public static final int MAX = 9999;
	public static final String HELLO = "hello!";
}

public -> 외부에서도 사용 가능하게 하기 위해

static -> 인스턴스 생성과 관계없이 클래스 이름으로 참조 가능하게 하기 위해

final -> 다른 값 대입 불가능

package first_project;

public class UsingDefine {
	public static void main(String[] args) {
		System.out.println(Define.HELLO); // 인스턴스 생성없이 클래스 이름으로 바로 참조
		System.out.println("최솟값은 "+ Define.MIN+"입니다.");
		System.out.println("최댓값은 "+ Define.MAX+"입니다.");
	}
}

결과

hello!
최솟값은 1입니다.
최댓값은 9999입니다.
 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글