Setiap perhitungan pada akhirnya harus disimpan ke suatu tempat, dan tugas itu dijalankan oleh operator penugasan. Operator dasarnya adalah tanda sama dengan (=) yang menyalin nilai dari ekspresi di sisi kanan ke variabel di sisi kiri. Java juga menyediakan bentuk gabungan (compound assignment) seperti +=, -=, *=, /=, dan %= yang memadukan operasi aritmetika dengan penugasan dalam satu statement ringkas. Pada Chapter ini kita bedah cara kerja operator tersebut, fakta bahwa penugasan adalah sebuah ekspresi bernilai, serta satu jebakan konversi tipe yang kerap menghentikan proses kompilasi.

Operator Penugasan Dasar #

Operator = bekerja dua langkah: JVM mengevaluasi ekspresi di sisi kanan lebih dahulu sampai menjadi satu nilai, kemudian nilai tersebut disimpan ke variabel di sisi kiri. Karena itu penulisan seperti saldo = saldo + 50000 sangat umum — nilai lama variabel dipakai sebagai operand, hasilnya disimpan kembali ke variabel yang sama. Bentuk seperti inilah yang diringkas oleh compound assignment operators, seperti ditunjukkan contoh berikut.

public class PenugasanDasar {
    public static void main(String[] args) {
        int saldo = 100000;
        System.out.println("Saldo awal        : " + saldo);

        saldo += 50000;   // saldo = saldo + 50000
        System.out.println("Setelah top-up    : " + saldo);

        saldo -= 30000;   // saldo = saldo - 30000
        System.out.println("Setelah belanja   : " + saldo);

        saldo *= 2;       // saldo = saldo * 2
        System.out.println("Setelah bonus     : " + saldo);

        saldo /= 4;       // saldo = saldo / 4
        System.out.println("Setelah dibagi 4  : " + saldo);

        saldo %= 7;       // saldo = saldo % 7
        System.out.println("Sisa modulo 7     : " + saldo);
    }
}

Output yang Dihasilkan:

text
Saldo awal        : 100000
Setelah top-up    : 150000
Setelah belanja   : 120000
Setelah bonus     : 240000
Setelah dibagi 4  : 60000
Sisa modulo 7     : 3

Mari kita telaah baris-baris kode di atas:

  1. Baris 3 (int saldo = 100000;): operator = menyimpan nilai 100000 ke variabel saldo — bentuk penugasan paling dasar.
  2. Baris 6 (saldo += 50000;): setara dengan saldo = saldo + 50000, sehingga saldo berubah menjadi 150000.
  3. Baris 9, 12, 15, 18 (-=, *=, /=, %=): pola yang sama untuk pengurangan (120000), perkalian (240000), pembagian (60000), dan modulus (3).
  4. Baris 15 (saldo /= 4;): ingat aturan Chapter sebelumnya — pembagian dua int memotong pecahan; 240000 / 4 memang habis terbagi sehingga hasilnya tetap presisi.

Penugasan adalah Ekspresi Bernilai #

Berbeda dari banyak bahasa lain, assignment pada Java bukan sekadar perintah melainkan juga ekspresi yang mengembalikan nilai yang baru saja disimpan. Konsekuensinya, penugasan dapat dirantai: a = b = c = 10 dievaluasi dari kanan ke kiri — 10 disimpan ke c, nilai 10 mengalir ke b, lalu ke a. Penugasan juga boleh dibungkus tanda kurung dan nilainya dipakai oleh ekspresi lain, seperti int salin = (d = 20);.

public class PenugasanSebagaiEkspresi {
    public static void main(String[] args) {
        int a, b, c;
        a = b = c = 10;          // dievaluasi dari kanan: c = 10, lalu b = c, lalu a = b
        System.out.println("a=" + a + ", b=" + b + ", c=" + c);

        int d = 5;
        int salin = (d = 20);     // penugasan mengembalikan nilai yang disimpan
        System.out.println("d=" + d + ", salin=" + salin);

        int e = 50;
        int hasil = (e += 10);    // compound assignment juga bernilai
        System.out.println("e=" + e + ", hasil=" + hasil);

        byte data = 10;
        data += 5;                // setara data = (byte) (data + 5)
        System.out.println("data=" + data);
    }
}

