클래스에서 상속을 사용하면 코드를 재사용하고 확장할 수 있기에
클래스의 상속은 기존 클래스의 특성과 동작을 다른 클래스에서 사용할 수 있게 해주는 중요한 개념입니다.
클래스 상속의 특성
- 클래스들간의 특성공유
- 코드 수정시 부모 클래스만 수정하면, 자식 클래스들이 자동적으로 업데이트
class 부모클래스:
# 부모클래스의 속성과 메서드 정의
class 자식클래스(부모클래스):
# 자식클래스에만 해당하는 추가적인 속성과 메서드 정의
파이썬에서 클래스 상속을 구현하는 기본적인 방법
부모클래스는 상속될 클래스를 의미하고, 자식클래스는 상속받는 클래스를 의미합니다. 자식클래스는 부모클래스의 모든 속성과 메서드를 상속받습니다.
클래스 상속 예시1) 학생 정보 출력하기
# student 클래스 정의
class student:
def __init__(self, name, age, score):
self.name = name # 학생의 이름을 인스턴스 변수로 저장
self.age = age # 학생의 나이를 인스턴스 변수로 저장
self.score = score # 학생의 시험 점수를 인스턴스 변수로 저장
# 학생의 정보를 출력
print("{} 학생이 시험을 쳤습니다.".format(self.name))
print("학생의 나이는 {}살이며, 시험점수는 {}입니다.".format(self.age, self.score))
# student_update 클래스 정의, student 클래스를 상속
class student_update(student):
def __init__(self, name, age, score):
# 부모 클래스인 student의 __init__ 메서드 호출하여 초기화
student.__init__(self, name, age, score)
# location 메서드 정의
def location(self, location):
print("{} 학생은 {}에 삽니다.".format(self.name, location))
# student_update 클래스의 인스턴스 생성
student_1 = student_update("조화성", 22, 50)
# location 메서드 호출하여 학생의 거주지 출력
student_1.location("화성")
클래스 상속 예시2) 월급및 급여 정보 출력하기
from abc import abstractmethod, ABCMeta
# 추상 기본 클래스 Employee 정의
class Employee(metaclass=ABCMeta):
def __init__(self, irum, nai):
self.irum = irum # 이름 속성 초기화
self.nai = nai # 나이 속성 초기화
@abstractmethod
def pay(self):
pass # 추상 메서드 pay, 하위 클래스에서 구현해야 함
@abstractmethod
def data_print(self):
pass # 추상 메서드 data_print, 하위 클래스에서 구현해야 함
def irumnai_print(self):
print('이름:{}, 나이:{} '.format(self.irum, self.nai),end='') # 이름과 나이 출력
class Temporary(Employee):
def __init__(self, irum, nai, ilsu, ildang):
Employee.__init__(self, irum, nai) # 부모 클래스 초기화 호출
self.ilsu = ilsu # 시간당 임금 속성 초기화
self.ildang = ildang # 근무 시간 속성 초기화
def pay(self):
pass # 추상 메서드 pay 구현은 하위 클래스에서
def data_print(self):
Employee.irumnai_print(self) # 이름과 나이 출력
print('월급 : {}'.format(self.ilsu * self.ildang)) # 월급 출력
class Regular(Employee):
def __init__(self, irum, nai, salary):
Employee.__init__(self, irum, nai) # 부모 클래스 초기화 호출
self.salary = salary # 고정 급여 속성 초기화
def pay(self):
pass # 추상 메서드 pay 구현은 하위 클래스에서
def data_print(self):
Employee.irumnai_print(self) # 이름과 나이 출력
print('급여 : {}'.format(self.salary)) # 급여 출력
class Saleman(Regular):
def __init__(self, irum, nai, salary, sales, commission):
Regular.__init__(self, irum, nai, salary) # 부모 클래스 초기화 호출
self.sales = sales # 판매량 속성 초기화
self.commission = commission # 수수료 속성 초기화
def pay(self):
pass # 추상 메서드 pay 구현은 하위 클래스에서
def data_print(self):
Employee.irumnai_print(self) # 이름과 나이 출력
print('수령액 : {}'.format(self.salary + self.sales * self.commission)) # 수령액 출력
t = Temporary('홍길동', 25, 20, 15000) # Temporary 클래스의 객체 생성
t.data_print() # 임시직 데이터 출력
print()
r = Regular('한국인', 27, 3500000) # Regular 클래스의 객체 생성
r.data_print() # 정규직 데이터 출력
print()
s = Saleman('손오공', 29, 1200000, 500000, 0.25) # Saleman 클래스의 객체 생성
s.data_print() # 판매원 데이터 출력
참고 개념
파이썬에서는 추상 기본 클래스(Abstract Base Class)를 정의하기 위해 @abstractmethod와 metaclass=ABCMeta 를 사용합니다.
- @abstractmethod
@abstractmethod 데코레이터는 메서드를 추상 메서드로 지정합니다.
추상 메서드는 메서드의 시그니처만을 정의하고, 실제 구현은 서브클래스에서 이루어져야 하는 메서드입니다.
즉, 이 메서드는 자식 클래스에서 반드시 구현되어야 합니다.
만약 자식 클래스에서 이 메서드를 구현하지 않으면 오류가 발생합니다.
- metaclass=ABCMeta
metaclass=ABCMeta는 클래스의 메타클래스를 정의합니다.
메타클래스는 클래스의 생성 방식과 행동을 정의하며, 클래스의 행동을 커스터마이징하고 확장하는 데 사용됩니다. ABCMeta는 ABC를 정의하기 위한 메타클래스입니다.
ABC는 인스턴스화될 수 없는 클래스로, 주로 상속을 통해 서브클래스에서 구현되는 인터페이스를 정의하기 위해 사용됩니다. ("인스턴스화될 수 없는 클래스"라는 말은 ABC 클래스 자체로는 객체를 생성할 수 없다는 것을 의미합니다. 즉, ABC 클래스를 직접 인스턴스화할 수 없습니다.)