Topik ini merangkai nilai dan variabel menjadi ekspresi melalui operator Java. Operator aritmetika, relasional, logika, bitwise, dan ternary dibahas satu per satu, ditutup dengan urutan prioritas yang menentukan operator mana dijalankan lebih dahulu. Perilaku pembagian bulat dan sirkuit pendek (short-circuit) mendapat porsi khusus karena keduanya paling sering memicu hasil yang tak terduga.
Ekspresi dan operator#
Ekspresi adalah kombinasi nilai, variabel, dan operator yang menghasilkan sebuah nilai baru. Baris 2 + 3 * 4 adalah ekspresi bernilai 14, dan (17 % 5) == 2 adalah ekspresi bernilai true. Operator adalah simbol yang menyatakan operasi, sedangkan nilai yang dioperasikan disebut operand. Pada a + b, operatornya + dan operandnya a serta b.
Setiap ekspresi memiliki tipe hasil yang ditentukan oleh operandnya. Penjumlahan dua int menghasilkan int, sementara penjumlahan int dengan double menghasilkan double karena tipe yang lebih luas menang. Pemahaman ini menjelaskan hampir semua perilaku operator yang dibahas di bawah, termasuk mengapa pembagian dua bilangan bulat tidak pernah menghasilkan pecahan.
Aritmetika dan pembagian bulat#
Operator aritmetika terdiri atas +, -, *, /, dan %. Empat yang pertama bekerja seperti matematika biasa, sedangkan % menghasilkan sisa pembagian, bukan hasil baginya. Yang membedakan Java dari matematika sekolah adalah pembagian bulat, yaitu ketika kedua operand bertipe bilangan bulat, hasilnya juga bilangan bulat dengan bagian desimal dipangkas begitu saja.
public class OperatorAritmetika {
public static void main(String[] args) {
int totalKue = 17;
int jumlahAnak = 5;
int kuePerAnak = totalKue / jumlahAnak;
int sisaKue = totalKue % jumlahAnak;
double totalKueDesimal = 17.0;
double hasilDesimal = totalKueDesimal / jumlahAnak;
System.out.println("Pembagian bulat : " + kuePerAnak);
System.out.println("Sisa bagi : " + sisaKue);
System.out.println("Pembagian desimal: " + hasilDesimal);
System.out.println("2 + 3 * 4 = " + (2 + 3 * 4));
System.out.println("(2 + 3) * 4 = " + ((2 + 3) * 4));
}
}Pembagian bulat : 3
Sisa bagi : 2
Pembagian desimal: 3.4
2 + 3 * 4 = 14
(2 + 3) * 4 = 2017 / 5 menghasilkan 3 karena hasil sebenarnya, 3.4, dipangkas ke arah nol, sedangkan 17 % 5 menghasilkan 2 karena itulah sisanya. Perilaku ini berguna untuk soal pembagian kelompok dan pemeriksaan kelipatan, misalnya tahun % 4 untuk mendeteksi tahun yang habis dibagi empat. Bila salah satu operand bertipe pecahan, seperti 17.0 / 5, pembagian berjalan dalam pecahan dan menghasilkan 3.4.
Demo berikut mengizinkan nilai a dan b diubah bebas untuk mengamati ketiga bentuk pembagian sekaligus, termasuk perilaku b bernilai nol.
Perbandingan, logika, dan sirkuit pendek#
Operator relasional membandingkan dua nilai dan menghasilkan boolean, yaitu <, >, <=, >=, == untuk kesamaan, dan != untuk ketidaksamaan. Hasil perbandingan inilah bahan utama percabangan yang menentukan jalannya program. Operator logika menggabungkan nilai boolean, yaitu && untuk dan, || untuk atau, serta ! untuk pembalikan.
Ciri khas && dan || adalah sirkuit pendek, yakni sisi kanan tidak dievaluasi bila hasil akhirnya sudah pasti dari sisi kiri. Untuk &&, sisi kanan dilewati bila sisi kiri false, dan untuk ||, sisi kanan dilewati bila sisi kiri true. Perilaku ini bukan sekadar penghematan, karena ia melindungi ekspresi yang berbahaya bila dievaluasi, misalnya pembagian dengan nol.
public class OperatorLogika {
public static void main(String[] args) {
int stok = 4;
int harga = 2000;
int uang = 6000;
System.out.println("stok > 0 : " + (stok > 0));
System.out.println("uang >= harga : " + (uang >= harga));
System.out.println("stok > 0 && uang >= harga : " + (stok > 0 && uang >= harga));
System.out.println("stok == 0 || uang >= harga : " + (stok == 0 || uang >= harga));
System.out.println("!(stok > 0) : " + !(stok > 0));
int pembagi = 0;
boolean aman = pembagi != 0 && 10 / pembagi > 1;
System.out.println("Sisi kanan dilewati, hasil : " + aman);
String status = stok > 0 ? "tersedia" : "habis";
System.out.println("Status barang : " + status);
}
}stok > 0 : true
uang >= harga : true
stok > 0 && uang >= harga : true
stok == 0 || uang >= harga : true
!(stok > 0) : false
Sisi kanan dilewati, hasil : false
Status barang : tersediaEkspresi pembagi != 0 && 10 / pembagi > 1 berjalan aman meskipun pembagi bernilai nol, karena sisi kiri false membuat sisi kanan yang membagi dengan nol tidak pernah dieksekusi. Bila operator & tanpa sirkuit pendek dipakai, pembagian itu tetap dijalankan dan program berhenti dengan ArithmeticException: / by zero. Pola pemeriksaan dahulu, operasi kemudian, adalah kebiasaan yang layak dibiasakan.
Bitwise dan pergeseran bit#
Operator bitwise bekerja pada pola bit bilangan bulat, bukan pada nilai desimalnya. Operator &, |, dan ^ menggabungkan dua bilangan bit demi bit, ~ membalik seluruh bit, sedangkan << dan >> menggeser bit ke kiri dan ke kanan. Operator ini jarang muncul di kode aplikasi sehari-hari, tetapi sering dipakai pada penandaan flag, penguraian berkas biner, dan algoritma kriptografi.
public class OperatorBitwise {
public static void main(String[] args) {
int a = 0b1100; // 12
int b = 0b1010; // 10
System.out.println("a & b = " + (a & b));
System.out.println("a | b = " + (a | b));
System.out.println("a ^ b = " + (a ^ b));
System.out.println("~a = " + (~a));
System.out.println("a << 2 = " + (a << 2));
System.out.println("a >> 2 = " + (a >> 2));
}
}a & b = 8
a | b = 14
a ^ b = 6
~a = -13
a << 2 = 48
a >> 2 = 3Contoh a & b membandingkan 1100 dengan 1010 bit demi bit sehingga hanya bit yang sama-sama satu yang bertahan, menghasilkan 1000 atau 8. Pergeseran kiri dua posisi menggandakan nilai empat kali, yaitu 12 menjadi 48, sementara pergeseran kanan membagi dua. Hasil ~a bernilai -13 karena Java menyimpan bilangan negatif dalam bentuk pelengkap dua, sehingga membalik semua bit sama dengan menghitung -n - 1.
Ternary dan urutan prioritas#
Operator ternary ?: memilih salah satu dari dua nilai berdasarkan sebuah kondisi, dengan bentuk kondisi ? nilaiJikaBenar : nilaiJikaSalah. Baris String status = stok > 0 ? "tersedia" : "habis"; menghasilkan “tersedia” bila stok > 0 bernilai true dan “habis” bila tidak. Bentuk ini ringkas untuk pilihan sederhana, sedangkan percabangan if lebih layak bila setiap pilihan butuh beberapa pernyataan.
Urutan prioritas menentukan operator mana dievaluasi lebih dahulu ketika beberapa operator berada dalam satu ekspresi. Operator * menang atas +, sehingga 2 + 3 * 4 bernilai 14 dan bukan 20. Tabel berikut merangkum kelompok operator dari yang paling diutamakan ke yang paling akhir.
| Prioritas | Kelompok | Operator |
|---|---|---|
| 1 | kurung | ( ) |
| 2 | unary | !, ~, +, -, ++, -- |
| 3 | perkalian | *, /, % |
| 4 | penjumlahan | +, - |
| 5 | pergeseran | <<, >> |
| 6 | relasional | <, <=, >, >= |
| 7 | kesetaraan | ==, != |
| 8 | bitwise | &, ^, ` |
| 9 | logika | &&, ` |
| 10 | ternary | ? : |
| 11 | penugasan | =, +=, -=, dan padanannya |
Kesalahan umum#
- Menukar
=dengan==di dalam kondisi. Barisif (x = 5)ditolak kompiler dengan pesanincompatible types: int cannot be converted to boolean, karena penugasan menghasilkanintdan bukanboolean. Java menolaknya sejak awal, berbeda dari beberapa bahasa yang diam-diam menerimanya. - Membandingkan bilangan pecahan dengan
==. Nilai0.1 + 0.2tidak pernah persis sama dengan0.3dalam representasi biner, sehingga perbandingan ketat menghasilkanfalse. Bandingkan selisihnya dengan batas kecil, misalnyaMath.abs(a - b) < 1e-9. - Pembagian bulat tanpa sengaja saat menghitung rata-rata. Ekspresi
(nilaiSatu + nilaiDua) / 2dengan duaintmemangkas desimalnya. Tulis salah satu operand dalam bentuk pecahan, misalnya membagi dengan2.0. - Memakai
%atau/dengan pembagi nol pada bilangan bulat. Program berhenti denganArithmeticException: / by zero. Berlindunglah dengan sirkuit pendek, yaitu memeriksa pembagi tidak nol dengan&&sebelum membagi.
Ringkasan#
- Ekspresi menghasilkan nilai bertipe tertentu, dan tipe operand menentukan tipe hasilnya, termasuk pembagian bulat
int / intyang memangkas desimal. - Operator
%menghasilkan sisa pembagian dan berguna untuk mendeteksi kelipatan, sedangkan&&dan||menerapkan sirkuit pendek yang melindungi ekspresi berisiko. - Operator bitwise bekerja pada pola bit, dipakai untuk flag dan data biner, jarang untuk perhitungan aplikasi biasa.
- Prioritas operator menentukan urutan evaluasi, dan kurung dipakai untuk memperjelas maksud meskipun tidak wajib.
Referensi#
- Operators — Oracle Java Tutorials — Rangkuman resmi seluruh operator Java beserta urutan prioritasnya.
- Expressions, Statements, and Blocks — Oracle Java Tutorials — Definisi resmi ekspresi, pernyataan, dan hubungannya dengan blok.
- Summary of Operators — Oracle Java Tutorials — Tabel ringkas operator menurut kelompok dan prioritas.