📕 들어가기 앞서

📌 추상자료형

기능 구현은 정의만하고 논리적으로만 만들어진 개념

📌 표현 방법

아래 3가지로 구분할 수 있다
각각 구현의 정도에 따라서 나뉘어져 있고
독자가 이해하기 편하게 코드로 작성을 해보았다
( abc모듈을 썼으니 어떤 느낌인지 잘 보기😉 )

구체클래스

구체적인 기능 구현이 되어있는 클래스

class Human:
    def __init__(self, N, A):
        self.name = N
        self.age = A
    
    def __str__(self):
        return f"저의 이름은 {self.name}이고 나이는 {self.age}입니다"

class Person(Human):...

A = Person("명일", "비밀")
print(A)
저의 이름은 명일이고 나이는 비밀입니다

추상클래스

기능 구현이 일부 되어있는 클래스
( 자식 클래스는 구현을 강제받는다 )

from abc import ABC, abstractmethod

class Human(ABC):
    def __init__(self, N, A):
        self.name = N
        self.age = A
    
    @abstractmethod
    def __str__(self):...

class Person(Human):
    def __str__(self):
        return f"저의 이름은 {self.name}이고 나이는 {self.age}입니다"

A = Person("명일", "비밀")
print(A)
저의 이름은 명일이고 나이는 비밀입니다

인터페이스

논리적인 개념으로 만들어진 클래스
( 자식 클래스는 구현을 강제받는다 )

from abc import ABC, abstractmethod

class Human(ABC):
    @abstractmethod
    def __str__(self):...

class Person(Human):
    def __init__(self, N, A):
        self.name = N
        self.age = A
    
    def __str__(self):
        return f"저의 이름은 {self.name}이고 나이는 {self.age}입니다"

A = Person("명일", "비밀")
print(A)
저의 이름은 명일이고 나이는 비밀입니다

구현 정도의 따라서 인터페이스 이거나 추상클래스, 구체클래스로 나뉜다


📌 이?상한 것

추상클래스와 인터페이스는 생성자 자리가 다르다는 것이다
( 이해를 돕기 위해서 생성자를 사용하는거지 생성자만의 특징이 아니니 잘 기억해두자 )

이게 무슨 차이가 있느냐?
추상클래스는 Human에 __init__이 구현되어 있고
인터페이스는 Human에 __init__이 구현되어 있지 않다는 것이다

인터페이스에는 생성자를 정의하는 건 추천하지 않는다
인터페이스는 구현을 강제한다는 역할을 가지고 있기 때문에 유연성을 해칠 수 있다


📌 더 자세한 내용

  1. 추상클래스에서는 함수를 구현해도 된다 하지만
    인터페이스에는 오직 정의만 해야 된다, 구현하면 안된다

  2. 위 코드처럼 __str__를 강제 구현하도록 만들 수 있다

from abc import ABC, abstractmethod

class Human(ABC):
    @abstractmethod
    def __str__(self):...

class Person(Human):...

A = Person()
print(A)
Traceback (most recent call last):
  File "파일 위치", line 9, in <module>
    A = Person()
TypeError: Can't instantiate abstract class Person with abstract method __str__    
  1. 파이썬에는 순수한 인터페이스는 없기에 추상클래스로 만들어서 인터페이스처럼 쓸 수는 있다

📖 들어가기

위에서 코드를 짤 때, abc모듈을 남발했는데 이제 이게 뭔지에 대해서 설명을 해본다
파이썬은 동적 타이핑 언어이기때문에 인터페이스와 추상클래스가 필요없지만
코드의 관리나 유연성 때문에 인터페이스와 추상클래스가 필요해질 때가 있다
그때, abc를 이용해서 추상자료형을 만들어준다

📌 abc 모듈

  1. [ ABC ]는 추상클래스를 정의하기 위한 클래스로 추상 함수가 포함된 클래스를 만들때, 사용한다

  2. [ ABCMeta ]는 메타클래스로 클래스를 생성하고 관리하는 역할을 하며 ABC의 기반 클래스이다

  3. [ abstractmethod ]는 추상 함수를 정의할 때, 사용해야하는 테코레이터다

  4. [ register ]는 간접적인 상속 관계를 만들 수 있다

  5. [ issubclass ][ isinstance ]는 각각 클래스 상속 여부와 인스턴스 소속 여부를 확인하는 함수다

위 명령어를 제외하고도 더 있지만 더 다루기에는 abc모듈에 대해서 다루는게 아닌 class에 대해서 다루는 경향이 더 강한 것 같아서 따로 정리하고자 한다
그리고 안 쓰는 코드는 따로 정리하지 않았다, 찾아보고자 하면 독자도 충분히 찾아서 공부 할 수 있을 것이라고 생각한다


📌 예제

위 명령어를 이해하는데 아래 코드가 도움이 되길 바란다

from abc import ABC, ABCMeta, abstractmethod

class Arm(ABC):
    @abstractmethod
    def punch(self):return "?"

class Lag(metaclass = ABCMeta):
    @abstractmethod
    def kick(self):return "?"

class Person(Arm):
    def punch(self):return "주먹질 하기!"
    def kick(self):return "발길질 하기!"

Lag.register(Person)
p1 = Person()
print(p1.punch())
print(p1.kick())

print(isinstance(p1, Arm), issubclass(Person, Arm))
print(isinstance(p1, Lag), issubclass(Person, Lag))
주먹질 하기!
발길질 하기!
True True
True True

🔖 끝내기 전에

간단하게 정리를 해보자

1. 추상 자료형은 논리적으로만 만들어진 개념이다
2. 표현법으로는 구체클래스, 추상클래스, 인터페이스가 있다
3. abc모듈을 이용하면 추상 개념을 만들어 낼 수 있다
4. abc모듈이나 추상자료형에 대한 내용은 이게 전부가 아니다

📘 끝내기

이후에 abc모듈을 이용해서 코드를 생각해보면서 짜보자
읽는 것도 중요하지만 직접 코드를 짜면서 만드는 것도 중요하다
profile
영차

0개의 댓글