Post

[Java] 추상 클래스(Abstract)

추상 클래스란?


자바에서 추상 클래스(Abstract Class)는 공통적인 기능이나 구조를 정의하고,
구현은 하위 클래스에서 하도록 강제하기 위해 사용된다.

추상 클래스는 스스로는 인스턴스를 생성할 수 없고,
상속을 통해서 자식 클래스로 파생되기 위한 클래스인 것이다.

또한, 관련된 여러 클래스들의 공통분모를 정의하기 위한 클래스이다.

추상 클래스


  • abstract 키워드로 선언된 클래스
  • 일부 메서드는 구현하고, 일부는 추상 메서드로 선언하여 자식 클래스에서 구현하도록 강제
  • 인스턴스 생성 불가 (상속을 통해서만 가능)
1
2
3
4
5
6
7
8
9
abstract class Animal {
    // 일반 메서드 (구현 ⭕️)
    void breathe() {
        System.out.println("숨을 쉽니다.");
    }

    // 추상 메서드 (구현 ❌)
    abstract void sound();
}

추상 메서드


  • abstract 메서드 사용
  • 본문이 없는 메서드
  • 반드시 자식 클래스에서 오버라이딩 해야 함
1
abstract void sound(); // 구현 없이 선언만

사용 예시


1
2
3
4
5
6
7
8
9
10
11
12
13
// 추상 클래스
abstract class Animal {
    public void eat() {
        System.out.println("먹는다.");
    }

    // ⭐️ 어짜피 자식 클래스에서 구현하도록 만드는 것이기 때문에
    // 추상 메서드에서는 접근 제어자가 필요없다.
    abstract void sound();

    // ❌ 클래스 메서드는 abstract 불가 (상속만 가능하기 때문에)
    // abstract static void sleep();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 구체 클래스
public class Dog extends Animal {
    // ⭐️ 자식 클래스에서 반드시 구현
    // 구현하지 않는다면 오류가 발생한다.
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
    public static void main(String[] args) {
        // ❌ 불가
        // Animal animal = new Animal();

        Animal dog = new Dog();
        dog.eat();    // 먹는다.
        dog.sound();  // 멍멍

        Animal cat = new Cat();
        cat.sound();  // 야옹
    }
}