티스토리 뷰
파이썬은 객체 지향 프로그래밍(OOP) 언어로, 상속과 다형성은 그 핵심 개념 중 하나입니다. 이 두 가지 개념을 이해하면 코드의 재사용성을 높이고, 유지보수성을 강화할 수 있습니다.
특히, 상속과 다형성은 프로그램을 더 유연하고 확장 가능하게 만들어 주는 중요한 도구입니다.
상속(Inheritance)이란?
상속은 하나의 클래스가 다른 클래스의 속성과 메서드를 물려받는 것을 의미합니다. 이를 통해 기존 코드를 재사용하고, 새로운 기능을 추가할 수 있습니다. 파이썬에서 상속은 자식 클래스가 부모 클래스의 모든 속성과 메서드를 물려받아 사용할 수 있게 해줍니다.
상속의 기본 구조
파이썬에서 상속을 구현하려면 자식 클래스 정의 시 괄호 안에 부모 클래스를 명시합니다.
class Animal:
def sound(self):
return "동물 소리"
class Dog(Animal): # Animal 클래스를 상속받음
def bark(self):
return "멍멍"
dog = Dog()
print(dog.sound()) # 출력: 동물 소리
print(dog.bark()) # 출력: 멍멍
위 예시에서 Dog
클래스는 Animal
클래스를 상속받아 sound()
메서드를 사용할 수 있습니다. 이처럼 상속을 통해 코드 중복을 줄이고, 유지보수가 용이한 코드를 작성할 수 있습니다.
다중 상속(Multiple Inheritance)
파이썬에서는 하나의 자식 클래스가 여러 부모 클래스로부터 상속받는 다중 상속도 가능합니다.
class Canine:
def bark(self):
return "Bark!"
class Domestic:
def home(self):
return "Lives with humans"
class Dog(Canine, Domestic): # 다중 상속
pass
dog = Dog()
print(dog.bark()) # 출력: Bark!
print(dog.home()) # 출력: Lives with humans
다중 상속은 여러 부모 클래스로부터 기능을 물려받아 다양한 기능을 구현할 수 있게 해줍니다. 그러나 동일한 이름의 메서드가 여러 부모 클래스에 존재할 경우 호출 순서를 명확히 해야 하므로 주의가 필요합니다.
다형성(Polymorphism)이란?
다형성은 동일한 메서드가 객체에 따라 다르게 동작하는 것을 의미합니다. 즉, 동일한 인터페이스를 통해 다양한 객체를 처리할 수 있는 능력을 말합니다.
메서드 오버라이딩(Method Overriding)
다형성은 주로 메서드 오버라이딩을 통해 구현됩니다. 자식 클래스에서 부모 클래스의 메서드를 재정의하여, 같은 이름의 메서드가 객체에 따라 다르게 동작하도록 할 수 있습니다.
class Animal:
def sound(self):
return "동물 소리"
class Dog(Animal):
def sound(self): # 부모 클래스의 sound 메서드를 오버라이딩
return "멍멍"
class Cat(Animal):
def sound(self): # 부모 클래스의 sound 메서드를 오버라이딩
return "야옹"
animals = [Dog(), Cat()]
for animal in animals:
print(animal.sound())
위 예시에서는 Dog
와 Cat
클래스가 각각 sound()
메서드를 오버라이딩하여 서로 다른 동작을 수행합니다. 이는 다형성을 통해 동일한 인터페이스를 사용하면서도 객체에 따라 다른 결과를 얻는 방식입니다.
함수 다형성(Function Polymorphism)
파이썬에서는 함수도 다형성을 가질 수 있습니다. 예를 들어, 내장 함수인 len()
은 입력 자료형에 따라 다른 결과를 반환합니다.
print(len("Hello")) # 출력: 5 (문자열)
print(len([1, 2, 3])) # 출력: 3 (리스트)
print(len({"a": 1})) # 출력: 1 (딕셔너리)
이처럼 함수 다형성은 동일한 함수가 다양한 자료형에 대해 적절히 동작하도록 해줍니다.
상속과 다형성을 활용한 실용적인 예제
상속과 다형성을 결합하면 매우 유연하고 확장 가능한 코드를 작성할 수 있습니다. 예를 들어, 도형 클래스를 만들어 각 도형마다 면적을 계산하는 프로그램을 생각해봅시다.
class Shape:
def calculate_area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def calculate_area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def calculate_area(self):
return 3.14 * (self.radius ** 2)
shapes = [Rectangle(4, 5), Circle(3)]
for shape in shapes:
print(f"면적: {shape.calculate_area()}")
이 예제에서 Shape
클래스를 부모 클래스로 두고 Rectangle
과 Circle
클래스가 이를 상속받아 각각 면적 계산 방식을 구현했습니다. 이를 통해 다형성을 활용하여 공통된 인터페이스(calculate_area()
)로 서로 다른 도형들의 면적을 계산할 수 있습니다.
결론
파이썬에서 상속과 다형성은 객체 지향 프로그래밍의 중요한 개념으로 코드 재사용성과 확장성을 극대화하는 데 큰 도움을 줍니다. 특히, 코드 중복을 줄이고 유지보수를 쉽게 할 수 있으며, 다양한 객체를 유연하게 처리할 수 있는 장점이 있습니다. 이러한 개념들을 잘 이해하고 활용한다면 더 나은 품질의 소프트웨어를 개발할 수 있을 것입니다.
자주 묻는 질문 (FAQ)
Q1: 파이썬에서 다중 상속은 어떻게 사용할 수 있나요?
A1: 파이썬에서는 한 자식 클래스가 여러 부모 클래스를 동시에 상속받을 수 있습니다. 이를 다중 상속이라고 하며, 각 부모 클래스의 속성과 메서드를 모두 사용할 수 있습니다.
Q2: 메서드 오버라이딩과 오버로딩의 차이는 무엇인가요?
A2: 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것이고, 오버로딩은 같은 이름의 메서드를 여러 번 정의하되 매개변수 유형이나 개수를 달리하는 것입니다. 파이썬에서는 오버로딩 대신 기본값 매개변수를 사용하여 비슷한 기능을 구현합니다.
Q3: 파이썬에서 모든 클래스는 어떤 클래스를 자동으로 상속받나요?
A3: 파이썬에서 모든 클래스는 자동으로 object
클래스를 상속받습니다. 이는 파이썬에서 모든 것이 객체라는 철학에 기반하며, 이를 통해 모든 클래스는 기본적인 속성과 메서드를 가지게 됩니다.