파이썬 클래스: 심화 내용

2024. 5. 23. 21:57Python/Python Programming

반응형

파이썬 클래스: 심화 내용

파이썬 클래스는 객체 지향 프로그래밍의 기본 단위이며, 앞서 살펴본 기본 개념 외에도 다양한 기능을 제공합니다. 이번 블로그 글에서는 클래스 상속, 다중 상속, 추상 클래스, 인터페이스 등 심화적인 내용을 다뤄보겠습니다.

1. 클래스 상속

상속은 기존 클래스의 기능을 새로운 클래스에 물려주는 개념입니다. 기존 클래스를 부모 클래스, 새로운 클래스를 자식 클래스라고 부릅니다. 자식 클래스는 부모 클래스의 속성과 메서드를 상속받고, 추가적으로 새로운 속성과 메서드를 정의할 수 있습니다.

 
class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def introduce(self):
    print(f"저는 {self.name}입니다. 나이는 {self.age}살입니다.")

class Student(Person):  # Person 클래스를 상속
  def __init__(self, name, age, major):
    super().__init__(name, age)  # 부모 클래스의 __init__ 메서드 호출
    self.major = major

  def study(self):
    print(f"{self.major}을 공부합니다.")

student1 = Student("홍길동", 20, "컴퓨터공학")
student1.introduce()  # 상속받은 메서드 사용
student1.study()  # 자식 클래스에서 정의한 메서드 사용
 

상속의 장점:

  • 코드 재사용성 향상: 부모 클래스에서 작성된 코드를 자식 클래스에서 재사용할 수 있어 코드 작성량을 줄이고 유지 관리를 용이하게 합니다.
  • 코드 구조 명확화: 상속을 통해 코드 구조가 더욱 명확하고 계층적으로 구성되어 이해하기 쉬워집니다.

2. 다중 상속

다중 상속은 하나의 자식 클래스가 여러 개의 부모 클래스로부터 상속받는 개념입니다. 다중 상속을 통해 자식 클래스는 여러 부모 클래스의 기능을 모두 물려받을 수 있습니다.

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

  def eat(self):
    print(f"{self.name}이 먹습니다.")

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

  def nurse(self):
    print(f"{self.name}이 새끼를 돌봅니다.")

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

  def fly(self):
    print(f"{self.name}이 날아갑니다.")

class Bat(Mammal, Bird):  # Mammal과 Bird 클래스를 다중 상속
  def __init__(self, name, fur_color, wing_span):
    super().__init__(name, fur_color)  # Mammal 클래스의 __init__ 메서드 호출
    super().__init__(name, wing_span)  # Bird 클래스의 __init__ 메서드 호출
    # self.name, self.fur_color, self.wing_span은 이미 초기화됨

  def unique_ability(self):
    print(f"{self.name}은 포유류이면서 날 수도 있습니다.")

bat1 = Bat("박쥐", "검은색", 1.5)
bat1.eat()  # 상속받은 메서드 사용
bat1.nurse()  # 상속받은 메서드 사용
bat1.fly()  # 상속받은 메서드 사용
bat1.unique_ability()  # 자식 클래스에서 정의한 메서드 사용
 

다중 상속의 주의점:

  • 다중 상속을 사용하면 코드 구조가 복잡해질 수 있으므로 신중하게 사용해야 합니다.
  • 상속받은 메서드 이름이 동일한 경우 충돌이 발생할 수 있으므로 주의해야 합니다.

 

3. 추상 클래스

추상 클래스는 설계만 하고 구현은 하지 않는 클래스입니다. 추상 클래스는 메서드 이름만 정의하고, 구현은 자식 클래스에서 해야 합니다. 추상 클래스를 사용하면 코드의 구조를 명확하게 하고, 자식 클래스 간의 일관성을 유지하는 데 도움이 됩니다.

 
from abc import ABC, abstractmethod

class Shape(ABC):
  @abstractmethod
  def area(self):
    pass

  @abstractmethod
  def perimeter(self):
    pass

class Square(Shape):
  def __init__(self, side_length):
    self.side_length = side_length

  def area(self):
    return self.side_length * self.side_length

  def perimeter(self):
    return 4 * self.side_length

class Circle(Shape):
  def __init__(self, radius):
    self.radius = radius

  def area(self):
    return 3.1415 * self.radius * self.radius

  def perimeter(self):
    return 2 * 3.1415 * self.radius

square1 = Square(5)
print(f"사각형 넓이: {square1.area()}")
print(f"사각형 둘레: {square1.perimeter()}")

circle1 = Circle(3)
print(f"원 넓이: {circle1.area()}")
print(f"원 둘레: {circle1.perimeter()}")
 

추상 클래스의 장점:

  • 코드 구조 명확화: 추상 클래스를 사용하면 코드의 구조가 더욱 명확하고 이해하기 쉬워집니다.
  • 자식 클래스 간 일관성 유지: 추상 클래스를 통해 자식 클래스들이 반드시 구현해야 하는 메서드를 정의하여 일관성을 유지할 수 있습니다.
  • 코드 재사용성 향상: 추상 클래스에서 공통적으로 사용되는 코드를 정의하여 코드 재사용성을 향상시킬 수 있습니다.

4. 인터페이스

인터페이스는 메서드 이름만 정의하고, 구현은 구체적인 클래스에서 하는 일종의 계약입니다. 추상 클래스와 유사하지만, 인터페이스는 다중 상속을 허용합니다. 즉, 하나의 클래스가 여러 개의 인터페이스를 구현할 수 있습니다.

 
from abc import ABC, abstractmethod

class IDisplayable(ABC):
  @abstractmethod
  def display(self):
    pass

class IMovable(ABC):
  @abstractmethod
  def move(self):
    pass

class Player(IDisplayable, IMovable):
  def __init__(self, name, position):
    self.name = name
    self.position = position

  def display(self):
    print(f"{self.name} 선수가 {self.position} 포지션에 있습니다.")

  def move(self, direction):
    print(f"{self.name} 선수가 {direction} 방향으로 이동합니다.")

player1 = Player("홍길동", "FW")
player1.display()
player1.move("왼쪽")
 

인터페이스의 장점:

  • 코드 재사용성 향상: 인터페이스를 통해 공통적인 기능을 정의하여 코드 재사용성을 향상시킬 수 있습니다.
  • 코드 유연성 향상: 인터페이스를 사용하면 구체적인 구현을 클래스에서 별도로 하기 때문에 코드 유연성을 높일 수 있습니다.
  • 코드 결합 감소: 인터페이스를 사용하면 클래스 간의 결합을 감소시켜 코드 유지 관리를 용이하게 합니다.

5. 마무리

파이썬 클래스는 객체 지향 프로그래밍의 기본 단위이며, 상속, 다중 상속, 추상 클래스, 인터페이스 등 다양한 기능을 제공합니다.

이러한 기능들을 효과적으로 활용하면 코드를 더욱 효율적이고 생산적으로 만들 수 있습니다.

반응형