추상클래스 기본
- 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
- 예) int add(int x, int y); // 선언
int add(int x, int y){ } // 구현부가 있음, 추상 메서드 아님
- 추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )
![](https://velog.velcdn.com/images/frost_12/post/5aa514c0-eb3a-4033-b7cb-83c5daf363a9/image.png)
추상클래스 응용 - 템플릿 메서드 패턴
![](https://velog.velcdn.com/images/frost_12/post/eda8a390-2e2a-4210-8c90-74190e144a3c/image.png)
![](https://velog.velcdn.com/images/frost_12/post/a7bc22e6-948f-481c-86bd-2f5d729a0040/image.png)
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("시동을 끕니다.");
}
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 클래스 / 메서드
![](https://velog.velcdn.com/images/frost_12/post/ee1ef780-1553-4fab-afae-7ec233d5b9f2/image.png)
![](https://velog.velcdn.com/images/frost_12/post/6de8e3e7-03ed-4df0-b306-068d0cf74770/image.png)