본문 바로가기

자바

[JAVA] 추상 클래스(abstract)

728x90

추상 클래스

추상 클래스란 객체를 직접 생성할 수 없는 클래스로, 주로 다른 클래스들이 상속받아 사용할 공통적인 기능(메서드, 필드 등)을 정의하는 용도로 사용된다.

공통적인 기능을 정의하고, 일부 메서드는 자식 클래스가 반드시 구현하도록 강제하는 역할을 한다.

1. 목적

  1. 코드의 재사용성 증가
    • 공통적인 메서드를 제공하여 중복 코드 방지
  2. 일관된 인터페이스를 제공한다.
    • 특정 기능을 반드시 구현하도록 강제
  3. 유지보수 및 확장에 용이하다.
    • 추상 클래스에 새로운 기능을 추가하면, 이를 상속받은 모든 클래스에서 사용할 수 있음
  4. 객체의 역할과 행동을 명확히 구분할 수 있다.
    • 예: 동물(Animal) 클래스에서 먹다(eat)는 공통적으로 제공하고, 소리 내기(makeSound)는 각 동물마다 다르게 구현하도록 강제

2. 특징

  1. 객체 생성 불가능
    • new 키워드로 직접 인스턴스를 생성할 수 없다.
    • 반드시 하위 클래스에서 상속받아 사용해야 한다.
  2. 추상 메서드를 가질 수 있음
    • abstract 키워드가 붙은 메서드는 구현 없이 선언만 존재하며, 이를 상속받은 클래스가 반드시 오버라이딩해야 한다.
  3. 일반 메서드와 필드를 가질 수 있음
    • 공통된 동작을 정의할 수 있다.
    • private, protected, public 접근 제어자를 사용할 수 있다.
  4. 다형성 활용 가능
    • 부모 클래스 타입으로 자식 객체를 참조할 수 있다.
    • 런타임 시점에서 동적 바인딩이 가능하다.
  5. 단일 상속만 가능
    • 인터페이스와 다르게 하나의 추상 클래스만 상속이 가능하다.

사용 예시

1. 추상 클래스 선언

// 추상 클래스 정의
abstract class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    // 일반 메서드 (공통 기능 제공)
    void eat() {
        System.out.println(name + " is eating.");
    }

    // 추상 메서드 (각 클래스에서 구현 필수)
    abstract void makeSound();
}

2. 하위 클래스에서 상속 및 구현

/ 개(Dog) 클래스 - 추상 클래스를 상속받음
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    // 추상 메서드 구현 (필수)
    @Override
    void makeSound() {
        System.out.println(name + " says: Woof woof!");
    }
}

// 고양이(Cat) 클래스 - 추상 클래스를 상속받음
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    @Override
    void makeSound() {
        System.out.println(name + " says: Meow!");
    }
}

3. 사용 예시

public class Main {
    public static void main(String[] args) {
        // Animal animal = new Animal("Some Animal"); // 오류: 추상 클래스는 직접 객체 생성 불가

        Dog dog = new Dog("Buddy");
        Cat cat = new Cat("Whiskers");

        dog.eat(); // Buddy is eating.
        dog.makeSound(); // Buddy says: Woof woof!

        cat.eat(); // Whiskers is eating.
        cat.makeSound(); // Whiskers says: Meow!

        // 다형성 활용
        Animal myPet = new Dog("Charlie");
        myPet.makeSound(); // Charlie says: Woof woof!
    }
}
728x90

'자바' 카테고리의 다른 글

[JAVA] 인터페이스(Interface)  (0) 2025.03.13
[JAVA] 다형성과 정적, 동적 바인딩  (0) 2025.03.13
[JAVA] 상속  (0) 2025.03.12
[JAVA] Stream  (0) 2025.03.11
[JAVA] 배열(Array)  (0) 2025.03.11