App노자

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

Android/Kotlin

[Kotlin] 연산자 오버로딩

앱의노예 2023. 5. 28. 16:12

1. 연산자 오버로딩이란?


fun main() {
    val a = 5
    val b = 10
    
    print(a.plus(b))
    // public operator fun plus(other: Int): Int
}

연산자를 사용하면 관련된 멤버 메서드를 호출하는 것과 같다

a + b는 a.plus(b)라는 함수가 내부적으로 호출되는 것이다 

연산자 오버로딩이란 클래스의 다형성 중 하나로 사용자의 필요에 의해 플러스와 같은 연산자에 여러 가지 다른 동작을 부여 하는 커스터마이징의 개념이다

 

코틀린 표준 라이브러리에 있는 Primitives.kt 파일이다

확인해 보면 operator키워드로 다양한 자료형들이 오버로딩되어 있는 것을 확인할 수 있다

https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Primitives.kt

 

GitHub - JetBrains/kotlin: The Kotlin Programming Language.

The Kotlin Programming Language. . Contribute to JetBrains/kotlin development by creating an account on GitHub.

github.com

class Point(var x: Int = 0, var y: Int = 10) {
    // plus 함수의 연산자 오버로딩
    operator fun plus(p: Point) : Point {
        return Point(x + p.x, y + p.y)
    }
    operator fun dec() = Point(--x, --y)
}

fun main() {
    val p1 = Point(3, -8)
    val p2 = Point(2, 9)

    var point = Point()
    point = p1 + p2
    println("point = (${point.x}, ${point.y})")
}

Point 클래스를 만들고 + 연산자를 오버로딩했다

operator키워드를 이용해 다양하게 활용이 가능하다

2. 호출 연산자


class Manager {
    operator fun invoke(value: String) {
        println(value)
    }
}

fun main() {
    val manager = Manager()

    // 원래는 manager.invoke("...")형태로 호출되며 invoke가 생략되었다.
    manager("Do something for me!")

    // 람다식 함수에는 invoke가 기본 정의된다.
    val sum = { x: Int, y: Int -> x + y }
    sum.invoke(3, 10)
    sum(3, 10) // 위와 동일한 결과

}

 

호출 연산자는 함수 호출을 돕는 데 사용 된다

특정 객체에 인수를 넣어 처리하기 위해 operator키워드를 이용해 다양하게 활용이 가능하다

3. 단일 연산자


enum class Day(var num: Int) {
    Monday(1), Tuesday(2), Wednesday(3), Thursday(4),
    Friday(5), Saturday(6), Sunday(7)
}

fun main() {
    val day = Day.Monday
    when(day.num) {
        1,2,3,4,5, -> println("weekDay")
        6,7 -> println("weekend")
    }
}

 

 

 

 

 

4. 범위 연산자


enum class Day(var num: Int) {
    Monday(1), Tuesday(2), Wednesday(3), Thursday(4),
    Friday(5), Saturday(6), Sunday(7)
}

fun main() {
    val day = Day.Monday
    when(day.num) {
        1,2,3,4,5, -> println("weekDay")
        6,7 -> println("weekend")
    }
}

 

 

 

 

 

 

 

 

 

5. 기타 연산자


인덱스 접근 연산자
public operator fun get(index: Int): Int

public operator fun set(index: Int, value: Int): Unit

인덱스 접근 연산자는 게터와 세터를 다루기 위해 대괄호 연산자를 제공한다 인덱스 표기법을 통해 값을 읽고 쓰기가 가능하다