Python 클래스 상속과 오버라이딩 예제 정리

파이썬 클래스 상속 및 오버라이딩 소개

파이썬은 객체 지향 프로그래밍을 지원하는 강력한 언어입니다. 특히 클래스와 객체를 통해 코드의 재사용성을 높이고, 효율성을 극대화할 수 있습니다. 그중에서도 클래스 상속은 상위 클래스의 특성을 하위 클래스에서 활용할 수 있게 해주는 중요한 개념입니다. 이번 포스트에서는 파이썬 클래스 상속 및 오버라이딩에 대해 자세히 알아보도록 하겠습니다.

클래스 생성하기

클래스를 생성하는 것은 매우 간단합니다. 먼저, 클래스를 정의해야 합니다. 예를 들어, 학생을 나타내는 클래스를 만들어보겠습니다.

class Student:
  def __init__(self, name, gender, grade):
    self.name = name
    self.gender = gender
    self.grade = grade

위 코드는 학생의 이름, 성별, 학년 정보를 갖는 Student 클래스를 생성하는 예입니다. 클래스가 데이터를 관리하는 방식은 이처럼 __init__ 메서드를 통해 매개변수를 설정하여 인스턴스를 초기화하는 것입니다.

메소드 추가하기

클래스 안에 메소드를 정의하여 특정 기능을 구현할 수 있습니다. 예를 들어, 위 Student 클래스에 학생 정보를 출력하는 메소드를 추가해 보겠습니다.

class Student:
  def __init__(self, name, gender, grade):
    self.name = name
    self.gender = gender
    self.grade = grade
  def info_student(self):
    print(f"이름: {self.name}, 성별: {self.gender}, 학년: {self.grade}")

이제 info_student 메소드를 호출하면 학생에 대한 정보를 출력할 수 있습니다.

클래스 상속의 원리

클래스 상속은 부모 클래스의 속성과 메소드를 자식 클래스가 물려받는 것을 의미합니다. 이를 통해 공통된 기능을 재사용할 수 있어 코드 중복을 줄일 수 있습니다. 예를 들어, Student 클래스를 상속받아 가족 정보를 관리하는 클래스를 만들어 보겠습니다.

class StudentFamily(Student):
  def __init__(self, name, gender, grade, mother_name, father_name):
    super().__init__(name, gender, grade)
    self.mother_name = mother_name
    self.father_name = father_name

위와 같이 자식 클래스에서 super()를 호출하여 부모 클래스의 생성자를 호출한 후, 추가적인 속성을 설정할 수 있습니다.

자식 클래스의 메소드 추가

자식 클래스에서 부모 클래스의 메소드를 그대로 사용할 수 있으며, 필요에 따라 수정하거나 새로운 메소드를 추가할 수도 있습니다. 다음은 학생의 부모 정보를 출력하는 메소드를 추가한 예제입니다.

class StudentFamily(Student):
  def __init__(self, name, gender, grade, mother_name, father_name):
    super().__init__(name, gender, grade)
    self.mother_name = mother_name
    self.father_name = father_name
  def family_info(self):
    print(f"{self.name} 학생의 어머니는 {self.mother_name}이고, 아버지는 {self.father_name}입니다.")

메소드 오버라이딩

부모 클래스의 메소드를 자식 클래스에서 수정하고 싶을 때는 오버라이딩을 활용합니다. 간단한 예를 들어 보겠습니다. 먼저, 부모 클래스에 정의된 메소드를 자식 클래스에서 어떻게 변경할 수 있는지 알아보겠습니다.

class Person:
  def greet(self):
    print("안녕하세요!") 
class Student(Person):
  def greet(self):
    print("안녕하세요, 저는 학생입니다!")

위의 예에서 Student 클래스는 Person 클래스의 greet 메소드를 오버라이딩하여 자신만의 인사말을 출력할 수 있도록 했습니다. 이를 통해 하위 클래스는 상위 클래스의 기능을 변경하여 사용할 수 있습니다.

다중 상속

파이썬은 하나의 클래스가 여러 부모 클래스를 동시에 상속받는 다중 상속을 지원합니다. 다중 상속을 사용하면 여러 클래스로부터 속성과 메소드를 동시에 물려받을 수 있지만, 코드 복잡성을 증가시킬 수 있습니다. 간단한 예를 통해 살펴보겠습니다.

class Vehicle:
  def start(self):
    print("차량이 출발합니다.")
class Electric:
  def charge(self):
    print("차량을 충전합니다.")
class ElectricCar(Vehicle, Electric):
  pass

위와 같이 ElectricCar 클래스는 VehicleElectric 클래스를 동시에 상속받습니다. 이제 ElectricCar 인스턴스는 두 부모 클래스의 메소드를 모두 사용할 수 있습니다.

메소드 해석 순서(MRO)

다중 상속을 사용할 때, 메소드를 호출할 때 어느 부모 클래스의 메소드가 호출될지를 결정하는 것이 중요합니다. 이를 해결하기 위해 파이썬은 메소드 해석 순서(Method Resolution Order, MRO) 알고리즘을 사용하여 메소드를 찾는 순서를 정합니다. 이를 통해 메소드 충돌 문제를 해결할 수 있습니다.

class A:
  def greet(self):
    print("A 인사")
class B(A):
  def greet(self):
    print("B 인사")
class C(A):
  def greet(self):
    print("C 인사")
class D(B, C):
  pass
d = D()
d.greet() # B 인사

위 예제에서 클래스 DBC를 상속받으며, 메소드 해석 순서는 왼쪽에서 오른쪽으로 진행됩니다. 따라서 B 클래스의 greet 메소드가 호출됩니다.

결론

이번 포스트에서는 파이썬의 클래스 상속과 오버라이딩 개념을 살펴보았습니다. 클래스를 활용하여 코드 재사용성을 높이고, 메소드 오버라이딩을 통해 기능을 확장할 수 있다는 것이 객체 지향 프로그래밍의 큰 장점입니다. 하지만 다중 상속을 사용할 때는 메소드 해석 순서를 잘 이해하고 활용해야 하며, 코드의 가독성도 고려해야 합니다.

이와 같은 접근 방식을 통해 파이썬의 객체 지향 프로그래밍에 대한 이해도를 높이고, 더 나은 소프트웨어 개발에 기여할 수 있을 것입니다.

자주 묻는 질문과 답변

파이썬 클래스 상속이란 무엇인가요?

파이썬 클래스 상속은 한 클래스가 다른 클래스의 속성과 메소드를 물려받는 기능을 의미합니다. 이를 통해 코드의 재사용성을 높이고, 중복을 줄일 수 있습니다.

메소드 오버라이딩은 어떤 경우에 사용하나요?

메소드 오버라이딩은 부모 클래스의 메소드를 자식 클래스에서 변경할 때 쓰입니다. 이렇게 함으로써 자식 클래스에 맞는 동작을 정의할 수 있습니다.

다중 상속이란 무엇인가요?

다중 상속은 하나의 클래스가 여러 부모 클래스로부터 속성과 메소드를 동시에 상속받는 것을 말합니다. 이 기능은 다양한 특성을 통합할 수 있게 해줍니다.

메소드 해석 순서는 어떻게 결정되나요?

파이썬은 메소드 해석 순서(MRO) 알고리즘을 사용해 메소드를 호출할 때 우선적으로 어떤 부모 클래스의 메소드를 사용할지를 정합니다. 이로 인해 메소드 충돌을 방지할 수 있습니다.