Apa yang Dilakukan Operator
Operator adalah simbol yang menggabungkan nilai untuk menghitung nilai baru. Kamu sebenarnya sudah memakainya: + menjumlahkan, > membandingkan. Java mengelompokkannya ke dalam beberapa keluarga: aritmatika, perbandingan, logika, penugasan, dan beberapa operator khusus seperti increment dan ternary.
Sebagian besar operator menerima dua nilai (satu sebelum dan satu sesudah simbolnya) lalu menghasilkan sebuah hasil. Kuncinya adalah tahu tipe hasilnya dan urutan penerapannya, karena di situlah pemula sering tersandung.
Operator Aritmatika
Lima operator aritmatika bekerja pada angka: +, -, *, /, dan % (sisa bagi).
Operator % menghasilkan sisa setelah pembagian: 17 % 5 hasilnya 2 karena 5 masuk ke 17 sebanyak tiga kali dengan sisa 2. Operator ini alat sehari-hari untuk menguji apakah suatu angka habis dibagi: n % 2 == 0 adalah pengecekan standar "apakah n genap?".
Perhatikan juga bahwa + punya dua tugas: dengan angka, operator ini menjumlahkan, tetapi kalau ada String di salah satu sisinya, operator ini menggabungkan teks.
Baris pertama dibaca dari kiri ke kanan: "Total: " + 3 sudah menjadi string, jadi 4 ditambahkan sebagai teks. Bungkus perhitungannya dengan tanda kurung kalau kamu ingin perhitungan itu dikerjakan lebih dulu.
Jebakan Pembagian Integer
Inilah kejutan yang paling sering terjadi. Kalau kedua operand / adalah bilangan bulat, Java melakukan pembagian integer dan membuang pecahannya. Hasilnya tidak dibulatkan, melainkan dipotong ke arah nol.
Untuk mendapatkan hasil desimal, buat minimal satu operand menjadi double: tulis dengan .0, atau cast salah satu sisi dengan (double). Cast (double)(5 / 2) tidak membantu, karena pembagian integer 5 / 2 sudah terjadi sebelum cast; kamu harus melakukan cast pada operand, bukan pada hasilnya.
Operator Perbandingan
Operator perbandingan mengajukan pertanyaan ya/tidak dan mengembalikan boolean. Ada enam: ==, !=, <, >, <=, >=.
Perhatikan perbedaan antara = (penugasan, "taruh nilai ini di sini") dan == (perbandingan, "apakah keduanya sama?"). Tertukar di antara keduanya adalah bug klasik.
Satu catatan penting: == membandingkan referensi objek, bukan isinya. Untuk string, pakai .equals().
Pakai == untuk tipe primitif seperti int dan boolean, dan .equals() setiap kali kamu membandingkan isi objek seperti string.
Operator Logika
Operator logika menggabungkan nilai boolean: && (dan), || (atau), dan ! (tidak). Dengan operator inilah kamu menyatakan kondisi seperti "cukup umur dan punya tiket".
&& dan || melakukan short-circuit: Java berhenti mengevaluasi begitu jawabannya sudah pasti. Dengan &&, kalau sisi kiri false, sisi kanan tidak pernah diperiksa; dengan ||, kalau sisi kiri true, sisi kanan dilewati. Ini bukan sekadar optimasi, kamu bisa mengandalkannya demi keamanan:
if (text != null && text.length() > 0) { ... }
Kalau text bernilai null, sisi kiri false dan text.length() tidak pernah dipanggil, sehingga NullPointerException terhindari. Kalau urutannya dibalik, program akan crash.
Penugasan dan Increment
= melakukan penugasan, tetapi Java juga punya penugasan gabungan yang menyatukan operasi dengan penugasan: +=, -=, *=, /=, %=. Lalu ++ / -- menambah atau mengurangi satu.
++ punya dua bentuk: postfix (count++) mengembalikan nilai lama lalu menambahkan satu; prefix (++count) menambahkan satu dulu lalu mengembalikan nilai baru. Perbedaannya hanya penting kalau kamu memakai hasilnya di ekspresi yang sama:
Kalau ++ berdiri sendiri di satu baris, postfix dan prefix tidak ada bedanya. Jadi pilih saja yang paling jelas dibaca, dan jangan menjejalkan increment ke dalam ekspresi yang lebih besar.
Operator Ternary
Ternary condition ? a : b adalah if/else versi ringkas yang menghasilkan nilai: kalau kondisinya true, hasilnya a, kalau tidak, hasilnya b.
Operator ini cocok untuk penugasan pilihan-salah-satu yang pendek. Hindari menumpuk ternary di dalam ternary, karena cepat sekali menjadi sulit dibaca, dan if/else biasa jauh lebih jelas.
Prioritas dan Tanda Kurung
Operator diterapkan dalam urutan yang tetap, mirip matematika: *, /, % lebih kuat daripada + dan -, yang lebih kuat daripada perbandingan, yang lebih kuat daripada &&, lalu ||.
Kamu tidak perlu menghafal tabel lengkapnya. Kalau sebuah ekspresi mencampur beberapa keluarga operator atau kamu harus berhenti sejenak untuk memikirkan urutannya, tambahkan tanda kurung. Tanda kurung tidak ada ruginya dan membuat maksudmu jelas bagi pembaca berikutnya.
Berikutnya: Type Casting
Beberapa jebakan di sini, seperti pembagian integer dan mencampur int dengan double, berakar pada tipe. Mengubah satu tipe angka ke tipe lain secara sengaja disebut casting, dan itulah topik halaman berikutnya.
Pertanyaan yang sering diajukan
Apa fungsi operator % di Java?
% adalah operator sisa bagi (modulo): hasilnya adalah sisa setelah pembagian bilangan bulat. 7 % 3 hasilnya 1, dan 10 % 2 hasilnya 0. Ini cara standar untuk menguji apakah suatu angka habis dibagi (n % 2 == 0 berarti n genap) dan untuk membatasi nilai ke dalam suatu rentang.
Kenapa 5 / 2 di Java hasilnya 2, bukan 2.5?
Kalau kedua operand adalah bilangan bulat, / melakukan pembagian integer dan membuang bagian pecahannya, jadi 5 / 2 hasilnya 2, bukan 2.5. Untuk mendapatkan 2.5, minimal satu operand harus berupa double: tulis 5.0 / 2, 5 / 2.0, atau cast salah satu sisi dengan (double) 5 / 2.
Apa perbedaan == dan equals() di Java?
== membandingkan tipe primitif berdasarkan nilainya, tetapi untuk objek (termasuk String) operator ini membandingkan referensi, yaitu apakah keduanya objek yang sama di memori. Untuk membandingkan isi objek, pakai .equals(). Membandingkan dua string dengan == bisa menghasilkan false walaupun teksnya sama, jadi selalu pakai "a".equals(b) untuk string.