Recent Posts
Recent Comments
에르노트
코틀린 연산자 오버로딩(Operator Overloading) 본문
자바에서는 연산자 오버로딩을 문법적으로 지원하지 않는다. 하지만 코를린에서는 연산자의 역할을 함수로 정의함으로써(Convention) 일반적인 함수를 정의하는 느낌 그대로 연산자를 이용할 수 있다. 따라서 플러스(+)와 같은 연산자에 여러 가지 다른 의미를 심어줄 수 있는데 이를 연산자 오버로딩(Operator Overloading)이라고 한다.
val a = 1
val b = 2
println(a + b) //1번
println(a.plus(b)) //2번
//1번과 2번은 100%은 같은 의미이다!
이처럼 연산자를 사용하는 것은 관련된 멤버 메서드를 호출하는 것과 같다.
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) 키를 누른 상태에서 연산자에 마우스 커서를 가져다 놓으면 해당 함수 정의를 확인할 수 있다.
'Dev > Kotlin' 카테고리의 다른 글
코틀린 표준 Scope 함수 정리 (let, also, apply, run, with) (1) | 2020.02.04 |
---|---|
코틀린 컬렉션 역순으로 뒤집기 reverse(), reversed(), reversedArray() (0) | 2020.01.29 |
코틀린 toByteArray() (1) | 2019.11.07 |
Comments