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.

kotlin Deklarasi 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:

OperatorNamaContohHasil
&&AND (dan)true && falsefalse
||OR (atau)true || falsetrue
!NOT (negasi)!truefalse

Tabel kebenaran &&:

KiriKanankiri && kanan
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

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:

kotlin
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:

text
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) = true

Mari kita amati baris-baris penting pada kode di atas:

  1. Baris 14 (sudahBayar && punyaVoucher) — && mengembalikan false jika salah satu operand false. Di sini punyaVoucher false, sehingga hasilnya false.
  2. Baris 15 (sudahBayar || punyaVoucher) — || mengembalikan true jika salah satu operand true. sudahBayar true, sehingga hasilnya true.
  3. Baris 25-29 (fun aksesDiskon()) — function lokal yang menginkrementasi counter dan mencetak teks saat dipanggil. Digunakan untuk membuktikan short-circuit.
  4. Baris 31 (aktif && aksesDiskon()) — aktif true, maka aksesDiskon() dipanggil. Counter menjadi 1.
  5. Baris 34 (nonaktif && aksesDiskon()) — nonaktif false, maka aksesDiskon() tidak dipanggil. Counter tetap 1. Inilah inti short-circuit.
  6. Baris 37 (aktif || aksesDiskon()) — aktif true, maka aksesDiskon() tidak dipanggil untuk || karena operand kiri sudah menentukan hasil.
  7. Baris 42 (val statusPengguna: Boolean? = null) — Boolean? memperbolehkan tiga keadaan: true, false, atau null. Ini berbeda dari Boolean yang hanya dua keadaan.
  8. Baris 44-46 (statusPengguna == true, == false, != true) — null == true adalah false; null == false juga false; null != true adalah true. Kita harus eksplisit dalam membandingkan tiga keadaan ini.
  9. Baris 50 (sudahFinal = konfirmasi ?: false) — elvis operator ?: memberi nilai default false jika konfirmasi adalah null. Idiom ini sangat umum untuk mengubah Boolean? menjadi Boolean.

Boolean? (nullable) #

Boolean? memperluas Boolean dengan kemungkinan null. Tiga keadaan ini berguna untuk merepresentasikan “belum diketahui” selain “ya” dan “tidak”.

kotlin Idiom untuk Boolean?
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 #

kotlin Idiom boolean 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 Boolean Kotlin 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.