English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서는 예제를 통해 연산자 오버로드에 대해 배웁니다(연산자가 사용자 정의 타입(예: 객체)에 어떻게 작동하는지 정의).
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에서는 특정 연산자 그룹만을 오버로드할 수 있습니다.