프로그래밍 노트/Kotlin

[Kotlin] 산술/비교 연산자 오버로딩

깡냉쓰 2023. 6. 29. 14:37
728x90
반응형

산술 연산자 오버로딩

이항 산술 연산 오버로딩 (+, -, *, /)

  • 함수 앞에 operator 키워드를 붙이면 연산자 오버로딩이 가능하다.
data class Point(val x: Int, val y: Int) {
  operator fun plus(other: Point): Point) { // plus 이름의 연산자 함수를 정의
    return Point(x + other.x, y + other.y)
  }
}

val p1 = Point(10, 20)
val p2 = Point(30, 40)
println(p1 + p2)
>> Point(x = 40, y = 60)
>> p1 + p2 는 p1.plus(p2)로 컴파일 된다.
  • 미리 정해둔 연산자만 오버로딩 가능
    함수
    a * b times
    a / b div
    a % b rem
    a + b plus
    a - b minus

복합 대입 연산자 오버로딩 (+=, -= ..._)

  • +=, -= 등 복합 대입(compound assignment)연산자 지원
  • 객체에 대한 참조를 다른 참조로 바꾸기 보다는 원래 객체의 내부 상태를 변경하게 만들고 싶을 때 사용한다.
    • plusAssign, minusAssign, timesAssign ..
// 리스트에 객체를 복합 대입 연산자 오버로딩을 사용하여 추가한다.
val numbers = ArrayList<Int>()
numbers += 42
prinln(numbers[0])
>>> 42

operator fun <T>MutableCollection<T>.plusAssign(element: T) {
  this.add(element)
}

주의

  • plus와 plusAssign 연산은 동시에 정의하지 말자
    • 변경 불가능하다면 plus와 같이 새로운 값을 반환하는 연산만 추가
    • 빌더와 같이 변경 가능한 클래스를 설계한다면 plusAssign이나 그와 비슷한 연산만을 제공

단항 연산자 오버로딩 (+a, -a, ...)

operator fun Point.unaryMinus(): Point {
  return Point(-x, -y)
}
함수 이름
+a unaryPlus
-a unaryMinus
!a not
++a, a++ inc
—a, a— dec

비교 연산자 오버로딩

  • 코틀린은 == 연산자 호출을 equals 메서드 호출로 컴파일 한다.
  • 식별자 비교(identity equals)는 === 연산자를 사용한다.
  • <, >, <=, >= 는 Comparable인터페이스 안에 있는 compareTo 메서드로 컴파일 된다.
    • p1 < p2 : p1.compareTo(p2) < 0
class Person(
  val firstName: String, val lastName: String
): Comparable<Person> {
  override fun compareTo(other: Person): Int {
    return compareValueBy(this, other,
      Person::lastName, Person::firstName)
  }
}

val p1 = Person("Alice", "Smith")
val p2 = Person("Bob", "Johnson")
p1 < p2 
>> false
728x90
반응형