Dive into Coding Life

KotlinLearning: 02-3 演算子

08/01/2021

演算子

比較演算子

  • < …左側の値が右側の値よりも小さい場合 true(右側の値は含まない)
  • <= …左側の値が右側の値以下の場合 true(右側の値を含む)
  • > …左側の値が右側の値よりも大きい場合 true(右側の値は含まない)
  • >= …左側の値が右側の値以上の場合 true(右側の値を含む)
  • == …左側の値と右側の値が同じ場合 true(Javaと異なりStringの値も比較可能)
  • != …左側の値と右側の値が異なる場合 true(Javaと異なりStringの値も比較可能)
  • === …左側の型と右側の参照が同じ場合 true(Javaのequal演算子と同じ)
  • !== …左側の型と右側の参照が異なる場合 true(Javaのequal演算子と同じ)

Javaと異なりStringもIntやBooleanと同じように扱われるので注意が必要です。
これは果たしてわかりやすいのでしょうか…。

fun main() {
  println(1 == 1) //true(値が同じ)
  println(1 === 1) //true(参照が同じ)

  println("a" == "a") //true(値が同じ)
  println("a" === "a") //true(参照が同じ)

  val A = 1
  val B = A
  println(A == B) //true(値が同じ)
  println(A === B) //true(参照が同じ)

  val C = "a"
  val D = C
  println(C == D) //true(値が同じ)
  println(C === D) //true(参照が同じ)
}
fun main() {
    val A = Integer(1)
    val B = Integer(1)
    println(A == B) //true(値が同じ)
    println(A === B) //false(参照が異なる)

    val C = A
    println(A == C) //true(値が同じ)
    println(A === C) //true(参照が同じ)
}

自作クラスなどの比較には注意が必要です。

class Hoge(val i:Int){}

fun main(){
  val A = Hoge(1)
  val B = Hoge(1)
  println(A == B) //false(値が異なる)
  println(A === B) //false(参照が異なる)

  val C = A
  println(A == C) //true(値が同じ)
  println(A === C) //true(参照が同じ)
}

クラス定義のequalメソッドをオーバーライドすれば==演算子の挙動を変更することが可能です。
https://kotlinlang.org/docs/reference/operator-overloading.html

class Hoge(val i:Int){
    override fun equals(other: Any?): Boolean {
        //インスタンスが保持する値iを比較するよう変更
        return this.i == (other as Hoge).i
    }
}

fun main(){
    val A = Hoge(1)
    val B = Hoge(1)
    println(A == B) //true(値が同じ)
    println(A === B) //false(参照が異なる)

    val C = A
    println(A == C) //true(値が同じ)
    println(A === C) //true(参照が同じ)
}

論理演算子

  • && …かつ(左側の値と右側の値、両方trueの場合、true)
  • || …または(左側の値と右側の値、どちらかがtrueの場合、true)
  • ! …否定(右側の値がtrueの場合false、falseの場合true)

四則演算を含め演算子には実行順序があります。
普通の算数と同様()で括ることによって()内を先に演算することができます。