Monday, March 12, 2018

Tipe Data, Variabel, dan Array Bagian 3



Promosi Tipe Otomatis Pada Ekspresi
Selain penugasan, ada tempat lain dimana konversi tipe dapat terjadi: pada ekspresi. Untuk melihat mengapa, perhatikan berikut ini. Pada sebuah ekspresi, kepresisian yang diperlukan dari nilai sementara kadangkala melebihi rentang dari operandnya. Sebagai contoh, perhatikan ekspresi berikut:

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

Hasil dari suku a * b melebihi rentang dari operand byte. Untuk mengatasi permasalahan ini, Java secara otomatis melakukan promosi tipe data kepada tiap operand byte, short, dan char menjadi int ketika mengevaluasi sebuah ekspresi. Ini berarti bahwa subekspresi a * b dilakukan menggunakan integer, bukan byte. Jadi, 2000, hasil dari subekspresi tersebut, 50 * 40, adalah valid meskipun a dan b keduanya bertipe data byte.

Meskipun promosi tipe data bermanfaat, hal itu bisa menyebabkan error kompilasi. Sebagai contoh, kode yang kelihatan tanpa error ini bisa menyebabkan masalah:

byte b = 50;
b = b * 2; // Error! Tidak dapat menugaskan sebuah int kepada byte!

Kode tersebut mencoba menyimpan 50 * 2, sebuah nilai byte yang valid, ke dalam variabel byte. Namun, karena operand-operandnya secara otomatis dipromosikan menjadi tipe int ketika ekspresi dievaluasi, hasilnya akan dipromosikan menjadi int. Jadi, hasil dari ekspresi sekarang bertipe int, yang tidak bisa ditugaskan kepada sebuah byte tanpa adanya cast atau konversi tipe data eksplisit.

Pada kasus dimana Anda memahami konsekuensi promosi tipe data ini, Anda sebaiknya menggunakan konversi tipe data eksplisit (cast) seperti berikut:

byte b = 50;
b = (byte)(b * 2);

yang menghasilkan nilai 100.


Aturan Promosi Tipe Data
Java mendefinisikan beberapa aturan yang berlaku pada ekspresi. Pertama, semua nilai byte, short, dan char dipromosikan menjadi int, seperti yang baru dijelaskan. Kemudian, jika salah satu operand bertipe long, maka keseluruhan ekspresi dipromosikan menjadi long. Jika salah satu operand bertipe float, maka keseluruhan ekspresi dipromosikan menjadi float. Jika salah satu operand bertipe double, maka keseluruhan ekspresi dipromosikan menjadi double.

Program berikut mendemonstrasikan bagaimana tiap nilai pada ekspresi dipromosikan agar cocok dengan argumen kedua pada tiap operator binernya:

public class Kelas {
   public static void main(String args[]) {
      byte b = 42;
      char c = 'a';
      short s = 1024;
      int i = 50000;
      float f = 5.67f;
      double d = .1234;
      
      double hasil = (f * b) + (i / c) - (d * s);
      
      System.out.println((f * b) + " + " + (i / c) + " - " + (d * s));
      System.out.println("hasil = " + hasil);
   }
}

Perhatikan lebih dekat promosi-promosi tipe data yang terjadi pada baris program ini:

double hasil = (f * b) + (i / c) - (d * s);

Pada subekspresi pertama, f * b, b dipromosikan menjadi sebuah float dan hasil subekspresi tersebut bertipe data float. Selanjutnya, pada subekspresi i/c, c dipromosikan menjadi int, dan hasilnya bertipe data int. Kemudian, pada subekspresi d * s, nilai dari s dipromosikan menjadi double, dan tipe data dari subekspresi ini adalah double. Terakhir, ketiga nilai subekspresi ini, float, int, dan double dipertimbangkan. Keluaran dari float ditambah dengan int adalah float. Kemudian hasil dari float dikurangi oleh double akan dipromosikan menjadi double, yang merupakan tipe data terakhir untuk hasil akhir dari ekspresi.


Array
Array adalah sebuah grup variabel yang bertipe data sama yang dapat diakses dengan nama sama. Array dengan tipe data apapun dapat diciptakan. Array dapat memiliki satu atau lebih dimensi. Elemen spesifik pada sebuah array dapat diakses melalui indeksnya. Array menawarkan cara efisien dalam mengelompokkan informasi yang berelasi.


