Sintaks Bahasa dan Tipe Data ( Array )

Array

Seperti yang telah kita bahas sebelumnya bahwa setiap kali hendak menggunakan suatu variabel, kita harus terlebih dahulu mendeklarasikannya. Yang menjadi masalah adalah bagaimana jika hendak
menggunakan sekumpulan variabel yang sangat banyak dengan tipe data tertentu, misalnya membutuhkan 1000 buah variabel bertipe int untuk suatu perhitungan. Sangat tidak efisien jika kita harus mendeklarasikan ke 1000 variabel tersebut satu per satu. Oleh karena itulah Java memiliki tipe data array.

Array Satu Dimensi
Pada dasarnya array satu dimensi merupakan kumpulan dari variabel yang memiliki tipe data yang sama.


Pendeklarasian tipe data array memiliki dua bentuk:

tipe-data nama-array[];
tipe-data[] nama-array;

Variasi cara pendeklarasian ini hanyalah untuk memudahkan programmer, bentuk mana yang digunakan adalah terserah kepada programmer karena pada dasarnya keduanya sama.

Tipe-data merupakan tipe data yang akan ditampung oleh variabelarray ini. Semua tipe data yang dikenal dalam Java, baik yang primitif maupun berupa class dapat digunakan di sini. Untuk nama array, merupakan identifier yang menunjukkan nama dari variabel array itu sendiri sama seperti nama variabel biasa. Tanda [] memberitahukan Java bahwa variabel ini bertipe array. Contoh Code:

int arr1[];
int[] arr2;

Code di atas mendeklarasikan variabel array arr1 dan arr2 dengan tipe data int. Perlu diperhatikan di sini, Java memperlakukan array sama dengan tipe data referensi di mana variabel ini sebenarnya
hanya digunakan untuk menyimpan referensi dari lokasi array yang sebenarnya di memori. Oleh karena itu, Anda harus mengalokasikan terlebih dahulu tempat di memori sebelum dapat mengakses array menggunakan variabel ini. Pendeklarasian yang ditunjukkan oleh code di atas hanya mendeklarasikan suatu variabel array dengan tipe data int bernama arr1 dan arr2, namun tempat yang akan digunakan untuk menampung array itu sendiri belum dibuat di memori. Berikut ini bentuk umum pengalokasian memori untuk array:

nama-array = new tipe-data[ukuran-array];

Untuk ukuran-array harus berupa bilangan bulat, dan jumlah maksimum yang dapat dimasukkan sebagai ukuran-array hanya terbatas pada seberapa banyak memori yang tersedia pada komputer. Berikut ini contoh pengalokasian memori:

int[] arr = new int[10];

Code di atas mengalokasikan variabel arr dengan tipe data int (array of int) sebanyak 10 buah. Array ini dapat diilustrasikan seperti gambar di bawah ini.
Untuk mengakses nilai yang ditampung dalam sebuah array, kita menggunakan indeks yang menentukan urutan dari array yang akan diakses. Indeks untuk array dalam Java selalu dimulai dari nol. Perhatikan contoh program sederhana berikut ini untuk melihat penggunaan array:

class SingleArray {
public static void main(String[] args) {
int[] x = new int[3];

x[0] = 20;
x[1] = 10;
x[2] = 0;

System.out.println("Nilai x[0] : "+ x[0]);
System.out.println("Nilai x[1] : "+ x[1]);
System.out.println("Nilai x[2] : "+ x[2]);
}
}

Variabel x pada program di atas dideklarasikan bertipe array of int, di mana ukuran array yang dialokasikan mampu menampung 3 buah data bertipe int. Pengaksesan variabel x dilakukan menggunakan indeksnya. Hasil eksekusi program di atas adalah sebagai berikut:

Nilai x[0] : 20
Nilai x[1] : 10
Nilai x[2] : 0

Perlu diperhatikan di sini bahwa kita tidak dapat/tidak boleh mengakses array di luar indeksnya, contoh:
Jika mengetik code di atas pada program, maka pada saat Anda mengeksekusinya, Anda akan mendapatkan eksepsi berupa:

java.lang.ArrayIndexOutOfBoundsException

