Menu

Tipe Data Java: Primitif, Tipe Referensi, dan Nilai Default

Penjelasan tipe data di Java: delapan tipe primitif, tipe referensi, nilai default, literal dan sufiksnya, overflow, dan kapan memakai tipe numerik yang mana.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Dua Keluarga: Primitif dan Referensi

Setiap nilai di Java punya tipe, dan tipe itu termasuk salah satu dari dua keluarga. Tipe primitif menyimpan nilai mentah secara langsung: sebuah angka, satu karakter, atau true/false. Tipe referensi menyimpan referensi (pointer) ke sebuah objek yang berada di tempat lain di memori: String, array, dan setiap class yang didefinisikan olehmu atau oleh library.

Perbedaan ini penting karena primitif itu ringan dan disalin berdasarkan nilainya, sedangkan variabel referensi menunjuk ke objek yang bisa dipakai bersama. Mulailah dengan delapan tipe primitif, karena semuanya dibangun di atas fondasi ini.

Delapan Tipe Primitif

Java punya tepat delapan tipe primitif bawaan. Enam di antaranya angka, satu karakter, dan satu boolean:

Beberapa hal yang perlu diperhatikan sejak awal: garis bawah pada 2_000_000 hanyalah pemisah visual yang diabaikan compiler, sufiks L dan f itu wajib (penjelasannya ada di bawah), dan char memakai tanda kutip tunggal, sedangkan String memakai tanda kutip ganda.

Memilih Tipe Numerik

Kamu hampir tidak pernah butuh byte atau short, karena keduanya hanya menghemat memori pada array yang sangat besar. Keputusan yang sebenarnya adalah antara int/long untuk bilangan bulat dan float/double untuk bilangan desimal.

TipeUkuranPakai saat
int32-bitDefault untuk bilangan bulat (sampai ~2,1 miliar)
long64-bitNilai di atas ~2 miliar: timestamp milidetik, ukuran file
double64-bitDefault untuk desimal, presisinya bagus
float32-bitHanya saat memori terbatas dan presisi boleh berkurang

Jebakannya adalah overflow. int diam-diam berputar balik saat melewati rentangnya. Tidak ada error, hanya jawaban yang salah:

maxInt + 1 mengalami overflow menjadi -2147483648 karena kedua operandnya int dan hasilnya tetap int. Melakukan cast salah satu sisi ke long terlebih dahulu membuat perhitungannya dilakukan dalam 64 bit. Kalau sebuah nilai bisa jadi besar, terutama milidetik sejak tahun 1970, pakai long.

Literal dan Sufiksnya

Literal angka tanpa tambahan apa pun punya tipe default, dan ini sering menjebak. 100 adalah int; 3.14 adalah double. Untuk menulis literal long atau float, kamu harus menambahkan sufiks:

Hapus L dari 8_000_000_000L, maka kodenya tidak akan bisa dikompilasi, karena literal itu melebihi rentang int sebelum sempat sampai ke variabel long. Hapus f dari 0.5f, maka Java akan protes bahwa double tidak bisa diberikan ke float tanpa cast. Sufiksnya tidak peka huruf besar kecil, tetapi pakai L huruf besar, karena l huruf kecil terlihat persis seperti angka 1.

char Sebenarnya Angka yang Menyamar

char menyimpan satu code unit Unicode 16-bit, artinya ia sekaligus berfungsi sebagai bilangan bulat kecil tanpa tanda. Kamu bisa melakukan aritmetika padanya dan mengonversinya bolak-balik dengan cast:

Ini kadang berguna untuk menggeser huruf, tetapi jangan mengandalkannya untuk teks, karena untuk itulah String ada. Perhatikan bahwa char memakai tanda kutip tunggal ('A'); tanda kutip ganda ("A") menghasilkan String berisi satu karakter, yang merupakan tipe yang sama sekali berbeda.

Nilai Default (dan Jebakan Variabel Lokal)

Field dan elemen array yang tidak kamu inisialisasi mendapat nilai default yang masuk akal. Tetapi ini hanya berlaku untuk field dan slot array: variabel lokal tidak mendapat nilai default, dan memakainya sebelum diberi nilai menghasilkan error kompilasi, bukan kejutan saat runtime.

Kalau kamu menulis int x; System.out.println(x); di dalam main, compiler akan menolaknya dengan pesan "variable x might not have been initialized." Ketegasan ini justru fitur: ia mencegahmu membaca nilai sampah. Nilai default yang perlu diingat: tipe numerik 0, boolean false, char '\u0000', dan setiap tipe referensi null.

Berikutnya: String

String adalah tipe referensi yang paling sering akan kamu pakai: teks, nilai yang digabungkan, input dari pengguna. Perilakunya berbeda dari tipe primitif di sini: ia adalah objek, ia immutable, dan membandingkan string punya jebakannya sendiri. Halaman berikutnya membahasnya.

Pertanyaan yang sering diajukan

Ada berapa tipe data di Java?

Java punya delapan tipe primitif: byte, short, int, long, float, double, char, dan boolean. Selain itu, yaitu String, array, dan objek apa pun, adalah tipe referensi. Jadi jumlah primitif bawaan tetap delapan, sedangkan tipe referensi tidak terbatas karena kamu (dan library) bisa mendefinisikan class baru.

Apa perbedaan int dan long di Java?

Keduanya menyimpan bilangan bulat, tetapi int berukuran 32-bit (rentang sekitar ±2,1 miliar) dan long berukuran 64-bit (rentang sekitar ±9,2 kuintiliun). Pakai int sebagai default; beralihlah ke long kalau nilainya bisa melebihi dua miliar, misalnya timestamp dalam milidetik, ukuran file, atau penghitung yang besar. Literal long butuh sufiks L, misalnya long big = 10000000000L;.

Berapa nilai default int di Java?

Field bertipe int bernilai default 0, tetapi hanya field dan elemen array yang mendapat nilai default. long bernilai default 0L, double 0.0, boolean false, char '\u0000', dan tipe referensi apa pun null. Variabel lokal sama sekali tidak mendapat nilai default: kamu harus memberinya nilai sebelum dipakai, kalau tidak kodenya tidak akan bisa dikompilasi.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai