Operator penugasan adalah jembatan antara ekspresi dan variabel. Di Kotlin, operator = mengikat hasil ekspresi ke variabel, sementara varian augmentasinya (+=, -=, *=, /=, %=) menggabungkan operasi aritmetika dengan penugasan singkat. Yang membedakan Kotlin dari banyak bahasa lain: operator penugasan augmentasi hanya berlaku pada variabel var, bukan val, kecuali untuk collection yang diubah secara in-place. Pada chapter ini kita akan membahas perilaku setiap operator, batasan pada val, dan interaksi augmentasi dengan tipe koleksi.

Daftar Operator Penugasan #

Berikut ringkasan operator penugasan Kotlin:

OperatorContohSetara denganBekerja pada
=x = 5— (penugasan langsung)var saja
+=x += 2x = x + 2var; val collection (mutasi in-place)
-=x -= 2x = x - 2var; val collection
*=x *= 2x = x * 2var
/=x /= 2x = x / 2var
%=x %= 2x = x % 2var

Ekspresi x += 2 sebenarnya adalah pemanggilan x = x.plus(2) untuk tipe primitif. Untuk collection mutable, ekspresi list += item dipetakan ke list.plusAssign(item), yang menambahkan elemen secara in-place tanpa membuat list baru.

Penugasan Dasar dan Augmentasi #

Penugasan dasar = mengikat nilai sisi kanan ke variabel sisi kiri. Variabel harus dideklarasikan sebagai var agar dapat diubah nilainya. Variabel val hanya bisa diisi sekali pada saat deklarasi. Operator augmentasi mengombinasikan operasi aritmetika dan penugasan dalam satu langkah, membuat kode lebih ringkas.

kotlin
fun main() {
    var stok = 50
    println("Stok awal: $stok")

    stok = 60
    println("Setelah di-set ulang: $stok")

    stok += 5
    println("Setelah += 5: $stok")

    stok -= 10
    println("Setelah -= 10: $stok")

    stok *= 2
    println("Setelah *= 2: $stok")

    stok /= 3
    println("Setelah /= 3: $stok")

    stok %= 7
    println("Setelah %= 7: $stok")

    val pesanan = mutableListOf("kopi", "gula")
    println("Pesanan awal: $pesanan")
    pesanan += "susu"
    println("Setelah += \"susu\": $pesanan")
    pesanan -= "gula"
    println("Setelah -= \"gula\": $pesanan")

    var harga = 1000
    harga += 500
    println("Harga setelah += 500: $harga")
    harga *= 3
    println("Harga setelah *= 3: $harga")
}

Output yang Dihasilkan:

text
Stok awal: 50
Setelah di-set ulang: 60
Setelah += 5: 65
Setelah -= 10: 55
Setelah *= 2: 110
Setelah /= 3: 36
Setelah %= 7: 1
Pesanan awal: [kopi, gula]
Setelah += "susu": [kopi, gula, susu]
Setelah -= "gula": [kopi, susu]
Harga setelah += 500: 1500
Harga setelah *= 3: 4500

Mari kita uraikan baris-baris penting pada contoh di atas:

  1. var stok = 50 mendeklarasikan variabel mutable dengan tipe Int bernilai 50. Karena var, kita dapat mengubah nilainya kemudian.
  2. stok = 60 mengikat ulang stok ke nilai 60 melalui penugasan dasar. Nilai sebelumnya 50 dibuang.
  3. stok += 5 setara dengan stok = stok + 5. Hasilnya 65. Operator augmentasi mengombinasikan pembacaan, operasi aritmetika, dan penulisan kembali dalam satu ekspresi.
  4. stok /= 3 menghasilkan 36, bukan 36.66..., karena pembagian bulat. Augmentasi /= tetap mengikuti aturan pembagian tipe primitif: kedua operand Int menghasilkan Int yang dibulatkan ke bawah.
  5. stok %= 7 menyisakan 1 karena 36 % 7 = 1. Operator %= jarang dipakai, namun berguna pada logika seperti penjadwalan modular.
  6. pesanan += "susu" memanggil plusAssign("susu") pada MutableList, menambahkan elemen baru ke list yang sama. List tetap dirujuk oleh val pesanan, tetapi isi list berubah secara in-place.
  7. pesanan -= "gula" memanggil minusAssign("gula") pada MutableList, menghapus elemen pertama yang setara dengan "gula". Tidak ada list baru yang dibuat.

val vs var untuk Operator Augmentasi #

Operator augmentasi pada tipe primitif (seperti Int) memerlukan var. Mencoba menulis val x = 5; x += 1 menghasilkan galat kompilasi: Val cannot be reassigned. Aturan ini masuk akal karena += pada primitif adalah x = x + y, yang memerlukan pengikatan ulang variabel.

Untuk koleksi, aturan sedikit berbeda. Karena += pada MutableList memanggil plusAssign (bukan reassign), variabel val tetap dapat digunakan selama referensi collection-nya tidak berubah. Yang berubah hanya isi collection. Inilah mengapa val pesanan = mutableListOf(...) masih bisa menerima pesanan += "susu".

Augmentasi pada Tipe Non-Primitif #

Operator augmentasi dapat bekerja pada tipe buatan sendiri yang mendefinisikan function plusAssign, minusAssign, dst. Function-function ini wajib ditandai dengan modifier operator agar dapat dipanggil lewat simbol +=. Konvensi penamaan: plus() untuk +, plusAssign() untuk +=. Kedua function ini biasanya tidak didefinisikan bersamaan untuk menghindari ambiguitas saat kompilator memilih jalur eksekusi.

Referensi Lanjutan #

Dengan pemahaman operator penugasan dasar dan augmentasinya, kita siap melangkah ke operator unary seperti ++, --, dan ! yang memodifikasi nilai tanpa operand kedua.