파이썬 - 다형성: 초보자를 위한 가이드
안녕하세요, 미래의 파이썬 마エスト로! 오늘, 우리는 파이썬에서 다형성의 흥미로운 세계로 여행을 떠날 거예요. '다형성'이라는 단어가 해리 포터의 마법의 노래처럼 들릴지라도 걱정하지 마세요. 이 튜토리얼을 끝내면, 여러분도 다형성을 숙련된 마エスト로서 사용할 수 있을 거예요!
파이썬에서 다형성이란?
마법의 지팡이를 가지고 있다고 상상해봅시다 (이야기에 몰입하십시오, 우리는 Hogwarts의 전체 스토리를 다루고 있습니다). 이 지팡이는 다양한 물체로 변신할 수 있어요. 때로는 펜이 되고, 때로는 검이 되고, 때로는 플래시라이트가 될 수 있어요. 이것이 바로 프로그래밍에서 다형성의 본질입니다!
파이썬에서는, 다형성을 통해 서로 다른 클래스의 객체를 공통의 베이스 클래스의 객체로 취급할 수 있어요. 이는 코드의 스위스 아ーミ이의 날카로움 - 하나의 인터페이스, 많은 구현입니다.
간단한 예제를 살펴보겠습니다:
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "멍!"
class Cat(Animal):
def speak(self):
return "야옹!"
def animal_sound(animal):
print(animal.speak())
# 객체 생성
dog = Dog()
cat = Cat()
# 다형성 사용
animal_sound(dog) # 출력: 멍!
animal_sound(cat) # 출력: 야옹!
이 예제에서, Dog
와 Cat
은 모두 Animal
클래스에서 파생되었어요. animal_sound
함수는 그가 받는 동물의 종류에 상관없이 speak
메서드를 호출만 합니다. 이것이 바로 다형성의 행동입니다!
파이썬에서 다형성을 구현하는 방법
파이썬은 다형성을 구현하기 위해 여러 가지 방법을 제공합니다. 하나씩 살펴보겠습니다:
파이썬의 덕 타이핑
덕 타이핑은 파이썬에서 객체의 행동에 중점을 둔 개념입니다. 타이핑에 따르면, "거위처럼 보이고, 거위처럼 수영하고, 거위처럼 꽥거리면, 그것은 아마도 거위일 것입니다."
예제를 보겠습니다:
class Duck:
def quack(self):
print("꽥꽥!")
class Person:
def quack(self):
print("난 거위를 체르는 거야!")
def make_it_quack(thing):
thing.quack()
# 객체 생성
duck = Duck()
person = Person()
# 덕 타이핑 사용
make_it_quack(duck) # 출력: 꽥꽥!
make_it_quack(person) # 출력: 난 거위를 체르는 거야!
이 예제에서, make_it_quack
는 그가 받는 객체의 형식에 상관없어요. 객체에 quack
메서드가 있으면 동작합니다.
파이썬의 메서드 오버라이딩
메서드 오버라이딩은 파생 클래스가 베이스 클래스에 정의된 메서드에 특정 구현을 제공하는 것입니다. 이는 부모님께 "너희가 이렇게 하지만, 난 저렇게 할 거야!"라고 말하는 것과 같아요.
예제를 보겠습니다:
class Vehicle:
def move(self):
print("이동 중!")
class Car(Vehicle):
def move(self):
print("도로 위에서 운전 중!")
class Boat(Vehicle):
def move(self):
print("물 위에서 항해 중!")
# 객체 생성
vehicle = Vehicle()
car = Car()
boat = Boat()
# 메서드 오버라이딩 사용
vehicle.move() # 출력: 이동 중!
car.move() # 출력: 도로 위에서 운전 중!
boat.move() # 출력: 물 위에서 항해 중!
이 예제에서, Car
와 Boat
는 모두 Vehicle
클래스의 move
메서드를 자신만의 구현으로 오버라이딩합니다.
파이썬의 연산자 오버로딩
파이썬은 사용자 정의 클래스에 대한 연산자의 행동을 정의할 수 있게 합니다. 이를 연산자 오버로딩이라고 합니다.
예제를 보겠습니다:
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(1, 2)
p2 = Point(3, 4)
# 연산자 오버로딩 사용
p3 = p1 + p2
print(p3) # 출력: (4, 6)
이 예제에서, 우리는 Point
클래스에 +
연산자를 오버로딩하기 위해 __add__
메서드를 정의했습니다.
파이썬의 메서드 오버로딩
일부 다른 언어와 달리, 파이썬은 전통적인 의미에서 메서드 오버로딩을 지원하지 않지만, 기본 인수나 가변 길이 인수를 사용하여 유사한 기능을 구현할 수 있습니다.
예제를 보겠습니다:
class Calculator:
def add(self, *args):
return sum(args)
# 객체 생성
calc = Calculator()
# 메서드 오버로딩과 유사한 기능 사용
print(calc.add(1, 2)) # 출력: 3
print(calc.add(1, 2, 3)) # 출력: 6
print(calc.add(1, 2, 3, 4)) # 출력: 10
이 예제에서, 우리의 add
메서드는 얼마나 많은 인수를 받을 수 있는지를 결정합니다, 메서드 오버로딩과 유사한 기능을 시뮬레이션합니다.
다형성 메서드 표
다음은 우리가 논의한 다형성 메서드를 요약한 표입니다:
메서드 | 설명 | 예제 |
---|---|---|
덕 타이핑 | 객체의 행동에 중점을 둔 개념 | make_it_quack(thing) |
메서드 오버라이딩 | 파생 클래스가 베이스 클래스에 정의된 메서드에 특정 구현을 제공 |
Car.move() overrides Vehicle.move()
|
연산자 오버로딩 | 사용자 정의 클래스에 대한 연산자의 행동을 정의 |
Point 클래스의 + 오버로딩 |
메서드 오버로딩과 유사한 기능 | 기본 인수나 가변 길이 인수를 사용하여 메서드 오버로딩을 시뮬레이션 | Calculator.add(*args) |
그리고 이렇게 끝! 여러분은 파이썬에서 다형성의 놀라운 세계로 첫 걸음을 내딛었어요. 기억해두세요, 연습이 열쇠예요. 이 개념들을 여러분의 코드에서 실험해보지 마세요. 알고보면, 마스터 스케ulptor처럼 코드를 조각하며, Michelangelo처럼 부러운 유연한 프로그램을 만들어낼 준비가 되어 있을 거예요!
코딩을 즐기고, 다형성이 여러분의 곁에 있길 바랍니다!
Credits: Image by storyset