1277870953.jpg

C++에는 있지만 자바에는 없는 것은 무엇이 있을까요?

지금은 많이 비슷(?!)해졌지만 아직까지도 차이점은 존재합니다. 


그 중의 하나가 연산자 오버로딩(operator overloading)입니다.


C++는 객체간의 연산을 사용자가 따로 정의하는 방법을 제공하고 있습니다.

그게 연산자 오버로딩인데 자바에서는 지원하지 않고 있죠. 


이런 답답한 부분을 그루비에서 시원스럽게 지원해 주고 있습니다. 


연산자 관련 메서드

  • a + b → a.plus(b)
  • a - b → a.minus(b)
  • a * b → a.multiply(b)
  • a / b → a.divide(b)
  • a % b → a.mod(b)
  • a++ ++a → a.next()
  • a-- --a → a.previous()
  • a**b → power(b)
  • a | b → a.or(b)
  • a & b → a.and(b)
  • a ^ b → a.xor(b)
  • ~a → a.negate()
  • a[b] → a.getAt(b)
  • a[b] = c → a.putAt(b, c)
  • a << b → a.leftShift(b)
  • a >> b → a.rightShift(b)
  • a >>> b → a.rightShiftUnsigned(b)
  • switch(a) { → a.isCase(b)
      case b:
    }
  • a == b → a.equals(b)
  • a != b → !a.equals(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
  • a as type → a.asType(typeClass)

다음은 더하기를 오버로딩한 간단한 예입니다.
클래스마다 필요한 연산을 오버로딩해서 쓰면 되겠습니다.

 class Money {
    int amount
    String currency  

    Money( _amount, _currency) {
        amount = _amount
        currency = _currency
    }   

    String toString() {
        return "$amount$currency"
    }
   
    Money plus(Money b) {
        return new Money(amount + b.amount, currency)
    }
}

def 백원 = new Money(100,'원')
def 천원 = new Money(1000, '원')

println 백원 + 천원


결과

1100원