Languages

kotlin 산술 연산자 오버로딩 (+, - *)

!쪼렙조햄 2020. 5. 18. 14:24
반응형

7.1 산술 연산자 오버로딩

  • String 에 대해 + 연산자를 사용하는 것 또한 산술 연산자 오버로딩
  • BigInteger 클래스를 다룬다면 add 메소드를 명시적으로 호출하기 보다는 + 연산을 사용하는 편이 더 낫다?
  • 컬렉션에서도 += 연산자를 사용하도록 할 수 있다

7.1.1 이항 산술 연산 오버로딩

data class Point(val x : Int, val y : Int){
    operator fun plus(other: Point): Point {
    return Point(x+otherx, y+other.y)
  }
}
val p1 = Point(10,20)
val p2 = Point(30,40)
println(p1 + p2)
  • 위 코드에서 + 를 써주면 plus 함수가 호출된다
    • plus 앞에 operator을 붙임으로서, 관례를 따르는 함수임을 명시
    • * 는 times, /는 div %는 mod, - 는 minus 등..
  • 직접 정의한 함수로 구현하더라도 연산자 우선순위는 표준 숫자 타입에 대한 연산자 우선순위와 같다
  • 연산자의 두 파라미터가 같은 타입일 필요는 없다
    • 그대신 kotlin 연산자가 자동으로 교환법칙을 지원하지는 않는다

7.1.2 복합 대입 연산자 오버로딩

  • plus 연산자를 오버로딩 하면 + 뿐만 아니라 자동으로 += 도 사용할 수 있게 된다

  • +=, -= : 복합 대입 연산자

    • 원래 += 를 쓰면 결과 값을 표현하는 객체를 만들어서 참조를 바꿔치기 한다

    • 참조 바꿔치기 대신 원래 객체의 내부 상태를 변경하도록 하고 싶다면?

      • plusAssign, minusAssign, timesAssign 등을 사용
    • 반환 타입이 Unit인 plusAssign 함수를 정의하면 코틀린은 += 연산자에 그 함수를 사용한다?

      • kotlin 에서 Unit은 Java에서 Void

        plus는 새로운 객체를 반환해주어야 했지만, plusAssign은 새로운 객체를 반환하는 것이 아닌 원래 객체를 변경하는 것이기 때문에 반환 값이 없다

  • +=

    • plus, plusAssign 양쪽으로 컴파일 할 수 있다
    • 두개를 모두 정의하면 컴파일러 오류
      • 일반 연산자를 사용하면 해결할 수 있다?
      • var을 val로 바꾸어서 plusAssign 적용이 불가능하게 할 수도 있다
    • 일반적으로는 둘다 정의하지 말기
  • 코틀린 표준 라이브러리에서는

    • + 는 plus, += 는 plusAssign

7.1.3 단항 연산자 오버로딩

operator fun Point.unaryMinus() : Point{
    return Point(-x, -y)
}
val p = Point(10,20)
println(-p)
  • 단항 연산자도 이항연산자와 마찬가지로, 미리 정해진 이름의 함수를 operator로 선언하면 된다
  • + : unaryPlus, - : unaryMinus, ! : not, ++ : inc, -- dec
반응형