우주먼지

💡 Operator Overloading

코틀린은 특정 연산자의 역할을 함수로 정의할 수 있다.

연산자 오버로딩을 할때 operator라는 키워드를 사용하며 이미 정의된 함수를 새롭게 정의하면 된다.

 

이항 산술 연산 오버로딩

  • 코틀린은 +,- 같은 산술 연산자를 오버로딩해서 사용 가능하다.
  • 객체끼리 더하거나 뺄 때, 원하는 동작을 함수안에 구현하면 연산자를 통해 표현이 가능하다.
  • 코틀린은 언어에서 미리 정해둔 연산자만 오버로딩할 수 있기 떄문에,
    다른 언어와 비교해서 오버로딩 연산자를 정의하고 사용하는 것이 더 쉽고 편리하다.

 

식함수 이름

a * b times
a / b div
a % b mod (version 1.1 이상부터는 rem)
a + b plus
a - b minus

 

예시

두 객체를 더하는 확장 함수 정의

// 이항 산술 연산 오버로딩
data class Point(val x: Int, val y: Int) {
    // 연산자를 확장 함수로 정의
    operator fun plus(other: Point): Point {
        return Point(x + other.x, y + other.y)
    }
}

fun main() {
    val point1 = Point(10, 20)
    val point2 = Point(30, 40)

    // 결과값 : Point(x=40, y=60)
    println(point1 + point2)
}

 

연산자를 정의할 때 두 파라미터가 같은 타입일 필요가 없다.

/* ----- 두 파라미터의 타입이 서로 다른 확장 함수 정의 ----- */
operator fun Point.times(scale: Double) : Point {
    return Point( (x * scale).toInt(), (y * scale).toInt() )
}

fun main() {
    val point = Point(10, 20)

    // 결과값 : Point(x=15, y=30)
    println(point * 1.5)
}

 

또한, 연산자 함수의 반환타입이 꼭 파라미터와 일치하지 않아도 된다.

/* ----- 결과 타입이 피연산자 타입과 전혀 다른 연산자 정의 ----- */
operator fun Char.times(count: Int) : String {
    return this.toString().repeat(count)
}

fun main() {
    // 결과값 : AAA
    println('A' * 3)
}

단항 산술 연산자 오버로딩

이항 연산 오버로딩과 마찬가지로 미리 정해진 함수를 선언하면서 operator로 표시한다.

 

식함수 이름

+a unaryPlus
-a unaryMinus
!a not
++a, a++ inc
--a, a-- dec

 

예시

 

단항연산자는 파라미터가 없다.

operator fun Point.unaryMinus() : Point {
    // 각 좌표에 -(음수)를 취한 좌표 반환
    return Point(-x, -y)
}

fun main() {
    val point = Point(10, 20)

    // 결과값 : Point(x = -10, y = -20)
    println(-point)
}

 

"++" 와 "--" 의 경우 inc(), dec()만 구현해두면 알아서 전위/후위 증가/감소 연산을 해준다.

operator fun Int.inc() = this + 2

fun main() {
    var num = 0

    println(num++) // 0
    println(num)   // 2
    println(++num) // 4
}

 

'Languages > Kotlin' 카테고리의 다른 글

Extention Function  (0) 2023.03.29
Kotlin Controll Flow  (0) 2023.03.29
[Operator Overloading] 복합 대입 & 비교 연산자 오버로딩  (0) 2023.03.29
Kotlin Basic Types  (0) 2023.03.26
Kotlin Basic Syntax  (0) 2023.03.26
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그