지금까지 파이썬을 공부하면서 연산자를 활용해 데이터의 연산을 다양하게 수행해 보았을 것이다.
'chill ' + 'guy' # 'chill guy'
12 - 8 # 4
'hello' * 3 # 'hellohellohello'
우리가 직접 정의한 클래스의 인스턴스 간에도 이런 연산자들을 통한 연산들이 가능해진다면 더 쉽게 프로그래밍을 할 수 있을 것이다. 다행히 파이썬은 그런 기능을 제공한다.
연산자 오버로딩이란?
연산자 오버로딩(Operator Overloading)은 기존에 정의된 연산자(+, -, *, / 등)의 동작을 커스텀 클래스에 맞게 재정의하는 기능이다. 이를 통해 사용자 정의 클래스의 인스턴스 간에도 직관적인 연산을 수행할 수 있게 된다. 우리가 직접 만든 사용자 정의 객체를 마치 파이썬의 내장 객체처럼 동작하도록 만들 수 있다는 것이다.
파이썬에서 연산자 오버로딩을 구현하려면 매직 메서드(Magic Methods)라고 불리는 특수 메서드를 사용한다. 이러한 메서드는 __add__, __sub__, __mul__ 등과 같이 언더스코어 두 개(__)로 시작하고 끝나는 이름을 가지고 있다.
다음은 주요 매직 메서드들이다:
연산자 | 매직 메서드 |
+ | __add__(self, other) |
- | __sub__(self, other) |
* | __mul__(self, other) |
/ | __truediv__(self, other) |
// | __floordiv__(self, other) |
% | __mod__(self, other) |
** | __pow__(self, other) |
== | __eq__(self, other) |
!= | __ne__(self, other) |
< | __lt__(self, other) |
<= | __le__(self, other) |
> | __gt__(self, other) |
>= | __ge__(self, other) |
클래스에서 연산자 오버로딩
자, 연산자 오버로딩이 무엇인지, 그리고 어떤 매직 메서드들이 있는지 살펴보았다. 이제 실제로 이것을 클래스에 어떻게 적용할 수 있는지 알아보자. 바로 예제를 보며 이해해 보자.
아래는 2차원 좌표 위의 점을 나타내는 Point 클래스이다. 생성자 함수에 x 좌표와 y 좌표를 넘겨줄 수 있다.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
이제 이 두 점의 좌표를 서로 더하고 싶다. 우선 두 점 각각의 객체를 생성한 후 서로 더해보도록 하겠다.
p1 = Point(2, 4)
p2 = Point(5, -2)
p3 = p1 + p2 # ❌ TypeError 오류 발생!
앗.. 에러가 난다. 두 점의 덧셈 연산이 안 된다.
사실 당연한 결과다. + 연산자가 Point가 뭔 줄 알고 어떻게 덧셈을 하겠는가. 사용자 정의 클래스의 경우는 우리가 설계해서 커스텀한 클래스이기 때문에 + 연산 시 어떤 결과가 나오게 할지도 우리가 직접 설정을 해줘야 한다. 파이썬에서는 이것에 대한 방법을 제공하고 있다. + 연산에 대한 매직 메서드, __add__(self, other)를 정의하면 Point 클래스에서도 + 연산자를 활용할 수 있게 된다.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# 덧셈 연산자 오버로딩
def __add__(self, other):
x = self.x + other.x
y = self.x + other.x
return Point(x, y)
이제 점들끼리의 덧셈을 시도해 보자.
p1 = Point(2, 4)
p2 = Point(5, -2)
print(p1 + p2) # <__main__.Point object at 0x0A4F030>
이번에는 오류가 발생하지 않는다! 그렇지만 여전히 우리가 원하는 값이 나오고 있지는 않고 print의 결과로 객체의 주소가 출력되고 있다. 이것은 인스턴스 변수들의 값을 하나의 문자열로 만들어서 반환하는 __str__() 메서드로 해결할 수 있다.
class Point:
# ...
def __str__(self):
return "Point(" + str(self.x) + ", " + str(self.y) + ")"
p1 = Point(2, 4)
p2 = Point(5, -2)
print(p1 + p2) # Point(4, 6)
이제 원하는 결과를 출력한다.
위 예제에서 __add__() 메서드를 정의함으로써, v1 + v2와 같은 직관적인 연산이 가능해졌다. 두 점의 x와 y 값을 각각 더한 새로운 Point 객체가 잘 반환된다. 위 예제에서는 + 연산자에 대한 매직 메서드만 정의했으나, 다른 연산자에 대해서도 해당하는 매직 메서드를 활용하면(위의 표 참고) 더 많은 연산자에 대한 작업을 정의할 수 있어 객체에 대한 쉽고 직관적인 연산이 가능해진다.
정리
파이썬의 연산자 오버로딩은 커스텀 클래스에 자연스러운 연산 기능을 추가하여 코드를 더욱 직관적이고 읽기 쉽게 만들어주는 강력한 도구다. 연산자 오버로딩을 적절히 활용하면, 복잡한 데이터 구조를 간결하게 다루고, 코드의 재사용성과 가독성을 높일 수 있다. 그러나 과도한 사용은 오히려 코드를 복잡하게 만들 수 있으므로, 명확한 목적과 일관성을 유지하며 사용하는 것이 중요하다. 연산자 오버로딩의 개념과 사용법을 잘 익혀서 적절하게 활용해 보자.
'Language > Python' 카테고리의 다른 글
[Python] 파이썬을 배우면 무엇을 할 수 있을까? 파이썬 대표 라이브러리 알아보기 (6) | 2025.01.24 |
---|---|
[Python] 파이썬에서 자주 사용하는 내장 함수 정리 (1) | 2025.01.23 |
[Python] 파이썬 클래스 변수 이해하기 (클래스 변수 vs 인스턴스 변수) (0) | 2025.01.22 |
[Python] 파이썬 정보 은닉 개념 이해하기 (0) | 2025.01.21 |
[Python] 파이썬 클래스와 생성자 사용하여 객체 생성하기 (0) | 2025.01.21 |