내가 오늘 본 operator 키워드가 사용된 코드는 이러했다.
operator fun String.get(i: Int): Char = this[i]
물론 해당 문제를 푸는데 있어서 크게 중요한 코드는 아니였지만, 이번 기회에 operator에 대해서 정리를 해야겠다고 생각이 들어서 오늘 operator에 대해서 정리를 해보려고한다.
operator 키워드는 연산자 오버로딩을 가능하게 해준다. 라고 간단하게 설명할 수 있다.
그럼 여기서 말하는 연산자 오버로딩이란 무엇일까? 오버로딩이란 용어만 알고 있다면 생각보다 간단하게 유추 할 수 있다.
오버로딩
하나의 클래스에서 동일한 이름의 메서드를 매개변수의 타입이나 개수를 다르게 지정하여 재정의하는 것을 의미한다.
그럼 여기서 말하는 연산자 오버로딩이란 연산자를 재정의할 수 있게 해준다. 이런 뜻으로 해석할 수 있다.
정리하자면, operator 키워드는 연산자 오버로딩을 위해 함수 앞에 사용되는 키워드입니다. 이를 통해 해당 함수가
특정 연산자에 매핑되었다는 것을 의미한다.
나는 설명만 보고서 잘 이해가 되지않는 부분들이 있어서 실제 operator 키워드가 사용된 코드를 참고했다.
data class Point(val x: Int, val y: Int)
operator fun Point.plus(other: Point): Point {
return Point(this.x + other.x, this.y + other.y)
}
fun main() {
val p1 = Point(1, 2)
val p2 = Point(3, 4)
val p3 = p1 + p2
println(p3) // Point(x=4, y=6)
}
해당 코드는 Point라는 특정 클래스에 대한 plus 연산자를 재정의 하는 코드라고 볼 수 있다.
그렇다면 만약 연산자 오버로딩을 사용하지 않는다면?? 어떻게 코드를 짤 수 있을까?
data class Point(val x: Int, val y: Int)
fun addPoints(p1: Point, p2: Point): Point {
return Point(p1.x + p2.x, p1.y + p2.y)
}
fun main() {
val p1 = Point(1, 2)
val p2 = Point(3, 4)
val p3 = addPoints(p1, p2)
println(p3) // Point(x=4, y=6)
}
operator 키워드를 통한 연산자 오버로딩으로 +, -, *, / 등의 연산자에 대해서 직관적이고 간편하게 사용할 수 있다.