본문 바로가기
Programming/Python

[Python] 다형성 (Polymorphism) (2)

by goatlab 2023. 6. 15.
728x90
반응형
SMALL

super() 메서드

 

 

부모 클래스와 자식 클래스에서 메서드를 작성하면 부모 클래스의 메서드를 자식 클래스에서 사용할 수 없다. 이 경우 자식 클래스의 메서드만 사용할 수 있으며, 자식 클래스의 메서드가 부모 클래스의 메서드를 대체하게 된다. super() 메서드는 자식 클래스에서 부모 클래스의 생성자 또는 메서드를 호출하는 데 사용된다.

 

연산자 오버로딩 (Operator Overloading)

 

연산자가 원래 목적 외의 추가 작업을 수행하는 경우 이를 연산자 오버로딩이라고 한다. 연산자 오버로딩을 사용하면 연산자를 사용자 정의 클래스 객체와 함께 사용할 수 있게 되어 코드의 가독성이 향상된다.

 

  • 파이썬에서는 메서드 이름이나 함수 이름을 오버로딩하는 기능이 명시적으로 지원되지 않는다.
  • 연산자 오버로딩은 파이썬에서 특정 연산자에 대해 다른 동작을 수행하기 위해 메서드를 재정의하는 방식으로 구현된다.
  • 연산자를 재정의하기 위해 메서드를 사용하는 개념을 연산자 오버로딩이라고 부른다.
  • 연산자 오버로딩은 파이썬에서 오버로딩 개념을 연산자에 적용한 것으로 볼 수 있다.
  • 연산자를 다른 동작으로 재정의하기 위해 특정한 메서드를 오버로딩하는 것이 연산자 오버로딩의 개념이다.
  • 연산자 오버로딩은 연산자를 다양한 객체와 조합하여 사용하거나 사용자 정의 클래스에서 특정 연산자의 동작을 재정의할 때 주로 사용된다.
  • 사용자 정의 클래스의 객체 간에는 기본적으로 연산자를 사용할 수 없다.
  • 연산자 오버로딩을 통해 클래스에 **__add__()**와 같은 특수한 메서드를 정의하여 연산자의 동작을 재정의 가능하다.
  • 클래스에 특정한 연산자 동작을 정의하려면 연산자 오버로딩을 사용해야 한다.

 

쉽게 말해, 연산자 오버로딩은 새 객체로 변환 되어서도 자유로운 연산이 가능하다는 것이다. 예를 들어, 두 개의 복소수 객체를 더하려면 다음과 같이 연산자 오버로딩을 사용할 수 있다.

 

class Complex:
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    def __add__(self, other):
        return Complex(self.real+ + other.real, self.imag + other.imag)

    def __str__(self):
        return f"{self.real} + {self.imag}i"

c1 = Complex(1, 2)
c2 = Complex(3, 4)
c3 = c1 + c2

print(c3)

 

실습 1

 

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    # 연산자 오버로딩
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    # 메서드 오버라이딩
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

a = Vector(1, 2)
b = Vector(3, 4)

print(a)             # Vector(1, 2)
print(b)             # Vector(3, 4)

c = a + b
print(c)             # Vector(4, 6)

 

실습 2

 

class ParentClass:
    def __init__(self):
        self.name = 'parent'
        self.number = 10

    def __str__(self):
        return f'ParentClass name : {self.name}, number : {self.number}'

    def add_num(self, new_number):
        print('부모 클래스', new_number, '만큼 더하기')
        self.number = self.number + new_number

    def minus_num(self, new_number):
        print('부모 클래스', new_number, '만큼 빼기')
        self.number = self.number - new_number

    def multiple_num(self, new_number):
        print('자식 클래스 곱하기')
        self.number = self.number * new_number

class ChildClass(ParentClass):
    def __init__(self):
        super().__init__()
        self.name = 'child'
        self.number = 10

    def __str__(self):
        return f'ChildClass name : {self.name}, number : {self.number}'

    def add_num(self, new_number):
        print('자식 클래스에서 5 더하기')
        self.number = self.number + 5

    def minus_num(self, new_number):
        print('자식 클래스에서 5 빼기?')
        self.number = self.number - 5


parent = ParentClass()
child = ChildClass()
print('클래스 정보')
print(parent)
print(child)
print()

print('7 더하기')
parent.add_num(7)
child.add_num(7) 

print(parent)
print(child)
print()

print('7 빼기')
parent.minus_num(7)
child.minus_num(7)

print(parent)
print(child)
print()

print('자식 클래스 10 곱하기')
child.multiple_num(10)
print(child)
728x90
반응형
LIST