코딜기

[Java] 추상 클래스와 추상 메서드 (Abstract) 본문

Language/Java

[Java] 추상 클래스와 추상 메서드 (Abstract)

코딜기 2024. 9. 21. 19:27
반응형

추상 메서드(Abstract Method)란?

  • 메서드 선언만 되어 있고, 메서드의 바디(중괄호 부분)가 없는 아직 완성되지 않은 메서드를 추상 메서드라고 합니다.
  • 형태만 구축되어 있고, 구체적인 구현은 없는 메서드입니다.
  • 추상 메서드는 반드시 추상 클래스 안에서만 선언할 수 있습니다.

추상 클래스(Abstract Class)란?

  • 추상 메서드를 하나 이상 포함한 클래스를 추상 클래스라고 부릅니다.
  • 미완성 메서드를 포함하고 있기 때문에 객체를 직접 생성할 수 없습니다.
  • 추상 클래스를 상속받은 자식 클래스가 추상 메서드를 구현해야만 객체를 생성할 수 있습니다.
  • 부모가 완성하지 못한 메서드를 자식 클래스가 반드시 완성해야 부모와 자식의 객체가 모두 생성될 수 있습니다.

추상 클래스 및 추상 메서드 사용

public abstract class Animal {
    public abstract void speak();

    public void walk() {
        System.out.println("걷기");
    }
}
  • speak 메서드는 추상 메서드로 선언되었고, walk 메서드는 일반 메서드로 선언되었습니다.
    • 추상 클래스에는 추상메서드만 선언할 수 있는 게 아니라 일반 메서드와 필드도 얼마든지 선언이 가능합니다.
  • Animal 클래스에서 동물이 speak 하는 방법을 부모 클래스에서 정하기 어려운 이유는, 자식 클래스마다 우는 방식이 다르기 때문입니다.
  • 따라서 이 메서드는 부모 클래스가 직접 구현하기보다는, 자식 클래스가 각자의 방식으로 오버라이딩해야 합니다.
  • 자식 클래스들이 반드시 오버라이딩해야 할 메서드는 강제하는 것이 좋기 때문에 speak 메서드를 추상 메서드로 선언한 것입니다.
  • 추상 메서드가 포함된 클래스는 추상 클래스로 선언되어야 하므로, Animal 클래스도 추상 클래스로 선언되었습니다.

public class Cat extends Animal {
    @Override
    public void speak() {
        System.out.println("야옹");
    }
}
public class Dog extends Animal {
    @Override
    public void speak() {
        System.out.println("멍멍");
    }
}
  • 자식 클래스인 Cat과 Dog를 선언하고, extends를 통해 Animal을 상속받았다면, speak 추상 메서드반드시 오버라이딩해야 합니다.
  • 부모 클래스인 Animal미완성 메서드로 남겨 놓았기 때문에, 자식 클래스가 이를 구현하지 않으면 객체를 생성할 수 없습니다.
  • 자식 클래스는 부모가 남겨둔 추상 메서드구체적으로 구현해야만 정상적으로 객체를 생성할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Cat();
        Animal animal2 = new Dog();

        animal1.speak(); // "야옹"
        animal2.speak(); // "멍멍"
    }
}
  • 다형성을 적용하여 객체를 생성하고, 각각의 메서드를 호출해 보았습니다.
  • 오버라이딩강제되었기 때문에, 문제없이 메서드가 정상적으로 호출될 것입니다.

추상 개념을 사용하는 이유

1. 다형성 구현 목적이 명확해집니다.

  • 추상 메서드는 자식 클래스에서 반드시 구현되어야 하기 때문에, 다형성을 적용할 때 부모 클래스의 선언을 더 단순화할 수 있습니다.
  • 자식 클래스가 구체적인 구현을 담당하므로 유지보수성이 높아집니다.

2. 코드 디자인 패턴 적용

  • 강제화의 성격을 활용하여, 정형화된 코드 패턴을 쉽게 강제할 수 있습니다.

3. 코드 재사용성을 통한 객체지향적 프로그래밍

  • 상속을 통해 자식 클래스에서 구현이 강제되므로, 코드 재사용이 용이해집니다. 이는 다형성의 주요 목적과도 연결됩니다.
  • 객체지향적 프로그래밍의 특성상, 코드가 더 구체적이고 명확하게 작성될 수 있습니다.
반응형
Comments