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:
| Tipe | Kelompok | Ukuran | Rentang Nilai | Contoh Literal |
|---|---|---|---|---|
byte | bilangan bulat | 1 byte | -128 .. 127 | 42 |
short | bilangan bulat | 2 byte | -32.768 .. 32.767 | 30000 |
int | bilangan bulat | 4 byte | -2.147.483.648 .. 2.147.483.647 | 8600000 |
long | bilangan bulat | 8 byte | ±9,2 kuintiliun | 149600000000L |
float | floating-point | 4 byte | ±3,4 × 10³⁸ (presisi ~7 digit) | 62.5f |
double | floating-point | 8 byte | ±1,8 × 10³⁰⁸ (presisi ~15 digit) | 168.75 |
char | karakter | 2 byte | \u0000 .. \uFFFF (0 .. 65.535) | 'A' |
boolean | logika | tak ditetapkan | true atau false | true |
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
longwajib diberi akhiranL(huruf kapital disarankan agar tidak tertukar dengan angka1):149600000000L. - Literal desimal
floatwajib diberi akhiranf:62.5f. Tanpa akhiran,62.5dibaca sebagaidoubledan assignment kefloatditolak compiler. - Literal karakter ditulis dengan petik tunggal dan memuat tepat satu karakter UTF-16:
'A','7','\n'. - Literal
booleanhanya punya dua bentuk:truedanfalse. - Untuk keterbacaan, angka panjang boleh dipisah garis bawah:
8_600_000bernilai sama dengan8600000.
Satu Variabel untuk Setiap Tipe #
Program berikut mendeklarasikan delapan variabel — satu untuk setiap tipe primitive — lalu mencetak isinya:
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:
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 = trueMari kita bedah beberapa baris kuncinya:
- Baris 6 (
long jarakMatahari = 149600000000L;): nilai 149,6 miliar melebihi rentangint, sehingga akhiranLbukan pilihan melainkan keharusan. Tanpa akhiranL, compiler membaca literal tersebut sebagaiintdan langsung menolaknya. - Baris 7 (
float beratBadan = 62.5f;): literal62.5bertipedouble; akhiranfmenurunkannya menjadifloatagar tipenya cocok dengan variabel. - Baris 3-4 (
bytedanshort): compiler menerima literalintyang nilainya muat ke dalambyte/shorttanpa cast, karena nilainya dapat diverifikasi saat kompilasi. Fasilitas khusus ini hanya berlaku untuk assignment literal langsung. - Baris 9 (
char nilaiHuruf = 'A';):charmenyimpan satu karakter UTF-16; saat dicetak lewatprintln, 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:
byte : -128 .. 127
short : -32768 .. 32767
int : -2147483648 .. 2147483647
long : -9223372036854775808 .. 9223372036854775807
float : 1.4E-45 .. 3.4028235E38
double : 4.9E-324 .. 1.7976931348623157E308Dua hal penting dari keluaran program di atas:
- Baris 3-6 (rentang integer): tipe integer simetris — nilai terkecil selalu kebalikan nilai terbesar dikurangi satu, misalnya
intmencakup -2.147.483.648 hingga 2.147.483.647. - Baris 7-8 (rentang floating-point):
Float.MIN_VALUEdanDouble.MIN_VALUEbukan 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 berkaspublic 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 berkaspublic class LiteralTerlaluBesar {
public static void main(String[] args) {
int populasiDunia = 3000000000;
System.out.println(populasiDunia);
}
}
RentangNilai.java
Unduh berkaspublic 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);
}
}