Operator logika menggabungkan beberapa kondisi Boolean menjadi satu keputusan. Kotlin menyediakan tiga operator logika: && (AND), || (OR), dan ! (NOT). Ketiga operator ini mendukung evaluasi short-circuit yang dapat menghindari eksekusi function mahal atau berbahaya secara tidak perlu. Pada chapter ini kita akan memahami cara kerja short-circuit, perbedaan dengan operator bitwise, serta penggunaan array Boolean untuk menyimpan sekumpulan flag.

Tiga Operator Logika #

Berikut ringkasan operator logika Kotlin:

OperatorNamaFunctionHasil
&&AND logika(built-in infix)true && false → false
||OR logika(built-in infix)true || false → true
!NOT (negasi)(prefix)!true → false

Operator && dan || hanya bekerja pada operand Boolean, bukan Int seperti di C atau Python. Tidak ada operator & dan | untuk logika bitwise pada Boolean — gunakan function and(), or(), xor() bila ingin operasi non-short-circuit.

Short-Circuit Evaluation #

Karakteristik utama && dan || adalah evaluasi malas (lazy). Pada a && b, jika a bernilai false, b tidak akan dievaluasi karena hasil sudah pasti false. Sebaliknya pada a || b, jika a bernilai true, b tidak dievaluasi karena hasil sudah pasti true. Karakteristik ini penting untuk menulis kondisi yang aman secara performa maupun efek samping.

kotlin
fun main() {
    val suhu = 38
    val adaDemam = suhu > 37
    val batuk = false
    val sakit = adaDemam && batuk
    val periksa = adaDemam || batuk
    val sehat = !adaDemam

    println("adaDemam = $adaDemam")
    println("sakit (demam AND batuk) = $sakit")
    println("periksa (demam OR batuk) = $periksa")
    println("sehat (NOT demam) = $sehat")

    var panggilan = 0
    fun isValid(): Boolean {
        panggilan++
        return true
    }
    val hasil1 = false && isValid()
    val hasil2 = true || isValid()
    println("Setelah false && isValid(): panggilan = $panggilan")
    println("Setelah true || isValid(): panggilan = $panggilan")

    val status = if (adaDemam && !batuk) "demam saja" else "kondisi lain"
    println("Status: $status")

    val bendera = booleanArrayOf(true, false, true, false, true)
    var hitung = 0
    for (b in bendera) {
        if (b) hitung++
    }
    println("Jumlah nilai true pada array: $hitung")
}

Output yang Dihasilkan:

text
adaDemam = true
sakit (demam AND batuk) = false
periksa (demam OR batuk) = true
sehat (NOT demam) = false
Setelah false && isValid(): panggilan = 0
Setelah true || isValid(): panggilan = 0
Status: demam saja
Jumlah nilai true pada array: 3

Mari kita bedah bagian penting pada contoh di atas:

  1. adaDemam && batuk menghasilkan false. Meskipun adaDemam bernilai true, batuk bernilai false, sehingga hasil AND menjadi false. Kedua operand dievaluasi karena operand pertama true tidak cukup untuk memutuskan.
  2. adaDemam || batuk menghasilkan true. Karena operand pertama adaDemam sudah true, operand kedua batuk sebenarnya tidak perlu dievaluasi. Pada kasus ini batuk tetap berupa variabel lokal yang sudah dihitung, sehingga efek short-circuit tidak terlihat.
  3. false && isValid() tidak memanggil isValid(). Karena operand pertama false, hasil sudah pasti false, sehingga function isValid() yang seharusnya menambah panggilan tidak dieksekusi. Itulah sebabnya nilai panggilan tetap 0.
  4. true || isValid() juga tidak memanggil isValid(). Karena operand pertama true, hasil sudah pasti true, sehingga isValid() kembali dilewati. panggilan masih 0.
  5. booleanArrayOf(...) membuat array Boolean[] di JVM, efisien untuk menyimpan banyak flag. Kita iterasi dan menghitung berapa nilai true yang ada.

Boolean Array dan Operasi Massal #

Kotlin menyediakan beberapa class khusus untuk menyimpan banyak nilai Boolean secara efisien. Pilihan yang umum:

TipePenyimpananPenggunaan
BooleanArray1 byte per elemenArray primitif kelas JVM
List<Boolean>Objek per elemenSintaks lebih fleksibel
BitSet (java.util)1 bit per elemenSangat hemat memori untuk flag besar

Pada data yang berukuran besar (jutaan elemen), BitSet jauh lebih hemat memori dibanding BooleanArray. Namun, untuk sebagian besar kasus, BooleanArray sudah cukup cepat dan mudah dipakai.

Negasi dan Precedence #

Operator ! mengubah true menjadi false dan sebaliknya. Karena ! adalah prefix operator dengan precedence lebih tinggi dari && dan ||, ekspresi !a && b diuraikan sebagai (!a) && b, bukan !(a && b). Gunakan tanda kurung secara eksplisit jika ingin mengubah urutan evaluasi untuk kejelasan kode.

Referensi Lanjutan #

Dengan menguasai operator logika beserta perilaku short-circuit-nya, kita siap memahami operator penugasan dan bentuk augmentasinya yang akan memperbarui nilai variabel pada chapter berikutnya.