Array Satu-Dimensi
Array satu-dimensi, pada dasarnya, adalah sebuah daftar variabel yang bertipe data sama. Untuk menciptakan sebuah array, Anda lebih dahulu harus menciptakan sebuah variabel array dengan tipe data yang diinginkan. Bentuk umum dari sebuah deklarasi array satu-dimensi adalah:

tipe_data nama_var[ ];

Di sini, tipe_data adalah tipe data dari elemen array. Tipe data elemen array menentukan tipe data dari tiap elemen yang membentuk array. Sebagai contoh, statemen berikut mendeklarasikan sebuah array bernama hari_bulan[] dengan tipe data int:

Meskipun pendeklarasian ini menyatakan bahwa hari_bulan adalah sebuah variabel array, array tersebut sesungguhnya belum ada. Untuk menghubungkan hari_bulan dengan array integer aktual, Anda perlu mengalokasikannya menggunakan new dan menugaskannya pada hari_bulan. Operator new dipakai untuk mengalokasikan memori bagi array.

Anda akan melihat lebih dekat tentang operator new pada buku ini, tetapi saat ini Anda perlu menggunakannya untuk mengalokasikan memori bagi array. Bentuk umum dari operator new yang diterapkan pada array satu-dimensi adalah sebagai berikut:

var_array = new tipe_data[ukuran]

Di sini, tipe_data menetapkan tipe data yang sedang dialokasikan, ukuran menetapkan banyak elemen pada array, dan var_array adalah variabel array yang dihubungkan ke array aktual. Jadi, agar operator new mengalokasikan sebuah array, Anda perlu menetapkan tipe data dan banyak elemen array. Elemen-elemen array yang dialokasikan dengan new secara otomatis akan diinisialisasi dengan nol (untuk tipe data numerik), false (untuk boolean), atau null (untuk tipe data referensi, yang akan dijelaskan nanti). Contoh berikut mengalokasikan sebuah array 12-elemen dengan tipe data integer dan menghubungkannya ke hari_bulan.

hari_bulan = new int[12];

Setelah statemen ini dieksekusi, hari_bulan akan mereferensi ke sebuah array dengan 12 elemen integer. Semua elemen array diinisialisasi dengan nol.

Setelah Anda mengalokasikan sebuah array, Anda dapat mengakses elemen spesifik pada array menggunakan indeksnya yang diapit dengan kurung siku. Semua indeks array diawali dari nol. Sebagai contoh, statemen ini menugaskan nilai 28 kepada elemen kedua dari hari_bulan:

hari_bulan[1] = 28;

Baris berikut menampilkan nilai yang disimpan pada indeks 3:

System.out.println(hari_bulan[3]);

Berikut adalah sebuah program yang menciptakan sebuah array yang memuat banyak hari untuk tiap bulannya:

//Mendemonstrasikan array satu-dimensi
public class CiptaArray {
   public static void main(String args[]) {
      int hari_bulan[];
      hari_bulan = new int[12];
      hari_bulan[0] = 31;
      hari_bulan[1] = 28;
      hari_bulan[2] = 31;
      hari_bulan[3] = 30;
      hari_bulan[4] = 31;
      hari_bulan[5] = 30;
      hari_bulan[6] = 31;
      hari_bulan[7] = 31;
      hari_bulan[8] = 30;
      hari_bulan[9] = 31;
      hari_bulan[10] = 30;
      hari_bulan[11] = 31;

      System.out.println("April memiliki " + hari_bulan[3] + " hari.");
   }
}

Ketika Anda menjalankan program ini, ia akan menampilkan banyak hari pada bulan April. Seperti disebutkan sebelumnya, indeks pada array Java diawali dari nol, jadi banyak hari pada April adalah hari_bulan[3], yaitu 30.

Adalah dimungkinkan untuk mengkombinasikan deklarasi atas variabel array dengan alokasi memori untuk array tersebut menggunakan operator new, seperti ditunjukkan di sini:

int hari_bulan[] = new int[12];

Inilah cara yang umumnya akan Anda lihat pada program-program Java professional.

