[코틀린기초] 35. 연산자 오버로딩

연산자에 여러 가지 다른 의미의 작동을 부여

코틀린에서는 특정 연산자의 역할을 함수로 정의

operator 키워드를 사용해 정의한다

ex) 오버로딩된 plus() 함수의 종류

  operator fun plus(other: Byte): Int
  operator fun plus(other: Short): Int
  operator fun plus(other: Int): Int
  ...
  
  operator fun String?.plus(other: Any?): String  // 문자열은 이어 붙이도록 되어있다
  

ex) plus 오버로딩 예시

  class Point(var x: Int = 0, var y : Int = 10){
    operator fun plus(p: Point) : Point{
      return Point(x + p.x, y + p.y)
    }
  }
  
  fun main(){
    val p1 = Point(3,-8)
    val p2 = Point(2,9)
    
    var point = Point()
    point = p1+p2
    println("point = (${point.x}, ${point.y})")
  }

ex) – 연산 오버로딩

  class Point(var x: Int =0, var y : Int = 10){
    operator fun dec() = Point(--x,--y)
  }
  
  fun main(){
  ...
    --point
    println("point = (${point.x}, ${point.y})")
  }
    

연산자 종류

호출 연산자

함수 호출을 돕는데 사용한다.

  class Manager{
    operator fun invoke(value: String){
      println(value)
    }
  }
  
  fun main(){
    val manager = Manager()
    manager("Do something for me!") //  manager.invoke("...") 형태로 호출되며, invoke가 생략되었다.
  }
  val sum = {x:Int, y:Int -> x + y}
  sum.invoke(3,10)
  sum(3,100

인덱스 연산자

게터/세터를 다루기 위한 대괄호([]) 연산자를 제공

단일 연산자

먼저 a의 자료형을 결정하고 매개변수 없이 각 연산자에 대한 함수를 호출한 다름 연산된 결과를 반환

  data class Point(val x: Int, val y: Int)
  
  operator fun Point.unaryMinus() = Point(-x,-y)
  val point = Point(10,20)
  println(-point)   //  단일 연산자에 의해 (-10,-20)으로 값을 바꾼다

포함 범위 연산자

in 연산자는 반복문에 사용해 특정 객체의 반복에 사용 혹은 포함 여부 판단

  if(i in 1..10){
    println(i)
  }
  
  for(i in 1..4) print(i)

할당 연산자

동등성 연산자

비교 연산자