Kotlin

[Kotlin] 9.1 산술 연산자를 오버로드해서 임의의 클래스에 대한 연산을 더 편리하게 만들기

mygomii 2025. 5. 12. 19:01
반응형
  • 코틀린에서 관례를 사용하는 가장 단순한 예는 산술 연산자

9.1.1 plus, times, divide 등: 이항 산술 연산 오버로딩

data class Point(val x: Int, val y: Int) {
    operator fun plus(other: Point): Point {
        return Point(x + other.x, y + other.y)
    }
}
fun main() {
	val p1 = Point(10, 20)
	val p2 = Point(30, 40)
	println(p1 + p2) // 기호를 쓰면 plus 함수가 호출 
	// Point(x=40, y=60)
}
  • plus 함수 앞에 operator 키워드를 붙여야 한다는 점
  • 연산자를 오버로딩하는 함수 앞에는 반드시 operator 가 있어야함
  • operator 키워드를 붙임으로 써 어떤 함수가 관례를 따르는 함수임을 명확히 할 수 있음
  • 실수로 관례에서 사용하는 함수 이름을 사용하는 경우를 막아줌
  • 함수 이름(plus, minus, times, div 등)과 operator 키워드를 맞추면, 표준 연산자(+, -, *, /)를 그대로 사용 가능

9.1.2 연산을 적용한 다음에 그 결과를 바로 대입: 복합 연산자 오버로딩

  • plus 와 같은 연산자를 오버로딩하면 코틀린은 + 연산자뿐 아니라 그와 관련 있는 연산자인 += 도 자동으로 함께 지원 += , -= 등의 연산자는 복합 대입 연산자라고 부름

9.1.3 피연산자가 1개뿐인 연산자: 단한 연산자 오버로딩

  • 단항 연산자를 오버로딩하는 절차도 이항 연산자와 마찬가지
  • 미리 정해진 이름의 함수를 선언하면서 operator 로 표시하면 됨
data class Point(val x: Int, val y: Int) {
    // -point
    operator fun unaryMinus(): Point =
        Point(-x, -y)

    // ++point
    operator fun inc(): Point =
        Point(x + 1, y + 1)

    // --point
    operator fun dec(): Point =
        Point(x - 1, y - 1)
}
fun main() {
    val p = Point(3, 5)

    val neg = -p
    println(neg)   // Point(x=-3, y=-5)

    val p2 = p.inc()    // 혹은 ++p
    println(p2)   // Point(x=4, y=6)

    var p3 = p
    p3++
    println(p3)   // Point(x=4, y=6)

    val p4 = p3.dec()   // 혹은 --p3
    println(p4)   // Point(x=3, y=5)
}
반응형