본문 바로가기
카테고리 없음

파이썬 상속과 다형성 - 코드 재사용의 핵심 기술

by chapter21 2025. 5. 26.

파이썬 상속과 다형성 - 코드 재사용의 핵심 기술

파이썬 객체 지향 프로그래밍의 핵심 개념인 상속다형성을 통해 코드 재사용성을 높이고 효율적인 프로그램을 만드는 방법을 배워보겠습니다. 마치 가족 구성원들이 서로의 특징을 물려받고, 하나의 리모컨으로 여러 종류의 가전제품을 제어하는 것처럼, 이 기술들은 복잡한 코드를 쉽고 간결하게 관리하는 강력한 노하우를 제공합니다.

이번 강의를 통해 여러분은 더욱 유연하고 확장 가능한 파이썬 프로그램을 설계할 수 있는 깊이 있는 이해를 얻게 될 것입니다. 불필요한 반복을 줄이고, 코드를 더 똑똑하게 활용하는 방법을 지금 바로 익혀보세요!

상속과 다형성이란 무엇일까요?

프로그래밍에서 상속(Inheritance)은 '부모 클래스'의 특징과 기능을 '자식 클래스'가 물려받아 사용하는 것을 의미합니다. 예를 들어, '동물'이라는 부모 클래스에 '소리 내기'라는 기능이 있다면, '강아지'나 '고양이'와 같은 자식 클래스는 이 '소리 내기' 기능을 다시 만들 필요 없이 물려받아 바로 사용할 수 있습니다.
이는 마치 아이가 부모님의 성격이나 외모를 물려받는 것과 비슷합니다.


다형성(Polymorphism)은 '여러 가지 형태를 가질 수 있는 성질'이라는 뜻입니다. 쉽게 말해, 같은 명령을 내렸을 때 각자 다른 방식으로 동작하는 것을 의미합니다. 예를 들어, '재생' 버튼을 눌렀을 때 음악 파일은 음악을 재생하고, 비디오 파일은 영상을 재생하는 것과 같습니다.
즉, 하나의 버튼으로 여러 가지 다른 행동을 유발하는 능력입니다. 이 두 개념은 코드를 더 깔끔하고 재사용하기 좋게 만드는 데 아주 중요한 역할을 합니다.

상속 사용 예시 1: 기본적인 특징 물려받기

먼저 상속의 가장 기본적인 형태를 살펴보겠습니다. Animal이라는 부모 클래스를 만들고, 이 클래스가 가지고 있는 make_sound()라는 '소리 내기' 기능을 자식 클래스인 DogCat이 어떻게 물려받아 사용하는지 확인해보세요. 자식 클래스를 만들 때 괄호 안에 부모 클래스 이름을 넣어주면 됩니다.

Python
# 부모 클래스: 동물 class Animal: def make_sound(self): print("동물이 소리를 냅니다.") # 자식 클래스: 강아지 (Animal을 상속받음) class Dog(Animal): pass # 특별한 기능 추가 없이 부모의 기능만 물려받음 # 자식 클래스: 고양이 (Animal을 상속받음) class Cat(Animal): pass # 객체 생성 및 기능 사용 my_dog = Dog() my_cat = Cat() my_dog.make_sound() my_cat.make_sound()

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

출력 결과
동물이 소리를 냅니다. 동물이 소리를 냅니다.

강아지와 고양이 객체가 직접 make_sound() 함수를 정의하지 않았음에도 불구하고, 부모 클래스인 Animal로부터 해당 기능을 물려받아 사용할 수 있게 된 것을 확인할 수 있습니다. 이것이 바로 상속을 통한 코드 재사용의 기본입니다.

상속 사용 예시 2: 기능 확장 및 변경하기 (오버라이딩)

자식 클래스는 부모로부터 물려받은 기능을 그대로 사용할 수도 있지만, 자기만의 고유한 기능을 추가하거나, 물려받은 기능을 자신의 상황에 맞게 변경할 수도 있습니다. 이처럼 물려받은 기능을 자식 클래스에서 다시 정의하여 동작을 바꾸는 것을 '오버라이딩(Overriding)'이라고 합니다. 강아지는 '멍멍', 고양이는 '야옹'하고 소리를 내도록 변경해보겠습니다.

