Groovy는 숫자, 콜랙션, Map 등의 다양한 자료 구조를 더 쉽게 사용할 수 있게 하기 위해 연산자 재정의(operator overloading)를 지원합니다.
Groovy의 다양한 연산자들은 각각 대응되는 보통의 자바 메서드 이름을 가지고 있습니다. 따라서 자바 혹은 Groovy 클래스에 해당 이름의 메서드를 추가하면 Groovy의 연산자 재정의를 이용할 수 있습니다. 다음 표는 Groovy의 각 연산자와 그에 대응되는 메서드 이름을 나타냅니다:
연산자 | 메서드 |
|---|---|
a + b | a.plus(b) |
a - b | a.minus(b) |
a * b | a.multiply(b) |
a / b | a.divide(b) |
a++ or ++a | a.next() |
a-- or --a | a.previous() |
a[b] | a.getAt(b) |
a[b] = c | a.putAt(b, c) |
a << b | a.leftShift(b) |
다음 모든 비교 연산자는 null을 특별히 처리해서 java.lang.NullPointerException 가 발생하는 것을 방지합니다:
Operator | Method |
|---|---|
a == b | a.equals(b) |
a != b | ! a.equals(b) |
a === b | 자바에서의 a == b (a와 b가 동일한 인스턴스를 지칭하고 있음) |
a <=> b | a.compareTo(b) |
a > b | a.compareTo(b) > 0 |
a >= b | a.compareTo(b) >= 0 |
a < b | a.compareTo(b) < 0 |
a <= b | a.compareTo(b) <= 0 |
연산자에 대한 비고
Groovy에서는 비교 연산자들이 null에 대해 특별한 처리를 합니다. 따라서 a == b는 a 혹은 b 혹은 둘 다가 null인 경우 모두 결코 NullPointerException을 발생시키지 않습니다:
| Code Block | ||
|---|---|---|
| ||
def a = null def b = "foo" assert a != b assert b != a assert a == null |
또한 서로 다른 숫자 타입에 대해 비교가 수행될 경우 가장 큰 숫자 타입으로 변환된 후 비교가 진행됩니다. 따라서 Groovy에서는 다음 코드가 유효합니다:
| Code Block | ||
|---|---|---|
| ||
Byte a = 12 Double b = 10 assert a instanceof Byte assert b instanceof Double assert a > b |