추상 클래스

JH·2022년 12월 4일
0

2022-Java-Study

목록 보기
9/10

추상 클래스

추상 메서드를 포함한 클래스

  • 추상 메서드는 구현 코드없이 메서드의 선언만 있는 메서드
  • abstract 예약어 사용
  • 추상 클래스는 인스턴스화(new) 할 수 없음

cf. concrete class

public abstract class Computer {
    public abstract void display(); // { 구현 부분이 없음 }
}

추상 클래스를 쓰는 이유

코드를 구현할 구체적인 방법을 모를 때 미리 선언해두고, 상속받는 쪽에서 구현한다.

Desktop 클래스는 Computer 메서드에 대한 구현 책임이 있다고도 한다.

public abstract class Computer {
    public abstract void display();
    public abstract void typing();

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

    @Override
    public void display() {
        System.out.println("Desktop display()");
    }

    @Override
    public void typing() {
        System.out.println("Desktop typing()");
    }
}

템플릿 메서드

추상 메서드나 구현된 메서드를 활용하여 전체 기능의 흐름을 정의하는 메서드

  • final로 선언하면 하위 클래스에 재정의 할 수 없음
  • 프레임워크에서 많이 사용되는 설계 패턴
  • 추상 클래스로 선언된 상위 클래스에 템플릿 메서드를 활용하여 전체적인 흐름을 정의
package template;

public abstract class Car {
    public abstract void drive();
    public abstract void stop();
    
    public abstract void wiper();
    // 나중에 추가한 경우 하위 클래스에서 구현해줘야 함

    public void washCar() {}
    // 추상클래스가 아님
    // 필요에 의해 재정의

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

    public final void run(){ // 바뀌면 안되는 시나리오
        startCar();
        drive();
        wiper();
        stop();
        washCar();
        turnOff();
    }
}

final

  • final 변수는 값이 변경될 수 없는 상수, 값 할당은 한 번만 가능

  • final 메서드는 하위 클래스에서 재정의 불가

  • final 클래스는 상속 불가

profile
매일 한 문제씩 풀기

0개의 댓글