Penjelasan tentang eksepsi akan dibahas pada Bab 10 nanti. Untuk sekarang Anda dapat mengacuhkannya dahulu.

Pengalokasian kapasitas dari array juga dapat dilakukan pada saat pendeklarasian, contoh:

int[] x = new int[3];

Bahkan dapat langsung menginisialisasi nilai dari array tersebut pada saat mendeklarasikannya, contoh:

int[] x = {0,1,2};

Pada contoh code di atas, secara otomatis akan dialokasikan tempat di memori yang dapat menampung 3 buah tipe data int untuk variabel x, di mana nilai pada masing-masing indeksnya akan
langsung diinisialisasi seperti berikut ini x[0]=0, x[1]=1, x[2]=2. Perlu diperhatikan di sini, Anda hanya dapat melakukan inisialisasi seperti ini pada saat Anda mendeklarasikan array tersebut. Oleh karena itu, contoh code berikut ini akan menghasilkan pesan kesalahan pada waktu hendak di-compile:

int[] x = new x[3];
x = {0,1,2}; // Error...

Array Multi Dimensi
Untuk menyederhanakan pengertian array multidimensi, kita dapat mengartikannya sebagai array of array, yaitu array yang terdapat di dalam array. Cara pendeklarasian array multidimensi ini, pada dasarnya sama dengan array satu dimensi, di mana cukup menambahkan [] sesuai dengan dimensi yang kita inginkan, contoh:

int[][] arr2; //-> Array 2 dimensi
int[][][] arr3; //-> Array 3 dimensi
int[][][][] arr4; //-> Array 4 dimensi

Untuk pengalokasian memori array multidimensi, memiliki sintaks yang sama dengan array satu dimensi, contoh:

int[][] arr2 = new int[3][4];

Code di atas akan mengalokasikan memori untuk menampung nilai tipe data int sebanyak 3*4. Untuk ilustrasi, array ini dapat digambarkan seperti gambar di bawah ini.
Pada prinsipnya, cara penggunaan array untuk dimensi berapa pun adalah sama. Oleh karena itu, untuk kemudahan kita hanya akan menggunakan array dua dimensi untuk menjelaskan tentang array multidimensi ini. Hal lain yang perlu diketahui adalah pada saat pengalokasian memori, Anda dapat mengalokasikan memori hanya untuk dimensi yang paling kiri, contoh:

int[][] arr2; //Pendeklarasian Array 2 dimensi

arr2 = new int[3][]; /* Alokasi memori untuk dimensi yang
paling kiri saja */

/* Alokasi memori untuk dimensi berikutnya */

arr2[0] = new int[4];
arr2[1] = new int[4];

arr2[2] = new int[4];

Alokasi dengan cara di atas sama dengan mengalokasikan memori dengan cara:

arr2 = new int[3][4];

Namun, dengan cara pengalokasian memori mulai dari dimensi yang paling kiri, Anda dapat mengalokasikan array multidimensi yang tidak simetris, contoh:

int[][] arr2;

arr2 = new int[3][];
arr2[0] = new int[1];
arr2[1] = new int[2];
arr2[2] = new int[3];

Ilustrasi array seperti ini dapat digambarkan seperti berikut ini.
Walaupun pengalokasian kapasitas array dapat dilakukan secara tidak simetris, sangat tidak disarankan untuk menggunakan array multidimensi yang tidak simetris seperti ini karena orang punya
kecenderungan untuk menganggap bahwa suatu array biasanya memiliki ukuran simetris sehingga dapat menimbulkan kebingungan bagi orang lain yang akan membaca program Anda. Namun, terkadang kita dapat menggunakan array yang tidak simetris ini jika memang membutuhkan array multidimensi yang sangat besar. Namun, tidak semua tempat dalam array tersebut akan digunakan.
Jika harus membuat array multidimensi yang simetris, akan banyak tempat dalam array yang tidak digunakan, yang berarti penyianyiaan memori. Dalam hal ini, penggunaan array multidimensi yang
tidak simetris mungkin merupakan solusi terbaik.

Seperti yang telah disebutkan di atas, sebenarnya array multidimensi adalah array yang terdapat dalam array. Dengan konsep ini, Anda dapat melakukan inisialisasi terhadap array multidimensi sama seperti menginisialisasi array satu dimensi.

