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

J·2023년 3월 20일
1

안드로이드

목록 보기
15/29

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

  • 단항 연산자 : ++, --
  • 산술 연산자 : +, -, *, /, %
  • 산술대입 연산자 : +=, -=, *=, /=, %=
  • 비교 연산자 : >, <, >=, <=

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

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);
  }
}

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

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

  • 동등성(Equality) : 두 객체의 값이 같은가?! (자바의 equals → 코틀린의 ==) → 자바스크립트 역시 ==
  • 동일성(Identity) : 완전히 동일한 객체인가?! 즉 주소가 같은가?! (자바의 == → 코틀린의 ===) → 자바스크립트 역시 ===

<자바 코드>

public class Lec04Main {
  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
    System.out.println(money1.equals(money3)); // false
  }
}

<코틀린 코드>

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

3. 논리 연산자와 코틀린에 있는 특이한 연산자

  • &&
  • ||
  • !

논리연산자

=> Java와 완전히 동일합니다.
=> Java 처럼 Lazy 연산을 수행합니다.

Lazy 연산이란? : 코틀린 코드

fun main() {
  if (fun1() || fun2()) {
    println("본문") // ||(또는) 이므로 값은 true이므로 실행됨.
  }
  
  if (fun1() && fun2()) {
    println("본문") // &&(그리고) 이므로 값은 false 이므로 실행되지 않음.
  }
}

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

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

in / !in

컬렉션이나 범위에 포함되어 있다, 포함되어 있지 않다
println(1 in numbers)

a..b

a 부터 b 까지의 범위 객체를 생성한다
반복문에서 자주 쓰임.

a[i]

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

val str = "ABC"
println(str[2]) //C

a[i] = b

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

4. 연산자 오버로딩

Kotlin에서는 객체마다 연산자를 직접 정의할 수 있다.

val money1 = Money(1_000L)
val money2 = Money(2_000L)
println(money1 + money2) // Money(amount=3000)

<자바코드>
JavaMoney.java

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
  pulic String toString() {
    return "JavaMoney{"  +
          "amount=" + amount +
          '}';
  }
}

Lec04Main.java

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.kt

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

Lec04Main.kt

fun main() {
  val money1 = Money(1_000L) // 코틀린 class의 Money
  val money2 = Money(2_000L)
  
  println(money1 + money2) //  toString이 구현되어 있어서 바로 덧셈 후 println 가능함. 물론 자바처럼 println(money1.plus(money2)) 처럼 구현도 가능함.
}

=> 진짜 진짜 진~~짜 JavaScript와 동일함…………… 찐이다…!!!!

※ 코틀린에서 연산자를 다루는 방법(정리) ※

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

0개의 댓글