Java 20. 추상클래스
추상클래스
absract (추상적인, 미완성의)
- 클래스 앞에 붙을 때
   - 클래스 내에 추상 메서드가 존재하는 클래스임.
- 메서드 앞에 붙을 때
   - 선언부만 존재하고 구현부가 없는 추상 메서드임.
추상 클래스 (abstract class)
- 구현 코드없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
- 메서드의 선언 (declaration) : 반환타입, 메서드 이름, 매개변수로 구성
- 메서드 정의 (definition) : 메서드 구현(implemention), 구현부(body)를 가짐
                                  {}
           - 예) public abstract int add(int x, int y);         // 선언
           -     int add(int x, int y) {}       // 구현부가 있음. 추상메서드 아님
- 
    abstract 예약어를 사용 
- 
    추상 클래스는 new 할수 없음 (인스턴스화 할수 없음) 
   - 모든 메서드가 구현 된 클래스라도 abstract로 선언하면 추상 클래스로 인스턴스 화 할수 없음
추상 클래스 구현하기
- 추상 클래스의 추상 메서드는 하위 클래스가 상속하여 구현
   - 추상 클래스 내의 추상 메서드 : 하위 클래스가 상속하여 구현 .
- 공통적으로 사용될 것이라고 예상되는 것을 모아서 하나의 추상클래스로 만듦.
   - 한곳에서 관리, 오류 줄어듦, 코드 중복 제거됨
final 예약어
- final 변수 : 값이 변경될 수 없는 상수
   - public static final double PI = 3.14;
- 
    final 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드 
- 
    final 클래스 : 상속할수 없는 클래스 
응용 - 템플릿 메서드 패턴
템플릿 메서드
- 추상 메서드나 구현된 메서드를 활용하여 시나리오(코드의 흐름)를 정의하는 메서드.
- final로 선언하여 하위 클래스에서 재정의(overrding) 할수 없게함.
- 
    프레임워크에서 많이 사용되는 설계 패턴. 
- Car
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 final void run() {
		startCar();
		drive();
		stop();
		turnOff();
	}
}
- ManualCar
public class ManualCar extends Car{
	
	@Override
	public void drive() {
		System.out.println("사람이 운전합니다.");
		System.out.println("사람이 핸들을 조작합니다.");
	}
	@Override
	public void stop() {
		System.out.println("브레이크를 밟아서 정지합니다.");
	}
	
}
- SelfDrivingCar
public class SelfDrivingCar extends Car{
	@Override
	public void drive() {
		System.out.println("자율 주행합니다.");
		System.out.println("차가 스스로 방향을 바꿉니다.");
	}
	@Override
	public void stop() {
		System.out.println("스스로 멈춥니다.");
	}
}
- Test
public class CarTest {
	public static void main(String[] args) {
		
		Car manualCar = new ManualCar();
		manualCar.run();
		
		System.out.println();
		
		Car SelfDrivingCar = new SelfDrivingCar();
		SelfDrivingCar.run();
	}
}
댓글남기기