MINGGU IX : ARRAY DAN GENERICS Pembahasan pada pertemuan ini lebih dikhususkan kepada tipe data lanjutan yaitu array dan Generics. Array merupakan variabel berindeks. Sedangkan Generics merupakan tipe data yang bersifat general. Tipe data generic dapat berubah-ubah sesuai dengan tipe data yang diinginkan.
Kompetensi Khusus Mahasiswa mampu memahami tentang array dan tipe data generics.
Materi Array Sebuah aplikasi seringkali membutuhkan data dalam jumlah yang besar yang pada umumnya memiliki tipe data yang sama. Sehingga diperlukan media penyimpanan untuk data dalam jumlah yang besar tersebut. Media penyimpanan data dalam aplikasi adalah variabel. Penggunaan variabel dalam jumlah yang banyak akan merepotkan. Setidaknya kita harus memikirkan nama-nama yang akan digunakan untuk masing-masing. Untuk mengatasi masalah ini dapat digunakan array. Array merupakan sekelompok item yang tidak terurut yang ditempatkan pada satu variabel. Sekelompok item tersebut merupakan nilai-nilai dengan tipe data yang sama. Array dapat diibaratkan dengan sebuah variabel dalam C#. Namun array dapat digunakan untuk menyimpan sejumlah nilai dengan menggunakan satu nama variabel. Masing-masing nilai dalam array diidentifikasi dengan menggunakan indeks. Hal ini menyebabkan array sering juga disebut dengan variabel berindeks. Array dalam C# memiliki dimensi. Array dalam C# bisa berupa array 1 dimensi, 2 dimensi, 3 dimensi dst. Walaupun pada kenyataannya dimensi array yang biasanya digunakan adalah array 1, 2 dan 3 dimensi. Setiap array ukuran yang menunjukkan jumlah item atau nilai yang dapat disimpan dalam array tersebut. Sama halnya seperti variabel pada dalam C#, array harus dideklarasikan terlebih dahulu sebelum dapat digunakan. Deklarasi array dalam C# tidak jauh berbeda dengan deklarasi variabel. Setiap array memiliki tipe data tertentu sehingga hanya bisa digunakan untuk menyimpan data dengan tipe data yang telah dideklarasikan tersebut. Format deklarasi array adalah sebagai berikut . <Tipe Data>[]
Sebagai contoh adalah deklarasi array dari nama mahasiswa. String[] namaMhs1;
String[] namaMhs2 = new String[4] { "Ael", "isang", "Hones", "Thifa" }; String[] namaMhs3 = { "Husnil", "Kamil", "Honesty", "Trila" };
Statement pertama akan mendeklarasikan array. Statement kedua adalah deklarasi array berikut dengan inisialiasi nilainya. Pada contoh diatas dideklarasikan sebuah array dengan nama namaMhs2 yang bertipe array dari String. Jumlah item yang bisa ditampung oleh array tersebut adalah 4 buah sekaligus memberikan nilai untuk masing-masing item yang disimpan. Statement ketiga merupakan bentuk sederhana dari statement kedua. Array dalam C# memiliki indeks. Indeks merupakan identitas dari masing-masing elemen yang terdapat dalam array tersebut. Indek array dalam C# berupa unsigned integer. Nilai indeks array dimulai dari 0, 1, 2 dst. Pada contoh diatas, array namaMhs2 memiliki 4 buah elemen yaitu namaMhs2[0], namaMhs2[1], namaMhs2[2] dan namaMhs2[3]. Nilai dari masing-masing elemen array tersebut sesuai dengan urutan deklarasi nilai array. Berdasarkan contoh diatas maka nilai masing-masing elemen array adalah seperti table berikut. Elemen
Nilai
namaMhs[0]
Husnil
namaMhs[1]
Kamil
namaMhs[2]
Hones
namaMhs[3]
Thifa
Setiap array memiliki sejumlah elemen sehingga sebuah array bisa menampung banyak nilai. Oleh karena itu operasi baca/tulis terhadap nilai yang terdapat dalam array adalah operasi yang berhubungan dengan elemen-elemen array. Operasi yang dilakukan adalah operasi baca nilai array dan tulis nilai ke dalam array. Acuan dalam operasi baca/tulis array adalah indeks dari array tersebut. Operasi baca dilakukan untuk mengambil atau membaca nilai yang ada dalam salah satu elemen array. Contoh operasi baca array adalah sebagai berikut String mahasiswa = namaMhs[1]; Pada contoh diatas, terjadi proses baca nilai array namaMhs yang memiliki indeks 1, sehingga nilai variabel mahasiswa menjadi “Kamil”. Operasi tulis terhadap dilakukan dengan menset nilai terhadap salah satu elemen yang ada dalam array. Contoh operasi tulis array adalah sebagai berikut. namaMhs[2] = “Onno”;
Pada contoh diatas, nilai elemen array ke-3 (yang memiliki indeks 2) diset menjadi “Onno”. Array dan Perulangan Operasi terhadap array biasanya dilakukan dengan menggunakan perulangan. Hal ini disebabkan karena sebuah array merupakan sekumpulan variabel yang tipenya sama. Pada dasarnya semua elemen dalam array adalah sama, hanya nilainya yang berbeda. Sehingga operasi terhadap elemen array akan melelahkan jika harus dicoding satu-persatu. Misalnya saja menampilkan nilai array. Hal ini bisa saja dilakukan dengan menuliskan statement untuk menampilkan nilai elemen array satu persatu seperti contoh dibawah ini. Console.WriteLine("Mahasiswa Console.WriteLine("Mahasiswa Console.WriteLine("Mahasiswa Console.WriteLine("Mahasiswa
1: 2: 3: 4:
{0}", {0}", {0}", {0}",
namaMhs[0]); namaMhs[1]); namaMhs[2]); namaMhs[3]);
Pada contoh diatas dapat dilihat bahwa untuk menampilkan isi dari elemen array, dibutuhkan statement sebanyak elemen array tersebut. Bayangkan saja jika jumlah elemen array tersebut adalah 1000 elemen, berapa jumlah statement yang harus dibuat untuk melakukan hal tersebut. Statement yang digunakanpun mirip, hanya berbeda pada penomoran dengan indeks array saja. Bisa dinyatakan bahwa kita mengeksekusi statement yang sama secara berulang-ulang. Oleh karena itu hal diatas dapat juga dilakukan dan akan lebih efektif jika menggunakan perulangan. Jika dilakukan dengan perulangan maka statement diatas dapat dijadikan kode seperti berikut ini. for (int i = 0; i < namaMhs.Length; i++) { Console.WriteLine("Mahasiswa {0} : {1}", i + 1, namaMhs[i]); }
Statement diatas akan menghasilkan keluaran yang sama seperti cara sebelumnya. Indeks array diakses dengan menggunakan counter pada perulangan. Dengan menggunakan perulangan akses terhadap seluruh elemen array jadi lebih mudah. Array sebagai Argumen dan nilai kembalian Method Seperti halnya tipe data lainnya, array juga bisa dijadikan sebagai argumen dan tipe data kembalian untuk sebuah method. Cara penggunaan array sebagai argumen atau nilai kembalian method sama seperti tipe data lainnya. Namun perlu diingat bahwa deklarasi array sebagai argumen tidak boleh mendeklarasikan jumlah elemen array yang menjadi argumen method tersebut. Begitu juga dengan deklarasi nilai kembalian method yang berupa array. Contoh method yang menggunakan array sebagai argumen dan nilai kembalian dapat dilihat pada contoh dibawah ini.
Public int[] ArrayMultiplier(int[] matrix, int multiplier) { int matLength = matrix.Length; int[] newMatrix = new int[matLength]; for (int i = 0; i < matrix.Length; i++) { newMatrix[i] = matrix[i] * multiplier; } return newMatrix; }
Pada contoh diatas method ArrayMultiplier digunakan untuk mengalikan setiap elemen array dengan bilangan multiplier. Method tersebut juga mengembalikan nilai berupa array integer. Dalam contoh diatas, array tersebut adalah array newMatrix yang merupakan array integer. Method tersebut digunakan dalam program utama seperti pada contoh berikut ini. int[] m = { 1, 2, 3, 4, 5 }; ArrayClass kelasArray = new ArrayClass(); int[] n = kelasArray.ArrayMultiplier(m, 2);
Pada contoh diatas, n merupakan array yang digunakan untuk menampung nilai kembalian dari method ArrayMultiplier(); Generics Andaikan saja kita memiliki sebuah kelas bernama Antrian yang digunakan untuk menyimpan antrian data integer. Kelas tersebut bisa digunakan untuk menambahkan data antrian, mengeluarkan data dari antrian. Namun bagaimana jika suatu saat nanti kita membutuhkan antrian untuk data bertipe String, maka perlu dibuatkan pula sebuah kelas AntrianString untuk menampung tipe data String tersebut. Setidaknya saat ini kita telah
memiliki 2 buah kelas yang memiliki kegunaan yang sama, hanya beda di tipe data saja. Belum lagi nantinya jika kita membutuhkan kelas untuk menampung antrian Pelanggan, Lagu, desimal, Kentang dsb. Kondisi seperti akan menyebabkan banyaknya kelas yang memiliki fungsi yang sama namun hanya berbeda di tipe data yang ditampungnya saja. Lebih mudah jika saja kita hanya memiliki satu buah kelas saja namun mampu menampung tipe data yang berbeda-beda. C# menyediakan fasilitas generic yang dapat digunakan untuk menampung tipe data yang berbeda-beda. Kelas yang menggunakan fasilitas generic tersebut disebut dengan kelas generic. Sebuah kelas generic memiliki sebuah placeholder untuk menempatkan tipe data yang sesungguhnya. Sintaks dari kelas generic dapat dilihat pada kode berikut ini. class Antrian { //.....
}
pada contoh diatas merupakan placeholder untuk menempatkan tipe data yang akan digunakan (tipe data sesungguhnya) dimana T merupakan tipe data generic. Pada program utama, kelas generic digunakan dengan menyatakan tipe data yang akan digunakannya. Contohnya adalah sebagai berikut. Antrian<string> antrian = new Antrian<string>();
Kalau seandainya kelas Antrian digunakan untuk membuat antrian kelas Kentang seperti pada contoh dibawah ini. Antrian antrian = new Antrian();
Pada contoh diatas dapat dilihat bahwa T pada kelas tersebut diganti dengan string. T pada kelas generic dapat diganti dengan tipe data lainnya. Kelas Antrian yang sesungguhnya dapat dilihat pada kode dibawah ini. class Antrian { private T[] data; private const int DEFAULTANTRIAN = 10; private int head = 0, tail = 0; private int jumlahItem; public Antrian() { data = new T[DEFAULTANTRIAN]; } public Antrian(int n) { data = new T[n]; } public void MasukkanDalamAntrian(T item) { if (jumlahItem <= data.Length) { data[head] = item; head++; head %= data.Length; jumlahItem++; } } public T KeluarkanDariAntrian() { if (jumlahItem <= 0) { throw new Exception("Tidak ada antrian"); } T itemAntrian = data[tail];
tail++; tail %= data.Length; jumlahItem--; return itemAntrian; } }
Pada contoh diatas, perhatikan simbol T yang terdapat dalam kode sumber. T tersebut merupakan placeholder untuk tipe data yang sesungguhnya. Jika kelas tersebut digunakan untuk membuat antrian dari objek String, maka T merupakan representasi dari String, jika kelas tersebut merupakan antrian dari objek Kentang, maka T merupakan representasi dari Kentang, T dapat diganti dengan tipe data yang sesungguhnya.