Output yang Dihasilkan:

text
a=10, b=10, c=10
d=20, salin=20
e=60, hasil=60
data=15

Baris 4 menunjukkan ketiga variabel berisi 10 karena nilai mengalir dari kanan ke kiri. Baris 8 membuktikan (d = 20) bernilai 20 sekaligus mengubah d menjadi 20. Baris 12 memperlihatkan compound assignment ikut memiliki nilai: (e += 10) menaikkan e menjadi 60 dan nilai 60 itulah yang disalin ke hasil. Baris 16 kita bahas khusus pada bagian berikutnya.

Jebakan Konversi Tipe pada Compound Assignment #

Aturan numeric promotion menyatakan bahwa operasi aritmetika pada byte, short, atau char dipromosikan menjadi int lebih dahulu. Akibatnya, statement data = data + 5 pada variabel byte gagal dikompilasi karena hasil penjumlahan bertipe int — lebih lebar dari byte — dan compiler javac menolak penyusutan tanpa cast eksplisit. Lalu mengapa data += 5 pada contoh sebelumnya lolos? Spesifikasi Java mendefinisikan compound assignment sebagai data = (byte) (data + 5) — compiler menyisipkan cast ke tipe variabel secara otomatis.

Program kecil berikut sengaja memuat versi yang gagal agar kita melihat bentuk errornya.

public class PenugasanByteGagal {
    public static void main(String[] args) {
        byte data = 10;
        data = data + 5;   // gagal kompilasi: hasil int tidak muat di byte
        System.out.println(data);
    }
}

Eksekusi berkas tersebut berhenti pada tahap kompilasi dengan pesan yang kita verifikasi langsung: error: incompatible types: possible lossy conversion from int to byte, ditunjuk pada baris keempat. Versi data += 5 diterima karena cast implisit ke byte disisipkan compiler, sementara data = data + 5 menuntut kita menulis sendiri data = (byte) (data + 5).

Operator penugasan kini jelas perannya: menampung hasil ekspresi ke dalam variabel. Chapter berikutnya berpindah ke operator yang membandingkan dua nilai — mulai dari < dan > hingga == beserta perbedaan penting antara membandingkan nilai dan membandingkan referensi objek.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

PenugasanByteGagal.java

Unduh berkas
java
public class PenugasanByteGagal {
    public static void main(String[] args) {
        byte data = 10;
        data = data + 5;   // gagal kompilasi: hasil int tidak muat di byte
        System.out.println(data);
    }
}

PenugasanDasar.java

Unduh berkas
java
public class PenugasanDasar {
    public static void main(String[] args) {
        int saldo = 100000;
        System.out.println("Saldo awal        : " + saldo);

        saldo += 50000;   // saldo = saldo + 50000
        System.out.println("Setelah top-up    : " + saldo);

        saldo -= 30000;   // saldo = saldo - 30000
        System.out.println("Setelah belanja   : " + saldo);

        saldo *= 2;       // saldo = saldo * 2
        System.out.println("Setelah bonus     : " + saldo);

        saldo /= 4;       // saldo = saldo / 4
        System.out.println("Setelah dibagi 4  : " + saldo);

        saldo %= 7;       // saldo = saldo % 7
        System.out.println("Sisa modulo 7     : " + saldo);
    }
}

PenugasanSebagaiEkspresi.java

Unduh berkas
java
public class PenugasanSebagaiEkspresi {
    public static void main(String[] args) {
        int a, b, c;
        a = b = c = 10;          // dievaluasi dari kanan: c = 10, lalu b = c, lalu a = b
        System.out.println("a=" + a + ", b=" + b + ", c=" + c);

        int d = 5;
        int salin = (d = 20);     // penugasan mengembalikan nilai yang disimpan
        System.out.println("d=" + d + ", salin=" + salin);

        int e = 50;
        int hasil = (e += 10);    // compound assignment juga bernilai
        System.out.println("e=" + e + ", hasil=" + hasil);

        byte data = 10;
        data += 5;                // setara data = (byte) (data + 5)
        System.out.println("data=" + data);
    }
}