프로그래밍공부(Programming Study)/파이썬(Python)

추상 메서드와 추상 클래스란?

Chaany 2024. 9. 8.
728x90

 

추상 메서드와 추상 클래스란?

추상 메서드추상 클래스는 객체지향 프로그래밍에서 중요한 개념으로, 구체적인 구현 없이 설계만 정의하는 데 사용됩니다. 이는 주로 공통적인 인터페이스나 동작을 여러 하위 클래스가 공유하게 하고 싶을 때 사용됩니다.

1. 추상 클래스(Abstract Class)란?

추상 클래스는 인스턴스화(객체를 만드는 것)가 불가능한 클래스입니다. 이 클래스는 주로 다른 클래스들이 상속받아 구현해야 할 공통적인 인터페이스나 메서드를 정의하는 용도로 사용됩니다. 추상 클래스 자체는 완전한 클래스가 아니기 때문에, 직접 객체를 생성할 수 없고 반드시 상속을 통해서 사용해야 합니다.

파이썬에서는 abc 모듈의 ABC 클래스를 사용하여 추상 클래스를 정의할 수 있습니다.

2. 추상 메서드(Abstract Method)란?

추상 메서드는 추상 클래스에 정의되어 있지만, 그 메서드의 내용이 구현되지 않은 상태입니다. 추상 메서드를 포함한 추상 클래스를 상속받는 클래스는 반드시 이 추상 메서드를 오버라이드(재정의)하여 구체적인 구현을 제공해야 합니다. 추상 메서드가 구현되지 않으면, 해당 클래스를 사용할 수 없습니다.

추상 메서드는 자식 클래스가 반드시 해당 메서드를 구현하도록 강제하기 때문에, 클래스의 동작을 표준화할 수 있습니다.

추상 클래스와 추상 메서드 사용 예시

from abc import ABC, abstractmethod

# 추상 클래스
class Animal(ABC):
    @abstractmethod
    def sound(self):
        pass

    def sleep(self):
        print("This animal is sleeping")

# 추상 클래스를 상속받은 구체 클래스
class Dog(Animal):
    def sound(self):
        print("Bark")

class Cat(Animal):
    def sound(self):
        print("Meow")

# 추상 클래스는 객체를 만들 수 없습니다
# animal = Animal()  # 오류 발생: 추상 클래스는 인스턴스화할 수 없음

# 구체 클래스만 객체 생성 가능
dog = Dog()
dog.sound()  # 출력: Bark
dog.sleep()  # 출력: This animal is sleeping

cat = Cat()
cat.sound()  # 출력: Meow
cat.sleep()  # 출력: This animal is sleeping

설명:

  • Animal 클래스는 추상 클래스이며, sound()라는 추상 메서드를 정의했습니다. 이 메서드는 구체적인 구현이 없고, pass 키워드로 표시됩니다.
  • DogCat 클래스는 Animal 클래스를 상속받아, sound() 메서드를 구체적으로 구현했습니다.
  • 추상 클래스로는 객체를 생성할 수 없으며, 반드시 추상 메서드를 구현한 구체적인 클래스만 인스턴스화할 수 있습니다.

3. 추상 클래스와 추상 메서드의 장점

  1. 코드 표준화: 여러 클래스가 동일한 인터페이스를 구현하도록 강제하여 코드의 일관성을 유지할 수 있습니다.
  2. 재사용성: 상위 클래스에서 공통된 기능은 추상 클래스에서 정의하고, 구체적인 기능은 하위 클래스에서 구현하게 하여 코드를 재사용할 수 있습니다.
  3. 유연한 설계: 추상 클래스를 통해 다양한 클래스들이 공통된 동작을 구현하되, 각 클래스마다 세부 구현을 다르게 할 수 있습니다.

4. 주의점

  • 추상 클래스는 인스턴스화할 수 없기 때문에, 상속을 통해서만 사용할 수 있습니다.
  • 추상 메서드는 반드시 자식 클래스에서 구현해야 합니다. 이를 구현하지 않으면 해당 자식 클래스도 추상 클래스로 간주됩니다.

결론

추상 클래스는 설계 수준에서 상속받는 클래스들이 따라야 할 인터페이스나 동작을 정의하는데 유용하며, 추상 메서드는 자식 클래스가 반드시 구현해야 할 메서드를 명시함으로써 코드의 일관성과 확장성을 높여줍니다. 이를 통해 클래스 간에 공통적인 구조와 기능을 유지하면서도, 다양한 방식으로 구현이 가능하게 되어 유연한 객체지향 설계를 할 수 있습니다.

728x90

댓글