반응형

연산자 오버로딩(Operator Overloading)

연산자 오버로딩은 객체 지향 프로그래밍의 중요한 속성입니다. 연산자에 특별한 의미를 부여하는 방법이 연산자 오버로딩입니다.

내부적으로 + 연산자는 매직 메서드로 알려진 _add_() 메서드로 구현되는 반면

* 연산자는 문자열 반복에도 적용할 수 있는 _mul_() 메서드로 구현됩니다.

 

다음 스크립트는 Boy 클래스를 만들고 b1 b2Boy 클래스 객체를 생성하였습니다. 그리고 b1, b2객체를 더하기 연산을 한 후 출력하였습니다. 그 결과 지원하지 않는다는 오류 메시지를 출력하였습니다. b1b2객체의 더하기 연산이 정의되어 있지 않기 때문에 오류가 발생하였습니다.

 

class Boy:

  def __init__(selftoys):

    self.toys = toys

 

b1 = Boy(22)

b2 = Boy(30)

print(b1 + b2)

 

TypeError: unsupported operand type(s) for +: 'Boy' and 'Boy'

 

다음 스크립트는 클래스 객체를 위한 + 연산자를 오버로딩하는 예제입니다.

class Boy:

  def __init__(selftoys):

    self.toys = toys

 

  def __add__(selfvar):

    return self.toys + var.toys

 

b1 = Boy(22)

b2 = Boy(30)

print(b1 + b2)

 

Output:

52

 

다음 표는 연산자와 관련 메서드 목록을 보여주고 있습니다.

Operator Magic methods
- object.__sub__(self, other)
+ object.__add__(self, other)
/ object.__truediv__(self, other)
* object.__mul__(self, other)
% object._mod_(self,other)
// object.__floordiv__(self, other)
+= object.__iadd__(self, other)
** object._pow_(self,other)
*= object._imul_(self,other)
-= object.__isub__(self, other)
//= object.__ifloordiv__(self,other)
**= object.__idiv__(self,other)
%= object.__ipow__(self,other)
<= object._imod_(self,other)
object.__le__(self,other)
>= object.__lt__(self,other)
object.__gt__(self,other)
!= object.__ne__(self,other)
== object.__eq__(self,other)

 

다음 스크립트는 > <= 연산자의 오버로딩의 예제입니다.

class Worker:

  def __init__(selfnamesal):

    self.name = name

    self.sal = sal

  

  def __gt__(selfvar):        # > 연산자 magic method

    return self.sal > var.sal

 

  def __le__(selfvar):        # <= 연산자 magic method

    return self.sal <= var.sal

 

w1 = Worker("A", 10000000)

w2 = Worker("B", 13000000)

print(w1 > w2)

print(w1 < w2)

print(w1 <= w2)

print(w1 >= w2)

 

Output:

False

True

True

False

 

다음 스크립트는 * 연산자를 오버로딩한 예제입니다.

class A:

  def __init__(selfsal):

    self.sal = sal

 

  def __mul__(selfvar):

    return self.sal * var.days

 

class B:

  def __init__(selfdays):

    self.days = days

 

a = A(500)

b = B(27)

print('Total Amount:', a*b)

 

Output:

Total Amount: 13500

 

메서드 오버로딩(Method Overloading)

메서드 오버로딩은 동일한 이름으로 메서드를 정의하고 매개변수를 다르게 사용하는 방법입니다. 그러나 파이썬 프로그래밍에서는 메서드 오버로딩은 사용 불가능합니다.오버로드된 메서드는 두 메서드가 동일한 이름을 공유하지만 인수가 다른 메서드입니다. 프로그래머가 동일한 이름과 다른 수의 인수를 사용하여 다양한 메서드를 선언하면 마지막 메서드가 Python 프로그래밍에서 고려됩니다(Hall 2010). 메서드 오버로딩은 파이썬에서 불가능합니다.

 

다음 스크립트는 클래스 A에 동일한 이름을 가진 method1을 매개변수만 다르게 3개 정의하였습니다. aA 클래스의 객체를 만들고 각각의 매서드를 호출하면 마지막으로 정의한 매개변수 2개를 받는 메서드만 오류가 발생하지 않습니다.

 

class A:

  def method1(self):

    print('No arg')

 

  def method1(selfx):

    print('One arg')

 

  def method1(selfxy):

    print('Two-arg')

 

a = A()

#a.method1()    # error

#a.mothod1(3)   # error

a.method1(3, 2)

 

Output:

Two-arg

 

오버로드된 메서드 처리

메서드의 매개변수 입력이 필요에 따라 개수가 변한다면 다음 스크립트처럼 처리하면 됩니다.

class Arth:

  def sum(selfx = Noney = Nonez = None):

    if x != None and y != None and z != None:

      print(x + y + z)

    elif x!= None and y != None:

      print(x + y)

    else:

      print('Default')

 

a = Arth()

a.sum(2)

a.sum(3, 4)

a.sum(2, 3, 4)

 

Output:

Default

7

9

 

다음 스크립트는 여러 개의 매개변수를 입력받기 위해서 *키워드를 사용하여 sum의 매개변수를 *x로 정의하였습니다. Arth클래스로 a객체를 생성한 후 Arth클래스 메서드인 sum을 호출하고 여러 매개변수를 입력하면 입력한 매개변수들은 튜플로 저장됩니다.

 

class Arth:

  def sum(self, *x):

    s = 0

    for i in x:

      s = s + i

    print('Sum: ', s)

    print('type:' , type(x))

 

a = Arth()

a.sum(2)

a.sum(3, 4)

a.sum(2, 3, 4)

 

Output:

Sum:  2

type: <class 'tuple'>

Sum:  7

type: <class 'tuple'>

Sum:  9

type: <class 'tuple'>

 

오버라이딩(Overriding)

오버라이딩은 자식 클래스가 부모 클래스를 상속 받는 경우 부모 클래스의 메서드 이름과 매개변수 및 반환 유형이 비슷한 자식 클래스의 메서드를 정의하면 자식 클래스에서 자체 기능을 정의할 수 있습니다. 부모클래스와 자식클래스에 동일한 이름으로 메서드가 정의되어 있으면 자식 클래스의 메서드가 호출됩니다.

부모 클래스의 메서드를 자식 클래스에서 재정의하는데 사용됩니다.

 

class Parent:

  def m1(self):

    print('Parent m1')

  def m2(self):

    print('Parent m2')

 

class Child(Parent):

  def m2(self):

    print('Child m2')

 

c = Child()

c.m2()

 

Output:

Child m2

반응형

+ Recent posts