에르노트

코틀린 연산자 오버로딩(Operator Overloading) 본문

Dev/Kotlin

코틀린 연산자 오버로딩(Operator Overloading)

두콩 2020. 2. 1. 21:11

자바에서는 연산자 오버로딩을 문법적으로 지원하지 않는다. 하지만 코를린에서는 연산자의 역할을 함수로 정의함으로써(Convention) 일반적인 함수를 정의하는 느낌 그대로 연산자를 이용할 수 있다. 따라서 플러스(+)와 같은 연산자에 여러 가지 다른 의미를 심어줄 수 있는데 이를 연산자 오버로딩(Operator Overloading)이라고 한다.

val a = 1
val b = 2
println(a + b) //1번
println(a.plus(b)) //2번
//1번과 2번은 100%은 같은 의미이다!

이처럼 연산자를 사용하는 것은 관련된 멤버 메서드를 호출하는 것과 같다.

 

 

그래서 직접 plus 메소드를 쳐보면 파라미터에 따라 다르게 정의되어(오버로딩) 있는 것을 확인할 수 있다

 

fun main(){
    println(Point(1, 3) + Point(2, 2))
}

class Point(var x: Int, var y: Int){
    operator fun plus(p: Point): Point =
        Point(x + p.x, y + p.y)

    override fun toString(): String =
        "Point: ($x, $y)"
}

실행 결과: Point: (3, 5)

 

방법은 간단하다. operator 키워드를 붙이고 해당 연산자에 대응되는 함수를 정의해주면 된다. 예시에서는 Point 클래스의 멤버 함수로서 plus를 정의해줌으로써 + 연산자를 오버로딩했다.

 

 

또한 연산자를 클래스의 멤버 함수가 아니라 확장 함수(Extension Function)로 정의할 수도 있다.

 

fun main(){
    var p = Point(2, 2)
    println(--p)
}

class Point(var x: Int, var y: Int){
    override fun toString(): String =
        "Point: ($x, $y)"
}

operator fun Point.dec() = Point(--x, --y)

이번에는 값을 감소시키는 증감연산자인 -- 연산자를 오버로딩했다. (-- 연산자의 함수명은 dec이다)

이처럼 Point 클래스의 멤버가 아니라 확장 함수 형태로도 오버로딩이 가능하므로 활용도가 높다.

 

각 연산자에 매핑되는 함수명을 알고 싶으면 코틀린 공식 문서를 참조하면 된다. 또 인텔리제이를 이용하면 좀 더 간편하게 확인이 가능한데, 컨트롤(Ctrl) 키를 누른 상태에서 연산자에 마우스 커서를 가져다 놓으면 해당 함수 정의를 확인할 수 있다.

 

인텔리제이를 이용한 연산자 정의 확인

 

Comments