Tiny Finger Point Hand With Heart
본문 바로가기
1일1CS

38. 인터페이스와 추상클래스의 차이

by yoondii 2023. 1. 16.
728x90
반응형

추상 클래스(abstract class)란?

파이썬은 추상 클래스(abstract class)를 제공한다. 추상 클래스란 구현 내용이 없고 메소드 목록만 가진 클래이며, 추상클래스 자체로는 인스턴스화가 불가능 하다. 추상 클래스는 클래스의 메소드를 상속 받는 파생 클래스에게 구현하도록 강제하기 위해 사용 된다.

  • 추상클래스란 미구현 추상메소드를 한개 이상 가지며, 자식클래스에서 해당 추상 메소드를 반드시 구현하도록 강제한다.
  • 상속받은 클래스는 추상메소드를 구현하지 않아도, import할 때까지 에러는 발생하지 않으나 객체를 생성할 시 에러가 발생한다.
  • 추상클래스를 만들기 위한 형식은 아래와 같다.
  • 반드시 abc 모듈을 import 해야다.
  • 추상메소드는 생략하면 기본적인 클래스 기능은 동작합니다만, 추상메소드를 추가한 후에는 객체를 생성하면 에러가 발생한다.

추상 클래스 문법

파이썬에서 추상 클래스를 사용하는 방법은 생각 보다 간단하다.

  • 가장 먼저 abc(abstract base class) 모듈의 ABC 클래스와 abstractmethod 데코레이터를 임포트한다.
  • 그리고 ABC 클래스를 상속 받은 추상 클래스를 정의하고
  • 파생 클래스에게 구현을 강제할 메소드에 @abstractmethod 데코레이터를 추가하면 끝이다.
from abc import *
class 추상클래스명(metaclass=ABCMeta):

     @abstractmethod
        def 추상메소드(self):
            pass

추상클래스(abstract class) 사용

  • 예제를 위해 'abstract.py' 파일을 만들고, 아래의 코드를 작성.
from abc import *


class AbstractCountry(metaclass=ABCMeta):
    name = '국가명'
    population = '인구'
    capital = '수도'

    def show(self):
        print('국가 클래스의 메소드입니다.')

class Korea(AbstractCountry):

    def __init__(self, name,population, capital):
        self.name = name
        self.population = population
        self.capital = capital

    def show_name(self):
        print('국가 이름은 : ', self.name)

  • 아직 추상메소드를 작성하지 않았다.
  • 하지만 추상클래스라할지라도 기본적인 클래스 기능은 동작한다.(추상메소드를 작성하지 않았기때문에..)
  • 상속한 객체도 생성이 된다.
>>> from abstract import *
>>> a = AbstractCountry()
>>> a.show()
국가 클래스의 메소드입니다.
>>> b = Korea("대한민국", 50000000, '서울')
>>> b.show_name()
국가 이름은 :  대한민국

  • AbstarctCountry 클래스에 추상메소드를 추가한다.
class AbstractCountry(metaclass=ABCMeta):

    ... 생략

    @abstractmethod
    def show_capital(self):
        print('국가의 수도는?')
  • 다시 REPL 에서 상속받은 Korea 클래스 객체를 생성.
  • 객체 생성 시에 에러가 발생.
>>> from abstract import *
>>> a = Korea("대한민국", 50000000, '서울')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Korea with abstract methods show_capital

  • Korea 클래스에서 상속받은 추상메소드를 구현.
    class Korea(AbstractCountry):

       def show_capital(self):
           super().show_capital()
           print(self.capital)

        ... 생략
  • 결과를 확인.
>>> from abstract import *
>>> a = Korea("대한민국", 50000000, '서울')
>>> a.show_capital()
국가의 수도는?
서울
  • 추상메소드를 추가하고 객체를 생성하면 에러가 발생.
>>> from abstract import *
>>> a = AbstractCountry()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class AbstractCountry with abstract methods show_capital

인터페이스란?

  • 추상 클래스 중에서 추상 메소드만 있고 일반 메소드는 없는 것을 인터페이스라 부른다.
  • 파이썬에는 없는 개념.
  • 클래스가 사용하지 않을 메소드에 의존할 것을 강요하면 안 된다. = 클래스가 나중에 사용하지도 않을 메소드를 가지도록 강제하지 말라는
  • 이미 공부했다시피 추상클래스를 상속받으면 자식 클래스는 추상 메소드들을 반드시 오버라이딩해야 한다.
  • 어떤 인터페이스(추상 클래스)를 상속받았을 때 사용하지 않을 메서드가 있다면 인터페이스 분리 원칙 위반이다.
  • 인터페이스 분리 원칙을 위반하지 않기 위해서는 인터페이스를 작게 분리해야 한다. (뚱뚱한 인터페이스를 만들지 말자.)
  • 인터페이스를 정의할 땐 항상 더 작게 쪼갤 수 있을지 고민해야 한다.
  • 그렇다고 인터페이스 하나당 메서드 하나만 있을 정도로 잘게 쪼개라는 것은 아니다.
  • 같은 기능이나 역할로 묶어서 인터페이스를 잘 만들어야 한다.

둘의 차이점을 자바(JAVA)로 보자면

추상 클래스(Abstract Class) 인터페이스(Interface)
상속하여 공통된 기능을 만들고, 확장하기 위함 구현하는 객체들이 같은 동작을 보장하기 위함
다중상속 불가능 다중상속 가능
생성자와 일반변수 모두 가질 수 있다. 생성자와 일반변수를 가질 수 없다.
메서드를 부분적으로 구현할 수 있다. 메서드 선언만 가능하다.
extends 키워드를 사용한다. implements 키워드를 사용한다.
  • 추상클래스 -> 객체들의 공통 특성들을 모아놓은 클래스
  • 인터페이스 -> 객체 생성을 위한 설계도 

라고 생각하면 조금은..이해가 될것이다.

 

 

 

출처-

https://coding-factory.tistory.com/868

https://wikidocs.net/16075

https://devlog-wjdrbs96.tistory.com/370

 

728x90
반응형

'1일1CS' 카테고리의 다른 글

40. [운영체제] 프로세스(Process)와 스레드(thread)  (0) 2023.01.18
39. [Database] ORM이란?  (0) 2023.01.17
37. 깃과 깃허브의 차이점  (0) 2023.01.13
36. Transaction과 ACID  (2) 2023.01.12
35. UDP/TCP 특징 및 차이점  (0) 2023.01.11

댓글