추상클래스, final 예약어

겨울조아·2023년 3월 14일
0

추상클래스 기본

  • 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
  • 예) int add(int x, int y); // 선언
    int add(int x, int y){ } // 구현부가 있음, 추상 메서드 아님
  • 추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )


추상클래스 응용 - 템플릿 메서드 패턴

Car.java

public abstract class Car {

	public abstract void drive();

	public abstract void stop();

	public void startCar() {
		System.out.println("시동을 켭니다.");
	}

	public void turnOff() {
		System.out.println("시동을 끕니다.");
	}

	// 훅 메서드 : 구현부는 있지만 abstract는 아님
	// 이렇게 하는 이유 => abstract는 반드시 하위클래스에서 구현을 해야함
	// 근데 이거는 구현할지 안할지 모를 때는 구현부를 비워두고 일단 넣어놓으면 아무일도 안하니까.
	// 따라서 오버라이딩 안해도 됨
	public void washCar() {}

	public void run() {
		startCar();
		drive();
		stop();
		turnOff();
		washCar();
	}
}

AICar.java

public class AICar extends Car {

	@Override
	public void drive() {
		System.out.println("자율 주행합니다.");
		System.out.println("자동차가 스스로 방향을 바꿉니다.");
	}

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

ManualCar.java

public class ManualCar extends Car {

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

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

	public void washCar() {
		System.out.println("손세차를 합니다.");
	}
}

CarTest.java

public class CarTest {

	public static void main(String[] args) {

		Car aiCar = new AICar();
		aiCar.run();
		System.out.println("================");
		Car manualCar = new ManualCar();
		manualCar.run();
	}
}


final 클래스 / 메서드

0개의 댓글