Logika program bergantung pada keputusan benar atau salah, dan tipe Boolean adalah representasi nilai kebenaran di Kotlin. Tipe ini hanya memiliki dua nilai: true dan false. Meski tampak sederhana, Boolean memiliki beberapa perilaku penting terkait short-circuit evaluation, varian nullable Boolean?, serta penggunaannya dalam operasi logika. Pada chapter ini kita akan membedah semua aspek tersebut.
Tipe Boolean #
Boolean adalah tipe yang hanya bisa menyimpan true atau false. Nilai ini sering muncul dari hasil pembanding (<, >, ==, !=) atau dari hasil function yang mengembalikan Boolean.
val aktif: Boolean = true
val nonaktif = false // inferensi: Boolean
val cukupUmur = 21 <= 25 // true (dari operator pembanding)Tidak ada konversi otomatis antara Boolean dan Int seperti pada bahasa C. Kita tidak bisa menulis if (1) — kondisi if wajib Boolean.
Operator logika #
Kotlin mendukung tiga operator logika:
| Operator | Nama | Contoh | Hasil |
|---|---|---|---|
&& | AND (dan) | true && false | false |
|| | OR (atau) | true || false | true |
! | NOT (negasi) | !true | false |
Tabel kebenaran &&:
| Kiri | Kanan | kiri && kanan |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
Short-circuit evaluation #
Operator && dan || di Kotlin bersifat short-circuit — operand kanan hanya dievaluasi bila operand kiri belum menentukan hasil. Pada &&, jika kiri false, kanan tidak dievaluasi. Pada ||, jika kiri true, kanan tidak dievaluasi.
Berikut program yang memperlihatkan perilaku ini:
fun main() {
val aktif: Boolean = true
val nonaktif: Boolean = false
val sudahBayar = true
val punyaVoucher = false
println("aktif = $aktif")
println("nonaktif = $nonaktif")
println("sudahBayar = $sudahBayar")
println("punyaVoucher= $punyaVoucher")
println()
println("Operator AND (&&):")
println("sudahBayar && punyaVoucher = ${sudahBayar && punyaVoucher}")
println("sudahBayar || punyaVoucher = ${sudahBayar || punyaVoucher}")
println("!aktif = ${!aktif}")
println()
println("Short-circuit evaluation:")
var jumlahPanggilan = 0
fun aksesDiskon(): Boolean {
jumlahPanggilan++
println(" -> fungsi aksesDiskon dipanggil (panggilan ke-$jumlahPanggilan)")
return false
}
val hasil1 = aktif && aksesDiskon()
println("aktif && aksesDiskon() = $hasil1 (jumlahPanggilan = $jumlahPanggilan)")
val hasil2 = nonaktif && aksesDiskon()
println("nonaktif && aksesDiskon() = $hasil2 (jumlahPanggilan = $jumlahPanggilan)")
val hasil3 = aktif || aksesDiskon()
println("aktif || aksesDiskon() = $hasil3 (jumlahPanggilan = $jumlahPanggilan)")
println()
val statusPengguna: Boolean? = null
println("statusPengguna (Boolean?) = $statusPengguna")
println("statusPengguna == true = ${statusPengguna == true}")
println("statusPengguna == false = ${statusPengguna == false}")
println("statusPengguna != true = ${statusPengguna != true}")
val konfirmasi: Boolean? = true
val sudahFinal = konfirmasi ?: false
println("sudahFinal (konfirmasi ?: false) = $sudahFinal")
}Output yang Dihasilkan:
aktif = true
nonaktif = false
sudahBayar = true
punyaVoucher= false
Operator AND (&&):
sudahBayar && punyaVoucher = false
sudahBayar || punyaVoucher = true
!aktif = false
Short-circuit evaluation:
-> fungsi aksesDiskon dipanggil (panggilan ke-1)
aktif && aksesDiskon() = false (jumlahPanggilan = 1)
nonaktif && aksesDiskon() = false (jumlahPanggilan = 1)
aktif || aksesDiskon() = true (jumlahPanggilan = 1)
statusPengguna (Boolean?) = null
statusPengguna == true = false
statusPengguna == false = false
statusPengguna != true = true
sudahFinal (konfirmasi ?: false) = trueMari kita amati baris-baris penting pada kode di atas:
- Baris 14 (
sudahBayar && punyaVoucher) —&&mengembalikanfalsejika salah satu operandfalse. Di sinipunyaVoucherfalse, sehingga hasilnyafalse. - Baris 15 (
sudahBayar || punyaVoucher) —||mengembalikantruejika salah satu operandtrue.sudahBayartrue, sehingga hasilnyatrue. - Baris 25-29 (
fun aksesDiskon()) — function lokal yang menginkrementasi counter dan mencetak teks saat dipanggil. Digunakan untuk membuktikan short-circuit. - Baris 31 (
aktif && aksesDiskon()) —aktiftrue, makaaksesDiskon()dipanggil. Counter menjadi 1. - Baris 34 (
nonaktif && aksesDiskon()) —nonaktiffalse, makaaksesDiskon()tidak dipanggil. Counter tetap 1. Inilah inti short-circuit. - Baris 37 (
aktif || aksesDiskon()) —aktiftrue, makaaksesDiskon()tidak dipanggil untuk||karena operand kiri sudah menentukan hasil. - Baris 42 (
val statusPengguna: Boolean? = null) —Boolean?memperbolehkan tiga keadaan:true,false, ataunull. Ini berbeda dariBooleanyang hanya dua keadaan. - Baris 44-46 (
statusPengguna == true,== false,!= true) —null == trueadalahfalse;null == falsejugafalse;null != trueadalahtrue. Kita harus eksplisit dalam membandingkan tiga keadaan ini. - Baris 50 (
sudahFinal = konfirmasi ?: false) — elvis operator?:memberi nilai defaultfalsejikakonfirmasiadalahnull. Idiom ini sangat umum untuk mengubahBoolean?menjadiBoolean.
Boolean? (nullable) #
Boolean? memperluas Boolean dengan kemungkinan null. Tiga keadaan ini berguna untuk merepresentasikan “belum diketahui” selain “ya” dan “tidak”.
val konfirmasi: Boolean? = null
val sudahFinal1 = konfirmasi == true // false (false jika null/false, true hanya jika true)
val sudahFinal2 = konfirmasi ?: false // false (default false jika null)
val belumFinal = konfirmasi != true // true (true jika null/false)Idiom umum #
// Negasi aman untuk nullable
val tidakAktif = konfirmasi != true
// Default value untuk null
val status = konfirmasi ?: false
// Validasi beberapa kondisi
val valid = nama.isNotEmpty() && umur >= 17 && umur <= 60
// Kondisi kompleks dengan prioritas tanda kurung
val lulus = (skor >= 70) && (hadir >= 80 || punyaIzin)Referensi Lanjutan #
- Booleans
— dokumentasi resmi tipe
BooleanKotlin termasuk operasi&&,||, dan!
Pemahaman tipe Boolean menjadi fondasi untuk percabangan dan loop yang akan kita bahas nanti. Berikutnya, kita akan melihat tipe karakter — Char — beserta bedanya dengan angka, pada chapter Char.