Python
# 부모 클래스: 동물 class Animal: def make_sound(self): print("동물이 소리를 냅니다.") # 자식 클래스: 강아지 (make_sound 기능을 자신에게 맞게 변경) class Dog(Animal): def make_sound(self): # 부모의 make_sound를 재정의(오버라이딩) print("멍멍!") def fetch(self): # 강아지만의 고유 기능 추가 print("공을 가져옵니다!") # 자식 클래스: 고양이 (make_sound 기능을 자신에게 맞게 변경) class Cat(Animal): def make_sound(self): # 부모의 make_sound를 재정의(오버라이딩) print("야옹!") # 객체 생성 및 기능 사용 my_dog = Dog() my_cat = Cat() my_dog.make_sound() my_dog.fetch() my_cat.make_sound()

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

출력 결과
멍멍! 공을 가져옵니다! 야옹!

이제 강아지와 고양이가 자신만의 소리를 내고, 강아지는 공을 가져오는 고유한 행동까지 할 수 있게 되었습니다. 이렇게 상속을 통해 코드를 확장하고 변경하는 것이 가능합니다.

다형성 사용 예시 3: 하나의 명령으로 여러 동작 수행하기

다형성의 진정한 힘은 여러 다른 종류의 객체(여기서는 강아지와 고양이)를 하나의 공통된 방식으로 다룰 수 있을 때 발휘됩니다. 우리는 각 동물이 어떤 종류인지 일일이 확인할 필요 없이, 단순히 '소리 내기' 명령만 내리면 각자 자신의 방식대로 소리를 냅니다. 마치 리모컨의 '재생' 버튼 하나로 CD 플레이어는 음악을, DVD 플레이어는 영화를 재생하는 것과 같습니다.

Python
# 부모 클래스: 동물 (다형성을 위해 make_sound는 필수) class Animal: def make_sound(self): print("동물이 소리를 냅니다.") # 자식 클래스: 강아지 class Dog(Animal): def make_sound(self): print("멍멍!") # 자식 클래스: 고양이 class Cat(Animal): def make_sound(self): print("야옹!") # 다양한 동물 객체를 리스트에 담기 animals = [Dog(), Cat(), Animal()] # 각 동물에게 소리 내기 명령 (동일한 make_sound() 호출) for animal in animals: animal.make_sound() # 각 객체에 따라 다른 소리가 납니다!

위 코드를 실행하면 다음과 같은 결과가 화면에 나타납니다.

출력 결과
멍멍! 야옹! 동물이 소리를 냅니다.

우리는 for 반복문 안에서 각 animal 객체에 대해 똑같이 make_sound()를 호출했습니다. 하지만 각 객체(강아지, 고양이, 일반 동물)의 종류에 따라 전혀 다른 소리가 출력되는 것을 볼 수 있습니다. 이것이 바로 다형성의 핵심입니다! 하나의 코드로 여러 가지 형태의 객체를 유연하게 처리할 수 있게 됩니다.

중요:

상속과 다형성은 함께 사용될 때 강력한 시너지를 냅니다. 상속을 통해 공통 기능을 물려받고, 다형성을 통해 물려받은 기능을 각 자식 클래스에 맞게 유연하게 사용할 수 있도록 합니다.

주의:

상속을 너무 깊게, 즉 여러 단계로 복잡하게 사용하는 것은 피해야 합니다. 상속 계층이 너무 복잡해지면 코드의 이해와 유지보수가 어려워질 수 있습니다. 적절한 상속 깊이를 유지하는 것이 중요합니다.

핵심 : 상속은 부모 클래스의 기능을 자식 클래스가 물려받아 코드 재사용성을 높이는 기술입니다. 다형성은 하나의 명령(메서드 호출)으로 다양한 형태의 객체가 자신만의 방식으로 동작하도록 하여 코드의 유연성을 극대화합니다. 이 둘은 객체 지향 프로그래밍의 핵심 원리입니다.

마무리 요약

이번 시간에는 파이썬 객체 지향 프로그래밍의 강력한 두 기둥인 상속과 다형성에 대해 깊이 있게 알아보았습니다. 상속을 통해 공통된 코드를 재사용하여 중복을 줄이고, 다형성을 통해 하나의 인터페이스로 다양한 객체를 유연하게 다룰 수 있음을 확인했습니다. 이 개념들을 잘 활용하면 더욱 효율적이고 유지보수가 쉬운 파이썬 프로그램을 만들 수 있습니다. 다음 강의에서는 복잡한 데이터를 효율적으로 저장하고 관리하는 '자료구조'에 대해 더 자세히 알아보겠습니다.

질문이 있다면 댓글에 남겨주세요.

다음 강의에서는 파이썬의 핵심 자료구조에 대해 배워 봅니다.