Akashic Records

5.2 상속 본문

Python for Beginners

5.2 상속

Andrew's Akashic Records 2023. 3. 20. 13:29
728x90

python for beginner

클래스 상속은 객체지향 프로그래밍의 핵심 개념 중 하나로, 파이썬에서도 광범위하게 사용됩니다. 상속을 통해 한 클래스가 다른 클래스의 속성과 메서드를 물려받을 수 있습니다. 이러한 메커니즘은 코드의 재사용성을 높이고, 관계를 통해 객체 간의 계층을 구성할 수 있게 해 줍니다.

 

상속의 기본 개념

상속은 기존 클래스의 기능을 확장하거나 수정하기 위해 사용됩니다. 기존 클래스를 부모 클래스(superclass 또는 base class)라고 하며, 상속받는 새로운 클래스를 자식 클래스(subclass 또는 derived class)라고 합니다.

자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받습니다. 또한, 자식 클래스는 추가적인 속성과 메서드를 정의할 수 있으며, 부모 클래스의 메서드를 오버라이드(재정의)할 수도 있습니다.

 

파이썬에서의 상속 예제

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        raise NotImplementedError("Subclasses must implement this method")

class Dog(Animal):
    def speak(self):
        return f"{self.name} says Woof!"

class Cat(Animal):
    def speak(self):
        return f"{self.name} says Meow!"

 

위 예제에서 Animal 클래스는 name 속성과 speak() 메서드를 가지고 있습니다. speak() 메서드는 구현이 정의되어 있지 않고, 대신 NotImplementedError를 발생시키는데, 이는 자식 클래스에서 해당 메서드를 반드시 구현하도록 요구합니다.

Dog와 Cat은 Animal 클래스를 상속받으며, 각각 speak() 메서드를 다르게 구현합니다. 이를 통해 같은 메서드(speak()) 호출이지만, 각각의 인스턴스 타입에 따라 다른 결과를 반환합니다.

 

메서드 오버라이딩

자식 클래스에서 부모 클래스의 메서드를 재정의하는 것을 메서드 오버라이딩이라고 합니다. 이는 자식 클래스가 부모 클래스의 행동을 수정하거나 확장하고자 할 때 사용됩니다.

 

super() 함수

super() 함수는 자식 클래스에서 부모 클래스의 메서드를 호출하고자 할 때 사용합니다. 이를 통해 부모 클래스의 초기화 메서드를 호출하거나, 메서드 오버라이딩 시 부모 클래스의 메서드를 확장할 수 있습니다.

class Bird(Animal):
    def __init__(self, name, can_fly):
        super().__init__(name)  # 부모 클래스의 __init__ 호출
        self.can_fly = can_fly

    def speak(self):
        return f"{self.name} says Chirp!"

 

상속의 이점

  1. 코드 재사용: 기존 클래스의 코드를 재사용하여 새 클래스를 쉽게 만들 수 있습니다.
  2. 코드 유지 관리: 공통 기능을 부모 클래스에 유지함으로써, 자식 클래스는 특화된 기능만 관리하면 됩니다.
  3. 다형성: 상속은 다형성을 가능하게 하는 메커니즘을 제공합니다. 부모 클래스 타입의 참조를 사용하여 다양한 자식 클래스의 객체를 참조하고 조작할 수 있습니다.

확장 계념: 다중 상속 예제

 

클래스 예시:

클래스는 객체의 속성(attribute)과 메서드(method)를 정의하는 코드 블록입니다. 속성은 객체의 상태를 나타내는 변수이며, 메서드는 객체의 행동을 나타내는 함수입니다. 클래스를 사용하여 객체를 생성할 때, 각 객체는 독립적인 상태와 행동을 가질 수 있습니다.

 

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def start_engine(self):
        print("엔진이 켜졌습니다.")

    def stop_engine(self):
        print("엔진이 꺼졌습니다.")

 

상속 예시:

상속은 한 클래스의 속성과 메서드를 다른 클래스에서 사용할 수 있도록 전달하는 프로세스입니다. 상속을 사용하면 코드의 재사용성을 높일 수 있으며, 프로그램의 구조를 개선할 수 있습니다. 기본적으로, 상속에는 기초 클래스(부모 클래스 또는 슈퍼 클래스)와 파생 클래스(자식 클래스 또는 서브 클래스)가 있습니다. 파생 클래스는 기초 클래스의 속성과 메서드를 상속받아 사용할 수 있으며, 필요한 경우 새로운 속성과 메서드를 추가하거나 기존의 것을 오버라이딩(재정의)할 수 있습니다.

class ElectricCar(Car):
    def __init__(self, make, model, year, battery_capacity):
        super().__init__(make, model, year)
        self.battery_capacity = battery_capacity

    def charge_battery(self):
        print("배터리를 충전합니다.")

    def start_engine(self):
        print("전기 엔진이 켜졌습니다.")

이 예제에서 ElectricCar 클래스는 Car 클래스를 상속받아 추가적인 속성인 battery_capacity와 새로운 메서드인 charge_battery를 가지고 있습니다. 또한 start_engine 메서드를 오버라이딩하여 전기차에 맞게 동작하도록 변경했습니다.

 

다중 상속:

파이썬에서는 다중 상속이 가능합니다. 다중 상속은 여러 기초 클래스로부터 상속을 받는 것을 말합니다. 다중 상속을 사용하면, 파생 클래스는 여러 기초 클래스의 속성과 메서드를 사용할 수 있습니다. 다중 상속은 코드의 복잡성을 증가시킬 수 있으므로, 신중하게 사용해야 합니다.

다중 상속 예시:

class Engine:
    def start_engine(self):
        print("엔진이 켜졌습니다.")

    def stop_engine(self):
        print("엔진이 꺼졌습니다.")


class AirConditioner:
    def turn_on_ac(self):
        print("에어컨이 켜졌습니다.")

    def turn_off_ac(self):
        print("에어컨이 꺼졌습니다.")


class LuxuryCar(Car, Engine, AirConditioner):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)

    def start_parking_assist(self):
        print("주차 보조 시스템이 작동합니다.")

    def stop_parking_assist(self):
        print("주차 보조 시스템이 중지됩니다.")


luxury_car = LuxuryCar("BMW", "7 Series", 2022)
luxury_car.start_engine()
luxury_car.turn_on_ac()
luxury_car.start_parking_assist()

이 예제에서 LuxuryCar 클래스는 Car, Engine, AirConditioner 클래스를 상속받습니다. 이를 통해 LuxuryCar 객체는 여러 기초 클래스의 속성과 메서드에 접근할 수 있습니다. 다중 상속을 사용할 때 주의할 점은 다이아몬드 문제(다중 상속으로 인해 메서드 호출이 모호해지는 문제)를 피하기 위해 상속 계층 구조를 명확하게 유지하는 것입니다.

 

클래스와 상속을 사용하면 객체 지향 프로그래밍의 핵심 원칙인 캡슐화(데이터와 기능을 하나의 객체에 묶음), 상속(코드의 재사용성), 다형성(여러 클래스에서 동일한 인터페이스를 사용하여 다양한 동작을 구현)을 실현할 수 있습니다. 이를 통해 유지 보수가 용이하고 확장성 있는 프로그램을 작성할 수 있습니다.

728x90

'Python for Beginners' 카테고리의 다른 글

5.4 캡슐화  (0) 2023.03.20
5.3 다형성  (0) 2023.03.20
5.1 클래스(Class)와 객체(Object)  (0) 2023.03.20
4.4 CSV, JSON 파일 다루기  (0) 2023.03.20
4.3 파일 관리  (0) 2023.03.20
Comments