본문 바로가기
코딩/코틀린

07-3 연산자 오버로딩

by rosemarie 2022. 9. 17.
반응형

연산자 우선순위

우선순위 분류 심볼
높음 접미사 ++ --  . ?.  ?
  접두사 -  +  ++  --  !  라벨선언(이름@)
  오른쪽 형식 : as as?
  배수 *  /  %
  첨가 +  -
  범위 ..
  중위함수 SimpleName
  엘비스 ?:
  이름검사 in !in is !is
  비교 < > <=  >=   
  동등성 ==  !=
  결합 &&
  분리 ||
낮음 할당 = += -= *= /= %=
package chapt7.section3

class Point(var x: Int = 0, var y: Int = 10) {
    operator fun plus(p: Point): Point {
        return Point(x+p.x, y+p.y)
    }
    operator fun dec()=Point(--x,--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})")
    --point
    println("point=(${point.x}, ${point.y})")
}

연산자의 종류

 

산술연산자

표현식 의미
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.rem(b)
a..b a.rangeTo(b)

호출연산자(Invoke Operator)

- 함수를 돕는데 사용됨

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,10)

인덱스 접근 연산자

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

- 인덱스 표기법을 통해 값을 읽어오거나 쓰기가 가능

표현식 의미
a[i] a.get(i)
a[i, j] a.get(i,j)
a[i_1, ..., i_n] a.get(i_1, ..., i_n)
a[i] = b a.set(i, b)
a[i, j] = b a.set(i, j, b)
a[i_1, ..., i_n] = b a.set(i_1, ..., i_n, b)

단일연산자

표현식 의미
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
data class Point(val x: Int, val y: Int)
operator fun Point.unaryMinus() = Point(-x, -y)
val point = Point(10,20)
println(-point)

범위연산자

a in b b.contains(a)
a !in b !b.contains(a)

대입연산자

-연산의 결과 할당

a += b a.plusAssign(b) (a=a+b)
a -= b a.minusAssign(b)
a *= b a.timesAssign(b)
a /= b a.divAssign(b)
a %= b a.remAssign(b)

동등성연산자

equals()

- a, b 둘 다가 null이면 true 반환

- Any 안에 operator 키워드가 붙어서 구현되기 때문에 override 키워드를 사용해서 == 와 치환할 수 있다.

a == b a?.equals(b) ?:(b === null)
a != b !(a?.equals(b) ?: (b===null))

비교 연산자

compareTo()를 호출해 반환되는 정수를 보고 비교

a>b a.compareTo(b) > 0 
a<b a.compareTo(b) < 0 
a>=b a.compareTo(b) >= 0 
a<=b a.compareTo(b) <= 0