English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin 연산자 오버로드

이 문서에서는 예제를 통해 연산자 오버로드에 대해 배웁니다(연산자가 사용자 정의 타입(예: 객체)에 어떻게 작동하는지 정의).

Kotlin에서 operator를 사용할 때, 그에 상응하는 멤버 함수를 호출합니다. 예를 들어, 표현식 a + b는 배경에서 a.plus(b)로 변환됩니다.

fun main(args: Array<String>) {
    val a = 5
    val b = 10
    print(a.plus(b)) // print(a+b)
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

15

실제로 plus() 함수는 다양한 Kotlin 기본 타입과 String(문자열)을 처리하기 위해 오버로드되었습니다.

// + 기본 타입의 연산자
operator fun plus(other: Byte): Int
operator fun plus(other: Short): Int
operator fun plus(other: Int): Int
operator fun plus(other: Long): Long
operator fun plus(other: Float): Float
operator fun plus(other: Double): Double
//문자열 결합에 사용됩니다
operator fun String?.plus(other: Any?): String

객체에 대해 연산자가 어떻게 작동하는지 정의하려면 해당 함수를 오버로드할 수 있습니다. 예를 들어, plus() 함수를 오버로드하여 다음과 같이 정의해야 합니다+연산자가 객체에 대해 어떻게 작동하는지 이해합니다.

예제:오버로드+연산자

fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)
    var sum = Point()
    sum = p1 + p2
    println("합 = (${sum.x}, ${sum.y})")
}
class Point(val x: Int = 0, val y: Int = 10) {
    //plus 함수를 오버로드합니다
    operator fun plus(p: Point): Point
        return Point(x + p.x, y + p.y)
    }
}

프로그램을 실행할 때, 출력은 다음과 같습니다:

sum = (5, 1)

여기서 plus() 함수는 operator 키워드로 표시되어 컴파일러에게 알립니다 + 연산자가 오버로드되고 있습니다.

표현식 p1 + p2 배경에서 p로 변환됩니다.1.plus(p2)。

예제:- 연산자 오버로드

이 예제에서는 연산자를 오버로드하는 방법을 배웁니다. - 연산자 표현식 --a는 배경에서 a.dec()로 변환됩니다.

dec() 멤버 함수는 매개변수를 포함하지 않습니다.

fun main(args: Array<String>) {
    var point = Point(3, -8)
    --point
    println("point = (${point.x}, ${point.y})")
}
class Point(var x: Int = 0, var y: Int = 10) {
    operator fun dec() = Point(--x, --y)
}

프로그램을 실행할 때, 출력은 다음과 같을 것입니다:

point = (2, -9)

기억해 두세요

operator fun dec() = Point(--x, --y)

相当于

operator fun dec(): Point
    return Point(--x, --y)
}

이 점을 유의하세요

1运算자를 오버로드할 때, 원래 의미를 유지하려고 시도해야 합니다. 예를 들어,

fun main(args: Array<String>) {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)
    var sum = Point()
    sum = p1 + p2
    println("합 = (${sum.x}, ${sum.y})")
}
class Point(val x: Int = 0, val y: Int = 10) {
    //plus 함수를 오버로드하다
    operator fun plus(p: Point) = Point(x - p.x, y - p.y)
}

위의 프로그램은 기술적으로 올바르지만, 우리는 + 연산자는 두 개의 객체의 해당 속성을 뺄 수 있으며, 이는 프로그램을 혼란스럽게 만듭니다.

2Scala와 같은 언어와는 달리, Kotlin에서는 특정 연산자 그룹만을 오버로드할 수 있습니다.