객체지향 프로그래밍(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)을 쉽게 구현할 수 있다!
즉, 추상 클래스를 사용하여 "틀"을 정의하고, 자식 클래스에서 다형성을 적용하여 서로 다른 방식으로 구현한 것입니다!
이제 여러분도 추상화를 활용하여 다형성을 구현해보세요!
'파이썬 > 클래스와 객체 지향' 카테고리의 다른 글
파이썬은 순수 객체 지향 언어! 🐍✨ (0) | 2025.03.20 |
---|---|
인스턴스 메소드 vs 클래스 메소드 (0) | 2025.03.20 |
[객체 지향 프로그래밍 4개의 기둥] 다형성 (0) | 2025.03.18 |
[객체 지향 프로그래밍 4개의 기둥] 캡슐화 그리고 프라이빗 메서드와 은닉화 (0) | 2025.03.18 |
불필요한 인스턴스 변수 사용 줄이기: 데이터프레임을 지역 변수로 처리하는 이유 (0) | 2025.03.18 |