상세 컨텐츠

본문 제목

파이썬 배우기: OOP 기본 – 추상화와 다형성

IT - 프로그래밍/파이썬

by 파란 호랑 2025. 3. 19. 12:46

본문

반응형

안녕하세요 여러분, 객체지향 프로그래밍(OOP)에서 추상화(Abstraction)와 다형성(Polymorphism) 은 코드를 더 유연하고 확장 가능하게 만드는 핵심 개념입니다. 이번 글에서는 추상화와 다형성 이 무엇인지, 그리고 파이썬에서 어떻게 구현하는지 알아보겠습니다.

추상화(Abstraction)란?


추상화는 불필요한 세부사항을 숨기고, 필요한 기능만 제공하는 개념입니다. 즉, 사용자는 내부 구현을 몰라도 기능을 사용할 수 있도록 하는 것이 추상화입니다.

예제: 자동차 운전
• 자동차를 운전할 때 핸들 조작, 가속 페달 밟기, 브레이크 밟기만 알면 됨
• 내부적으로 엔진이 어떻게 작동하는지, 연료가 어떻게 연소되는지를 몰라도 운전 가능
• 사용자는 필요한 기능만 사용하면 되고, 내부 구현은 숨겨짐

추상 클래스(Abstract Class)

파이썬에서는 abc (Abstract Base Class) 모듈 을 사용하여 추상 클래스를 정의할 수 있습니다.
추상 클래스는 하위 클래스에서 반드시 구현해야 하는 추상 메서드(abstract method) 를 포함합니다.

📌 추상 클래스 기본 구조

from abc import ABC, abstractmethod

class Animal(ABC):  # 추상 클래스
    @abstractmethod
    def make_sound(self):
        pass  # 반드시 하위 클래스에서 구현해야 함

class Dog(Animal):  # 추상 클래스 상속
    def make_sound(self):
        return "멍멍!"

class Cat(Animal):
    def make_sound(self):
        return "야옹!"

dog = Dog()
cat = Cat()

print(dog.make_sound())  # ✅ "멍멍!"
print(cat.make_sound())  # ✅ "야옹!"

ABC 클래스를 상속 → 추상 클래스를 정의
@abstractmethod 데코레이터 → 하위 클래스에서 반드시 구현해야 하는 메서드

인터페이스처럼 활용하기

추상 클래스는 인터페이스처럼 사용하여, 특정 기능을 반드시 구현하도록 강제할 수 있음

from abc import ABC, abstractmethod

class Payment(ABC):  # 결제 시스템 추상 클래스
    @abstractmethod
    def pay(self, amount):
        pass

class CreditCardPayment(Payment):  # 신용카드 결제
    def pay(self, amount):
        print(f"신용카드로 {amount}원 결제 완료")

class PayPalPayment(Payment):  # PayPal 결제
    def pay(self, amount):
        print(f"PayPal로 {amount}원 결제 완료")

payment1 = CreditCardPayment()
payment1.pay(10000)  # ✅ "신용카드로 10000원 결제 완료"

payment2 = PayPalPayment()
payment2.pay(5000)  # ✅ "PayPal로 5000원 결제 완료"

Payment 추상 클래스를 통해 결제 시스템의 기본 구조 정의
CreditCardPayment, PayPalPayment 는 반드시 pay() 메서드를 구현해야 함

다형성(Polymorphism)란?


다형성(Polymorphism) 은 하나의 인터페이스로 여러 가지 형태의 객체를 사용할 수 있도록 하는 개념입니다.
즉, 같은 메서드를 여러 클래스에서 다르게 구현할 수 있습니다.

기본적인 다형성 예제

class Bird:
    def make_sound(self):
        return "짹짹"

class Dog:
    def make_sound(self):
        return "멍멍"

class Cat:
    def make_sound(self):
        return "야옹"

animals = [Bird(), Dog(), Cat()]

for animal in animals:
    print(animal.make_sound())

# ✅ "짹짹"
# ✅ "멍멍"
# ✅ "야옹"

make_sound() 메서드를 여러 클래스에서 다르게 구현
동일한 인터페이스로 여러 객체를 다룰 수 있음

메서드 오버라이딩(Method Overriding)

부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의(Override)할 수 있음

class Animal:
    def make_sound(self):
        return "소리 없음"

class Dog(Animal):
    def make_sound(self):  # 부모 클래스 메서드 재정의
        return "멍멍!"

dog = Dog()
print(dog.make_sound())  # ✅ "멍멍!"

✅ 부모 클래스의 make_sound() 메서드를 자식 클래스에서 다르게 구현

연산자 오버로딩(Operator Overloading)

연산자 오버로딩을 통해 객체 간 연산을 커스텀할 수 있음

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)

    def __str__(self):
        return f"({self.x}, {self.y})"

p1 = Point(2, 3)
p2 = Point(4, 5)
p3 = p1 + p2  # ✅ __add__() 호출

print(p3)  # ✅ "(6, 8)"

+ 연산자를 오버로딩하여 객체 간 덧셈 연산 가능

추상화 & 다형성 활용 예제

#동물 소리 시스템

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        return "멍멍!"

class Cat(Animal):
    def make_sound(self):
        return "야옹!"

class Cow(Animal):
    def make_sound(self):
        return "음메!"

animals = [Dog(), Cat(), Cow()]

for animal in animals:
    print(animal.make_sound())

# ✅ "멍멍!"
# ✅ "야옹!"
# ✅ "음메!"

추상화(Abstraction) 적용 → Animal 클래스를 만들고 make_sound()를 필수 구현하도록 강제
다형성(Polymorphism) 적용 → make_sound() 를 각각 다른 방식으로 구현


#파이썬 #Python #OOP #객체지향프로그래밍 #추상화 #다형성 #PythonOOP #코딩공부 #파이썬강의 

728x90
반응형

관련글 더보기