Kotlin/Variable and Function

[Kotlin] operator fun 을 통한 연산자 오버로딩 한번에 정리하기

Dev.Cho 2024. 4. 1. 07:56

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)를 더하며, 이 둘을 더한 값을 출력한다. 따라서 위 코드를 실행해보면 다음과 같은 결과를 볼 수 있다.

그림1. operator fun plus 결과

 

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은 매우 유용하지만, 잘못 사용하게 되면 오히려 가독성을 저하시킬 수 있어 정말 필요한 경우인지 확인하고 작성하는 것이 좋다고 생각한다. 

 

 

반응형