파이썬/클래스와 객체 지향

[객체 지향 프로그래밍 4개의 기둥] 추상화를 통해 다형성을 구현하는 방법

Data Jun 2025. 3. 18. 11:41

객체지향 프로그래밍(OOP)에서 **추상화(Abstraction)와 다형성(Polymorphism)**은 중요한 개념입니다.
특히, Python에서는 추상 클래스를 활용하여 다형성을 효과적으로 구현할 수 있습니다.

이번 글에서는 추상화를 적용하여 다형성을 구현하는 방법을 알아보겠습니다. 

 

추상화(Abstraction)란?

추상화는 **"공통적인 인터페이스(틀)를 제공하고, 세부 구현은 나중에 하도록 하는 개념"**입니다.
즉, 불필요한 세부 사항을 감추고, 꼭 필요한 기능만 정의하는 것입니다.

Python에서는 ABC(추상 클래스)와 @abstractmethod(추상 메서드)를 사용하여 구현할 수 있습니다.

 

다형성(Polymorphism)이란?

다형성은 **"같은 이름의 메서드가 여러 클래스에서 다르게 동작하는 것"**을 의미합니다.
즉, 같은 메서드(extract_email_info())를 호출해도, 객체의 종류에 따라 다르게 실행될 수 있습니다.

 

추상화를 활용하여 다형성 구현하기

추상 클래스 만들기 (BaseMailProcessor)

먼저, **공통적인 인터페이스(추상 클래스)**를 만듭니다.
이 클래스는 틀(공통 메서드명)을 제공하지만, 구체적인 구현은 하지 않습니다.

from abc import ABC, abstractmethod

class BaseMailProcessor(ABC):
    """이메일을 처리하는 기본(추상) 클래스"""
    
    @abstractmethod
    def extract_email_info(self, email_text: str):
        """이메일에서 발신자, 수신자, 날짜, 제목을 추출하는 메서드"""
        pass

BaseMailProcessor는 추상 클래스(abstract class)
extract_email_info()는 추상 메서드(abstract method)
구체적인 구현이 없고, 오직 "틀"만 제공

이제 extract_email_info()를 다양한 방식으로 구현하는 자식 클래스를 만들어보겠습니다.

 

추상 클래스를 상속받아 다형성 적용

이제 추상 클래스를 상속받아, 서로 다른 방식으로 이메일을 처리하는 클래스를 만듭니다.

텍스트 기반 이메일 처리 클래스

class TextMailProcessor(BaseMailProcessor):
    def extract_email_info(self, email_text: str):
        """텍스트 기반 이메일을 파싱하는 방식"""
        lines = email_text.split("\n")
        sender = lines[0].split(":")[1].strip()
        recipient = lines[1].split(":")[1].strip()
        date = lines[2].split(":")[1].strip()
        subject = lines[3].split(":")[1].strip()
        return sender, recipient, date, subject

일반적인 텍스트 이메일을 처리하는 방식
extract_email_info() 메서드를 텍스트 기반으로 구현

 

HTML 기반 이메일 처리 클래스

from bs4 import BeautifulSoup

class HTMLMailProcessor(BaseMailProcessor):
    def extract_email_info(self, email_text: str):
        """HTML 기반 이메일을 파싱하는 방식"""
        soup = BeautifulSoup(email_text, "html.parser")
        sender = soup.find("span", class_="sender").text.strip()
        recipient = soup.find("span", class_="recipient").text.strip()
        date = soup.find("span", class_="date").text.strip()
        subject = soup.find("span", class_="subject").text.strip()
        return sender, recipient, date, subject

HTML 형식의 이메일을 처리하는 방식
BeautifulSoup을 사용하여 HTML 데이터를 파싱

 

다형성 적용: 같은 메서드명(extract_email_info())으로 서로 다른 동작

이제 같은 메서드를 호출하더라도, 객체에 따라 서로 다르게 동작하는지 확인해보겠습니다.

text_processor = TextMailProcessor()
html_processor = HTMLMailProcessor()

text_email = """From: John Doe\nTo: Alice\nDate: 2025-03-18\nSubject: Meeting Reminder"""
html_email = """<html><body><span class='sender'>John Doe</span><span class='recipient'>Alice</span>
                <span class='date'>2025-03-18</span><span class='subject'>Meeting Reminder</span></body></html>"""

print(text_processor.extract_email_info(text_email))  
# 출력: ('John Doe', 'Alice', '2025-03-18', 'Meeting Reminder')

print(html_processor.extract_email_info(html_email))  
# 출력: ('John Doe', 'Alice', '2025-03-18', 'Meeting Reminder')

같은 extract_email_info()를 호출하지만, 클래스마다 다르게 동작(다형성 적용)!
텍스트 이메일 → 텍스트 파싱 방식, HTML 이메일 → BeautifulSoup 활용 방식
새로운 형식의 이메일을 지원하려면? → 새로운 클래스를 추가하면 됨! (기존 코드 수정 X)

 

결론: 추상화(Abstraction)로 다형성(Polymorphism)을 쉽게 구현할 수 있다!

즉, 추상 클래스를 사용하여 "틀"을 정의하고, 자식 클래스에서 다형성을 적용하여 서로 다른 방식으로 구현한 것입니다!

이제 여러분도 추상화를 활용하여 다형성을 구현해보세요!