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:
| Operator | Nama | Function | Hasil |
|---|---|---|---|
&& | 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.
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:
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: 3Mari kita bedah bagian penting pada contoh di atas:
adaDemam && batukmenghasilkanfalse. MeskipunadaDemambernilaitrue,batukbernilaifalse, sehingga hasil AND menjadifalse. Kedua operand dievaluasi karena operand pertamatruetidak cukup untuk memutuskan.adaDemam || batukmenghasilkantrue. Karena operand pertamaadaDemamsudahtrue, operand keduabatuksebenarnya tidak perlu dievaluasi. Pada kasus inibatuktetap berupa variabel lokal yang sudah dihitung, sehingga efek short-circuit tidak terlihat.false && isValid()tidak memanggilisValid(). Karena operand pertamafalse, hasil sudah pastifalse, sehingga functionisValid()yang seharusnya menambahpanggilantidak dieksekusi. Itulah sebabnya nilaipanggilantetap0.true || isValid()juga tidak memanggilisValid(). Karena operand pertamatrue, hasil sudah pastitrue, sehinggaisValid()kembali dilewati.panggilanmasih0.booleanArrayOf(...)membuat arrayBoolean[]di JVM, efisien untuk menyimpan banyak flag. Kita iterasi dan menghitung berapa nilaitrueyang ada.
Boolean Array dan Operasi Massal #
Kotlin menyediakan beberapa class khusus untuk menyimpan banyak nilai Boolean secara efisien. Pilihan yang umum:
| Tipe | Penyimpanan | Penggunaan |
|---|---|---|
BooleanArray | 1 byte per elemen | Array primitif kelas JVM |
List<Boolean> | Objek per elemen | Sintaks lebih fleksibel |
BitSet (java.util) | 1 bit per elemen | Sangat 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 #
- Operator overloading
— konteks konvensi
and,or,notpada panduan operator
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.