반응형
오버로딩(Overloading)
- 사전적 - 과적하다, 과부하가 걸리게 하다
- 컴퓨터에서의 의미 - "메소드의 중복 정의", 즉 같은 이름의 메소드를 사용하는 것
- 오버로딩의 예시 - 하나의 노래 검색 함수를 두가지로 활용. 노래검색(제목/가수) -> 제목이나 가수로 노래 검색
파이썬에서의 오버로딩
- 파이썬에서 같은 이름의 메소드를 사용하면 늦게 정의한 메소드로 기능 재정의 (덮어쓰기)
class A:
def func(self,a):
return "hello"
def func(self):
return "world"
a = A() # 클래스 객체 생성
print(a.func())
>>> world
print(a.func(1))
>>> TypeError: func() takes 1 positional argument but 2 were given
연산자 오버로딩
- 기존 약속되어있는 (__) 메소드를 재정의해서 해당 클래스에서 객체간 연산을 가능하게 함 (특수한 메소드)
- 인스턴스 객체 간 연산을 하기 위해 이미 약속되어 있는 연산자를 재정의하여 사용하는 것
- 연산자 오버로딩을 하지 않으면 인스턴스간 연산이 되지 않음
수치 연산자 오버로딩
- 기존 약속되어있는 수치 연산자의 메소드를 재정의
- ex) 덧셈 기능을 하는 수치 연산자의 리턴을 뺄셈으로 할 경우, '+' 기호를 통한 연산시 뺄셈으로 연산 진행
- 연산자 오른쪽에 객체가 오는 경우, 메소드 앞에 r을 붙여줘야함 안그러면 에러 출력
- ex) __radd__, 10+i
- 수치 연산자 종류
- __add__ : 객체간 '+' 기호를 사용 할 시 수행 할 기능을 재정의
- __sub__ : 객체간 '-' 기호를 사용 할 시 수행 할 기능을 재정의
- __mul__ : 객체간 '*' 기호를 사용 할 시 수행 할 기능을 재정의
- __truediv__ : 객체간 '/' 기호를 사용 할 시 수행 할 기능을 재정의
# 연산자 오버로딩을 하지 않은 클래스의 인스턴스 연산
class A:
def __init__(self, i):
self.i = i
n = A(40)
print(n+1) >>> TypeError: unsupported operand type(s) for +: 'A' and 'int'
# 연산자 오버로딩을 한 클래스의 인스턴스 연산
class A:
def __init__(self, i):
self.i = i
# 연산자 오버로딩, 덧셈(+) 기능 재정의
def __add__(self,other):
return self.i +other
n = A(40)
print(n+1) >>> 41
n = A(40)
print(1+n) >>> TypeError: unsupported operand type(s) for +: 'int' and 'A'
# 연산자 오른쪽에 객체가 오는 경우 __radd__ 연산자로 재정의 해주어야 한다.
비교 연산자 오버로딩
- 객체 간 비교 연산 가능하게 해주는 것
- 비교 연산자 종류
- __lt__ : self < other
- __le__ : selft <= other
- __gt__ : self > other
- __ge__ : self >= other
- __eq__ : self == other
- __ne__ : self != other
class MyInteger:
def __init__(self, i):
self.i = i
def __gt__(self, y):
return self.i > y
c = MyInteger(10)
print ( c > 1 )
>>> True
시퀀스/매핑 자료형의 연산자 오버로딩
- 클래스에 다음 연산자들을 활용해 자신만의 시퀀스 자료형 생성
- 즉, 기능을 커스마이징하여 자신만의 기능을 재정의
- 사용자가 정의한 클래스 객체를 리스트, 튜플 객체로 변경 가능
- 시퀀스/매핑 자료형 연산자의 종류
- __len__(self) : len()
- __contains__(self, item) : item in self
- __getitem__(self, key) : self[key]
- __setitem__(self, key, value) : self[key] = value
- __delitem__(self, key) : del self(k)
올바른 연산자 오버로딩
- isinstance(인스턴스, 클래스) : 해당 객체가 클래스로부터 만들어졌는지 확인
# 수치 연산자 재정의로 인한 연산
class A:
def __init__(self, i):
self.i = i
def __add__(self, other):
return self.i + other
i = A(10)
i = i + 1
print(i)
>>> 11
print( isinstance(i, A) )
>>> False
# 값만 입력 받았을뿐 인스턴스가 아님
# A클래스의 리턴값이 return A(self.i + other)이면 True 출력
# 덧셈 함수 구현으로 인한 연산
class A:
def __init__(self, i):
self.i = i
def add(self, n) :
return self.i + n
i = A(10)
print(i.add(1))
>>> 11
print(isinstance(i, A))
>>> True
# A클래스의 리턴값이 return A(self.i + other)이므로 True 출력
반응형