Contoh inisialisasi array dua dimensi:

int[][] arr2 = {{11,12,13},
{21,22,23},
{31,32,33}};

Array di atas memiliki ukuran 3*3 di mana nilai dari setiap elemennya:

arr2[0][0] = 11 arr2[0][1] = 12 arr2[0][2] = 13
arr2[1][0] = 21 arr2[1][1] = 22 arr2[1][2] = 23
arr2[2][0] = 31 arr2[2][1] = 32 arr2[2][2] = 33

Contoh inisialisasi array tiga dimensi:

int[][][] arr3 = {{{111,112,113},{121,122,123}},
{{211,212,213},{221,222,223}},
{{311,312,313},{321,322,323}}};

Array di atas memiliki ukuran 3*2*3 di mana nilai dari setiap elemennya:

arr3[0][0][0] = 111 arr3[1][0][0] = 211
arr3[0][0][1] = 112 arr3[1][0][1] = 212
arr3[0][0][2] = 113 arr3[1][0][2] = 213

arr3[0][1][0] = 121 arr3[1][1][0] = 221
arr3[0][1][1] = 122 arr3[1][1][1] = 222
arr3[0][1][2] = 123 arr3[1][1][2] = 223

arr3[2][0][0] = 311 arr3[2][1][0] = 321
arr3[2][0][1] = 312 arr3[2][1][1] = 322
arr3[2][0][2] = 313 arr3[2][1][2] = 333

Satu hal lagi yang perlu diperhatikan tentang tipe data array, yaitu bahwa Anda dapat mengetahui kapasitas atau panjang dari suatu array dengan mengakses property yang dimiliki oleh objek array,

yaitu length. Perhatikan contoh penggunaannya berikut ini:

class DemoArray {
public static void main(String[] args) {

// array 3*2

int arr[][] = {{1,2},{3,4},{5,6}};

System.out.println("Panjang dimensi pertama:"
+ arr.length);

System.out.println("Panjang dimensi kedua:"
+ arr[0].length);
}

}

Hasil eksekusi program:
Panjang dimensi pertama:3
Panjang dimensi kedua:2

Konversi Tipe Data dan Casting

Adalah hal yang biasa dalam pemrograman untuk menampung suatu nilai dengan tipe data tertentu ke dalam variabel yang mempunyai tipe data yang berbeda. Java akan melakukan konversi tipe data secara otomatis jika kedua tipe data tersebut kompatibel. Misalnya dari tipe data int ke tipe data long.


Contoh code:

int data1 = 10;
long data2 = data1;

Variabel data1 yang bertipe int ditampung ke dalam variabel data2 yang bertipe long. Dengan demikian, terjadi konversi tipe data, dan dalam hal ini konversi dilakukan secara otomatis oleh Java tanpa membutuhkan tambahan code apa pun.

Namun, tidak semua tipe data kompatibel satu dengan yang lainnya. Misalnya tipe data float dengan tipe data int, float merupakan tipe data pecahan (floating-point), sedangkan int adalah tipe data bilangan bulat (integer). Hal yang sama juga terjadi jika Anda hendak mengonversi tipe data yang lebih besar ke tipe data yang lebih kecil, seperti dari int ke short. Konversi tipe data yang tidak kompatibel ini masih memungkinkan, namun harus menyebutkan secara eksplisit

tipe data tujuan (casting)
Sintaks code:

(target-tipe-data)nilai
target-tipe-data      : tipe data yang menjadi tujuan konversi.
Nilai                      : dapat berupa nilai literal atau berupa variabel.

Contoh code:

Float data1 = 10.2f;
int data2 = (int)data1; // -> casting dari float ke int
int data3 = 257;
byte data4 = (byte)data3; // -> casting dari int ke byte

