개발/자바

Java 추상 클래스 (abstract class)

피터JK 2025. 2. 18. 11:48
728x90

🔹 Java 추상 클래스 (abstract class)

1️⃣ 추상 클래스란?

  • 추상 클래스(abstract class)추상 메서드(abstract method)를 포함할 수 있는 클래스
  • 추상 클래스 자체로 객체 생성이 불가능
  • 일부 구현을 포함할 수도 있고, 포함하지 않을 수도 있음
  • 자식 클래스가 상속받아 구현하도록 강제하는 역할

2️⃣ 추상 클래스 선언과 사용

추상 클래스 선언

abstract class Animal {
    abstract void makeSound();  // 추상 메서드 (몸체 없음)

    void sleep() {
        System.out.println("잠을 잡니다.");
    }
}

✔ abstract 키워드를 사용하여 클래스 및 메서드를 정의
✔ makeSound()는 구현이 없고, 하위 클래스에서 반드시 구현해야 함
✔ sleep() 메서드는 일반 메서드로 구현 포함 가능


추상 클래스를 상속받아 구현

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

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("야옹!");
    }
}

✔ Dog와 Cat 클래스는 Animal을 상속
✔ makeSound() 메서드를 반드시 구현해야 함


사용 예시

public class AbstractExample {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myDog.makeSound();  // 출력: 멍멍!
        myCat.makeSound();  // 출력: 야옹!
        myDog.sleep();      // 출력: 잠을 잡니다.
    }
}

✔ Animal 자체로는 객체를 생성할 수 없음
✔ Dog, Cat 객체는 Animal 타입으로 다형성(polymorphism) 적용 가능


3️⃣ 추상 클래스 vs 인터페이스

특징  추상 클래스 (abstract class)  인터페이스 (interface)
객체 생성 ❌ 직접 생성 불가능 ❌ 직접 생성 불가능
메서드 ✔ 추상 메서드 + 일반 메서드 포함 가능 ✔ 기본적으로 모든 메서드가 추상 메서드 (Java 8부터 default 메서드 지원)
필드(변수) ✔ 인스턴스 변수 가능 ❌ 모든 필드는 public static final (상수)
상속 관계 ✔ extends 사용 (단일 상속) ✔ implements 사용 (다중 구현 가능)
사용 목적 ✔ 공통된 동작 일부 구현 후 하위 클래스에서 확장 ✔ 공통된 동작을 강제 (구현 없이 설계 제공)

✅ 언제 사용해야 할까?

  • 공통된 로직을 일부 구현하면서 하위 클래스가 추가적인 동작을 구현해야 할 때 → abstract class
  • 구현 없이 단순히 설계(명세)만 제공하고 싶을 때 → interface

4️⃣ 추상 클래스의 활용 예시

템플릿 메서드 패턴 (Template Method Pattern)

abstract class Game {
    abstract void initialize();
    abstract void start();
    abstract void end();

    // 템플릿 메서드
    public final void play() {
        initialize();
        start();
        end();
    }
}

class Soccer extends Game {
    @Override
    void initialize() { System.out.println("축구 게임 초기화"); }
    @Override
    void start() { System.out.println("축구 경기 시작!"); }
    @Override
    void end() { System.out.println("축구 경기 종료!"); }
}

public class TemplateMethodExample {
    public static void main(String[] args) {
        Game game = new Soccer();
        game.play();
    }
}

공통된 실행 흐름(play())은 추상 클래스에서 정의
세부 동작(initialize(), start(), end())은 하위 클래스에서 구현
객체마다 다른 동작을 유지하면서 공통된 흐름을 보장할 때 사용


🎯 정리

추상 클래스는 공통된 동작을 일부 구현하면서, 하위 클래스에서 필수적으로 구현해야 하는 기능을 정의할 때 사용
인터페이스와 달리 일반 메서드와 멤버 변수를 가질 수 있음
템플릿 메서드 패턴과 같은 설계 패턴에서 많이 사용됨
객체 생성 불가능하고, 반드시 하위 클래스에서 구현해야 사용 가능

🚀 "부분적으로 구현된 클래스가 필요할 때 추상 클래스를 고려하자!"

728x90