-
[코틀린] 연산자 오버로딩코틀린 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