코틀린에서 연산자를 어떻게 사용하고, 코틀린에만 있는 연산자에는 무엇이 있는지 알아본다.
연산자
단항 연산자 / 산술 연산자
- 단항 연산자
- ++, –
- 산술 연산자
- +, -, *, /, %
- 산술 대입 연산자
- +=, -=, *=, /=, %=
자바와 코틀린이 완전히 동일하다.
비교 연산자와 동등성, 동일성
- 비교 연산자
- <, >, <=, >=
자바와 사용법은 같지만 자바와 다르게 객체를 비교할 때 비교 연산자를 사용해도 compareTo를 자동으로 호출해준다.
- 동등성
- 두 객체의 값이 같은지?
- 동일성
- 완전히 동일한 객체인가? 즉, 주소가 같은가?
자바에서 동일성에는 ==를 사용했고, 동등성에 equals를 호출했다.
코틀린에서는 어떨까?
1
2
3
4
5
6
7
val money1 = Money(1_000L)
val money2 = money1
val money3 = Money(1_000L)
println(money1 === money2) // true
println(money1 === money3) // false
println(money1 == money3) // true
- 동일성에 ===을 사용한다.
- 동등성에 ==을 사용하면 간접적으로 equals를 호출해준다.
논리 연산자
- 논리 연산자
&&, , !
자바와 완전히 동일하다.
자바와 같이 Lazy 연산을 수행한다.
Lazy 연산?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun main() {
if (fun1() || fun2() {
println("main")
}
}
fun fun1(): Boolean {
println("fun 1")
return true
}
fun fun2(): Boolean {
println("fun 2")
return false
}
- 실행해보면 출력 결과는 fun1, main이 나타난다.
- or 연산 시 fun1()에서 이미 true를 반환받았기 때문에 fun2()까지 확인할 필요가 없다.
위와 같은 경우가 lazy 연산이다.
코틀린에 있는 특이 연산자
- in, !in
- 컬렉션이나 범위에 포함되어 있다, 포함되어 있지 않다.
1
println(1 in numbers)
- a..b
- a부터 b까지 범위 객체를 생성한다.
- a[i]
- a에서 특정 Index i값을 가져온다.
- a[i] = b
- a의 특정 index i에 b를 넣는다.
연산자 오버로딩
코틀린에서는 객체마다 연산자를 직접 정의할 수 있다.
1
2
3
val money1 = Money(1_000L)
val money2 = Money(2_000L)
println(money1 + money2)
자바에서는 이러한 기능을 구현하려면 plus()같은 메서드를 정의해주고 money1.plus(money2) 이런 방식으로 사용했었다.
코틀린을 이용한 방법을 보자.
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)
}
}
위와 같이 정의할 수 있다. 똑같이 plus() 메서드로 연산을 할 수도 있지만 + 연산자를 사용할 수도 있다. 어떻게 가능한걸까?
우선 operator 키워드를 사용하면 되고, 알맞은 함수를 오버라이딩하여 정의하면 된다.
표현 | 함수 |
---|---|
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.plusAssign(b) |
a -= b | a.minusAssign(b) |
a *= b | a.timesAssign(b) |
a /= b | a.divAssign(b) |
a %= b | a.remAssign(b) |
표를 보면 알 수 있듯 +를 오버로딩한다고 하여 +=이 자동으로 동일한 연산이 되지 않는다.
정리
- 단항연산자, 산술연산자, 산술대입연산자는 자바와 동일하다.
- 비교 연산자도 Java와 같다.
- 객체끼리의 비교에서는 자동으로 호출되는 compareTo 덕분에 자바와 다르게 비교 연산자를 그대로 사용해도 동작한다.
- in, !in, a..b, a[i], a[i] = b와 같은 코틀린에서 생긴 연산자도 존재한다.
- 객체끼리의 연산자를 직접 정의해줄 수 있다.