thumb

 

추상 클래스와 템플릿 메서드

 

 

추상 클래스(abstract class)

 

 

추상 클래스는 추상 메서드를 포함하고 있다. 추상 메서드를 선언하는 이유는 자식 클래스가 추상 클래스인 부모 클래스를 상속받아서 사용하게 되는데, 부모 클래스에서 자식 클래스에 사용될 메서드의 코드 구현을 모르기 때문에 메서드 이름만 정의하고 코드 구현은 자식 클래스에서 이루어지는 것이다.

 

 

간단하게 말하자면 부모 클래스에서 하위 클래스에게 메서드 코드 작성을 위임했다고 해석하면 된다. 

추상 클래스는 객체로 생성할 수 없다.

 

 

추상 클래스를 상속받는 하위 클래스는 상위 클래스의 추상 메서드를 구현할 책임이 있다.

 

 

▶ 추상 클래스 사용방법

 

public abstract class Computer { ..<-- 추상 클래스

	public abstract void display(); // <- 추상 메서드 
	public abstract void typing();  // <- 추상 메서드 

	public void turnOn() {
		System.out.println("전원을 켭니다.");
	}
	public void turnOff() {
		System.out.println("전원을 끕니다.");
	}
}

 

 

abstract 예약어를 사용하여 추상 클래스와 추상 메서드를 정의한다.

 

 추상 클래스 예제

 

1
추상 클래스(Computer.class)
2
하위 클래스(Desktop.class)
3
하위 클래스(Notebook.class)
4
main(excute.class)

 

 

res
결과

 

추상 클래스의 메서드 또한 오버라이딩이 가능하며, 하위 클래스에서는 추상 메서드의 구현을 하여 사용하게 된다. 주석의 느낌이 물씬 난다.

 

템플릿 메서드

 

추상 메서드나 구현된 메서드를 활용해 전체 기능의 흐름 또는 시나리오를 정의하는 메서드이다. final 예약어로 선언하며 하위 클래스에서 재정의할 수 없다. 하위 클래스에서 오바라이딩할 수 없는 메서드이다.

 

▶ 템플릿 메서드 사용방법

 

 

public final void run(){ ... }

 

final public void run(){ ... }

 

 

 

Car.class

 

package templatemethod;

public abstract class Car {

	public abstract void Drive();
	public abstract void Break(); 
	
	public void startCar() {
		System.out.println("시동을 건다");
	}
	public void turnOff() {
		System.out.println("시동을 끈다");
	}
	public final void run() { // <-- 템플릿 메서드
		startCar();
		Drive();
		Break();
		turnOff();
	}
}

 

CarTest.class

 

package templatemethod;

public class CarTest {

	public static void main(String[] args) {

		Car mycar1 = new HumanDriveCar();
		Car mycar2 = new SelfDrivingCar();
		
		mycar1.run();
		mycar2.run();
	}
}

 

HumanDriveCar.class

 

package templatemethod;

public class HumanDriveCar extends Car {

	@Override
	public void Drive() {
		// TODO Auto-generated method stub
		System.out.println("사람이 운전합니다.");
		System.out.println("사람이 핸들을 조작합니다.");
	}
	@Override
	public void Break() {
		// TODO Auto-generated method stub
		System.out.println("사람이 브레이크로 정지합니다.");
		
	}
}

 

SelfDrivingCar.class

 

package templatemethod;

public class SelfDrivingCar extends Car {

	@Override
	public void Drive() {
		// TODO Auto-generated method stub
		System.out.println("자율주행 합니다.");
		System.out.println("자동차가 스스로 방향을 전환합니다.");
	}
	@Override
	public void Break() {
		// TODO Auto-generated method stub
		System.out.println("자동차가 스스로 멈춥니다.");
	}
}

 

result
결과