KotlinLearning: 02-3 演算子
演算子
比較演算子
- < …左側の値が右側の値よりも小さい場合 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)
四則演算を含め演算子には実行順序があります。
普通の算数と同様()で括ることによって()内を先に演算することができます。