Variabel pada Chapter sebelumnya kita isi dengan beragam jenis data: bilangan bulat, bilangan desimal, satu karakter, dan keadaan benar/salah. Java menyediakan delapan primitive data types bawaan untuk data tersebut — tipe paling dasar yang menyimpan nilai mentah langsung di memori, bukan referensi ke objek. Memilih tipe yang tepat menentukan seberapa besar nilai yang muat dan berapa memori yang terpakai. Pada Chapter ini kita petakan kedelapan tipe tersebut beserta ukuran dan rentang nilainya, lalu menguji batas-batasnya dengan program nyata.

Delapan Tipe Primitive #

Kedelapan tipe terbagi dalam empat kelompok: bilangan bulat (integral), bilangan desimal (floating-point), karakter, dan logika. Berikut ringkasannya:

TipeKelompokUkuranRentang NilaiContoh Literal
bytebilangan bulat1 byte-128 .. 12742
shortbilangan bulat2 byte-32.768 .. 32.76730000
intbilangan bulat4 byte-2.147.483.648 .. 2.147.483.6478600000
longbilangan bulat8 byte±9,2 kuintiliun149600000000L
floatfloating-point4 byte±3,4 × 10³⁸ (presisi ~7 digit)62.5f
doublefloating-point8 byte±1,8 × 10³⁰⁸ (presisi ~15 digit)168.75
charkarakter2 byte\u0000 .. \uFFFF (0 .. 65.535)'A'
booleanlogikatak ditetapkantrue atau falsetrue

Dua hal patut digarisbawahi dari tabel tersebut. Pertama, int adalah tipe default untuk seluruh literal bilangan bulat — tulis 42 dan compiler membacanya sebagai int. Kedua, double adalah tipe default untuk literal desimal — tulis 3.14 dan compiler membacanya sebagai double.

Literal dan Akhiran Khusus #

Literal adalah nilai yang ditulis langsung di kode sumber. Beberapa aturan literal menempel erat pada tipe tertentu:

  • Literal bilangan bulat berukuran long wajib diberi akhiran L (huruf kapital disarankan agar tidak tertukar dengan angka 1): 149600000000L.
  • Literal desimal float wajib diberi akhiran f: 62.5f. Tanpa akhiran, 62.5 dibaca sebagai double dan assignment ke float ditolak compiler.
  • Literal karakter ditulis dengan petik tunggal dan memuat tepat satu karakter UTF-16: 'A', '7', '\n'.
  • Literal boolean hanya punya dua bentuk: true dan false.
  • Untuk keterbacaan, angka panjang boleh dipisah garis bawah: 8_600_000 bernilai sama dengan 8600000.

Satu Variabel untuk Setiap Tipe #

Program berikut mendeklarasikan delapan variabel — satu untuk setiap tipe primitive — lalu mencetak isinya:

java DelapanTipe.java
public class DelapanTipe {
    public static void main(String[] args) {
        byte umurBulan = 25;              // 1 byte, cukup untuk angka kecil
        short populasiDesa = 7800;        // 2 byte
        int populasiKota = 8600000;       // 4 byte, tipe bilangan bulat default
        long jarakMatahari = 149600000000L; // 8 byte, akhiran L wajib
        float beratBadan = 62.5f;         // 4 byte, akhiran f wajib untuk desimal
        double tinggiBadan = 168.75;      // 8 byte, tipe desimal default
        char nilaiHuruf = 'A';            // 2 byte, satu karakter UTF-16
        boolean sudahLulus = true;        // ukuran tidak ditetapkan spesifikasi

        System.out.println("byte   umurBulan       = " + umurBulan);
        System.out.println("short  populasiDesa     = " + populasiDesa);
        System.out.println("int    populasiKota    = " + populasiKota);
        System.out.println("long   jarakMatahari   = " + jarakMatahari);
        System.out.println("float  beratBadan      = " + beratBadan);
        System.out.println("double tinggiBadan     = " + tinggiBadan);
        System.out.println("char   nilaiHuruf      = " + nilaiHuruf);
        System.out.println("boolean sudahLulus     = " + sudahLulus);
    }
}

Output yang Dihasilkan:

text
byte   umurBulan       = 25
short  populasiDesa     = 7800
int    populasiKota    = 8600000
long   jarakMatahari   = 149600000000
float  beratBadan      = 62.5
double tinggiBadan     = 168.75
char   nilaiHuruf      = A
boolean sudahLulus     = true

Mari kita bedah beberapa baris kuncinya:

  1. Baris 6 (long jarakMatahari = 149600000000L;): nilai 149,6 miliar melebihi rentang int, sehingga akhiran L bukan pilihan melainkan keharusan. Tanpa akhiran L, compiler membaca literal tersebut sebagai int dan langsung menolaknya.
  2. Baris 7 (float beratBadan = 62.5f;): literal 62.5 bertipe double; akhiran f menurunkannya menjadi float agar tipenya cocok dengan variabel.
  3. Baris 3-4 (byte dan short): compiler menerima literal int yang nilainya muat ke dalam byte/short tanpa cast, karena nilainya dapat diverifikasi saat kompilasi. Fasilitas khusus ini hanya berlaku untuk assignment literal langsung.
  4. Baris 9 (char nilaiHuruf = 'A';): char menyimpan satu karakter UTF-16; saat dicetak lewat println, karakternya yang tampil, bukan angka kode numeriknya.

