Home Kotlin - 연산자
Post
Cancel

Kotlin - 연산자

코틀린에서 연산자를 어떻게 사용하고, 코틀린에만 있는 연산자에는 무엇이 있는지 알아본다.

연산자

단항 연산자 / 산술 연산자

  • 단항 연산자
    • ++, –
  • 산술 연산자
    • +, -, *, /, %
  • 산술 대입 연산자
    • +=, -=, *=, /=, %=

자바와 코틀린이 완전히 동일하다.

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

  • 비교 연산자
    • <, >, <=, >=

자바와 사용법은 같지만 자바와 다르게 객체를 비교할 때 비교 연산자를 사용해도 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 + ba.plus(b)
a - ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.rem(b)
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.remAssign(b)

표를 보면 알 수 있듯 +를 오버로딩한다고 하여 +=이 자동으로 동일한 연산이 되지 않는다.

정리

  • 단항연산자, 산술연산자, 산술대입연산자는 자바와 동일하다.
  • 비교 연산자도 Java와 같다.
    • 객체끼리의 비교에서는 자동으로 호출되는 compareTo 덕분에 자바와 다르게 비교 연산자를 그대로 사용해도 동작한다.
  • in, !in, a..b, a[i], a[i] = b와 같은 코틀린에서 생긴 연산자도 존재한다.
  • 객체끼리의 연산자를 직접 정의해줄 수 있다.
This post is licensed under CC BY 4.0 by the author.