Python - Class - 오버로딩과 연산자 오버로딩(수치, 비교, 시퀀스/매핑 자료형), 인스턴스관계확인(isinstance)

반응형

오버로딩(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 출력
반응형