operator fun이란
코틀린은 특정한 부호의 연산을 함수로 정의할 수 있는 연산자 오버로딩 기능을 제공한다. 예를 들어 plus 라는 함수를 operator fun으로 선언하면 + 연산과 같은 효과를 낸다. 예를 들어 다음 Vector 클래스를 살펴보자.
data class Vector(val x: Float, val y: Float) {
operator fun plus(vector: Vector): Vector {
return Vector(this.x + vector.x, this.y + vector.y)
}
}
이 Vector 클래스는 operator fun plus을 선언하고 있으며, 이 함수는 두 Vector를 더할 때 x 값은 x 값끼리, y 값은 y 값끼리 더해 Vector 객체의 x 값과 y값에 입력해 새로운 인스턴스를 반환한다.
이렇게 선언된 operator fun plus는 다음 main 함수와 같이 사용될 수 있다.
fun main() {
val vector1 = Vector(1f, 1f)
val vector2 = Vector(-1f, 1f)
val result = vector1 + vector2 // plus 연산이 일어남
println(result)
}
main 함수에서는 Vector(1f, 1f)와 Vector(-1f, 1f)를 더하며, 이 둘을 더한 값을 출력한다. 따라서 위 코드를 실행해보면 다음과 같은 결과를 볼 수 있다.
operator fun의 종류
operator fun을 매우 다양하다. Kotlin에서 사용할 수 있는 operator fun의 종류는 다음과 같다.
산술연산자
사용법
산술 연산자는 두 개의 객체에 대한 연산을 수행하기 위한 연산자이다. 예를 들어 다음과 같이 사용할 수 있다.
fun main() {
val vector1 = Vector(1f, 1f)
val vector2 = Vector(-1f, 1f)
val result = vector1 + vector2 // 산술 연산자
println(result)
}
정류
산술 연산자의 종류는 다음과 같다.
함수 이름 | 연산자 | 설명 |
plus | + | 더하기 |
minus | - | 빼기 |
times | * | 곱하기 |
div | / | 나누기 |
rem | % | 나머지 연산 |
대입 연산자
사용법
대입 연산자는 객체 자체의 값을 변경시키는데 사용되는 연산자이다. 따라서 반환값이 없어야 한다. 예를 들어 Vector에 대한 += 연산을 수행하는 plusAssign을 구현하면 다음과 같아진다.
data class Vector(var x: Float, var y: Float) {
operator fun plusAssign(vector: Vector) {
this.x += vector.x
this.y += vector.y
}
}
fun main() {
val vector1 = Vector(1f, 1f)
val vector2 = Vector(-1f, 1f)
vector1 += vector2 // plusAssign연산이 일어남
println(vector1) // Vector(x=0.0, y=2.0) 출력
}
종류
대입 연산자의 종류는 다음과 같다.
함수 이름 | 연산자 | 설명 |
plusAssign | += | 더해서 대입 |
minusAssign | -= | 빼서 대입 |
timesAssign | *= | 곱해서 대입 |
divAssign | /= | 나눠서 대입 |
단항 연산자
사용법
단항 연산자는, 객체의 앞에 붙어 객체에 특정한 연산을 수행하는 연산자이다. 예를들어 vector 변수 앞에 -vector가 붙으면 이것이 unaryMinus 연산자가 된다.
data class Vector(val x: Float, val y: Float) {
operator fun unaryMinus(): Vector {
return Vector(-x, -y)
}
}
fun main() {
val vector1 = Vector(1f, 1f)
println(-vector1) // Vector(x=-1.0, y=-1.0) 출력
}
종류
단항 연산자의 종류는 다음과 같다.
함수 이름 | 연산자 | 사용법(object가 변수명) |
unaryPlus | + | +object |
unaryMinus | - | -object |
not | ! | !object |
inc | ++ | ++object |
dec | -- | --object |
정리 및 개인적인 의견
- operator fun 을 사용해 연산자를 오버로딩하면, 부호를 통한 연산을 하는 방법을 직접 작성할 수 있다.
- 개인적으로는 operator fun은 매우 유용하지만, 잘못 사용하게 되면 오히려 가독성을 저하시킬 수 있어 정말 필요한 경우인지 확인하고 작성하는 것이 좋다고 생각한다.