Python 클래스가 객체를 상속하는 이유
코드 재사용성 향상:
상속을 통해 기본 기능을 한 번만 정의하고 여러 클래스에서 공유할 수 있습니다. 이는 코드 중복을 줄이고 유지 관리를 용이하게 하며, 코드베이스 전체의 일관성을 유지하는 데 도움이 됩니다.
예를 들어, Person
이라는 클래스를 만들고 싶다고 가정해 봅시다. 이 클래스는 이름, 나이, 주소와 같은 모든 사람에 대한 공통 속성을 저장할 수 있습니다.
class Person:
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
이제 Student
라는 또 다른 클래스를 만들고 싶다고 가정해 봅시다. 이 클래스는 학생 번호, 전공과 같은 학생에 대한 추가 속성을 저장해야 합니다. Student
클래스는 Person
클래스를 상속받아 이름, 나이 및 주소와 같은 공통 속성을 재사용할 수 있습니다.
class Student(Person):
def __init__(self, name, age, address, student_id, major):
super().__init__(name, age, address)
self.student_id = student_id
self.major = major
위 코드에서 Student
클래스는 __init__
메서드를 직접 정의하지 않지만 Person
클래스로부터 상속받습니다. 즉, Student
객체를 만들 때 name
, age
, address
속성을 설정하는 데 필요한 모든 로직은 이미 Person
클래스에 정의되어 있으므로 Student
클래스에서 별도로 정의할 필요가 없습니다.
상속을 통해 코드를 더 간결하게 만들 수 있습니다. 상속받은 속성과 메서드를 명시적으로 정의할 필요가 없기 때문에 코드 줄 수를 줄일 수 있습니다.
객체 계층 구조 구현:
상속을 사용하여 객체 간의 계층 구조를 쉽게 구현할 수 있습니다. 더 구체적인 클래스는 더 추상적인 클래스를 상속받아 특화된 기능을 추가할 수 있습니다.
class Animal:
def eat(self):
pass
def sleep(self):
pass
def reproduce(self):
pass
이제 Dog
및 Cat
과 같은 더 구체적인 동물 클래스를 만들 수 있습니다. 이러한 클래스는 Animal
클래스를 상속받아 공통 행동을 재사용하고 특정 동물에 대한 고유 행동을 추가할 수 있습니다.
class Dog(Animal):
def bark(self):
pass
class Cat(Animal):
def purr(self):
pass
위 코드에서 Dog
및 Cat
클래스는 eat()
, sleep()
, reproduce()
메서드를 직접 정의하지 않지만 Animal
클래스로부터 상속받습니다. 즉, 이러한 동작을 수행하는 데 필요한 모든 로직은 이미 Animal
클래스에 정의되어 있으므로 Dog
및 Cat
클래스에서 별도로 정의할 필요가 없습니다.
다형성 지원:
상속은 다형성을 지원하는 데 사용됩니다. 다형성은 서로 다른 클래스의 인스턴스가 동일한 메서드를 호출할 때 서로 다른 동작을 나타낼 수 있는 기능입니다.
예제 코드
class Person:
def __init__(self, name, age, address):
self.name = name
self.age = age
self.address = address
def __str__(self):
return f"이름: {self.name}, 나이: {self.age}, 주소: {self.address}"
class Student(Person):
def __init__(self, name, age, address, student_id, major):
super().__init__(name, age, address)
self.student_id = student_id
self.major = major
def __str__(self):
return f"{super().__str__()}, 학번: {self.student_id}, 전공: {self.major}"
person = Person("홍길동", 30, "서울시 마포구")
print(person)
student = Student("김철수", 20, "서울시 강남구", "20230001", "컴퓨터공학")
print(student)
이 코드에서:
Person
클래스는 이름, 나이 및 주소와 같은 모든 사람에 대한 공통 속성을 정의합니다.Student
클래스는 학생 번호 및 전공과 같은 학생에 대한 추가 속성을 정의합니다.Student
클래스는Person
클래스를 상속받아 이름, 나이 및 주소와 같은 공통 속성을 재사용합니다.__str__
메서드는 객체를 문자열 표현으로 반환하는 데 사용됩니다.Person
및Student
클래스는 각각 해당 클래스의 인스턴스에 대한 정보를 포함하는 문자열 표현을 반환하도록 재정의됩니다.
코드를 실행하면 다음과 같은 출력이 생성됩니다.
이름: 홍길동, 나이: 30, 주소: 서울시 마포구
이름: 김철수, 나이: 20, 주소: 서울시 강남구, 학번: 20230001, 전공: 컴퓨터공학
Python 클래스 상속 대체 방법
다중 상속:
다중 상속을 사용하면 하나 이상의 부모 클래스로부터 상속받을 수 있습니다. 이는 여러 클래스로부터 기능을 재사용해야 하는 경우 유용할 수 있습니다.
class Animal:
def eat(self):
pass
def sleep(self):
pass
class Flyer:
def fly(self):
pass
class Bird(Animal, Flyer):
pass
위 코드에서 Bird
클래스는 Animal
및 Flyer
클래스를 상속받아 먹이, 잠자기 및 날 수 있는 기능을 모두 수행할 수 있습니다.
믹신:
믹신은 다중 상속과 유사하지만 클래스 간의 더욱 유연한 조합을 허용합니다. 믹신을 사용하면 클래스에서 선택한 메서드만 상속받을 수 있습니다.
class Animal:
def eat(self):
pass
def sleep(self):
pass
class Flyer:
def fly(self):
pass
class Bird:
def __init__(self):
self.animal = Animal()
self.flyer = Flyer()
def eat(self):
self.animal.eat()
def sleep(self):
self.animal.sleep()
def fly(self):
self.flyer.fly()
위 코드에서 Bird
클래스는 Animal
및 Flyer
클래스의 인스턴스를 직접 생성하고 해당 인스턴스의 메서드를 호출하여 동일한 기능을 수행합니다.
조합:
조합은 클래스의 속성과 메서드를 직접 결합하여 새로운 클래스를 만드는 방법입니다. 상속을 사용하지 않고 클래스 간의 관계를 나타내는 데 유용할 수 있습니다.
class Animal:
def __init__(self, name):
self.name = name
class Flyer:
def __init__(self, wingspan):
self.wingspan = wingspan
class Bird(Animal, Flyer):
def __init__(self, name, wingspan):
super().__init__(name)
self.wingspan = wingspan
bird = Bird("앵무새", 1.5)
print(bird.name, bird.wingspan)
위 코드에서 Bird
클래스는 Animal
및 Flyer
클래스의 속성을 직접 결합하여 이름과 날개 길이를 가진 새를 나타냅니다.
프록시:
프록시는 다른 객체의 인터페이스를 감싸는 객체입니다. 상속을 사용하지 않고 객체 간의 관계를 나타내는 데 유용할 수 있습니다.
class Animal:
def eat(self):
pass
def sleep(self):
pass
class Bird(Animal):
def __init__(self, real_bird):
self.real_bird = real_bird
def eat(self):
self.real_bird.eat()
def sleep(self):
self.real_bird.sleep()
def fly(self):
print("새가 날아갑니다!")
위 코드에서 Bird
클래스는 real_bird
인스턴스를 사용하여 먹이, 잠자기 및 날 수 있는 기능을 제공하는 프록시입니다. fly()
메서드는 real_bird
인스턴스가 아닌 Bird
인스턴스 자체에서 직접 구현됩니다.
데코레이터:
데코레이터는 함수의 기능을 변경하는 데 사용할 수 있는 함수입니다. 상속을 사용하지 않고 클래스에 기능을 추가하는 데 유용할 수 있습니다.
def flyable(cls):
def fly(self):
print("새가 날아갑니다!")
setattr(cls, "fly", fly)
return cls
class Bird(Animal):
pass
Bird = flyable(Bird)
bird = Bird()
bird.fly()
python class oop