ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코틀린] 연산자 오버로딩
    코틀린 2022. 3. 20. 00:05

    1. 연산자 오버로딩

    코틀린에서는 개발자가 정의한 클래스에도 +, * 연산자를 정의해 줄 수 있다. 클래스 내에 RationalNumber를 인자로 받는 operator fun plus라는 키워드로 함수를 정의하면 이 클래스들 간의 + 연산이 정의된다.

    아래는 RationalNumber 클래스 간의 + 와 RationalNumber 클래스와 정수 간의 + 를 정의한 것이다.

    class RationalNumber(
        val numerator: Int,
        val denominator: Int
    ) {
        operator fun plus(other: RationalNumber): RationalNumber {
            return RationalNumber(
                this.numerator * other.denominator + other.numerator * this.denominator,
                this.denominator * other.denominator
            )
        }
    
        operator fun plus(other: Int): RationalNumber {
            return RationalNumber(
                this.numerator + this.numerator * other,
                this.denominator
            )
        }
    
        override fun toString(): String {
            return "$numerator / $denominator"
        }
    }
    
    println(RationalNumber(1, 2) + RationalNumber(1, 4)) // 출력: 6 / 8
    println(RationalNumber(1, 2) + 1) // 출력: 3 / 2

    * 은 times함수를 정의하면 된다.

    operator fun times(other: RationalNumber): RationalNumber {
        return RationalNumber(
            this.numerator * other.numerator,
            this.denominator * other.denominator
        )
    } // RationalNumber 클래스 내에 구현한다.
    
    println(RationalNumber(1, 2) * RationalNumber(1, 2)) // 출력 1 / 4

     

    2. 확장 함수로 기본 타입에 연산자 정의하기

    위의 RationalNumber에 Int 타입과의 plus를 정의했었다. 하지만 이 plus는 아래와 같은 경우까지 처리해주지는 못한다.

    operator fun plus(other: Int): RationalNumber {
        return RationalNumber(
            this.numerator + this.denominator * other,
            this.denominator
        )
    } // RationalNumber 내에 구현된 함수
    
    println(1 + RationalNumber(1, 2)) // 에러 발생함

    RationalNumber(1, 2) + 1 은 RationalNumber(1, 2).plus(1) 로 계산할 수 있다. 그러나 1 + RationalNumber(1, 2)는 1.plus(RationalNumber(1, 2)) 이기 때문에 Int 타입에 RationalNumber와의 plus가 정의되어있어야한다.

    코틀린은 확장함수를 통해서 이미 정의되어있는 클래스에 필요한 함수를 추가해 줄 수 있다. 

    operator fun Int.plus(rationalNumber: RationalNumber): RationalNumber {
        return RationalNumber(
            this * rationalNumber.denominator + rationalNumber.numerator,
            rationalNumber.denominator
        )
    }
    
    println(1 + RationalNumber(1, 2)) // 출력 3 / 2

    아래는 코틀린 공식문서에 연산자와 각 연산자를 정의할 수 있는 함수가 나와있다.

    https://kotlinlang.org/docs/operator-overloading.html#unary-operations

     

    '코틀린' 카테고리의 다른 글

    [코틀린] also, apply, let, run  (0) 2022.03.20
    [코틀린] 확장함수와 확장속성  (0) 2022.03.20
    [코틀린] 내부 반복(map, filter, groupBy, reduce)  (0) 2022.03.19
    [코틀린] 람다  (0) 2022.03.19
    [코틀린] 델리게이션  (0) 2022.03.16

    댓글

Designed by Tistory.