포스트

Kotlin의 연산자 다루기


단항 연산자 / 산술 연산자


단항 연산자

  • ++
  • --


산술 연산자

  • +
  • -
  • *
  • /
  • %


산술대입 연산자

  • +=
  • -=
  • *=
  • /=
  • %=


Java와 Kotlin 모두 동일!!



비교 연산자와 동등성, 동일성


비교 연산자

  • >
  • <
  • >=
  • <=


Kotlin은 Java와 다르게 객체를 비교할 때 비교 연산자를 사용하면 자동으로 compareTo를 호출


Kotlin 비교 연산자 사용

1
2
3
4
5
6
    val money1 = JavaMoney(2_000L)
    val money2 = JavaMoney(1_000L)

    if(money1 > money2){
        println("Money1이 Money2보다 금액이 큽니다")
    }

위와 같이 객체를 비교할 때 비교 연산자를 사용할 수 있는데, 그 때 자동으로 compareTo를 호출한다.


  • 동등성(Equality) : 두 객체의 값이 같은가?
  • 동일성(Identity) : 완전히 동일한 객체인가? (주소가 같은가?)

Java에서는 값을 비교하는 겨우는 ==을 사용하고, 값은 동일하지만 주소가 다른 경우는 equals를 사용

  • 즉, 동일성 -> == / 동등성 -> equals


Kotlin은 동일성과 동등성을 어떻게 구별하나?

  • 동등성 : == (간접적으로 equals 호출)
  • 동일성 : ===


동일성 예시

1
2
3
4
5
    val money1 = JavaMoney(2_000L)
    val money2 = JavaMoney(1_000L)
    val money3 = money2

    println(money3 === money2)

위와 같은 상황에서 주소가 같기 때문에 true를 반환


동일성 false 예시

1
2
3
4
5
    val money1 = JavaMoney(1_000L)
    val money2 = JavaMoney(1_000L)
    val money3 = money2

    println(money3 === money1)

이렇게 값은 같지만 주소가 다른 경우는 ===false를 반환


동등성 예시

1
2
3
4
5
    val money1 = JavaMoney(1_000L)
    val money2 = JavaMoney(1_000L)
    val money3 = money2

    println(money3 == money1)

==을 사용하면 주소가 아닌 값을 비교하기 때문에 true 반환




논리 연산자 / 코틀린에 있는 특이한 연산자


  • &&
  • ||
  • !

Java와 완전히 동일하고, Lazy연산을 수행


Lazy 논리 연산 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    // fun2를 실행하지 않고 "본문 실행"을 출력
    // ||는 `또는` 이기 때문에 fun1() 이 true 여서 뒤는 볼 필요 없이 넘긴다. (Lazy 연산)
    if(fun1() || fun2()){
        println("본문 실행")
    }

    // fun1()을 생행하지 않고 블럭을 넘김
    // &&는 `모두` 이기 때문에 fun2() 가 이미 false 이기 때문에 뒤는 볼 필요 없이 넘긴다. (Lazy 연산)
    if(fun2() && fun1()){
        println("본문 실행")
    }


fun fun1(): Boolean {
    println("fun1")
    return true
}

fun fun2(): Boolean {
    println("fun2")
    return false
}


Kotlin에 있는 특이한 연산자

  • in / !in
    • 컬렉션이나 범위에 포함되어 있다 / 포함되지 않는다
  • a..b
    • a부터 b까지의 범위 객체를 생성
    • 반복문에서 주로 쓰임
  • a[i]
    • a에서 특정 Index i로 값을 가져옴 (배열과 비슷)
  • a[i] = b
    • a에 특정 Index i에 b를 넣음




연산자 오버로딩


  • Kotlin은 객체마다 연산자를 직접 정의 가능


Money class 예시

1
2
3
4
5
6
7
8
data class Money(
    val amount: Long
) {

    operator fun plus(other: Money): Money{
        return Money(this.amount + other.amount)
    }
}


Money 객체 연산

1
2
3
4
    val kotlinMoney1 = Money(1_000L)
    val kotlinMoney2 = Money(2_000L)

    println(kotlinMoney1 + kotlinMoney2)

위와 같이 객체를 +로 연산해도 plus 메서드 처럼 Money(amount=3000)와 같은 값을 얻을 수 있다.

  • 즉, 객체 끼리의 연산자를 Kotlin은 직접 정의할 수 있음
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.