본문 바로가기

공부방/Kotlin

코틀린에서 연산자를 다루는 방법

1. 단항 연산자 / 산술 연산자

 

자바와 코틀린 완전 동일하게 사용할 수 있습니다.

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

 

 

2. 비교 연산자

 

자바에서는 객체에 있는 값을 이용한 비교를 할 때 compareTo를 override로 구현하고 이를 호출해서 비교합니다.

아래 JavaMoney라는 객체가 있습니다.

 

public class JavaMoney implements Comparable<JavaMoney> {

	private final long amount;

	public JavaMoney(long amount) {
	this.amount = amount;
	}

	@Override
	public int compareTo(@NotNull JavaMoney o) {
	return Long.compare(this.amount, o.amount);
	}
}

 

[Java]

JavaMoney에 있는 amount 값을 비교하는 코드를 확인해봅시다.

위에서 말했던것과 동일하게 자바에서는 compareTo를 호출해서 money 객체의 amount를 비교하고 있습니다.

 

public class Lec04Main {

	public static void main(String[] args) {
		JavaMoney money1 = new JavaMoney(1_000L);
		JavaMoney money2 = new JavaMoney(2_000L);

		if (money1.compareTo(money2) > 0) {
			System.out.println("Money1이 Money2보다 금액이 큽니다.");
		}
		System.out.println(money1.plus(money2));
	}
}

 

[코틀린]

코틀린에서는 어떻게 객체의 값을 비교할 수 있을까요?

코틀린에서는 compareTo를 가지고 오는 대신, 비교 연산자만 사용하면 코틀린에서 알아서 compareTo 메서드를 호출하여 비교해줍니다.  아래 코드와 같이 말이죠.

 

public class Lec04Main {

	public static void main(String[] args) {
		JavaMoney money1 = new JavaMoney(1_000L);
		JavaMoney money2 = new JavaMoney(2_000L);

		if (money1.compareTo(money2) > 0) {
			System.out.println("Money1이 Money2보다 금액이 큽니다.");
		}		
	}
}

 

3. 동등성, 동일성


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

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

 

  자바 코틀린
동등성 (Equality) equals() ==
동일성 (Identity) == ===

 

4. 논리 연산자


&&, ||

Java와 완전히 동일하며, Java와 동일하게 Lazy 연산을 합니다. (if문 순차 진행)

 

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


in / !in

컬렌션이나 범위에 포함되어 있다, 포함되어 있지 않다.

 

a..b

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

 

a[i]

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

 

6. 연산자 오버로딩


kotlin에서는 객체마다 연산자를 직접 지정할 수 있습니다.

 

[자바]

java에서 money객체의 amount값을 더하려면 아래와 같이 진행해야합니다.

우선 JavaMoney라는 클래스를 만들어줍니다.

 

package lec04;

import org.jetbrains.annotations.NotNull;

import java.util.Objects;

public class JavaMoney implements Comparable<JavaMoney> {

	private final long amount;

	public JavaMoney(long amount) {
	this.amount = amount;
	}

	public JavaMoney plus(JavaMoney other) {
		return new JavaMoney(this.amount + other.amount);
	}

	@Override
	public String toString() {
		return "JavaMoney{" +
			"amount=" + amount +
			'}';
	}
}

 

그리고 객체를 만들어서 값을 더하는 코드는 아래와 같을 것입니다.

 

public class Lec04Main {

	public static void main(String[] args) {
		JavaMoney money1 = new JavaMoney(1_000L);
		JavaMoney money2 = new JavaMoney(2_000L);

		System.out.println(money1.plus(money2));
	}
}

 

[코틀린]

코틀린에서는 위와 같은 행위를 어떻게 구현할 수 있을까요?

코틀린에서도 money 클래스를 만들어봅시다.

 

data class KotlinMoney(
	val amount: Long
) {

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

 

그리고 아래와 같은 코드를 실행하면, 자바에서 실행하는 것과 동일한 결과가 나타나는 것을 확인할 수 있습니다.

연산자 overrinde와 toString 메서드가 이미 구현이 되어있기 떄문입니다.

toString 메서드는 KotlinMoney 클래스 앞에 붙어있는 data 어노테이션 때문인 것 같네요

 

fun main() {
	val money1 = KotlinMoney(1_000L)
	val money2 = KotlinMoney(2_000L)
	// 물론 아래와 같은 코드도 동일한 결과를 반환합니다.
	// money1.plus(money2)
	println(money1 + money2)
}