[기초] 코틀린에서 연산자를 다루는 방법

정리

- 단항 연산자, 산술 연산자, 산술대입 연산자는 Java와 동일하다
- 비교 연산자 사용법도 Java 동일하지만,
  객체끼리도 자동 호출되는 compareTo를 이용해 비교 연산자를 사용할 수 있다
- in / !in / a..b / a[i] / a[i] = b 와 같이 코틀린에서 새로 생긴 연산자도 있다
- 객체끼리의 연산자를 직접 정의할 수 있다

 

단항 연산자 / 산술 연산자

- 단항 연산자: ++ --
- 산술 연산자: + - * / %
- 산술대입 연산자: += -= *= /= %=

 

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

비교 연산자

- 비교 연산자: > < <= >=

 

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

fun main() {
    val money1 = JavaMoney(2_000L)
    val money2 = JavaMoney(1_000L)
    
    if(money1 > money2) {
		println("Money1이 Money2보다 금액이 크다")
    }
}

 

동등성, 동일성

- 동등성(Equality): 두 객체의 값이 같은가

- 동일성(Identity): 완전히 동일한 객체인가(주소가 같은가)

 

Java

동일성에는 == 를 사용하고, 동등성에는 equals를 직접 호출한다

public static void main(String[] args){
    JavaMoney money1 = new JavaMoney(1_000L);
    JavaMoney money2 = money1;
    JavaMoney money3 = new JavaMoney(1_000L);
    
    System.out.println(money1 == money2); // true
    System.out.println(money1 == money3); // false
}

 

Kotlin

동일성에는 === 를 사용, 동등성에는 == 를 호출한다.

== 를 사용하면 간접적으로 equals를 호출해준다.

fun main() {
    val money1 = JavaMoney(2_000L)
    val money2 = money1
    val money3 = JavaMoney(1_000L)
    
    println(money1 === money2) // true
    println(money1 === money3) // false
    println(money1 == money3) // true
}

 

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

논리 연산자

- 논리 연산자: && || !

 

Java와 완전 동일하며, Lazy 연산을 수행한다

 

💡Lazy 연산이란?

필요한 시점에만 계산하는 방식이다
fun main() {
    if(fun1() || fun2()) {
    	println("본문")
    }
}

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

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

/* 
-- 결과 --
fun1
본문
*/

위와 같은 함수가 있을 때 main에서 fun1이 true면 어짜피 실행이 될 것이기 때문에, fun2는 수행 없이 바로 본문이 출력된다.

 

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

- in / !in

  : 컬렉션이나 범위에 포함되어 있다 / 포함되어 있지 않다

- a..b

  : a부터 b까지의 범위 객체를 생성한다

- a[i]

  : a에서 특정 index i로 값을 가져온다

- a[i] = b

  : a의 특정 index i에 b를 넣는다

 

연산자 오버로딩

코틀린에서는 객체마다 연산자를 직접 정의할 수 있다

public static void main(String[] args) {
    JavaMoney money1 = new JavaMoney(1_000L);
    JavaMoney money2 = new JavaMoney(2_000L);
    
    System.out.println(moeny1.plus(money2));
}


public class JavaMoney implements Comparable<JavaMoeny> {
    private final long amount;
    (...)
    
    public JavaMoney plus(JavaMoney other) {
        return new JavaMoney(this.amount + other.amount);
    }
	
    (...)
}

자바에서 위와 같은 로직이 있다고 하자

fun main() {
    val money1 = Money(1_000L)
    val money2 = Money(2_000L)
    
    println(money1 + moeny2) // 3000
}

data class Money(
	val amount: Long
){
	operator fun plus(other: Money): Money {
    	return Money(this.amount + other.amount)
    }
}

코틀린에서는 operator 키워드를 사용해서 특정 함수 이름으로 연산자의 동작을 정의할 수 있다