우리는 문자열을 결합하기 위하여 + 연산자를 사용하고 2개의 문자열을 비교하기 위하여 == 연산자를 사용합니다.
이들 연산자들은 실제로 str 클래스 안에 정의된 메소드입니다. 연산자를 메소드로 정의하는 것을 연산자 오버로딩(operator overloading)이라고 합니다.
연산자 오버로딩을 이용하면 여러 가지 연산자들을 클래스들의 메소드로 연결할 수 있습니다.
예를 들어서 + 연산자에 대응되는 메소드는 __add(self, other)이고 == 연산자들에 대응되는 메소드는 __eq__(self, other)입니다.
문자열을 연결할 때 + 연산자 대신에 이들 메소드를 사용하여도 됩니다. (물론 일부러 그러시면 봉민이입니다. ^^ )
s1 = "Red "
s2 = "Velvet"
s3 = s1.__add__(s2)
print(s3)
<실행 결과>
Red Velvet
| 연산자 | 수식 예 | 내부적인 함수 호출 |
|---|---|---|
| 덧셈 | x + y | x.__add__(y) |
| 뺄셈 | x - y | x.__sub__(y) |
| 곱셈 | x * y | x.__mul__(y) |
| 지수 | x ** y | x.__pow__(y) |
| 나눗셈(실수) | x / y | x.__truediv__(y) |
| 나눗셈(정수) | x // y | x.__floordiv__(y) |
| 나머지 | x % y | x.__mod__(y) |
| 비트 왼쪽 이동 | x << y | x.__lshift__(y) |
| 비트 오른쪽 이동 | x >> y | x.__rshift__(y) |
| 비트 AND | x & y | x.__and__(y) |
| 비트 OR | x | y | x.__or__(y) |
| 비트 XOR | x ^ y | x.__xor__(y) |
| 비트 NOT | ~x | x.__invert__() |
우리가 작성하는 클래스에서도 기본 연산자들을 우리 마음대로 재정의하여서 사용할 수 있습니다.
예를 들어서 2차원 공간에서 한 점을 클래스로 정의하였다고 가정할 때 점과 점을 + 연산으로 합할 수 있다면 편리할 것입니다.
class Point:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2)
<실행 결과>
TypeError: unsupported operand type(s) for +: 'Point' and 'Point'
기본적으로 Point 클래스 객체에 대해서는 + 연산이 정의되지 않습니다.
하지만 우리가 만약 다음과 같이 __add__(self, other)를 정의한다면 Point 클래스에 대해서도 + 연산자를 적용할 수 있습니다.
class Point:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Point(x, y) # Point 객체 끼리의 + 연산을 정의합니다.
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2)
<실행 결과>
<__main__.Point object at 0x000002A42ADD4A90>
이번에는 오류가 발생하지 않았지만 print(p1 + p2)의 결과값이 객체의 주소가 출력됩니다.
이것도 아래와 같이 __str__()을 이용하여서 출력 형식을 변경할 수 있습니다.
class Point:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Point(x, y) # Point 객체 끼리의 + 연산을 정의합니다.
def __str__(self):
return 'Point(' + str(self.x) + ', ' + str(self.y) + ')'
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1 + p2)
<실행 결과>
Point(4, 6)
책을 나타내는 Book 클래스를 작성하고 Book 클래스 내부에 __add__() 함수를 정의하여 Book 클래스의 객체들을 서로 합할 수 있게 합시다.
__add__() 함수는 책의 페이지들을 합쳐서 반환합니다.
Book 클래스는 다음과 같은 인스턴스 변수를 가집니다.
book1은 '자료구조'라는 책의 제목과 600 페이지를 가지며, book2는 'C언어'라는 책의 제목과 700 페이지를 가질 때 book1 + book2 의 계산 결과를 출력하세요.
<실행 결과>
1300