<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>myung_1.log</title>
        <link>https://velog.io/</link>
        <description>영차</description>
        <lastBuildDate>Mon, 03 Mar 2025 09:38:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>myung_1.log</title>
            <url>https://velog.velcdn.com/images/myung_1/profile/b32640d0-6b8f-4ce6-be24-d601301af5e6/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. myung_1.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/myung_1" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Python abc 모듈]]></title>
            <link>https://velog.io/@myung_1/Python-abc-%EB%AA%A8%EB%93%88</link>
            <guid>https://velog.io/@myung_1/Python-abc-%EB%AA%A8%EB%93%88</guid>
            <pubDate>Mon, 03 Mar 2025 09:38:39 GMT</pubDate>
            <description><![CDATA[<h1 id="📕-들어가기-앞서">📕 들어가기 앞서</h1>
<h2 id="📌-추상자료형">📌 추상자료형</h2>
<pre><code>기능 구현은 정의만하고 논리적으로만 만들어진 개념</code></pre><hr>
<h2 id="📌-표현-방법">📌 표현 방법</h2>
<p>아래 3가지로 구분할 수 있다
각각 구현의 정도에 따라서 나뉘어져 있고
독자가 이해하기 편하게 코드로 작성을 해보았다
( abc모듈을 썼으니 어떤 느낌인지 잘 보기😉 )</p>
<h3 id="구체클래스">구체클래스</h3>
<p>구체적인 기능 구현이 되어있는 클래스</p>
<pre><code class="language-python">class Human:
    def __init__(self, N, A):
        self.name = N
        self.age = A

    def __str__(self):
        return f&quot;저의 이름은 {self.name}이고 나이는 {self.age}입니다&quot;

class Person(Human):...

A = Person(&quot;명일&quot;, &quot;비밀&quot;)
print(A)</code></pre>
<pre><code>저의 이름은 명일이고 나이는 비밀입니다</code></pre><h3 id="추상클래스">추상클래스</h3>
<p>기능 구현이 일부 되어있는 클래스
( 자식 클래스는 구현을 강제받는다 )</p>
<pre><code class="language-python">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&quot;저의 이름은 {self.name}이고 나이는 {self.age}입니다&quot;

A = Person(&quot;명일&quot;, &quot;비밀&quot;)
print(A)</code></pre>
<pre><code>저의 이름은 명일이고 나이는 비밀입니다</code></pre><h3 id="인터페이스">인터페이스</h3>
<p>논리적인 개념으로 만들어진 클래스
( 자식 클래스는 구현을 강제받는다 )</p>
<pre><code class="language-python">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&quot;저의 이름은 {self.name}이고 나이는 {self.age}입니다&quot;

A = Person(&quot;명일&quot;, &quot;비밀&quot;)
print(A)</code></pre>
<pre><code>저의 이름은 명일이고 나이는 비밀입니다</code></pre><p>구현 정도의 따라서 인터페이스 이거나 추상클래스, 구체클래스로 나뉜다</p>
<hr>
<h2 id="📌-이상한-것">📌 이?상한 것</h2>
<p>추상클래스와 인터페이스는 생성자 자리가 다르다는 것이다
( 이해를 돕기 위해서 생성자를 사용하는거지 생성자만의 특징이 아니니 잘 기억해두자 )</p>
<p>이게 무슨 차이가 있느냐?
추상클래스는 Human에 __init__이 구현되어 있고
인터페이스는 Human에 __init__이 구현되어 있지 않다는 것이다</p>
<p>인터페이스에는 생성자를 정의하는 건 추천하지 않는다
인터페이스는 구현을 강제한다는 역할을 가지고 있기 때문에 유연성을 해칠 수 있다</p>
<hr>
<h2 id="📌-더-자세한-내용">📌 더 자세한 내용</h2>
<ol>
<li><p>추상클래스에서는 함수를 구현해도 된다 하지만
인터페이스에는 오직 정의만 해야 된다, 구현하면 안된다</p>
</li>
<li><p>위 코드처럼 __str__를 강제 구현하도록 만들 수 있다</p>
<pre><code class="language-python">from abc import ABC, abstractmethod
</code></pre>
</li>
</ol>
<p>class Human(ABC):
    @abstractmethod
    def <strong>str</strong>(self):...</p>
<p>class Person(Human):...</p>
<p>A = Person()
print(A)</p>
<pre><code></code></pre><p>Traceback (most recent call last):
  File &quot;파일 위치&quot;, line 9, in <module>
    A = Person()
TypeError: Can&#39;t instantiate abstract class Person with abstract method <strong>str</strong>    </p>
<pre><code>
3. 파이썬에는 순수한 인터페이스는 없기에 추상클래스로 만들어서 인터페이스처럼 쓸 수는 있다

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

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

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

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

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

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

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

---
## 📌 예제

위 명령어를 이해하는데 아래 코드가 도움이 되길 바란다
```python
from abc import ABC, ABCMeta, abstractmethod

class Arm(ABC):
    @abstractmethod
    def punch(self):return &quot;?&quot;

class Lag(metaclass = ABCMeta):
    @abstractmethod
    def kick(self):return &quot;?&quot;

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

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))</code></pre><pre><code>주먹질 하기!
발길질 하기!
True True
True True</code></pre><hr>
<h1 id="🔖-끝내기-전에">🔖 끝내기 전에</h1>
<p>간단하게 정리를 해보자</p>
<pre><code>1. 추상 자료형은 논리적으로만 만들어진 개념이다
2. 표현법으로는 구체클래스, 추상클래스, 인터페이스가 있다
3. abc모듈을 이용하면 추상 개념을 만들어 낼 수 있다
4. abc모듈이나 추상자료형에 대한 내용은 이게 전부가 아니다</code></pre><hr>
<h1 id="📘-끝내기">📘 끝내기</h1>
<pre><code>이후에 abc모듈을 이용해서 코드를 생각해보면서 짜보자
읽는 것도 중요하지만 직접 코드를 짜면서 만드는 것도 중요하다</code></pre>]]></description>
        </item>
    </channel>
</rss>