Yang perlu diperhatikan di sini adalah jika Anda mengubah tipe data yang berbeda jenis, seperti dari tipe data pecahan (floating-point) ke tipe data bilangan bulat (Integer), maka akan terjadi pemotongan (truncation). Dalam contoh di atas, data2 akan bernilai 10. Sedangkan untuk tipe data yang lebih kecil jika digunakan untuk menampung data yang lebih besar dari daya tampungnya, maka yang akan tertampung adalah nilai modulusnya (sisa bagi). Dalam contoh di atas, tipe data variabel data4 adalah byte (jumlah maksimum yang dapat ditampung oleh byte adalah 256), sedangkan nilai yang hendak ditampung adalah 257. Dari perhitungan 257/256 diperoleh modulus = 1 maka data4 akan bernilai 1.

Anda juga perlu memperhatikan bahwa di dalam Java dikenal apa yang disebut promosi tipe data secara otomatis dalam suatu ekspresi matematik. Untuk lebih jelasnya perhatikan contoh code berikut ini:

byte data1 = 10;
byte data2 = 50;
byte data3 = data1 * data2;

Variabel data1 dan data2 memiliki nilai yang terdapat dalam range byte. Namun, hasil perkalian data1 dan data2 akan menghasilkan nilai 500 yang tidak dapat lagi ditampung oleh tipe data byte. Karena alasan ini, maka pada waktu melakukan komputasi, Java akan melakukan promosi tipe data byte ke tipe data int supaya hasil perhitungannya benar. Yang menjadi masalah adalah, promosi tipe
data secara otomatis tersebut akan tetap dilakukan, sekalipun hasil dari perkalian variabel data1 dan data2 tidak melebihi kapasitas tampung tipe data byte.
Hasil dari data1*5 adalah 100 yang seharusnya dapat ditampung oleh tipe data byte, namun karena adanya promosi tipe data secara otomatis, nilai 100 tersebut bukan lagi bertipe byte melainkan bertipe
int. Jika ingin memaksa, Anda dapat melakukan type casting agar code di atas dapat di-compile tanpa menimbulkan pesan kesalahan, seperti berikut ini:

byte data1 = 20;
byte data2 = (byte)(data1 * 5);

Sebagai ringkasan, promosi tipe data secara otomatis dalam suatu ekspresi matematik yang dilakukan oleh Java mengikuti pedoman sebagai berikut:


  1. Untuk tipe data byte dan short akan dipromosikan ke tipe data int.
  2. Jika salah satu operand bertipe data long, maka semua tipe datadari operand yang terlibat dalam ekspresi matematik tersebutakan dipromosikan ke tipe data long.
  3. Jika salah satu operand bertipe data float, maka semua tipe datadari operand yang terlibat dalam ekspresi matematik tersebutakan dipromosikan ke tipe data float, kecuali bila ada operandyang bertipe data double.
  4. Jika salah satu operand bertipe data double, maka semua tipedata dari operand yang terlibat dalam ekspresi matematik tersebut akan dipromosikan ke tipe data double.

Konversi tipe data terkadang dapat mengakibatkan kebingungan dan kesalahan logik yang sulit dicari penyebabnya. Perhatikan contoh code di bawah ini.

int nilai = 26;
double hasil = nilai/4;

Jika code di atas dieksekusi, maka isi variabel hasil adalah 6.0 dan bukan 6.5. Ini karena variabel nilai bertipe data int sehingga hasil operasi nilai/4 adalah juga bertipe data int yang hanya dapat menampung bilangan bulat saja. Sehingga hasil yang didapat dari nilai/4 adalah 6 dan bukan 6.5. Hasil ini baru kemudian ditampung oleh variabel hasil dan mengakibatkan variabel hasil bernilai 6.0.

Untuk menghindari kesalahan seperti ini usahakan selalu menggunakan tipe data pecahan (floating-point, seperti double dan float) untuk melakukan operasi yang dapat menghasilkan bilangan pecahan. Selain itu, Anda juga dapat melakukan casting ke tipe data floating-point terhadap salah satu operand yang terlibat dalam operasi tersebut, seperti yang ditunjukkan oleh contoh code berikut ini:

int nilai = 26;
double hasil = (double)nilai/4;

2 komentar:

Bundet mengatakan...

Step by step belajar Pemrograman Java Fungsi Nilai Balik dan Konversi Tipe Data

Paipai mengatakan...

thanks gan sudah share infonya
solder uap

Posting Komentar

 

Serba Ada Blog Copyright © 2011-2012 | Powered by Blogger