"Membuat Program JAVA dengan Menggunakan Array"
Jika sekumpulan data digabungkan dalam satu unit, hasilnya adalah suatu
struktur data.
Data struktur dapat berupa struktur yang sangat kompleks, akan tetapi
dalam banyak aplikasi, data struktur yang cocok hanya terdiri dari
kumpulan data berurutan. Struktur data sederhana seperti ini bisa berupa
array atau
record.
Istilah
"record" sebetulnya tidak digunakan pada Java. Suatu record pada
intinya mirip dengan objek pada Java yang hanya memiliki variabel
instansi tanpa metode instansi. Beberapa bahasa pemrograman lain yang
tidak mendukung objek biasanya mendukung record. Dalam bahasa C yang
bukan bahasa berorientasi objek, misalnya, memiliki tipe data record,
dimana pada C disebut "struct". Data pada record -- dalam Java, adalah
variabel instansi suatu objek -- disebut
field suatu
record. Masing-masing item disebut nama field. Dalam Java, nama field
adalah nama variabel instansi. Perbedaan sifat dari suatu record adalah
bahwa item pada record dipanggil berdasarkan namanya, dan field yang
berbeda dapat berupa tipe yang berbeda. Misalnya, kelas
Orang didefisikan sebagai :
class Orang {
String nama;
int nomorID;
Date tanggalLahir;
int umur;
}
maka objek dari kelas
Orang bisa disebut juga sebagai record dengan 4 field. Nama fieldnya adalah
nama,
nomorID,
tanggalLahir dan
umur. Lihat bahwa tipe datanya berbeda-beda yaitu
String,
int, dan
Date.
Karena record hanya merupakan bagian lebih kecil dari objek, kita tidak akan bahas lebih lanjut di sini.
Seperti record, suatu array adalah kumpulan item. Akan tetapi, item pada record dipanggil dengan
nama, sedangkan item pada array dinomori, dan masing-masing item dipanggil besarkan
nomor posisi
pada array tersebut. Semua item pada array harus bertipe sama. Definisi
suatu array adalah : kumpulan item bernomor yang semuanya bertipe sama.
Jumlah item dalam suatu array disebut panjang array. Nomor posisi dari
array disebut
indeks item tersebut dalam array. Tipe dari item tersebut disebut
tipe dasar dari array.
Tipe
dasar suatu array bisa berupa tipe Java apa saja, baik berupa tipe
primitif, nama kelas, atau nama interface. Jika tipe dasar suatu array
adalah
int, maka array tersebut disebut "array
int". Suatu array bertipe
String disebut "array
String". Akan tetapi array bukan urutan int atau urutan String atau urutan
nilai bertipe apapun. Lebih baik jika array adalah urutan
variabel bertipe int atau String atau tipe lainnya.
Seperti
biasa, ada dua kemungkinan kegunaan variabel : sebagai nama suatu
lokasi di memori, dan nama suatu nilai yang disimpan pada lokasi memori.
Setiap posisi pada array bersifat seperti variabel. Setiap posisi dapat
menyimpan nilai dengan tipe tertentu (yaitu tipe dasar array). Isinya
bisa diganti kapanpun. Nilai tersebut disimpan di dalam array. Array
merupakan kontainer bukan kumpulan nilai.
Item pada array (maksudnya setiap anggota variabel dalam array tersebut) sering juga disebut
elemen array.
Dalam Java, elemen array selalu dinomori mulai dari nol. Yaitu, indeks
dari elemen pertama suatu array adalah nol. Jika panjang array adalah N,
maka indeks elemen terakhir adalah N-1. Sekali array dibuat, maka
panjangnya tidak bisa diubah lagi.
Dalam Java, array adalah objek. Ada beberapa konsekuensi yang lahir dari fakta ini. Array harus dibuat dengan operator
new.
Variabel tidak bisa menyimpan array; variabel hanya bisa merujuk pada
array. Variabel lain yang bisa merujuk array juga bisa bernilai
null
yang berarti ia tidak merujuk pada lokasi memori apapun. Seperti objek
lain, array juga bagian dari suatu kelas, di mana seperti kelas lain
adalah kelas turunan dari kelas
Object. Elemen array pada dasarnya adalah variabel instansi dalam objek array, kecuali mereka dipanggil dalam indeksnya bukan namanya.
Meskipun
array berupa objek, ada beberapa perbedaan antara array dan objek
lainnya, dan ada beberapa fitur khusus Java untuk membuat dan
menggunakan array.
Misalnya A adalah variabel yang merujuk
pada suatu array. Maka indeks k di dalam A bisa dipanggil dengan A[k].
Item pertama adalah A[0], yang kedua adalah A[i], dan seterusnya.
A[k]
adalah suatu variabel dan bisa digunakan seperti variabel lainnya. Kita
bisa memberinya nilai, bisa menggunakannya dalam ekspresi, dan bisa
diberikan sebagai parameter pada subrutin. Semuanya akan didiskusikan di
bawah nanti. Untuk sekarang ingat sintaks berikut
variabel_array [ekspresi_integer]
untuk merujuk pada suatu array.
Meskipun
setiap array merupakan suatu objek, kelas array tidak harus
didefinisikan sebelumnya. Jika suatu tipe telah ada, maka kelas array
dari tipe tersebut otomatis ada. Jika nama suatu tipe adalah
TipeDasar, maka nama kelas arraynya adalah
TipeDasar[]. Artinya, suatu objek yang diciptakan dari kelas
TipeDasar[] adalah array dari item yang tiap itemnya bertipe
TipeDasar. Tanda kurung "[]" dimaksudkan untuk mengingat sintaks untuk mengambil item di dalam suatu array. "
TipeDasar[]" dibaca seperti "array TipeDasar". Mungkin perlu juga dijelaskan bahwa jika
KelasA adalah kelas turunan dari
KelasB maka
KelasA[] otomatis menjadi kelas turunan
KelasB[].
Tipe dasar suatu array dapat berupa tipe apapun yang ada atau sudah didefinisikan pada Java. Misalnya tipe primitif
int akan diturunkan kelas array
int[]. Setiap elemen di dalam array
int[] adalah variabel yang memiliki tipe
int dan bisa diisi dengan nilai dengan tipe
int. Dari kelas yang bernama
String diturunkan tipe array
String[]. Setiap elemen di dalam array
String[] adalah variabel dengan tipe
String, yang bisa diisi dengan nilai bertipe
String. Nilai ini bisa
null atau referensi ke objek yang bertipe
String (dan juga kelas turunan dari
String)
Mari kita lihat contoh lebih konkrotnya menggunakan array bilangan bulat sebagai contoh pertama kita. Karena
int[] adalah sebuah kelas, maka kita bisa menggunakannya untuk mendeklarasikan variabel. Misalnya,
yang membuat variabel bernama
daftar dengan tipe
int[]. Variabel ini bisa menunjuk pada array int, akan tetapi nilai awalnya adalah
null (jika merupakan variabel anggota suatu kelas) atau tak tentu (jika merupakan variabel lokal di dalam suatu metode). Operator
new digunakan untuk membuat objek array baru, ayng kemudian bisa diberikan kepada
daftar. Sintaksnya sama seperti sintaks sebelumnya, yaitu :
membuat array 5 buah integer. Lebih umum lagi, konstruktor "
new TipeDasar[N]" digunakan untuk membuat array bertipe
TipeDasar[].
Nilai N di dalam kurung menyatakan panjang array, atau jumlah elemen
yang bisa ditampung. Panjang array adalah variabel instansi di dalam
objek array, sehingga array tahu berapa panjangnya. Kita bisa
mendapatkan panjang suatu array, misalnya
daftar menggunakan
daftar.length (akan tetapi kita tidak bisa mengubahnya)
Hasil dari pernyataan "
daftar = new int[5];" dapat diilustrasikan sebagai berikut
Perlu dicatat bahwa array integer secara otomatis diisi dengan nol.
Dalam Java, array yang baru dibuat akan selalu diisi dengan nilai
tertentu: nol untuk angka, false untuk boolean, karakter dengan nilai
Unicode 0 untuk char dan null untuk objek.
Elemen di dalam array
daftar dapat dirujuk dengan
daftar[0],
daftar[1],
daftar[2],
daftar[3], dan
daftar[4]
(ingat juga bahwa nilai indeks terbesar adalah panjangnya array
dikurang satu). Akan tetapi, referensi array sebetulnya lebih umum lagi.
Tanda kurung di dalam referensi array bisa berisi ekspresi apapun yang
nilainya suatu integer. Misalnya jika
idks adalah variabel bertipe
int, maka
daftar[idks] dan
daftar[2*idks+3] secara sintaks benar.
Contoh berikut akan mencetak semua isi integer di dalam array
daftar ke layar :
for (int i = 0; i < daftar.length; i++) {
System.out.println( daftar[i] );
}
Perulangan pertama adalah ketika i = 0, dan
daftar[i] merujuk pada
daftar[0]. Jadi nilai yang disimpan pada variabel
daftar[0] akan dicetak ke layar. Perulangan kedua adalah i = 1, sehingga nilai
daftar[i] dicetak. Perulangan berhenti setelah mencetak
daftar[4] dan i menjadi sama dengan 5, sehingga kondisi lanjutan "
i < daftar.length" tidak lagi benar. Ini adalah contoh umum dari menggunakan perulangan untuk mengolah suatu array.
Penggunaan
suatu variabel dalam suatu program menyatakan lokasi di memori.
Pikirkan sesaat tentang apa yang akan komputer lakukan ketika ia
menemukan referensi ke elemen suatu array
daftar[k] ketika program berjalan. Komputer harus menentukan lokasi memori di mana ia dijadikan referensi. Untuk komputer,
daftar[k] berarti : "Ambil pointer yang disimpan di dalam variabel
daftar.
Ikuti pointer ini untuk mencari objek array. Ambil nilai k. Pergi ke
posisi ke-k dari array tersebut, dan di sanalah alamat memori yang Anda
ingin."
Ada dua hal yang bisa salah di sini. Misalnya nilai
daftar adalah null. Dalam kasus ini, maka
daftar
tidak memiliki referensi sama sekali. Percobaan merujuk suatu elemen
pada suatu array kosong adalah suatu kesalahan. Kasus ini akan
menampilkan pesan kesalahan "pointer kosong". Kemungkinan kesalahan
kedua adalah jika
daftar merujuk pada suatu array, akan tetapi k berada di luar rentang indeks yang legal. Ini akan terjadi jika
k < 0 atau jika
k >= daftar.length.
Kasus ini disebut kesalahan "indeks array keluar batas". Ketika kita
menggunakan array dalam program, kita harus selalu ingat bahwa kedua
kesalahan tersebut mungkin terjadi. Dari kedua kasus di atas, kesalahan
indeks array keluar batas adalah kesalahan yang lebih sering terjadi.
Untuk
suatu variabel array, seperti variabel lainnya, kita bisa
mendeklarasikan dan mengisinya dengan satu langkah sekaligus, misalnya :
int[] daftar = new int[5];
Jika
daftar merupakan variabel lokal dalam subrutin, maka perintah di atas akan persis sama dengan dua perintah :
int[] daftar;
daftar = new int[5];
(Jika
daftar adalah variabel instansi, tentukan kita tidak bisa mengganti "
int[] daftar = new int[5];" dengan "
int[] daftar; daftar = new int[5];" karena ini hanya bisa dilakukan di dalam subrutin)
Array
yang baru dibuat akan diisi dengan nilai awal yang tergantung dari tipe
dasar array tersebut seperti dijelaskan sebelumnya. Akan tetapi Java
juga menyediakan cara untuk memberi isi array baru dengan daftar isinya.
Dalam pernyataan yang untuk membuat array, ini bisa dilakukan dengan
menggunakan penginisialiasi array (
array initializer), misalny :
int[] daftar = { 1, 4, 9, 16, 25, 36, 49 };
akan membuat array baru yang berisi 7 nilai, yaitu 1, 4, 9, 16,
25, 36, dan 49, dan mengisi
daftar dengan referensi ke array baru tersebut. Nilai
daftar[0] berisi 1, nilai
daftar[1] berisi 4, dan seterusnya. Panjang
daftar adalah 7, karena kita memberikan 7 nilai awal kepada array ini.
Suatu
penginisialisasi array memiliki bentuk daftar angka yang dipisahkan
dengan koma dan diapit dengan tanda kurung kurawal {}. Panjang array
tersebut tidak perlu diberikan, karena secara implisit sudah bisa
ditentukan dari jumlah daftar angkanya. Elemen di dalam penginisialisasi
array tidak harus selalu berbentuk konstanta. Juga bisa merupakan
variabel atau ekspresi apa saja, asalkan nilainya bertipe sama dengan
tipe dasar array tersebut. Misalnya, deklarasi berikut membuat array
dari delapan jenis
Color beberapa warna telah dibentuk dengan ekspresi "
new Color(r,g,b);"
Color[] palette =
{
Color.black,
Color.red,
Color.pink,
new Color(0,180,0), // hijau gelap
Color.green,
Color.blue,
new Color(180,180,255), // biru muda
Color.white
};
Inisialisasi array bentuk seperti ini hanya bisa digunakan dalam
deklarasi suatu variabel baru, akan tetapi tidak bisa digunakan seperti
operator pemberi nilai (=) di tengah-tengah suatu program. Akan tetapi
ada cara lain yang bisa digunakan sebagai pernyataan pemberian nilai
atau diberikan ke dalam subrutin. Yaitu menggunakan jenis lain dari
operator
new
untuk membuat atau menginisialisasi objek array baru. (Cara ini agak
kaku dengan sintaks aneh, seperti halnya sintaks kelas anonim yang telah
didiskusikan sebelumnya). Misalnya untuk memberi nilai kepada suatu
variabel
daftar, kita bisa menggunakan :
daftar = new int[] { 1, 8, 27, 64, 125, 216, 343 };
Sintaks umum dari bentuk operator
new seperti ini adalah
new TipeDasar [ ] { daftar_nilai_nilai }
Ini adalah suatu ekspresi yang isinya merupakan objek, dan bisa digunakan untuk banyak situasi di mana suatu objek dengan tipe
TipeDasar dipentingkan. Misalnya
buatTombol merupakan metode yang mengambil array String sebagai parameter, maka kita bisa menuliskan
buatTombol( new String[] { "Stop", "Jalan", "Berikut", "Sebelum" } );Catatan terakhir : untuk alasan sejarah, maka deklarasi
akan bernilai sama dengan
di mana sintaks tersebut digunakan dalam bahasa C dan C++. Akan
tetapi sintaks alternatif ini tidak begitu masuk akan dalam Java, atau
mungkin lebih baik dihindari. Lagian, maksudnya adalah mendeklarasikan
variabel dengan tipe tertentu dan namanya adalah
int[]. Akan lebih masuk akan untuk mengikuti siintaks "nama_tipe nama_variabel" seperti pada bentuk bertama.