본문 바로가기
파이썬

상속

by 코낄2 2023. 9. 13.

1. 상속

파이썬에서 상속은  클래스의 속성과 메서드를 다른 클래스에 전달하는 기능을 의미합니다상속을 사용하면 기존의 코드를 재사용하고 확장할  있습니다기본적으로 파이썬의 모든 클래스는 object라는 기본 클래스로부터 상속받습니다.

 

부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스 : 필드를 전달하는 쪽

자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스 : 필드를 전달받는 쪽

class Parent:
  pass
class Child(Parent):
  pass
class MyClass:
    pass

# 위의 코드는 다음과 동일합니다.
class MyClass(object):
    pass
class Animal:
    def __init__(self,name,age):
        self.name = name   # self를 붙여서 선언하는 이유는 다른 메소드에서도 해당 변수를 사용하기 위함이다.
        self.age = age

    def eat(self,food):
        print(f'{self.name}은(는) {food}를 먹습니다.')

    def sleep(self,hour):
        print(f'{self.name}은(는) {hour}시간 동안 잠을 잡니다.')
 
class Dog(Animal):
    pass
# Rucy = Dog() #Animal.__init__() missing 2 required positional arguments: 'name' and 'age'
# Animal 클래스를 상속 받았기 때문에 생성자 매개변수 name, age를 전달 받아야한다.

Rucy = Dog('루시', 14)
Rucy.eat('사료')
Rucy.sleep(10)

***클래스 상속 시 생성자 호출 순서

class Parent:
    def __init__(self):
        print('부모 클래스의 생성자 호출')
class Child(Parent):
    def __init__(self):
        print('child 클래스 생성자 호출')
        super().__init__() # 부모 클래스의 생성자를 호출
        print('자식 클래스의 생성자 호출')
 
child = Child()
>> child 클래스 생성자 호출
     부모 클래스의 생성자 호출
     자식 클래스의 생성자 호출

• 자식 클래스(child class)의 생성자가 호출 > 자식 클래스 생성자에서 부모 클래스(parent class)의 생성자를 호출(super() 함수를 사용)  > 부모 클래스의 생성자가 실행을 마치면 자식 클래스의 생성자로 돌아가 자식 클래스의 생성자 코드가 실행

2. 메서드 오버라이딩

메서드 오버라이딩은 서브 클래스(자식 클래스)에서 슈퍼 클래스(부모 클래스) 메서드를 재정의하는 것을 의미합니다. 서브 클래스는 슈퍼 클래스에서 상속받은 메서드와 동일한 이름의 메서드를 가질 수 있습니다. 이때, 서브 클래스에서의 메서드 구현이 슈퍼 클래스의 메서드를 "오버라이드"합니다. 오버라이딩을 사용하면서브 클래스에서 상속받은 메서드의 동작을 변경하거나 확장할  있습니다.

***메서드의 시그니처: 오버라이딩할 때, 메서드의 이름은 물론이고 매개변수의 타입과 개수도 일치해야 합니다. 반환 타입은 일치할 필요는 없지만, 일반적으로 같게 유지하는 것이 좋습니다.

# 슈퍼 클래스
class Animal:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eat(self,food):
        print(f'{self.name}은(는) {food}를 먹습니다.')

    def sleep(self,hour):
        print(f'{self.name}은(는) {hour}시간 동안 잠을 잡니다.')
# 서브 클래스
class Dog(Animal):
    def run(self):
        print(f'{self.name}은(는) 달립니다.')
    # 메소드 오버라이딩
    def eat(self,food):
        print(f'{self.name}은(는) {food}를 아주 맛있게 먹습니다!')
    #루시은(는) 사료를 아주 맛있게 먹습니다!

    def superEat(self,food):
        super().eat(food)    # super() 함수로 부모 클래스 함수 사용.
     # 루시은(는) 사료를 먹습니다.
animal = Animal('동물', 10)
animal.eat('먹이')
# animal.run() # 자식 클래스의 객체 메서드는 부모클래스 객체가 사용할 수 없음.

 

'파이썬' 카테고리의 다른 글

파일 입출력 라이브러리  (0) 2023.09.14
super()메소드와 다중상속  (0) 2023.09.13
객체지향과 클래스  (0) 2023.09.12
콜백 함수/람다함수/재귀호출  (0) 2023.09.12
사용자 정의 함수  (0) 2023.09.10