개발 새발/JAVA

[Java] 자바 객체지향 - 추상클래스

recordari 2025. 4. 9. 16:01

추상클래스

= 미완성 설계도(= template) 또는 추상 메서드를 가진 클래스라고 할 수 있다.

추상클래스는 키워드 abstract를 붙이면 된다.

abstract class Animal {
    abstract void sound();  // 추상 메서드
    void breathe() {
        System.out.println("숨을 쉰다");
    }
}

미완성 설계도로 완성된 제품을 만들 수 없듯이, 추상클래스로는 인스턴스를 생성할 수 없다.

왜 완성을 안 시켰을까?
사람들이 공통적으로 잘 쓸만한 것들/변경되지 않을 것들(템플릿)을 남겨두고, 추가적으로 덧붙이는 걸 쉽게 하도록 도와주기 위해서

 

 

추상메서드

메서드는 선언부와 구현부(몸통)으로 구성되어 있다.
선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상메서드이다. 즉, 미완성 메서드다.

abstract class Animal {
    abstract void sound();  // 선언만 하고, 구현은 X
}

왜 완성을 안 시켰을까?
메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문이다.
추상메서드 역시 키워드 abstract를 앞에 붙이고, {} 괄호 대신 ;으로 끝내면 된다.

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍!");
    }
}

 

 

추상화란?

공통점을 찾아내서 공통의 조상을 만드는 것.

  • 변하지 않는 것(공통의 것)을 남기고
  • 변하는 것과 분리한다

그리고 분리한 다음에는 다시 완전하게 만들어야 한다.

1. 상속, 2. 주입 으로 완성
→ 상속으로 하는 게 template method 패턴
→ 주입(포함)으로 하는 게 전략 패턴
→ 상속과 주입을 따로 해도 되고, 같이 써도 됨

 

예시 코드

abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    // 일반 메서드: 공통 로직
    void readyMessage() {
        System.out.println("=== 게임을 시작합니다 ===");
    }

    // 템플릿 메서드 (순서 고정)
    public final void play() {
        readyMessage();   // 공통 동작
        initialize();     // 각 게임별 초기화
        startPlay();      // 게임 시작
        endPlay();        // 게임 종료
    }
}
class Football extends Game {
    void initialize() {
        System.out.println("축구 게임 준비 중");
    }

    void startPlay() {
        System.out.println("축구 게임 시작!");
    }

    void endPlay() {
        System.out.println("축구 게임 종료");
    }
}
public class Main {
    public static void main(String[] args) {
        Game game = new Football();
        game.play();
    }
}

 

  • play()는 템플릿 메서드
    전체 실행 순서를 정의하고,
    → 구체적인 내용은 하위 클래스에 위임
  • readyMessage()는 일반 메서드
    → 게임 시작 전 공통 메시지를 출력
    → 모든 게임에서 같은 방식으로 사용되는 공통 기능이기 때문에 추상화하지 않고 추상 클래스에서 직접 구현된다.
탬플릿 메서드란?
템플릿 메서드 패턴 은 알고리즘의 구조(순서)를 상위 클래스에 정의하고, 그 구조를 이루는 구체적인 단계(step)는 하위 클래스에 맡기는 패턴