파게로그

[OOP] 연산자 오버로딩 본문

콤퓨타 왕기초/Kotlin

[OOP] 연산자 오버로딩

파게 2021. 6. 13. 19:43

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