파게로그
[OOP] 연산자 오버로딩 본문
Kotlin에서 연산자를 사용하면 해당 연산자에 상응하는 멤버 함수가 호출된다. 예를 들어, a+b라는 표현은 내부적으로는 a.plus(b)로 변환되는 것이다. 사실, plus() 함수는 Kotlin의 여러 기본 자료형과 String에 맞추어 작동하도록 오버로딩되었다.
// + operator for basic types
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
// for string concatenation
operator fun String?.plus(other: Any?): String
사용자 또한 연산자에 해당하는 함수를 오버로딩함으로써 연산자의 작동 방식을 정의할 수 있다. 예를 들어, plus() 함수를 오버로딩함으로써 + 연산자가 어떻게 작동하는지를 정의할 수 있는 것이다.
fun main(args: Array<String>) {
val p1 = Point(10, 20)
val p2 = Point(100, 200)
val sum = p1 + p2
println("x: ${sum.x}, y: ${sum.y}")
}
class Point(val x: Int, val y: Int) {
operator fun plus(p: Point): Point = Point(x + p.x, y + p.y)
}
또 다른 예로, operator fun dec()를 정의함으로써 -- 연산자의 작동 방식을 정의할 수 있다.
다만 주의할 점은 다음과 같다.
▪ 연산자의 본래 의미에서 너무 동떨어지지 않도록 주의한다. 기술적으로 올바르다 한들, 연산자의 본래 의미와 너무 동떨어진 방식으로 작동하도록 오버로딩한다면, 이는 곧 프로그램의 혼란을 유발한다.
▪ Scala와 같은 언어와 달리, Kotlin에서는 특정한 연산자만이 오버로드될 수 있다.
'콤퓨타 왕기초 > Kotlin' 카테고리의 다른 글
[Basic] package (0) | 2021.06.15 |
---|---|
[OOP] Extension Function (0) | 2021.06.13 |
[OOP] Object, singleton pattern (0) | 2021.06.13 |
[OOP] Sealed Classes (0) | 2021.06.13 |
[OOP] Data Class (0) | 2021.06.13 |
Comments