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:
| Operator | Contoh | Setara dengan | Bekerja pada |
|---|---|---|---|
= | x = 5 | — (penugasan langsung) | var saja |
+= | x += 2 | x = x + 2 | var; val collection (mutasi in-place) |
-= | x -= 2 | x = x - 2 | var; val collection |
*= | x *= 2 | x = x * 2 | var |
/= | x /= 2 | x = x / 2 | var |
%= | x %= 2 | x = x % 2 | var |
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.
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:
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: 4500Mari kita uraikan baris-baris penting pada contoh di atas:
var stok = 50mendeklarasikan variabel mutable dengan tipeIntbernilai50. Karenavar, kita dapat mengubah nilainya kemudian.stok = 60mengikat ulangstokke nilai60melalui penugasan dasar. Nilai sebelumnya50dibuang.stok += 5setara denganstok = stok + 5. Hasilnya65. Operator augmentasi mengombinasikan pembacaan, operasi aritmetika, dan penulisan kembali dalam satu ekspresi.stok /= 3menghasilkan36, bukan36.66..., karena pembagian bulat. Augmentasi/=tetap mengikuti aturan pembagian tipe primitif: kedua operandIntmenghasilkanIntyang dibulatkan ke bawah.stok %= 7menyisakan1karena36 % 7 = 1. Operator%=jarang dipakai, namun berguna pada logika seperti penjadwalan modular.pesanan += "susu"memanggilplusAssign("susu")padaMutableList, menambahkan elemen baru ke list yang sama. List tetap dirujuk olehval pesanan, tetapi isi list berubah secara in-place.pesanan -= "gula"memanggilminusAssign("gula")padaMutableList, 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 #
- Operator overloading
— penjelasan resmi augmented assignment (
+=,-=) dan konvensinya
Dengan pemahaman operator penugasan dasar dan augmentasinya, kita siap melangkah ke operator unary seperti ++, --, dan ! yang memodifikasi nilai tanpa operand kedua.