Batas Nilai Tiap Tipe #

Setiap tipe bilangan memiliki konstanta MIN_VALUE dan MAX_VALUE di class pembungkusnya (Byte, Short, Integer, Long, Float, Double). Program berikut mencetak seluruhnya:

public class RentangNilai {
    public static void main(String[] args) {
        System.out.println("byte   : " + Byte.MIN_VALUE + " .. " + Byte.MAX_VALUE);
        System.out.println("short  : " + Short.MIN_VALUE + " .. " + Short.MAX_VALUE);
        System.out.println("int    : " + Integer.MIN_VALUE + " .. " + Integer.MAX_VALUE);
        System.out.println("long   : " + Long.MIN_VALUE + " .. " + Long.MAX_VALUE);
        System.out.println("float  : " + Float.MIN_VALUE + " .. " + Float.MAX_VALUE);
        System.out.println("double : " + Double.MIN_VALUE + " .. " + Double.MAX_VALUE);
    }
}

Output yang Dihasilkan:

text
byte   : -128 .. 127
short  : -32768 .. 32767
int    : -2147483648 .. 2147483647
long   : -9223372036854775808 .. 9223372036854775807
float  : 1.4E-45 .. 3.4028235E38
double : 4.9E-324 .. 1.7976931348623157E308

Dua hal penting dari keluaran program di atas:

  1. Baris 3-6 (rentang integer): tipe integer simetris — nilai terkecil selalu kebalikan nilai terbesar dikurangi satu, misalnya int mencakup -2.147.483.648 hingga 2.147.483.647.
  2. Baris 7-8 (rentang floating-point): Float.MIN_VALUE dan Double.MIN_VALUE bukan nilai negatif terbesar, melainkan bilangan positif terkecil yang masih dapat direpresentasikan. Rentang tipe floating-point dibahas tuntas pada Chapter Floating-Point Precision.

Literal di Luar Rentang #

Apa jadinya jika literal melebihi kapasitas variabelnya? Compiler menolaknya sebelum program berjalan. Berkas berikut sengaja memuat literal tiga miliar untuk variabel int:

public class LiteralTerlaluBesar {
    public static void main(String[] args) {
        int populasiDunia = 3000000000;
        System.out.println(populasiDunia);
    }
}

Compiler javac merespons dengan pesan error: integer number too large yang menunjuk ke angka 3000000000. Angka tersebut memang sah sebagai literal long, tetapi variabel tujuannya bertipe int yang batasnya 2.147.483.647. Solusinya dua pilihan: ganti tipe variabel menjadi long dan tambahkan akhiran L pada literal, atau turunkan angkanya hingga muat di rentang int.

Kedelapan tipe primitive menyimpan nilai mentah secara langsung, tetapi Java juga adalah bahasa berorientasi objek yang penuh. Bagaimana cara menyimpan teks panjang, tanggal, atau struktur data buatan sendiri? Jawabannya adalah reference types — variabel yang tidak menyimpan nilainya sendiri, melainkan alamat menuju objek di memori heap. Chapter berikutnya membedah perbedaan mendasar tersebut.

Referensi #

Berkas Sumber

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

DelapanTipe.java

Unduh berkas
java
public class DelapanTipe {
    public static void main(String[] args) {
        byte umurBulan = 25;              // 1 byte, cukup untuk angka kecil
        short populasiDesa = 7800;        // 2 byte
        int populasiKota = 8600000;       // 4 byte, tipe bilangan bulat default
        long jarakMatahari = 149600000000L; // 8 byte, akhiran L wajib
        float beratBadan = 62.5f;         // 4 byte, akhiran f wajib untuk desimal
        double tinggiBadan = 168.75;      // 8 byte, tipe desimal default
        char nilaiHuruf = 'A';            // 2 byte, satu karakter UTF-16
        boolean sudahLulus = true;        // ukuran tidak ditetapkan spesifikasi

        System.out.println("byte   umurBulan       = " + umurBulan);
        System.out.println("short  populasiDesa     = " + populasiDesa);
        System.out.println("int    populasiKota    = " + populasiKota);
        System.out.println("long   jarakMatahari   = " + jarakMatahari);
        System.out.println("float  beratBadan      = " + beratBadan);
        System.out.println("double tinggiBadan     = " + tinggiBadan);
        System.out.println("char   nilaiHuruf      = " + nilaiHuruf);
        System.out.println("boolean sudahLulus     = " + sudahLulus);
    }
}

LiteralTerlaluBesar.java

Unduh berkas
java
public class LiteralTerlaluBesar {
    public static void main(String[] args) {
        int populasiDunia = 3000000000;
        System.out.println(populasiDunia);
    }
}

RentangNilai.java

Unduh berkas
java
public class RentangNilai {
    public static void main(String[] args) {
        System.out.println("byte   : " + Byte.MIN_VALUE + " .. " + Byte.MAX_VALUE);
        System.out.println("short  : " + Short.MIN_VALUE + " .. " + Short.MAX_VALUE);
        System.out.println("int    : " + Integer.MIN_VALUE + " .. " + Integer.MAX_VALUE);
        System.out.println("long   : " + Long.MIN_VALUE + " .. " + Long.MAX_VALUE);
        System.out.println("float  : " + Float.MIN_VALUE + " .. " + Float.MAX_VALUE);
        System.out.println("double : " + Double.MIN_VALUE + " .. " + Double.MAX_VALUE);
    }
}