Array dapat diinisialisasi ketika ia dideklarasikan. Proses ini mirip dengan ketika menginisialisasi tipe data biasa. Penginisialisasi array merupakan sebuah ekspresi yang memuat daftar nilai awal, yang dipisahkan dengan koma. Array akan secara otomatis diciptakan cukup besar untuk menampung banyak elemen yang Anda tetapkan pada penginisialisasi array. Tidak diperlukan operator new. Sebagai contoh, untuk menyimpan banyak hari pada tiap bulan, kode berikut menciptakan sebuah array integer yang diinisialisasi:

//Sebuah versi baru dari program sebelumnya
public class AutoArray {
   public static void main(String args[]) {
      int hari_bulan[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  
      System.out.println("April memiliki " + hari_bulan[3] + " hari.");
   }
}

Ketika Anda menjalankan program ini, Anda akan melihat keluaran yang sama seperti yang dihasilkan oleh versi program sebelumnya.

Java secara ketat memeriksa untuk memastikan bahwa Anda tidak secara tidak sengaja mencoba menyimpan atau mereferensi (mengakses) nilai yang ada di luar rentang array. Sistem run-time Java akan memeriksa untuk memastikan bahwa semua indeks array berada pada rentang yang tepat. Sebagai contoh, system run-time akan memeriksa nilai dari tiap indeks array hari_bulan untuk memastikan bahwa indeks tersebut dimulai dari 0 sampai 11. Jika Anda menciba mengakses elemen di luar rentang array (dengan indeks negatif atau indeks yang lebih besar dari panjang array), maka error kompilasi akan dibangkitkan.

Berikut adalah satu contoh lain yang menggunakan array satu-dimensi. Program ini mencari rerata atas sekumpulan nilai:

//Menghitung rerata array
public class Rerata {
   public static void main(String args[]) {
      double angka[] = {10.1, 11.2, 12.3, 13.4, 14.5};
      double hasil = 0;
      int i;
  
      for(i=0; i<5; i++)
       hasil = hasil + angka[i];
         System.out.println("Rerata array = " + hasil / 5);
   }
}


Array Multidimensi
Dalam Java, array multidimensi sebenarnya adalah sebuah array memuat array-array. Namun, ada beberapa perbedaannya. Untuk mendeklarasikan sebuah variabel array multidimensi, Anda perlu menetapkan indeks tambahan menggunakan kurung siku lain. Sebagai contoh, statemen berikut mendeklarasikan sebuah variabel array multidimensi dengan nama duaD:

int duaD[ ][ ] = new int[4][5];

Statemen ini mengalokasikan sebuah array berukuran 4 x 5 dan menugaskannya kepada variabel array duaD. Secara internal, matriks ini diimplementasikan sebagai sebuah array yang memuat array-array bertipe int. Secara konseptual, array ini tampak seperti pada Gambar 2.1

Program berikut menomori setiap elemen array dari kiri ke kanan, atas ke bawah, dan kemudian menampilkan nilai-nilai tersebut:

//Mendemonstrasikan array dua dimensi
public class ArrayDuaD {
   public static void main(String args[]) {
      int duaD[][]= new int[4][5];
      int i, j, k = 0;
  
      for(i=0; i<4; i++)
         for(j=0; j<5; j++) {
            duaD[i][j] = k;
            k++;
         }
      
      for(i=0; i<4; i++) {
         for(j=0; j<5; j++)
            System.out.print(duaD[i][j] + " ");
            System.out.println();
         }
      }
}

Program ini menghasilkan keluaran berikut:

0 1 2 3 4 
5 6 7 8 9 
10 11 12 13 14 
15 16 17 18 19

Gambar 2.1 Sebuah konsep array dua dimensi dengan ukuran 4 kali 5

Ketika Anda mengalokasikan memori bagi array multidimensi, Anda hanya perlu menetapkan memori untuk dimensi pertama (paling kiri). Anda dapat mengalokasikan dimensi lain secara terpisah. Sebagai contoh, kode berikut mengalokasikan memori untuk dimensi pertama dari duaD ketika ia dideklarasikan. Kode ini mengalokasikan dimensi kedua secara manual.

int duaD[][] = new int[4][];
duaD[0] = new int[5];
duaD[1] = new int[5];
duaD[2] = new int[5];
duaD[3] = new int[5];

Ketika Anda mengalokasikan dimensi array secara manual, Anda tidak perlu mengalokasikan banyak elemen yang sama untuk tiap dimensi. Seperti disebutkan sebelumnya, karena array multidimensi sebenarnya adalah array yang memuat array-array, maka panjang dari tiap array dapat Anda tentukan sendiri. Sebagai contoh, program berikut menciptakan sebuah array dua-dimensi dimana ukuran dari dimensi kedua tidak sama:

// Secara menual mengalokasikan ukuran berbeda pada dimensi kedua.
public class ArrayDuaDLagi {
   public static void main(String args[]) {
      int duaD[][] = new int[4][];
      duaD[0] = new int[1];
      duaD[1] = new int[2];
      duaD[2] = new int[3];
      duaD[3] = new int[4];
  
      int i, j, k = 0;
      for(i=0; i<4; i++)
         for(j=0; j<i+1; j++) {
          duaD[i][j] = k;
            k++;
         }
  
         for(i=0; i<4; i++) {
            for(j=0; j<i+1; j++)
               System.out.print(duaD[i][j] + " ");
               System.out.println();
            }
         }
}

Program ini menghasilkan keluaran berikut:

0 
1 2 
3 4 5 
6 7 8 9

Array yang diciptakan oleh program ini tampak seperti ini:


Kegunaan array multidimensi dengan ukuran dimensi berbeda mungkin tidak banyak digunakan pada aplikasi di dunia nyata, karena hal itu berlawanan dengan apa yang dipahami orang tentang array multidimensi. Namun, array semacam ini dapat dipakai secara efektif pada beberapa aplikasi. Misalnya, jika Anda memerlukan sebuah array dua-dimensi yang sangat besar, dimana tidak semua elemen array digunakan, maka array tak-reguler ini bisa menjadi solusi yang sempurna.

Adalah dimungkinkan untuk menginisialisasi array multidimensi. Untuk melakukannya, Anda hanya perlu mengapit tiap penginisialisasi dimensi di dalam sepasang kurung kurawal. Program berikut menciptakan sebuah matriks dimana tiap elemen memuat hasil perkalian dari indeks baris dan indeks kolom. Selain itu, perhatikan bahwa Anda dapat menggunakan ekspresi dan nilai literal di dalam penginisialisasi array.

//Menginisialisasi array dua-dimensi
public class Matriks {
   public static void main(String args[]) {
      double m[][] = {
         { 0*0, 1*0, 2*0, 3*0 },
         { 0*1, 1*1, 2*1, 3*1 },
         { 0*2, 1*2, 2*2, 3*2 },
         { 0*3, 1*3, 2*3, 3*3 }
      };
  
      int i, j;
      for(i=0; i<4; i++) {
         for(j=0; j<4; j++)
            System.out.print(m[i][j] + " ");
            System.out.println();
      }
   }
}

Ketika Anda menjalankan program ini, Anda akan mendapatkan keluaran berikut:

0.0 0.0 0.0 0.0 
0.0 1.0 2.0 3.0 
0.0 2.0 4.0 6.0 
0.0 3.0 6.0 9.0

Seperti yang dapat Anda lihat, setiap baris pada array diinisialisasi seperti ditetapkan pada daftar inisialisasi. Anda perlu melihat satu lagi contoh yang menggunakan array multidimensi. Program berikut menciptakan sebuah array tiga-dimensi dengan ukuran 3 kali 4 kali 5. Program kemudian memberikan nilai hasil perkalian indeks-indeksnya kepada tiap elemen array. Terakhir, program menampilkan hasil-hasil perkalian ini.

//Mendemonstrasikan matriks tiga-dimensi
public class MatriksTigaD {
   public static void main(String args[]) {
      int tigaD[][][] = new int[3][4][5];
  
      int i, j, k;
      for(i=0; i<3; i++)
         for(j=0; j<4; j++)
            for(k=0; k<5; k++)
               tigaD[i][j][k] = i * j * k;
  
               for(i=0; i<3; i++) {
                  for(j=0; j<4; j++) {
                     for(k=0; k<5; k++)
                        System.out.print(tigaD[i][j][k] + " ");
                     System.out.println();
                  }
                  System.out.println();
               }
   }
}

Ketika Anda menjalankan program ini, Anda akan mendapatkan keluaran berikut:

0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

0 0 0 0 0 
0 1 2 3 4 
0 2 4 6 8 
0 3 6 9 12 

0 0 0 0 0 
0 2 4 6 8 
0 4 8 12 16 
0 6 12 18 24








No comments: