Buku Petunjuk Praktikum Praktikum Pemrograman Berbasis Obyek Oleh: Ali Ridho Barakbah S.Kom., Ph.D. Rizky Yuniar Hakkun S.Kom., M.T. Tita Karlita, S.Kom., M.Kom. Yuliana Setiowati, S.Kom., M.Kom. Program Studi D3 Teknik Informatika Departemen Teknik Informatika dan Komputer Politeknik Elektronika Negeri Surabaya 2012 Kata Pengantar Puji syukur kami panjatkan kehadirat Tuhan Yang Maha Esa atas segala rahmat dan karunia-Nya sehingga Buku Praktikum Pemrograman Berbasis Obyek dapat diwujudkan. Buku Praktikum Pemrograman Berbasis Obyek ini dirasa sangat diperlukan untuk diterbitkan sebagai pedomam bagi mahasiswa dan dosen yang berkaitan dengan kegiatan belajar dan mengajar di Jurusan Teknik Informasi Politeknik Elektronika Negeri Surabaya. Buku Praktikum Pemrograman Berbasis Obyek ini berisi penjelasan konsep pemrograman berbasis obyek disertai contoh penerapannya dengan menggunakan bahasa Java. Materi yang diajarkan meliputi prinsip-prinsip pemrograman berorientasi obyek seperti kelas, obyek, method, enkapsulasi, pewarisan, polimorfisme, serta topik tentang penanganan kesalahan, tipe data koleksi, dan membuat antar muka grafis menggunakan Java. Dengan modul-modul praktikum yang ada di buku ini diharapkan mahasiswa mampu merancang dan mengimplementasikan permasalahan ke dalam konsep pemrograman berbasis obyek dengan diberikan latihan-latihan dan tugas-tugas pemrograman. Diakhir kuliah mahasiswa membuat tugas proyek akhir yang dipresentasikan di kelas. Akhirnya dengan ini kami mengharapkan Buku Praktikum ini dapat dijadikan petunjuk dan dipergunakan dengan sebaik-baiknya. Dan tentu tidak lupa kami harapkan kritik dan saran demi makin sempurnanya buku ini. Surabaya, 30 Nopember 2012 i Daftar Isi Kata Pengantar Daftar Isi Praktikum 1 Praktikum 2 Praktikum 3 Praktikum 4 Praktikum 5 Praktikum 6 Praktikum 7 Praktikum 8 Praktikum 9 Praktikum 10 Praktikum 11 Praktikum 12 Praktikum 13 Praktikum 14 Praktikum 15 Praktikum 16 Praktikum 17 Praktikum 18 Praktikum 19 Praktikum 20 Praktikum 21 Praktikum 22 Praktikum 23 Praktikum 24 Praktikum 25 Praktikum 26 Praktikum 27 Praktikum 28 Praktikum 29 Praktikum 30 Praktikum 31 Praktikum 32 Pengenalan Lingkungan Kerja Java Dasar Pemrograman Java Operator Pengambilan Keputusan dan Perulangan Array String Pengenalan Pemrograman Berbasis Obyek Enkapsulasi Mengelola Kelas Inheritance 1 Inheritance 2 Overriding dan Overloading Polimorfisme Nested Class Type Wrapper Type Enum Menangani Exception Melempar Exeption dan Membuat Exception Sendiri Java Collection Framework: Set dan List Java Collection Framework: Map Comparable Comparator Generics: Membuat Class Generic dan Generic pada Collection Generics: Bounded Type Parameter dan WildCard Input dan Output 1 Input dan Output 2 Antar Muka Grafis Penanganan Event GUI: Kalkulator Mini Proyek 1 Proyek 2 Presentasi i ii 1 7 15 25 35 44 53 63 71 81 89 96 105 113 122 134 145 153 164 177 185 197 211 222 237 246 257 267 279 291 292 293 ii PRAKTIKUM 1 PENGENALAN LINGKUNGAN KERJA JAVA A. TUJUAN PEMBELAJARAN 1. Mengenal dan mempersiapkan lingkungan kerja Java 2. Mampu menerapkan langkah-langkah dalam menginstall Java Development Kit 3. Membuat program sederhana dengan Java 4. Mengkompilasi dan menjalankan program Java 5. Menganalisa beberapa problem yang terjadi saat pemrograman dan memberikan solusi B. DASAR TEORI Untuk bisa bekerja dengan Java, maka kita perlu melakukan instalasi Java Development Kit (JDK) atau Java 2 Software Development Kit (J2SDK). Setelah proses instalasi selesai, selanjutnya adalah melakukan penyetingan PATH dan CLASSPATH di dalam sistem. Penyetingan PATH sangat berguna untuk memberitahu sistem dimana kita meletakkan file-file utama Java (diantaranya java, javac, jdb, dan lain-lain). Sedangkan penyetingan CLASSPATH sangat berguna untuk memberitahu sistem dimana kita meletakkan file-file class yang akan kita libatkan dalam program kita. Penyetingan CLASSPATH ini biasa melibatkan dua item, yaitu tanda . (titik) yang menandakan direktori kerja dan tools.jar yang berisikan kumpulan file-file library standar yang disediakan oleh Java. 1 C. TUGAS PENDAHULUAN Buatlah makalah yang berisi tentang perkembangan teknologi Java dan uraikan berbagai macam teknologi Java serta aplikasinya saat ini. D. PERCOBAAN Percobaan 1 : Instalasi JDK Pilih dan tentukan file instalasi JDK sesuai dengan operating system yang dipakai oleh komputer anda. Jalankan file instalasi JDK dan ikuti proses instalasi tahap demi tahap. Pilihlah direktori penginstallan secara default (biasanya ini akan membuat direktori baru atau c:\jdkxxx atau c:\j2sdkxxx dimana xxx adalah versi JDK yang di-install. Percobaan 2 : Pengesetan PATH Masuk ke system setting OS anda melalui control panel dan lakukan penambahan PATH dengan cara sebagai berikut: set PATH=%PATH%;%JAVA_HOME%\bin Percobaan 3 : Pengesetan CLASSPATH Masuk ke system setting OS anda melalui control panel dan lakukan penambahan atau membuat baru CLASSPATH dengan cara sebagai berikut: set CLASSPATH=.;%JAVA_HOME%\lib\tools.jar Percobaan 4 : Menampilkan suatu tulisan ke layar Hallo.java public class Hallo { public static void main(String args[]) { System.out.println("Hallo..."); } } 2 Percobaan 5 : Melibatkan class lain dalam program Buatlah class TestGreeting dan Greeting dalam dua file sumber berbeda. TestGreeting.java public class TestGreeting { public static void main (String[] args) { Greeting hello = new Greeting(); hello.greet(); } } Greeting.java public class Greeting { public void greet() { System.out.println("hi"); } } E. LATIHAN Latihan 1 : Menganalisa dan membenahi kesalahan pada program Tulislah program berikut ini dan simpanlah dengan nama Test.java Test.java public class Testing { public static void main(String[] args) { System.out.println("What's wrong with this program?"); } } 3 Lakukan kompilasi pada file tersebut dan amati hasilnya. Kenapa terjadi kegagalan pada saat kompilasi?. Benahilah kesalahan diatas sehingga program tersebut dapat berjalan dengan baik. Latihan 2 : Menganalisa dan membenahi kesalahan pada program Tulislah program dibawah ini dan simpanlah dengan nama tertentu sesuai pilihan anda. public class Test { public static void main(String[] args) { System.out.println("What's wrong with this program?"); } } public class TestAnother { public static void main(String[] args) { System.out.println("What's wrong with this program?"); } } Lakukan kompilasi pada file tersebut dan amati hasilnya. Kenapa terjadi kegagalan pada saat kompilasi? Benahilah kesalahan diatas sehingga program tersebut dapat berjalan dengan baik. Latihan 3 : Menganalisa dan membenahi kesalahan pada program Tulislah program berikut ini dan simpanlah. public class Test { public static void main(String args) { System.out.println("What's wrong with this program?"); } } 4 Lakukan kompilasi pada program tersebut dan jalankan. Kenapa terjadi kesalahan pada saat menjalankan program tersebut. Benahilah kesalahan diatas sehingga program tersebut dapat berjalan dengan baik. Latihan 4 : Menganalisa dan membenahi kesalahan pada program Tulislah program berikut ini dan simpanlah. public class Test { public void main(String args[]) { System.out.println("What's wrong with this program?"); } } Lakukan kompilasi pada program tersebut dan jalankan. Kenapa terjadi kesalahan pada saat menjalankan program tersebut. Benahilah kesalahan diatas sehingga program tersebut dapat berjalan dengan baik. F. TUGAS Tugas 1 : Menghitung luas dan keliling lingkaran Buatlah program untuk menghitung luas dan keliling lingkaran. Untuk nilai PI gunakan konstanta PI yang ada di java.lang.Math.PI Rumus : Luas lingkaran = PI x jari-jari2 Keliling lingkaran = 2 x PI x jari-jari Tugas 2 : Mengkonversi suatu nilai dari Celcius ke Fahrenheit atau sebaliknya Buatlah suatu program untuk mengkonversi suatu nilai dari Celcius ke Fahrenheit atau sebaliknya. Rumus : 5 Lampiran Cara memasukkan input melalui JOptionPane. import javax.swing.JOptionPane; public class InputPane { public static void main(String args[]) { int nilai; String str = JOptionPane.showInputDialog("Masukkan nilai :"); nila i= Integer.parseInt(str); System.out.println(nilai); System.exit(0); } } LAPORAN RESMI Kumpulkan hasil percobaan di atas, tambahkan dalam laporan resmi flow chart untuk menghitung nilai rata-rata dari n bilangan yang diinputkan, hitung jumlah totalnya, hitung maksimal dan minimal bilangan. 6 PRAKTIKUM 2 DASAR PEMROGRAMAN JAVA A. TUJUAN PEMBELAJARAN 1. Mengetahui aturan penamaan identifier 2. Mengenal kata-kata kunci yang ada di Java 3. Mengetahui tipe-tipe dasar yang ada di Java 4. Mengetahui pemberian nilai default untuk masing-masing tipe dasar 5. Memahami bagaimana melakukan casting dan promotion B. DASAR TEORI Identifier adalah nama yang diberikan untuk variabel, class atau method. Penamaan identifier tidak boleh mengandung spasi dan harus diawali dengan karakter unicode, tanda $ (dollar) atau tanda _ (underscore). Penamaan identifier ini bersifat case-sensitive dan tidak dibatasi panjang maksimum. Java mempunyai 48 kata kunci, seperti if, int, void, dan lain-lain. Kata-kata kunci tersebut tidak bisa dipakai sebagai identifier. Selain kata kunci, Java juga mempunyai 3 kata literal, yaitu true, false dan null, yang juga tidak bisa dipakai untuk penamaan identifier juga terdapat 2 reserved words yang tidak bisa digunakan sebagai nama identifier yaitu const dan goto. Java mempunyai 8 tipe dasar, yaitu boolean, char, byte, short, int, long, float, dan double. Dari 8 tipe data dasar tersebut bisa dikelompokkan menjadi 4 kelompok data yaitu, integral, floating point, character, dan logical. Yang termasuk dalam kelompok data integral atau bilangan bulat adalah byte, short, int dan long. Nilai default untuk kelompok data integral adalah int. Yang termasuk dalam kelompok data floating point adalah float dan double dengan nilai default double. Sedang yang termasuk dalam 7 tipe data character adalah char yang direpresentasikan dengan Unicode leter. Dan kelompok data yang terakhir adalah logical yaitu boolean dengan hanya dua buah nilai saja yang diijinkan yaitu “true” dan “false”. Spesifikasi panjang bit dan range serta nilai default untuk masing-masing tipe data bisa dilihat pada Tabel 2.1. Casting diperlukan untuk mengkonversi dari suatu tipe ke tipe data yang lebih kecil panjang bitnya. Sedangkan promotion terjadi pada saat mengkonversi dari suatu tipe data ke tipe data yang lebih panjang bitnya. Contoh : int p = (int) 10L; long i = 10; Tabel 2.1 Spesifikasi panjang bit dan nilai default tipe data dasar Tipe Panjang bit Range Nilai Default boolean 16 - false char 16 0 – 216-1 ‘\u0000’ byte 8 -27 – 27-1 0 short 16 -215 – 215-1 0 int 32 -231 – 231-1 0 long 64 -263 – 263-1 0L float 32 - 0.0F double 64 - 0.0 C. TUGAS PENDAHULUAN 1. Buatlah uraian yang berisi tentang spesifikasi 8 tipe data dasar ! 2. Apakah yang dimaksud dengan casting (narrowing conversion) ? 3. Apakah yang dimaksud dengan konversi (widening conversion) ? D. PERCOBAAN Percobaan 1 : Memberikan nilai ke suatu tipe data public class Assign { public static void main(String args[]) { boolean b = true; 8 System.out.println("Value b = " + b); char c = 'C'; System.out.println("Value c = " + c); byte bt = 10; System.out.println("Value bt = " + bt); short s = 20; System.out.println("Value s = " + s); int i = 30; System.out.println("Value i = " + i); long l = 40L; System.out.println("Value l = " + l); float f = 3.14F; System.out.println("Value f = " + f); double d = 3.14; System.out.println("Value d = " + d); } } Percobaan 2 : Mencetak nilai default dari tipe dasar public class DefaultValue { static boolean b; static char c; static byte bt; static short s; static int i; static long l; static float f; static double d; public static void main(String args[]) { 9 System.out.println("Default value b = " + b); System.out.println("Default value c = " + c); System.out.println("Default value bt = " + bt); System.out.println("Default value s = " + s); System.out.println("Default value i = " + i); System.out.println("Default value l = " + l); System.out.println("Default value f = " + f); System.out.println("Default value d = " + d); } } Percobaan 3 : Mengamati hasil perubahan nilai dari suatu operasi matematis public class Divide { public static void main(String[] arguments) { float number1 = 15; float number2 = 6; float result = number1 / number2; float remainder = number1 % number2; System.out.println(number1 + " divided by " + number2); System.out.println("\nResult\tRemainder"); System.out.println(result + "\t" + remainder); } } Percobaan 4 : Mengamati hasil perubahan nilai dari suatu operasi matematis class Invest { public static void main(String[] arguments) { float total = 14000; System.out.println("Original investment: $" + total); // Increases by 40 percent the first year total = total + (total * .4F); System.out.println("After one year: $" + total); // Loses $1,500 the second year 10 total = total - 1500F; System.out.println("After two years: $" + total); // Increases by 12 percent the third year total = total + (total * .12F); System.out.println("After three years: $" + total); } } Percobaan 5 : Menampilkan bilangan oktal ke format desimal public class Octal { public static void main(String args[]) { int six=06; int seven=07; int eight=010; int nine=011; System.out.println("Octal six = " + six); System.out.println("Octal seven = " + seven); System.out.println("Octal eight = " + eight); System.out.println("Octal nine = " + nine); } } Percobaan 6 : Menampilkan bilangan heksadesimal ke format desimal public class Hexadecimal { public static void main(String args[]) { int x=0x0001; int y=0x7fffffff; int z=0xDeadCafe; System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("z = " + z); 11 } } Percobaan 7 : Mengamati perubahan nilai pada suatu tipe public class Plus { public static void main(String args[]) { int x; int y; x=2147483647; //(2^31)-1 System.out.println("x = " + x); y=x+1; System.out.println("y = " + y); } } Percobaan 8 : Memahami pemakaian Unicode public class CobaUnicode { public static void main(String args[]) { ch\u0061r a='a'; char \u0062 = 'b'; char c= '\u0063'; String kata="\u0061\u0062\u0063"; System.out.println("a: " + a); System.out.println("a: " + b); System.out.println("a: " + c); System.out.println("kata: " + kata); } } 12 E. LATIHAN Latihan 1 : Membuat formulasi proses casting dari tipe-tipe primitif Lakukan percobaan casting antar tipe-tipe primitif. Lalu amati dan catatlah konversi dari suatu tipe ke tipe lainnya yang memerlukan suatu casting. Dari hasil analisa anda, buatlah suatu skema casting diantara tipe-tipe primitif. Latihan 2 : Membuat formulasi proses promotion dari tipe-tipe primitif Lakukan percobaan promotion antar tipe-tipe primitif. Lalu amati dan catatlah konversi dari suatu tipe ke tipe lainnya yang menyebabkan terjadinya suatu promotion. Dari hasil analisa anda, buatlah suatu skema promotion diantara tipe-tipe primitif. F. TUGAS Tugas 1 : Menganalisa batasan maksimum dari suatu tipe Amatilah dan tulislah program berikut ini: public class BigInteger { public static void main(String args[]) { long p=2147483648; } } Lakukan kompilasi pada file tersebut dan amati pesan kesalahannya. Lakukan analisa mengapa bisa terjadi kesalahan padahal batasan nilai maksimum dari suatu bilangan bertipe long adalah 263-1 (9223372036854775807)?. Kemudian berikanlah solusi yang tepat untuk mengatasi persoalan diatas. Tugas 2 : Mencari panjang menit dari durasi waktu Input: jam awal, menit awal, jam akhir, menit akhir Output: durasi waktu (dalam menit) antara jam awal menit awal dengan jam akhir menit akhir. 13 LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 14 PRAKTIKUM 3 OPERATOR A. TUJUAN PEMBELAJARAN 1. Mengenal berbagai macam bentuk operator 2. Memahami penggunaan berbagai macam jenis operator yang ada di Java B. DASAR TEORI Operator dapat diklasifikasikan menjadi 2 bentuk, yaitu unary operator dan binary operator. Unary operator adalah operator yang hanya melibatkan 1 operan. Sedangkan binary operator adalah operator yang melibatkan 2 operan. Java mempunyai berbagai macam jenis operator yang dapat digolongkan menjadi operator aritmatika, increment-decrement, bitwise, boolean, logik, shift (geser), penugasan, kombinasi dan kondisi. Arithmatic operator (operator aritmatika) adalah operator yang berfungsi untuk operasi aritmatika. Yang termasuk dalam arithmatic operator bisa dilihat pada Tabel 3.1. Tabel 3.1. Arithmatic operator Arithmatic Operator Keterangan + Operasi penambahan - Operasi pengurangan * Operasi perkalian / Operasi pembagian % Operasi modulus Increment – decrement operator adalah operator yang berguna untuk menaikkan 1 nilai (increment) dan menurunkan 1 nilai (decrement). Yang termasuk increment16 decrement operator bisa dilihat pada Tabel 3.2. Berdasarkan urutan eksekusi penaikkan dan penurunan nilainya, increment-decrement operator ini dapat diklasifikasikan menjadi 2 macam, yaitu pre-increment/decrement dan post-increment/decrement. Tabel 3.2. Arithmatic operator Increment-Decrement Operator Keterangan ++ increment -- decrement Bitwise operator adalah operator yang dipakai untuk operasi bit pada nilai operan. Yang termasuk bitwise operator bisa dilihat pada Tabel 3.3. Tabel 3.3. Bitwise Operator Bitwise Operator Keterangan ~ Operasi complement & Operasi AND | Operasi OR ^ Operasi XOR Boolean operator (operator boolean) adalah operator yang mengharuskan operannya bertipe boolean (true atau false). Yang termasuk boolean operator bisa dilihat pada Tabel 3.4. Tabel 3.4. Boolean Operator Logical Operator Keterangan ! Operasi negasi (NOT) & Operasi AND | Operasi OR ^ Operasi XOR && Operasi AND (short circuit) 17 || Operasi OR (short circuit) Operator !, &, | dan ^ mempunyai implementasi yang sama sebagaimana ketika ia menjadi bitwise operator. Hanya saja di logical operator, operan yang dilibatkan disini harus bertipe boolean, yang hanya mempunyai nilai true atau false. Logical operator (operator logika) adalah operator yang sering dipakai untuk operasi perbandingan dan selalu menghasilkan suatu nilai bertipe boolean (true atau false). Yang termasuk logical operator bisa dilihat pada Tabel 3.5. Tabel 3.5. Logical Operator Logical Operator Keterangan == Operasi perbandingan sama dengan != Operasi perbandingan tidak sama dengan > Operasi perbandingan lebih besar >= Operasi perbandingan lebih besar sama dengan < Operasi perbandingan lebih kecil <= Operasi perbandingan lebih kecil sama dengan Shift operator (operator geser) adalah operator yang berfungsi untuk menggeser susunan bit pada suatu nilai. Yang termasuk dalam shift operator dapat dilihat pada Tabel 3.6. Tabel 3.6. Shift Operator Shift Operator Keterangan >> right shift >>> unsigned right shift << left shift Combination operator (operator kombinasi) adalah operator yang terdiri dari gabungan 2 operator. Biasanya combination operator ini dipakai untuk mempersingkat waktu penulisan program. Yang termasuk operator combination bisa dilihat pada Tabel 18 3.7. Tabel 3.7. Combination Operator Combination Operator Keterangan += Gabungan dari operator = dan + -= Gabungan dari operator = dan - *= Gabungan dari operator = dan * /= Gabungan dari operator = dan / %= Gabungan dari operator = dan % >>= Gabungan dari operator = dan >> >>>= Gabungan dari operator = dan >>> <<= Gabungan dari operator = dan << &= Gabungan dari operator = dan & |= Gabungan dari operator = dan | ^= Gabungan dari operator = dan ^ Conditional operator (operator konditional) adalah operator yang dipakai untuk operasi kondisi (persyaratan), sama sebagaimana if-then-else dan hanya berlaku untuk pernyataan tunggal. Operator ini mengembalikan suatu nilai yang benar sesuai dengan kondisi yang diberikan. Conditional operator (operator konditional) ini hanya ada 1 macam, yaitu ? disertai dengan tanda : (titik dua). Jika kondisi persyaratan yang terletak di sebelah kiri tanda ? bernilai benar, maka pernyataan yang berada di sebelah kiri tanda : yang akan diambil. Demikian juga sebaliknya, jika kondisi persyaratan bernilai salah, maka pernyataan yang berada di sebelah kanan tanda : yang akan diambil. C. TUGAS PENDAHULUAN Buatlah makalah yang berisi tentang berbagai macam operator dengan disertai contoh penggunaan dan outputnya. 19 D. PERCOBAAN Percobaan 1 : Melakukan increment dan decrement nilai class IncDec { public static void main (String args[]) { int x = 8, y = 13; System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("x = " + ++x); System.out.println("y = " + y++); System.out.println("x = " + x--); System.out.println("y = " + --y); } } Percobaan 2 : Melakukan operasi bit class Bitwise { public static void main (String args[]) { int x = 5, y = 6; System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("x & y = " + (x & y)); System.out.println("x | y = " + (x | y)); System.out.println("x ^ y = " + (x ^ y)); } } Percobaan 3 : Melakukan operasi komplemen class BitwiseComplement { public static void main (String args[]) { int x = 8; System.out.println("x = " + x); int y = ~x; System.out.println("y = " + y); } } 20 Percobaan 4 : Melakukan operasi shift class Shift { public static void main (String args[]) { int x = 7; System.out.println("x = " + x); System.out.println("x >> 2 = " + (x >> 2)); System.out.println("x << 1 = " + (x << 1)); System.out.println("x >>> 1 = " + (x >>> 1)); } } Percobaan 5 : Menggunakan logical operator class LogicalOperator { public static void main (String args[]) { int x = 7, y = 11, z = 11; System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("z = " + z); System.out.println("x < y = " + (x < y)); System.out.println("x > z = " + (x > z)); System.out.println("y <= z = " + (y <= z)); System.out.println("x >= y = " + (x >= y)); System.out.println("y == z = " + (y == z)); System.out.println("x != y = " + (x != z)); } } Percobaan 6 : Menggunakan operator boolean and public class BooleanAnd { public static void main(String args[]) { int a=5, b=7; if ((a<2) & (b++<10)) b+=2; System.out.println(b); } } 21 Percobaan 7 : Menggunakan operator boolean and short-circuit public class ShortCircuitBooleanAnd { public static void main(String args[]) { int a=5, b=7; if ((a<2) && (b++<10)) b+=2; System.out.println(b); } } Percobaan 8 : Menggunakan boolean or public class BooleanOr { public static void main(String args[]) { int a=5, b=7; if ((a>2) | (b++<10)) b+=2; System.out.println(b); } } Percobaan 9 : Menggunakan boolean or short-circuit public class ShortCircuitBooleanOr { public static void main(String args[]) { int a=5, b=7; if ((a>2) || (b++<10)) b+=2; System.out.println(b); } } Percobaan 10 : Menggunakan operator kondisi class Conditional { public static void main (String args[]) { int x = 0; boolean isEven = false; System.out.println("x = " + x); x = isEven ? 4 : 7; System.out.println("x = " + x); } } 22 E. LATIHAN Latihan 1 : Menampilkan representasi biner dari bilangan desimal bertipe int Buatlah suatu program untuk menampilkan susunan bit dari suatu bilangan desimal. Nilai bilangan input yang dimasukkan adalah bertipe int. Contoh tampilan: Masukkan nilai desimal: 13 Susunan bit dari 13 adalah 00000000000000000000000000001101 Masukkan nilai desimal: 612 Susunan bit dari 13 adalah 00000000000000000000001001100100 Masukkan nilai desimal: -1 Susunan bit dari 13 adalah 11111111111111111111111111111111 Masukkan nilai desimal: -13 Susunan bit dari 13 adalah 11111111111111111111111111110011 Latihan 2 : Menampilkan representasi biner dari bilangan desimal bertipe byte Buatlah suatu program seperti diatas untuk menampilkan susunan bit dari suatu bilangan desimal, akan tetapi nilai bilangan input yang dimasukkan adalah bertipe byte. F. TUGAS Tugas 1 : Mencari representasi biner dari suatu bilangan Tuliskan representasi bit dari nilai –19? Jelaskan. Tugas 2 : Menganalisa pergeseran bit dari operasi shift 23 Jelaskan apa yang terjadi pada potongan program berikut ini: byte a=-1; a=(byte) (a >>> 2); LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 24 PRAKTIKUM 4 PERCABANGAN DAN PERULANGAN A. TUJUAN PEMBELAJARAN 1. Memahami logika percabangan 2. Memahami logika perulangan 3. Memakai percabangan dan perulangan yang tepat 4. Memahami pemberian kondisi untuk perulangan B. DASAR TEORI Percabangan di dalam Java terdapat 2 macam, yaitu dengan memakai if dan switch. Percabangan if dipakai jika kita menginginkan suatu pernyataan itu dilakukan dengan syarat tertentu yang bernilai benar. Sintaks dari if adalah sebagai berikut: if (ekspresi_boolean) { Pernyataan1; } Pernyataan1 akan dikerjakan kalau ekspresi_boolean bernilai true. Percabangan if-else dipakai untuk mengeksekusi salah satu dari 2 pernyataan dari syarat tertentu yang pada pada if yang dapat bernilai benar atau salah. Sintaks dari if-else adalah sebagai berikut: if (ekspresi_boolean) { Pernyataan1; } else { Pernyataan2; } 25 Pernyataan1 akan dikerjakan kalau ekspresi_boolean bernilai true. Kalau ekspresi_boolean bernilai false, maka Pernyataan2 akan dikerjakan. Percabangan else-if dipakai untuk memberikan kondisi tertentu pada bagian else. Sintaks dari else-if adalah sebagai berikut: if (ekspresi_boolean1) { Pernyataan1; } else if (ekspresi_boolean2) { Pernyataan2; } Ketika ekspresi_boolean bernilai false, maka alur program akan menuju ke bagian else. Selanjutnya Pernyataan2 diatas akan dikerjakan kalau ekspresi_boolean2 bernilai true. Percabangan switch dipakai pada saat kita ingin memberikan kondisi denga beberapa syarat yang identik yang masing-masing mempunyai pernyataan yang berbeda-beda. Pada Java, nilai yang dilewatkan pada switch harus bertipe int, short, byte atau char. Sintaks dari switch adalah sebagai berikut: switch (ekspresi) { case nilai1: Pernyataan1; break; case nilai2: Pernyataan2; break; default: Pernyataan3; } Ketika ekspresi bernilai nilai1, maka alur program akan mengeksekusi Pernyataan1. Selanjutnya break menyebabkan alur program keluar dari daerah switch. Kalau ekspresi bernilai nilai2, maka alur program akan mengeksekusi Pernyataan2. Apabila ekspresi mempunyai nilai yang tidak sama dengan nilai1 dan nilai2, maka alur program akan menuju ke bagian default dan kemudian mengeksekusi Pernyataan3. Tipe data yang 26 diperbolehkan untuk ekspresi adalah byte, short, int dan char saja. Tetapi untuk Java diatas versi 7 ditambahkan tipe data String. Perulangan di dalam Java terdapat 3 macam, yaitu for, while dan do-while. Perulangan for dipakai pada saat kita melakukan perulangan dengan jumlah yang sudah diketahui pasti. Sintaks dari for adalah sebagai berikut: for (inisialisasi; kondisi; perubah) { Pernyataan; } Perulangan while dipakai pada saat kita melakukan perulangan dengan jumlah yang belum diketahui pasti. Pernyataan pada while akan dikerjakan setelah pengecekan kondisi pada while bernilai true. Sintaks dari while adalah sebagai berikut: while (kondisi) { Pernyataan; } Perulangan do-while dipakai pada saat kita melakukan perulangan dengan jumlah yang belum diketahui pasti. Pernyataan pada do akan dikerjakan terlebih dahulu, baru setelah itu dilakukan pengecekan kondisi pada while. Sintaks dari do-while adalah sebagai berikut: do { Pernyataan; } while (kondisi); Kita dapat memberikan kondisi tertentu pada saat terjadi perulangan. Kondisi yang mungkin terjadi pada perulangan terdapat 2 macam, yaitu break dan continue. Break menyebabkan suatu kondisi untuk keluar dari perulangan. Sedangkan continue memyebabkan suatu kondisi untuk melanjutkan ke tahapan selanjutnya pada perulangan. 27 C. TUGAS PENDAHULUAN 1. Sebutkan dan jelaskan berbagai macam sintaks percabangan yang digunakan di Java! 2. Sebutkan dan jelaskan berbagai macam sintaks perulangan yang digunakan di Java! D. PERCOBAAN Percobaan 1 : Percabangan menggunakan if, if-else dan else-if class IfElseName { public static void main (String args[]) { char firstInitial = 'a'; System.out.println("Masukkan huruf awal nama anda: "); try { firstInitial = (char)System.in.read(); } catch (Exception e) { System.out.println("Error: " + e.toString()); } if (firstInitial == 'a') System.out.println("Nama anda pasti Asep!"); else if (firstInitial == 'b') System.out.println("Nama anda pasti Brodin!"); else if (firstInitial == 'c') System.out.println("Nama anda pasti Cecep!"); else System.out.println("Nama anda tidak terkenal!"); } } Percobaan 2 : Percabangan menggunakan switch class SwitchName { public static void main (String args[]) { char firstInitial = 'a'; System.out.println("Masukkan huruf awal nama anda:"); try { firstInitial = (char)System.in.read(); } catch (Exception e) { 28 System.out.println("Error: " + e.toString()); } switch (firstInitial) { case 'a': System.out.println("Nama anda pasti Asep!"); case 'b': System.out.println("Nama anda pasti Brodin!"); case 'c': System.out.println("Nama anda pasti Cecep!"); default: System.out.println("Nama anda tidak terkenal!"); } } } Percobaan 3 : Percabangan menggunakan switch dengan break class SwitchNameBreak { public static void main (String args[]) { char firstInitial = 'a'; System.out.println("Masukkan huruf awal nama anda:"); try { firstInitial = (char)System.in.read(); } catch (Exception e) { System.out.println("Error: " + e.toString()); } switch (firstInitial) { case 'a': System.out.println("Nama anda pasti Asep!"); break; case 'b': System.out.println("Nama anda pasti Brodin!"); break; case 'c': System.out.println("Nama anda pasti Cecep!"); break; 29 default: System.out.println("Nama anda tidak terkenal!"); } } } Percobaan 4 : Perulangan menggunakan for class ForCount { public static void main (String args[]) { int count=1; for (int i=0; i<9; i++) { for (int j=0; j<i+1; j++) { System.out.print(count); } count++; System.out.println(); } } } Percobaan 5 : Perulangan menggunakan while class WhileCoun t { public static void main (String args[]) { int count=1; int i=0; while (i<9) { int j=0; while (j<i+1) { System.out.print(count); j++; } count++; System.out.println(); i++; 30 } } } Percobaan 6 : Perulangan dengan break class BreakLoop { public static void main (String args[]) { int i = 0; do { System.out.println("Iterasi ke " + i); i++; if (i > 10) break; } while (true); } } Percobaan 7 : Perulangan dengan continue public class ContinueLoop { public static void main(String args[]) { int a, b; for(a=0;a<2;a++) for(b=0;b<3;b++) { if (b==1) continue; System.out.println("a=" + a + " ; b=" + b); } } } Percobaan 8 : Pemakaian label pada kondisi break public class BreakLabel { public static void main(String args[]) { int a, b; 31 Mulai: for(a=0;a<2;a++) for(b=0;b<3;b++) { if (b==1) break Mulai; System.out.println("a=" + a + " ; b=" + b); } } } Percobaan 9 : Pemakaian label pada kondisi continue public class ContinueLabel { public static void main(String args[]) { int a, b; Mulai: for(a=0;a<2;a++) for(b=0;b<3;b++) { if (b==1) continue Mulai; System.out.println("a=" + a + " ; b=" + b); } } } E. LATIHAN Latihan 1 : Pengecekan kelompok karakter Buatlah program untuk menentukan kelompok suatu karakter yang dimasukkan melalui keyboard. Kelompok karakter tersebut adalah huruf kecil, huruf besar, angka, dan karakter khusus (tanda baca, operator dan sebagainya). Latihan 2 : Menampilkan bilangan faktorial Bilangan bulat faktorial n, ditulis dengan n! adalah dihasilkan dari mengalikan dari 1 sampai dengan n. Contohnya 5! = 1 x 2 x 3 x 4 x 5 =120. Buatlah program untuk menampilkan tabel hasil faktorial dari suatu bilangan yang diinputkan (tampilan bilangan rata kanan) 32 Contoh tampilan : Masukkan bilangan faktorial: 7 n n! -----------------------------1 1 2 2 3 6 4 24 5 120 6 720 7 5040 --------------------------- Latihan 3 : Deret Fibonacci Buatlah program untuk menampilkan deret Fibonacci Contoh tampilan : Masukkan berapa deret Fibonacci? 8 8 deret Fibonacci = 1 1 2 3 5 8 13 21 Latihan 4 : Menampilkan deret bilangan genap Buatlah program untuk menampilkan deret bilangan genap dari 2 sampai dengan 20 kecuali kelipatan 6. Contoh tampilan : 2 4 8 10 14 16 20 F. TUGAS Tugas 1 : Menghitung nilai determinan dan mencari akar persamaan kuadrat Buatlah program untuk menghitung determinan dan mencari akar-akar dari persamaan kuadrat : ax2 + bx + c = 0 , dengan ketentuan sebagai berikut : D = b2 - 4ac • Jika D = 0 , maka terdapat 2 akar real yang kembar, yaitu : x1 = x2 = -b / 2a 33 • Jika D > 0 , maka terdapat 2 akar real yang berlainan, yaitu : x1 = (-b + √D) / 2a x2 = (-b - √D) / 2a • Jika D < 0 , maka terdapat 2 akar imaginer yang berlainan, yaitu : x1 = -b / 2a + (√D / 2a) i x2 = -b / 2a - (√D / 2a) i Input : a, b, c (int) Output : Nilai Determinan serta nilai akar-akar persamaan tsb (x1 dan x2). Petunjuk : Gunakan Math.pow(x,0.5) untuk mencari akar dari x. Tugas 2 : Menentukan tahun kabisat Buatlah program untuk menentukan suatu tahun kabisat atau bukan dimana tahun dibatasi mulai dari tahun 1900 sampai dengan tahun 2005. Contoh tampilan: Masukkan tahun (1900-2005) : 1923 1923 bukan tahun kabisat Masukkan tahun (1900-2005) : 1898 Maaf, tahun input dibawah 1900 Masukkan tahun (1900-2005) : 1996 1996 adalah tahun kabisat Masukkan tahun (1900-2005) : 2008 Maaf, tahun input diatas 2005 LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 34 PRAKTIKUM 5 ARRAY A. TUJUAN PEMBELAJARAN 1. Membuat dan menggunakan array 2. Berinteraksi dengan array multi dimensi 3. Mengkopi elemen array 4. Memahami konsep referensi array B. DASAR TEORI Array adalah suatu kumpulan data pada suatu variabel. Cara mendeklarasikan suatu array adalah sebagai berikut : tipe_array nama_array[]; tipe_array[] nama_array; Contoh : int nilai[]; char[] huruf; Agar kita dapat memesan tempat di memori untuk menampung elemen-elemen array, kita perlu membuat array. Adapun caranya adalah dengan memakai new karena di dalam Java suatu array adalah dianggap suatu obyek. Format penulisannya adalah sebagai berikut : nama_array = new tipe_array[total_elemen_array]; Contoh : int nilai[]; nilai = new int[5]; Untuk dapat mengakses elemen array dapat dilakukan dengan menyebutkan elemen ke berapa dari array yang akan diakses, seperti berikut ini: nama_array[elemen_array] 35 Kita juga dapat melakukan deklarasi dan pembuatan array hanya pada satu baris statement. Adapun format penulisannya adalah sebagai berikut : tipe_array nama_array[] = new tipe_array[total_elemen_array]; Contoh : int nilai[] = new int[5]; Inisialisasi array dapat dilakukan dengan format penulisan sebagai berikut: tipe_array nama_array[] = {nilai_indeks_0, nilai_indeks_1, … , nilai_indeks_n}; Contoh : int nilai[] = {70, 65, 85}; Kita dapat membuat array multi dimensi dengan cara menambahkan tanda [] sebanyak dimensi yang ingin dibuat. Sebagai contoh adalah sebagai berikut: int x[][] = new int[3][4]; Baris statement diatas berarti kita ingin membuat array berdimensi 2, dengan 3 elemen di dimensi ke-1 dan 4 elemen di dimensi ke-2. Untuk mengetahui panjang dari suatu array yang telah kita buat, kita dapat memakai properti length. Adapun format untuk menggunakan length adalah sebagai berikut: var_array.length total elemen array pada dimensi 1 var_array[i].length total elemen array pada dimensi 2 untuk indeks ke-i pada dimensi 1 var_array[i][j].length total elemen array pada dimensi 3 untuk indeks ke-i pada dimensi 1 dan indeks ke-j pada dimensi 2 dan seterusnya. Isi dari suatu array dapat kita kopi pada array yang lain dengan memanfaatkan method arraycopy() pada class System. Format penulisannya sebagai berikut : System.arraycopy(array1, p1, array2, p2, n); dimana : array1 = array asal/sumber pengkopian array2 = array tujuan pengkopian p1 = posisi indeks awal pengkopian pada array asal p2 = posisi indeks awal pengkopian pada array tujuan n = banyaknya elemen array yang akan dikopi 36 Suatu array juga dapat me-refer (merujuk) ke array yang lain, dengan kata lain merujuk pada alamat memori yang sama. Sebagai contoh adalah program berikut ini : int nilai[] = {10, 20, 30}; int result[]; result = nilai; Di baris ketiga, kita meng-assign array nilai ke array result. Akibatnya, array result akan me-refer (merujuk) pada array nilai, sehingga kedua array tersebut merujuk alamat memori yang sama. C. TUGAS PENDAHULUAN 1. Apakah yang dimaksud dengan array? 2. Buatlah contoh mendeklarasikan, memberi nilai dan mengakses elemen array! 3. Bagaimana cara mengetahui panjang array? 4. Uraikan pengetahuan anda mengenai array multidimensi! 5. Bagaimana cara mengkopi isi array? 6. Apakah yang dimaksud dengan referensi array. Beri contoh! D. PERCOBAAN Percobaan 1 : Mengakses elemen array public class Array1 { public static void main(String args[]) { int nilai[]=new int[3]; nilai[0]=70; nilai[1]=80; nilai[2]=65; double ratarata=0.0; 37 for(int i=0; i<nilai.length; i++) ratarata+=nilai[i]; ratarata/=nilai.length; System.out.println("Nilai rata-rata = " + ratarata); } } Percobaan 2 : Mengakses elemen array berdimensi 2 import java.text.NumberFormat; public class Array2 { public static void main(String args[]) { NumberFormat nf=NumberFormat.getInstance(); nf.setMaximumFractionDigits(3); int nilai[][]=new int[2][3]; nilai[0][0]=85; nilai[0][1]=81; nilai[0][2]=78; nilai[1][0]=65; nilai[1][1]=73; nilai[1][2]=71; String MK[]={"RPL", "PBO"}; double ratarataMK[]=new double[nilai.length]; for (int i=0; i<nilai.length; i++) { for (int j=0; j<nilai[0].length; j++) { ratarataMK[i]+=nilai[i][j]; } ratarataMK[i]/=nilai[0].length; } System.out.println("Nilai Mata Kuliah\n"); System.out.println("MK \tMinggu1\tMinggu2\tMinggu3\tRataRata"); 38 for (int i=0; i<nilai.length; i++) { System.out.print(MK[i] + "\t"); for (int j=0; j<nilai[0].length; j++) { System.out.print(nilai[i][j] + "\t"); } System.out.print(nf.format(ratarataMK[i])+"\n"); } } } Percobaan 3 : Mendapatkan informasi panjang elemen array multi dimensi public class CariPanjangElemen { public static void main(String args[]) { int x[][][][]=new int[2][][][]; x[0]=new int[1][][]; x[0][0]=new int[2][]; x[0][0][0]=new int[3]; x[0][0][1]=new int[2]; x[1]=new int[2][][]; x[1][0]=new int[1][]; x[1][0][0]=new int[2]; x[1][1]=new int[2][]; x[1][1][0]=new int[1]; x[1][1][1]=new int[3]; System.out.println(x.length); System.out.println(x[0].length); System.out.println(x[0][0].length); System.out.println(x[0][0][0].length); System.out.println(x[0][0][1].length); System.out.println(); System.out.println(x[1].length); System.out.println(x[1][0].length); System.out.println(x[1][0][0].length); System.out.println(x[1][1].length); 39 System.out.println(x[1][1][0].length); System.out.println(x[1][1][1].length); } } Percobaan 4 : Menangkap daftar argumen public class GetArguments { public static void main(String args[]) { System.out.println("Tanggal : " + args[0]); System.out.println("Bulan : " + args[1]); System.out.println("Tahun : " + args[2]); } } Percobaan 5 : Melakukan pengkopian array public class CopyArray { public static void main(String args[]) { int[] array1 = { 7, 4, 8, 1, 4, 1, 4 }; int[] array2 = new int[3]; System.arraycopy(array1,0,array2,0,3); System.out.print("Array1 : "); for (int i=0; i<array1.length; i++) System.out.print(array1[i] + " "); System.out.println(); System.out.print("Array2 : "); for (int i=0; i<array2.length; i++) System.out.print(array2[i] + " "); } } 40 E. LATIHAN Latihan 1 : Mencari nilai rata-rata mata kuliah dari daftar nilai siswa Diketahui daftar nilai siswa sebagai berikut: NRP Nama Mhs RPL BD PBO 1 Ahmad 81 90 62 2 Adang 50 83 87 3 Dani 89 55 65 4 Edi 77 70 92 Buatlah program untuk menampilkan laporan sebagai berikut: NRP Rata-rata -------------------------1 77.67 2 73.33 3 69.67 4 79.67 --------------------------- Latihan 2 : Menampilkan deret Fibonacci Deret fibonanci adalah deret dimana dimulai dengan dua angka, dimana bernilai 0 dan 1, kemudian deret ketiga ditentukan dari penjumlahan kedua angka tersebut, sedangkan deret keempat ditentukan dari dua angka sebelumnya begitu seterusnya. Sehingga didapatkan deret fibonanci sebagai berikut: 0 1 1 2 3 5 8 13 21 dan seterusnya. Buatlah program untuk menampilkan bilangan Fibonacci yang banyaknya sesuai dengan input. Contoh tampilan: Masukkan jumlah deretan Fibonacci? 8 0 1 1 2 3 5 8 13 41 Masukkan jumlah deretan Fibonacci? 10 0 1 1 2 3 5 8 13 21 34 Latihan 3 : Mendeteksi bilangan prima Buatlah suatu program untuk mendeteksi suatu bilangan itu termasuk bilangan prima atau bukan. Contoh tampilan: Masukkan bilangan? 8 8 bukan termasuk bilangan prima Masukkan bilangan? 11 11 adalah bilangan prima F. TUGAS Tugas 1: Mencari posisi suatu angka di array Misal terdapat array dua dimensi sebagai berikut: int[][] arrayOfInts = { { 32, 87, 3, 589 }, { 12, 1076, 2000, 8 }, { 622, 127, 77, 955 }}; Tugas : Carilah posisi angka 12 pada array tersebut. Silakan menggunakan looping, branching, label, break, atau continue bila diperlukan. Contoh output program: Found 12 at 1, 0 Tugas 2: Hitung jumlah huruf a yang terdapat pada array berikut ini ! char [ ] matKul = {‘p’,‘e’,’m’,’r’,’o’,’g’,’r’,’a’,’m’,’a’,’n’,’b’,’e’,’r’,’b’,’a’,’s’,’i’,’s’,’o’,’b’,’y’,’e’,’k’}; 42 Tugas 3. Mengakses elemen array Di bawah ini adalah contoh program yang mengakses dan menampilkan elemen array ke layar dengan menggunakan looping for. class ForDemo { public static void main(String[] args){ int x [] = {1,2,3,4,5,6,7,8,9,10}; for(int i=0; i<10; i++){ System.out.println("Count is: " + x[i]); } } } Temukan dan sebutkan cara lain dengan menggunakan loop for untuk mengakses dan menampilkan elemen array! LAPORAN RESMI Kumpulkan hasil percobaan di atas, tambahkan analisa untuk tiap latihan dan tugas! 43 PRAKTIKUM 6 STRING A. TUJUAN PEMBELAJARAN 1. Memahami sifat dan cara menggunakan dan operasi String. 2. Memahami sifat dan cara menggunakan dan operasi StringBuffer 3. Memahami sifat dan cara menggunakan dan operasi StringBuilder B. DASAR TEORI Objek dari String sering sekali kita gunakan sehari-hari, bahkan mungkin di setiap class dari Java kita terdapat rutin yang menangani String. Class String merepresentasikan suatu teks. Class String berisi string yang tetap (immutable string). Artinya sekali intance String dibuat maka isinya tidak bisa diubah. Kelas String memiliki 13 konstruktor yang memungkinkan kita membuat obyek String dan menginisialisasi nilainya dengan menggunakan berbagai macam sumber data yang berbeda. Cara membuat obyek string adalah sebagai berikut: String str = "abc"; Sama dengan char data[] = {'a', 'b', 'c'}; String str = new String(data); Berikut ini adalah beberapa contoh penggunaan String: System.out.println("abc"); String cde = "cde"; System.out.println("abc" + cde); String c = "abc".substring(2,3); String d = cde.substring(1, 2); Class String memiliki method untuk menangani individual karakter dari suatu string, membandingkan string, mencari string, mendapatkan substring, membuat kopi isi string 44 dan dijadikan lowercase atau uppercase. Java menyediakan operator spesial untuk menggabungkan dua string yaitu operator plus (+). Class StringBuffer mirip dengan String tetapi bersifat mutable, atau dapat diubah atau dimodifikasi dengan menggunakan beberapa method yang dimilikinya. String buffer aman digunakan oleh beberapa thread. Method-methodnya bersifat synchronized sehingga beberapa operasi yang terjadi pada suatu obyek string buffer akan diselesaikan secara serial sesuai urutan pemanggilan. Operasi utama class StringBuffer adalah method append dan insert. Method append selalu menambahkan teks diakhir string, sedang method insert menembahkan teks di posisi tertentu. Sebagai contoh: StringBuffer sb1 = new StringBuffer(“start”); sb1.append(“le”); maka isi sb1 adalah “startle” StringBuffer sb2 = new StringBuffer(“start”); sb2. insert(4,”le”); maka isi sb1 adalah “starlet” Secara umum, jika sb adalah obyek dari StringBuffer, maka sb.append(x) sama dengan operasi sb.insert(sb.length(),x). StringBuilder adalah string yang bersifat mutable. Operasi yang dimiliki class StringBuilder mirip dengan class StringBuffer. Perbedaannya adalah StringBuilder tidak mendukung sinkronisasi. C. TUGAS PENDAHULUAN 1. Apakah perbedaan class String, StringBuffer dan StringBuilder? 2. Apakah yang dimaksud dengan sifat mutable dan immutable? Beri contoh! 3. Jelaskan operasi utama append dan insert yang dimiliki oleh StringBuffer! D. PERCOBAAN Percobaan 1. Karakter escape Di dalam String kita dapat memasukkan sekuen dari karakter escape yang terdiri dari satu karakter back slash (\) diikuti oleh karakter escape tersebut. Beberapa escape character yang sering digunakan adalah : - \n untuk baris baru 45 - \t untuk tab - \\ untuk karakter back slash (\) itu sendiri Cobalah kode dibawah ini. Apakah outputnya? class Str1{ public static void main(String [] args){ String str1 = "PENS"; String str2 = "pens"; System.out.println(str1 + "\n" + str2); } } Percobaan 2. Membandingkan String Membandingkan String di java tidak bisa menggunakan operator equals (==) tetapi kita harus menggunakan method dari String yaitu equals dan equalsIgnoreCase. Sesuai dengan nama methodnya, equals digunakan untuk membandingkan objek String secara case-sensitive (huruf kecil dan besar dibedakan) dan sebaliknya equalsIgnoreCase digunakan untuk membandingkan String secara case-insensitive (huruf besar dan kecil tidak dibedakan). Cobalah kode dibawah ini. Apakah outputnya? class Str2{ public static void main(String [] args){ String str1 = "PENS"; String str2 = "pens"; System.out.println(str1.equals(str2)); System.out.println(str1.equalsIgnoreCase(str2); } } Percobaan 3. Menggabungkan String (Concatenation) Untuk menggabungkan string kita bisa menggunakan beberapa cara yaitu dengan menggunakan method concat maupun dengan operator + (plus) dan += (plus sama dengan). Cobalah kode dibawah ini. Apakah outputnya? 46 class Str3{ public static void main(String [] args){ String str1 = "Monas"; System.out.println(str1); String str2 = "monas"; System.out.println(str2); String str3 = str1 + str2; System.out.println(str3); String str4 = str1.concat(str2); System.out.println(str4); str1 += str2; System.out.println(str1); } } Percobaan 4. Konversi Otomatis (Automatic Conversion) Pada saat kita menggunakan concatenation (penggabungan) antara objek string dengan suatu nilai atau variable yang bertipe primitive (int, char, float, dsbnya) maka secara otomatis data primitif tersebut akan dikonversi menjadi string. Cobalah kode dibawah ini. Apakah outputnya? class Str4{ public static void main(String [] args){ int nilai = 100; nilai = nilai * 2; System.out.println("Angka " + 1 + " adalah angka perta ma bilangan bulat positif"); System.out.println("100 x 2 = " + nilai); } } 47 Percobaan 5. Mengganti Nilai String Sederhana Untuk mengganti nilai text dari String cukup menggunakan method replace dari String. Cobalah kode dibawah ini. Apakah outputnya? class Str5{ public static void main(String [] args){ String nama = "Dora"; nama = nama.replace("Dor", "Ti"); System.out.println(nama); } } E. LATIHAN Latihan 1. Apakah output program dibawah ini? class Str1{ public static void main(String [] args){ String s=new String("Bicycle"); int iBegin=1; char iEnd=3; System.out.println(s.substring(iBegin,iEnd)); } } Latihan 2. Apa yang terjadi bila kode berikut ini dikompile dan dijalankan? Jelaskan! public class Conv{ public static void main(String argv[]){ Conv c = new Conv(); String s = new String("ello"); c.amethod(s); } public void amethod(String s){ char c = 'H'; c += s; System.out.println(c); } } 48 Latihan 3. Apa yang terjadi bila kode berikut ini dikompile dan dijalankan? Jelaskan! public class EqTest3{ public static void main(String argv[]){ EqTest e = new EqTest(); } EqTest(){ String s1 = "Java"; String s2 = "Java"; String s3 = "java"; if(s1 == s2)) { System.out.println("Equal"); }else{ System.out.println("Not equal"); } if(s1 == s3)) { System.out.println("Equal"); }else{ System.out.println("Not equal"); } } } Latihan 4. Apa yang terjadi bila kode berikut ini dikompile dan dijalankan? Jelaskan! public class EqTest4{ public static void main(String argv[]){ EqTest e = new EqTest(); } EqTest(){ String s1 = new String("Java"); String s2 = new String("Java"); String s3 = new String("java"); if(s1 == s2)) { System.out.println("Equal"); }else{ System.out.println("Not equal"); } if(s1 == s3)) { System.out.println("Equal"); }else{ System.out.println("Not equal"); } } } 49 Latihan 5. Apa yang terjadi bila kode berikut ini dikompile dan dijalankan? Jelaskan! public class EqTest5{ public static void main(String argv[]){ EqTest e = new EqTest(); } EqTest(){ String s = "Java"; String s2 = "java"; if(s.equalsIgnoreCase(s2)) { System.out.println("Equal"); }else{ System.out.println("Not equal"); } } } Latihan 6. Apa yang terjadi bila kode berikut ini dikompile dan dijalankan? Jelaskan! public class EqTest6{ public static void main(String argv[]){ String str = "Java"; StringBuffer buffer = new StringBuffer(str); if(str.equals(buffer)){ System.out.println("Both are equal"); } else{ System.out.println("Both are not equal"); } } } Latihan 7. Apa yang terjadi bila kode berikut ini dikompile dan dijalankan? Jelaskan! public class Test { public static void main(String args[]) { String str1="abc"; String str2="def"; String str3=str1.concat(str2); str1.concat(str2); System.out.println(str1); } } 50 F. TUGAS Tugas 1. Buatlah sebuah program yang menampikan indek-indek karakter pada suatu kalimat. Contoh: Input : Output: Kalimat : “Politeknik Elektronika Negeri Surabaya” Karakter : ‘o’ Karakter ‘o’ terdapat pada indek 1, 17 Tugas 2. Desain dan implementasikan program Java yang mampu melakukan beberapa operasi terhadap string “Selamat Datang di PENS” : a. Konversikan semua karakter menjadi huruf kapital dan tampilkan ke layar b. Konversikan semua karakter menjadi huruf kapital dan tampilkan ke layar c. Tampilkan panjang string d. Tampilkan indek kata “PENS” Tugas 3. Buatlah sebuah program yang mengubah huruf pertama suatu string dengan huruf terakhir string tersebut dan sebaliknya! Contoh: String masukan : Amanda Ace String hasil : Emende Eca Program harus bisa berjalan untuk semua inputan string. Tugas 4. Buatlah sebuah program yang menukar family name dari dua buah string. Contoh: Input : String nama pertama : Katy Perry String nama kedua Output : Taylor Swift : String nama pertama : Katy Swift String nama kedua : Taylor Perry Program harus bisa berjalan untuk semua inputan string. 51 Tugas 5. Buatlah sebuah program yang mampu mengganti kata tertentu suatu string. Contoh: Input : String kalimat utama : Praktikum di laboratorium Database String yang diganti : Database String pengganti : Sistem Informasi Output : Kalimat utama menjadi : Praktikum di laboratorium Sistem Informasi Program harus bisa berjalan untuk semua inputan string. H. LAPORAN RESMI Kumpulkan hasil latihan dan tugas di atas. Tambahkan analisa dalam laporan resmi. 52 PRAKTIKUM 7 PENGENALAN PEMROGRAMAN BERBASIS OBYEK A. TUJUAN PEMBELAJARAN 1. Mendeklarasikan suatu class 2. Mendeklarasikan suatu atribut 3. Mendeklarasikan suatu metod 4. Mengakses anggota suatu obyek B. DASAR TEORI Deklarasi class dapat dilakukan dengan sintaks sebagai berikut: <modifier> class <nama_class> { [deklarasi_atribut] [deklarasi_konstruktor] [deklarasi_metode] } Contoh: public class Siswa { … } Deklarasi atribut dapat dilakukan dengan sintaks sebagai berikut: <modifier> <tipe> <nama_atribut> ; Contoh: public class Siswa { public int nrp; 53 public String nama; } Deklarasi metode dapat dilakukan dengan sintaks sebagai berikut: <modifier> <return_type> <nama_metode> ([daftar_argumen]) { [<statement>] } Contoh: public class Siswa { public int nrp; public String nama; public void info() { System.out.println(“Ini siswa PENS”); } } Untuk dapat mengakses anggota-anggota dari suatu obyek, maka harus dibuat instance dari class tersebut terlebih dahulu. Berikut ini adalah contoh pengaksesan anggota-anggota dari class Siswa: public class Siswa { public static void main(String args[]) { Siswa it=new Siswa(); it.nrp=5; it.nama=”Andi”; it.info(); } } C. TUGAS PENDAHULUAN 1. Apakah yang dimaksud dengan kelas, method, atribut dan obyek? 2. Buatlah contoh suatu kelas dan definisikan atribut dan methodnya! 3. Buatlah kode program soal no. 2 diatas! 54 4. Buatlah kelas yang berisi main method yang membuat obyek dari kelas yang telah dibuat di soal no. 3. Selanjutnya obyek tersebut mengakses atribut dan methodnya. D. PERCOBAAN Percobaan 1 : Mengakses anggota suatu class Amati program dibawah ini: public class Siswa { int nrp; public void setNrp(int i) { nrp=i; } } public class Test { public static void main(String args[]) { Siswa anak=new Siswa(); anak.setNrp(5); System.out.println(anak.nrp); } } Percobaan 2 : Mengakses anggota suatu class Amati program dibawah ini: public class Siswa { int nrp; String nama; public void setNrp(int i) { nrp=i; } public void setNama(String i) { nama=i; } } 55 Percobaan 3 : Mengimplementasikan UML class diagram dalam program Berikut adalah sebuah UML class diagram dari suatu kasus: Dari class diagram tersebut, dapat diimplementasikan ke dalam program sebagai berikut: public class Siswa { public int nrp; public Siswa(int i) { nrp=i; } public void setNrp(int i) { nrp=i; } public int getNrp() { return nrp; } } 56 E. LATIHAN Latihan 1 : Mengimplementasikan UML class diagram dalam program untuk class Tabungan. Transformasikan class diagram diatas ke dalam bentuk program. Tulislah listing program berikut ini sebagai pengetesan. public class TesLatihan1{ public static void main(String args[]){ Tabungan tabungan = new Tabungan(5000); System.out.println("Saldo awal : " + tabungan.saldo); tabungan.ambilUang(2300); System.out.println("Jumlah uang yang diambil : 2300"); System.out.println("Saldo sekarang : " + tabungan.saldo); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Saldo awal : 5000 Jumlah uang yang diambil : 2300 Saldo sekarang : 2700 57 Latihan 2 : Mengimplementasikan UML class diagram dalam program untuk class Mahasiswa Transformasikan class diagram diatas ke dalam bentuk program! Tulislah listing program berikut ini sebagai pengetesan. public class TesLatihan2{ public static void main(String args[]){ Mahasiswa mhs = new Mahasiswa(12345, "Jono"); System.out.println("NRP : " + mhs.getNrp()); System.out.println("Nama : " + mhs.getnama()); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. NRP : 12345 Nama : Jono 58 Latihan 3 : Mengimplementasikan UML class diagram dalam program untuk class Truk Transformasikan class diagram diatas ke dalam bentuk program! Tulislah listing program berikut ini sebagai pengetesan. public class TesLatihan3{ public static void main(String args[]){ Truk truk = new Truk(1000); System.out.println("Muatan maksimal = "+truk.getMuatanMaks()); truk.tambahMuatan(500.0); System.out.println("Tambah muatan : 500 "); truk.tambahMuatan(350.0); System.out.println("Tambah muatan : 350 "); truk.tambahMuatan(100.0); System.out.println("Tambah muatan : 100 "); truk.tambahMuatan(150.0); System.out.println("Tambah muatan : 150 "); System.out.println("Muatan sekarang = " + truk.getMuatan()); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Muatan maksimal : 1000.0 Tambah muatan : 500 Tambah muatan : 350 Tambah muatan : 100 Tambah muatan : 150 Muatan sekarang = 950.0 59 F. TUGAS Tugas 1 : Mengimplementasikan UML class diagram dalam program untuk class Tabungan Transformasikan class diagram diatas ke dalam bentuk program! Tulislah listing program berikut ini sebagai pengetesan. public class TesTugas1 { public static void main (String srt[]){ boolean status; Tabungan tabungan = new Tabungan(5000); System.out.println("Saldo awal :"+tabungan.getSaldo()); tabungan.simpanUang(3000); System.out.println("Jumlah uang yang disimpan : 3000"); status = tabungan.ambilUang(6000); System.out.println("Jumlah uang yang diambil : 6000"); if (status) System.out.println("Ok"); else System.out.println("Gagal"); tabungan.simpanUang(3500); System.out.println("Jumlah uang yang disimpan :3500"); status = tabungan.ambilUang(4000); System.out.println("Jumlah uang yang diambil : 4000"); 60 if (status) System.out.println("Ok"); else System.out.println("Gagal"); status = tabungan.ambilUang(1600); System.out.println("Jumlah uang yang diambil : 1600"); if (status) System.out.println("Ok"); else System.out.println("Gagal"); tabungan.simpanUang(2000); System.out.println("Jumlah uang yang disimpan :2000"); System.out.println("Saldo sekarang = " + tabungan.getSaldo()); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Saldo awal : 5000 Jumlah uang yang disimpan : 3000 Jumlah uang yang diambil : 6000 ok Jumlah uang yang disimpan : 3500 Jumlah uang yang diambil : 4000 ok Jumlah uang yang diambil : 1600 gagal Jumlah uang yang disimpan : 2000 Saldo sekarang = 3500 Tugas 2 : Menganalisa, membuat UML class diagram dan implementasi program Seorang pengusaha rental mobil kesulitan mengingat armada kendaraan yang dimilikinya. Oleh karena itu pengusaha tersebut menugaskan pegawainya untuk mengidentifikasi tersebut. Hasil identifikasi dicatat dalam suatu table sebagaimana bisa 61 dilihat pada Tabel 7.1. Sayangnya karena merupakan pegawai baru maka ia tidak memahami nama hal yang diidentifikasi (A,B,C, D, dan E). a. Bantulah pegawai tersebut dalam menentukan nama hal yang diidentifikasi (A,B,C, D, dan E). b. Bantulah pengusaha tersebut dalam membuat UML class diagram Mobil. Tambahkan method infoMobil() yang bertujuan untuk menampilkan semua karakteristik mobil (A,B,C, D, dan E). c. Buatlah kelas Mobil.java yang mengimplementasikan desain UML class diagram anda! d. Buatlah kelas TesMobil.java yang berisi pembuatan 4 (empat) buah obyek bernama mobil1, mobil2, mobil3, mobil4. Mengeset karakteristik masing-masing dan menampilkan info karakteristik mobil. Tabel 7.1. Data karakteristik mobil Obyek A B Biru C D E minibus 2000 7 mobil1 Toyota mobil2 Daihatsu Hitam pick up 1500 2 mobil3 Suzuki Silver suv 1800 5 mobil4 Honda Merah sedan 1300 5 H. LAPORAN RESMI Kumpulkan hasil latihan dan tugas di atas. Tambahkan analisa dalam laporan resmi. 62 PRAKTIKUM 8 ENKAPSULASI A. TUJUAN PEMBELAJARAN 1. Menerapkan konsep enkapsulasi pada class 2. Mendeklarasikan suatu constructor B. DASAR TEORI Kita dapat menyembunyikan information dari suatu class sehingga anggotaanggota class tersebut tidak dapat diakses dari luar. Adapun caranya adalah cukup dengan memberikan akses kontrol private ketika mendeklarasikan suatu atribut atau method. Contoh: private int nrp; Encapsulation (Enkapsulasi) adalah suatu cara untuk menyembunyikan implementasi detail dari suatu class. Enkapsulasi mempunyai dua hal mendasar, yaitu : 1. information hiding 2. menyediakan suatu perantara (method) untuk pengaksesan data Contoh: public class Siswa { private int nrp; public void setNrp(int n) { nrp=n; } } Contructor (konstruktor) adalah suatu method yang pertama kali dijalankan pada 63 saat pembuatan suatu obyek. Konstruktor mempunyai ciri yaitu : 1. mempunyai nama yang sama dengan nama class 2. tidak mempunyai return type (seperti void, int, double dll) Contoh: public class Siswa { private int nrp; private String nama; public Siswa(int n, String m) { nrp=n; nama=m; } } Suatu class dapat mempunyai lebih dari 1 konstruktor dengan syarat daftar parameternya tidak boleh ada yang sama. Contoh : public class Siswa { private int nrp; private String nama; public Siswa(String m) { nrp=0; nama=””; } public Siswa(int n, String m) { nrp=n; nama=m; } } C. TUGAS PENDAHULUAN 1. Apakah yang dimaksud dengan enkapsulasi? 2. Apakah yang dimaksud dengan constructor? 2. Apakah yang dimaksud dengan overloading constructor? 64 D. PERCOBAAN Percobaan 1 : Melakukan enkapsulasi pada suatu class Implementasikan UML class diagram Mahasiswa sebelum dan setelah dilakukan enkapsulasi! Jika enkapsulasi dilakukan pada class diagram diatas, maka akan berubah menjadi: Percobaan 2 : Melakukan overloading constructor Dari class diagram tersebut, dapat diimplementasikan ke dalam program sebagai berikut: public class Mahasiswa { private int nrp; 65 private String nama; public Mahasiswa() { nrp=0; nama=””; } public Mahasiswa(String nama) { nrp=0; this.nama=nama; } public Mahasiswa(int nrp, String nama) { this.nrp=nrp; this.nama=nama; } } E. LATIHAN Latihan 1: Mengimplementasikan UML class diagram dalam program untuk class Kalender Dari class diagram diatas, desainlah suatu class yang memenuhi konsep enkapsulasi. Untuk nilai inisialisasi, dipakai 1-1-2000. Pakailah kata kunci this untuk mempersingkat pengkodean. Tulislah listing program berikut ini sebagai pengetesan. 66 public class TesKalender { public static String getTime(Kalender kal) { String tmp; tmp = kal.getTanggal() + "-" + kal.getBulan() + "-" + kal.getTahun(); return tmp; } public static void main(String args[]) { Kalender kal = new Kalender(8); System.out.println("Waktu awal : " + getTime(kal)); kal.setTanggal(9); System.out.println("1 hari setelah waktu awal : "+getTime(kal)); kal = new Kalender(6, 2003); System.out.println("Waktu berubah : " + getTime(kal)); kal.setBulan(7); System.out.println("1 bulan setelah itu : " + getTime(kal)); kal = new Kalender(20, 10, 2004); System.out.println("Waktu berubah : " + getTime(kal)); kal.setTahun(2005); System.out.println("1 tahun setelah itu : " + getTime(kal)); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda. Waktu awal : 8-1-2000 1 hari setelah waktu awal : 9-1-2000 Waktu berubah : 1-6-2003 1 bulan setelah itu : 1-7-2003 Waktu berubah : 20-10-2004 1 tahun setelah itu : 20-10-2005 67 Latihan 2 : Mengimplementasikan UML class diagram dalam program untuk class Truk Keterangan : 1 kilogram = 9,8 newtons Transformasikan class diagram diatas ke dalam bentuk program! Tulislah listing program berikut ini sebagai pengetesan. public class TesTugas2{ public static void main(String args[]){ boolean status; Truk truk = new Truk(900); System.out.println("Muatan maksimal = "+truk.getMuatanMaks()); status = truk.tambahMuatan(500.0); System.out.println("Tambah muatan : 500"); if (status) System.out.println("Ok"); else System.out.println("Gagal"); status = truk.tambahMuatan(300.0); System.out.println("Tambah muatan : 300"); if (status) System.out.println("Ok"); 68 else System.out.println("Gagal"); status = truk.tambahMuatan(150.0); System.out.println("Tambah muatan : 150"); if (status) System.out.println("Ok"); else System.out.println("Gagal"); status = truk.tambahMuatan(50.0); System.out.println("Tambah muatan : 50"); if (status) System.out.println("Ok"); else System.out.println("Gagal"); System.out.println("Muatan sekarang = " + truk.getMuatan()); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Muatan Tambah Tambah Tambah Tambah Muatan maksimal muatan : muatan : muatan : muatan : sekarang : 900.0 500 ok 300 ok 150 gagal 50 ok = 849.9999999999999 F. TUGAS Tugas 1. Menerapkan konsep enkapsulasi pada kelas Tabungan yang terdapat di Tugas 1. Bab 7. Pengenalan Pemrograman Berbasis Obyek. 69 Kembangkan kelas Tabungan diatas sehingga memungkinkan pengguna untuk memilih satuan mata uang yang berbeda (USD, AUD, IDR) ketika mengambil atau menyimpan uang. Saldo tabungan disimpan dalam satuan IDR oleh sistem. Beri nama kelas anda dengan nama MultiTabungan.java. Diasumsikan bahwa: 1 AUD = 10.000 IDR 1 USD = 9.000 IDR Buat kelas baru untuk mengetes kelas MultiTabungan yang anda buat! G. LAPORAN RESMI Kumpulkan hasil latihan dan tugas di atas. Tambahkan analisa dalam laporan resmi. 70 PRAKTIKUM 9 MENGELOLA KELAS A. TUJUAN PEMBELAJARAN 1. Memahami konsep package dan import 2. Menggunakan kata kunci this B. DASAR TEORI Package adalah suatu cara untuk memenej class-class yang kita buat. Package akan sangat bermanfaat jika class-class yang kita buat sangat banyak sehingga perlu dikelompokkan berdasarkan kategori tertentu. Contoh: package it; package telkom; public class Siswa { public class Siswa { … … Yang perlu kita perhatikan pada saat deklarasikan package, bahwa class tersebut harus disimpan pada suatu direktori yang sama dengan nama package-nya. Suatu class dapat meng-import class lainnya sesuai dengan nama package yang dipunyainya. Contoh: import it.Siswa; public class IsiData { … } Satu hal yang perlu kita ketahui, pada saat kita ingin meng-import suatu class dalam suatu package, pastikan letak package tersebut satu direktori dengan class yang ingin meng-import. Kata kunci this sangat berguna untuk menunjukkan suatu member dalam classnya sendiri. This dapat digunakan baik untuk data member maupun untuk function 71 member, serta dapat juga digunakan untuk konstruktor. Adapun format penulisannya adalah: this.data_member merujuk pada data member this.function_member() merujuk pada function member this() merujuk pada konstruktor Contoh: class Parent { public int x = 5; } class Child extends Parent { public int x = 10; public void Info() { System.out.println(super.x); } } Ketika kita memakai konsep inheritance, maka yang harus kita ketahui adalah konstruktor dari parent class tidak dapat diwariskan ke subclass-nya. Sebagai konsekuensinya adalah setiap kali kita membuat suatu subclass, maka kita harus memanggil konstruktor parent class di konstruktor subclass. Jika kita tidak mendeklarasikannya secara eksplisit, maka kompiler Java akan menambahkan deklarasi pemanggilan kontruktor parent class di konstruktor subclass. C. TUGAS PENDAHULUAN 1. Apakah yang dimaksud dengan package? 2. Apakah kegunaan kata kunci import? 3. Apakah kegunaan kata kunci this? 72 D. PERCOBAAN Percobaan 1 : Menggunakan kata kunci this Dari class diagram tersebut, dapat diimplementasikan ke dalam program sebagai berikut: public class Mahasiswa { public int nrp; public String nama; public Mahasiswa(int nrp, String nama) { this.nrp=nrp; this.nama=nama; } } Percobaan 2 : Memakai kata kunci this pada overloading constructor Dari class diagram tersebut, dapat diimplementasikan ke dalam program sebagai berikut: 73 public class Mahasiswa { private int nrp; private String nama; public Mahasiswa() { this(0,””); } public Mahasiswa(String nama) { this(0,nama); } public Mahasiswa(int nrp, String nama) { this.nrp=nrp; this.nama=nama; } } Percobaan 3 : Menggunakan package dan import 74 Dari class diagram tersebut, dapat diimplementasikan ke dalam program dibawah ini. Sebelum melakukan kompilasi, daftarkan direktori tempat package diatas disimpan. package sekolah; package sekolah; public class Kelas { public class Mahasiswa { private int kodekelas; private int nrp; private String namakelas; private String nama; private Mahasiswa mahasiswa; public Mahasiswa(int nrp, public Kelas(int kode, String nama) { String nama) { this.nrp=nrp; this.kodekelas=kode; this.nama=nama; this.namakelas=nama; } } } public void setMhs (Mahasiswa mhs) { this.mahasiswa=mhs; } } 75 E. LATIHAN Latihan 1: Mengimplementasikan UML class diagram dalam program untuk package perbankan import perbankan.*; public class TesLatihan { public static void main(String[] args) { int tmp; boolean status; Nasabah nasabah = new Nasabah("Agus","Daryanto"); System.out.println("Nasabah atas nama "+nasabah.getNamaAwal()+nasabah.getNamaAkhir()); nasabah.setTabungan(new Tabungan (5000)); tmp = nasabah.getTabungan().getSaldo(); System.out.println("Saldo awal : "+tmp); nasabah.getTabungan().simpanUang(3000); System.out.println("Jumlah uang yang disimpan 3000"); status=nasabah.getTabungan().ambilUang(6000); 76 System.out.println("Jumlah uang yang diambil 6000"); if(status) System.out.println(" OK"); else System.out.println(" Gagal"); nasabah.getTabungan().simpanUang(3500); System.out.println("Jumlah uang yang disimpan 3500"); status=nasabah.getTabungan().ambilUang(4000); System.out.println("Jumlah uang yang diambil 4000"); if(status) System.out.println(" OK"); else System.out.println(" Gagal"); status=nasabah.getTabungan().ambilUang(1600); System.out.println("Jumlah uang yang diambil 1600"); if(status) System.out.println(" OK"); else System.out.println(" Gagal"); nasabah.getTabungan().simpanUang(2000); System.out.println("Jumlah uang yang disimpan 2000"); tmp=nasabah.getTabungan().getSaldo(); System.out.println("Saldo sekarang = "+tmp); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. 77 Nasabah atas nama : Agus Daryanto Saldo awal : 5000 Jumlah uang yang disimpan : 3000 Jumlah uang yang diambil : 6000 ok Jumlah uang yang disimpan : 3500 Jumlah uang yang diambil : 4000 ok Jumlah uang yang diambil : 1600 gagal Jumlah uang yang disimpan : 2000 Saldo sekarang = 3500 F. TUGAS Tugas 1 : Perhatikan program dibawah ini. Apa yang terjadi bila dikompile dan dijalankan? Jelaskan jawaban anda! public class Pegawai{ int nip; String nama; public Pegawai(int nip_pegawai){ this(nip_pegawai,”NoName“); } public Pegawai(int nip_pegawai, String nama_pegawai){ this.nip = nip_pegawai; this.nama = nama_pegawai; } } 78 Tugas 2. Mengembangkan package perbankan dengan tambahan class Bank Transformasikan class diagram diatas ke dalam bentuk program! Tulislah listing program berikut ini sebagai pengetesan. import perbankan.*; public class TesTugas { public static void main(String arg []){ Bank bank = new Bank(); bank.tambahNasabah("Agus", "Daryanto"); bank.getNasabah(0).setTabungan(new Tabungan(5000)); bank.tambahNasabah("Tuti", "Irawan"); bank.getNasabah(1).setTabungan(new Tabungan(7000)); bank.tambahNasabah("Ani", "Ratna"); bank.getNasabah(2).setTabungan(new Tabungan(4000)); bank.tambahNasabah("Bambang", "Darmawan"); bank.getNasabah(3).setTabungan(new Tabungan(6500) ); System.out.println("Jumlah Nasabah = "+ 79 bank.getJumlahNasabah()); for(int i =0; i<bank.getJumlahNasabah(); i++){ System.out.println("Nasabah ke-" + (i+1) + " : " + bank.getNasabah(i).getNamaAwal() + " " + bank.getNasabah(i).getNamaAkhir() + " ; Saldo = " + bank.getNasabah(i).getTabungan().getSaldo()); } } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Jumlah nasabah = 4 Nasabah ke-1 : Agus Daryanto ; Saldo = 5000 Nasabah ke-2 : Tuti Irawan ; Saldo = 7000 Nasabah ke-3 : Ani Ratna ; Saldo = 4000 Nasabah ke-4 : Bambang Darwaman ; Saldo = 6500 G. LAPORAN RESMI Kumpulkan hasil latihan dan tugas di atas. Tambahkan analisa dalam laporan resmi. 80 PRAKTIKUM 10 INHERITANCE 1 A. TUJUAN PEMBELAJARAN 1. Memahami dan menerapkan konsep inheritance dalam pemrograman 2. Memahami pengaksesan member pada parent class 3. Memahami konsep single inheritance 4. Memahami konsep multi level inheritance B. DASAR TEORI Konsep inheritance ini mengadopsi dunia riil dimana suatu entitas/obyek dapat mempunyai entitas/obyek turunan. Dengan konsep inheritance, sebuah class dapat mempunyai class turunan. Suatu class yang mempunyai class turunan dinamakan parent class atau base class. Sedangkan class turunan itu sendiri seringkali disebut subclass atau child class. Suatu subclass dapat mewarisi apa-apa yang dipunyai oleh parent classnya, sehingga member dari suatu subclass adalah terdiri dari apa-apa yang ia punyai dan juga apa-apa yang ia warisi dari class parent-nya. Kesimpulannya, boleh dikatakan bahwa suatu subclass adalah tidak lain hanya memperluas (extend) parent class-nya. Di dalam Java untuk mendeklarasikan suatu class sebagai subclass dilakukan dengan cara menambahkan kata kunci extends setelah deklarasi nama class, kemudian diikuti dengan nama parent class-nya. Kata kunci extends tersebut memberitahu kompiler Java bahwa kita ingin melakukan perluasan class. Berikut adalah contoh deklarasi inheritance. Contoh: public class B extends A { ... } 81 Contoh diatas memberitahukan kompiler Java bahwa kita ingin meng-extend class A ke class B. Dengan kata lain, class B adalah subclass (class turunan) dari class A, sedangkan class A adalah parent class dari class B. Java hanya memperkenankan adanya single inheritance. Konsep single inheritance hanya memperbolehkan suatu sublass mempunyai satu parent class. Dengan konsep single inheritance ini, masalah pewarisan akan dapat diamati dengan mudah. Konsep single inheritance bisa dilihat pada Gambar 11.1. Pada gambar tersebut bisa dilihat bahwa tiap class pasti memiliki hanya satu perant class. Java mengijinkan suatu sub class untuk memiliki anak lagi. Hal ini disebut dengan konsep multi level inheritance. Contohnya class Kendaraan memiliki class anak yaitu Bermotor, dan class Bermotor memiliki class anak lagi yaitu Mobil dan Pesawat. Kendaraan Tidak Bermomotor Bermotor Mobil Pesawat Delman Andong Becak Gambar 11.1 Gambaran konsep single dan multi level inheritance Dalam konsep dasar inheritance dikatakan bahwa suatu subclass adalah tidak lain hanya memperluas (extend) parent class-nya. Contoh : public class Pegawai { public String nama; public double gaji; public class Manajer extends Pegawai { public String departemen; } 82 Pada saat class Manajer menurunkan atau memperluas (extend) class Pegawai, maka ia mewarisi data member yang dipunyai oleh class Pegawai. Dengan demikian, class Manajer mempunyai data member yang diwarisi oleh Pegawai (nama, gaji), ditambah dengan data member yang ia punyai (departemen). Pengaksesan member yang ada di parent class dari subclass-nya tidak jauh berbeda dengan pengaksesan member subclass itu sendiri. Contoh: public class Manajer extends Pegawai { public String departemen; public void IsiData(String n, String d) { nama = n; departemen = d; } } C. TUGAS PENDAHULUAN 1. Apa yang dimaksud dengan inheritance? 2. Buatlah contoh kasus yang menerapkan konsep inheritance ! 3. Adakah perbedaan cara mengakses member class milik parent dan member class milik sendiri? Jelaskan melalui contoh ! (Silahkan memanfaatkan jawaban soal nomor 2.) 4. Apa yang dimaksud dengan konsep single inheritance ? 5. Apa yang dimaksud dengan konsep multi level inheritance ? D. PERCOBAAN Penyembunyian informasi Buatlah class Pegawai seperti dibawah ini: public class Pegawai { private String nama; public double gaji; } 83 Kemudian buatlah class Manajer seperti ini dibawah ini. public class Manajer extends Pegawai { public String departemen; public void IsiData(String n, String d) { nama=n; departemen=d; } } Sekarang cobalah untuk mengkompilasi class Manajer diatas. Apa yang terjadi?. Pesan kesalahan akan muncul seperti ini: Manajer.java:5: nama has private access in Pegawai nama=n; Ini membuktikan bahwa class Manajer tidak mewarisi data member nama dari parent class-nya (Pegawai). E. LATIHAN Latihan 1. Tempatkan class Base dan class Class1 di direktori yang sama. Apa yang terjadi ketika Class1.java dikompile dan dijalankan jika sebelumnya Base.java belum dikompile? Jelaskan ! //Base.java package Base; class Base{ protected void amethod(){ System.out.println("amethod"); }//End of amethod }//End of class base 84 package Class1; //Class1.java public class Class1 extends Base{ public static void main(String argv[]){ Base b = new Base(); b.amethod(); }//End of main }//End of Class1 Latihan 2. Aturan overriding a. Berdasarkan kode di bawah ini, akses modifier (public, protected atau private) apa yang diijinkan di tambahkan sebelum myMethod() baris 3? b. Jika baris 3 seperti kode di bawah (apa adanya tanpa perubahan) keywords apa yang diijinkan ditambahkan sebelum myMethod baris 8? 1. 2. 3. 4. 5. 6. 7. 8. 9. class HumptyDumpty { void myMethod() {} } class HankyPanky extends HumptyDumpty { void myMethod() {} } Latihan 3. a. Apa yang terjadi bila kedua kode dibawah ini dikompile dan dijalankan dalam satu direktori? Jelaskan ! b. Bagaimana solusi supaya tidak terjadi error? //File P1.java package MyPackage; class P1{ void aFancyMethod(){ System.out.println("What a fancy method"); } } //File P2.java public class P2 extends P1{ public static void main(String argv[]){ P2 p2 = new P2(); p2.aFancyMethod(); } } 85 Latihan 4. Mengimplementasikan UML class diagram dalam program untuk package perbankan Ubahlah mode akses atribut saldo pada Tabungan menjadi protected. Lalu Transformasikan class diagram diatas ke dalam bentuk program! Tulislah listing program berikut ini sebagai pengetesan. import perbankan.*; public class TesLatihan{ public static void main(String args[]){ PenyimpananUang tabungan = new PenyimpananUang(5000, 8.5/100); System.out.println("Uang yang ditabung : 5000"); System.out.println("Tingkat bunga sekarang : 8.5%"); System.out.println("Total uang anda sekarang : " + tabungan.cekUang()); } } 86 Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Uang yang ditabung : 5000 Tingkat bunga sekarang : 8.5% Total uang anda sekarang : 5425.0 F. TUGAS Mengimplementasikan UML class diagram dalam program untuk package perbankan Transformasikan class diagram diatas ke dalam bentuk program! Tulislah listing program berikut ini sebagai pengetesan. import perbankan.*; public class TesTugas{ public static void main(String args[]){ 87 PengambilanUang tabungan = new PengambilanUang(5000, 1000); System.out.println("Uang yang ditabung : 5000"); System.out.println("Uang yang diproteksi : 1000"); System.out.println("-----------------------------"); System.out.println("Uang yang akan diambil : 4500 " + tabungan.ambilUang(4500)); System.out.println("Saldo sekarang : " + tabungan.getSaldo()); System.out.println("-----------------------------"); System.out.println("Uang yang akan diambil : 2500 " + tabungan.ambilUang(2500)); System.out.println("Saldo sekarang : " + tabungan.getSaldo()); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Uang yang ditabung : 5000 Uang yang diproteksi : 1000 ----------------Uang yang akan diambil : 4500 false Saldo sekarang : 5000 ----------------Uang yang akan diambil : 2500 true Saldo sekarang : 2500 G. LAPORAN RESMI Kumpulkan hasil latihan dan tugas di atas. Tambahkan analisa dalam laporan resmi. 88 PRAKTIKUM 11 INHERITANCE 2 A. TUJUAN PEMBELAJARAN 1. Melakukan pengontrolan akses pada pengkodean 2. Menggunakan kata kunci super 3. Menghindari kesalahan pada pewarisan konstruktor B. DASAR TEORI Suatu parent class dapat tidak mewariskan sebagian member-nya kepada subclass-nya. Sejauh mana suatu member dapat diwariskan ke class lain, ataupun suatu member dapat diakses dari class lain, sangat berhubungan dengan access control (kontrol pengaksesan). Di dalam java, kontrol pengaksesan dapat digambarkan dalam Tabel 9.1. Tabel 9.1. Akses modifier Modifier class package yang sama yang sama subclass class manapun private √ default √ √ protected √ √ √ public √ √ √ √ Kata kunci super dipakai untuk merujuk pada member dari parent class, sebagaimana kata kunci this yang dipakai untuk merujuk pada member dari class itu sendiri. Adapun format penulisannya adalah sebagai berikut: super.data_member merujuk pada data member pada parent class super.function_member() merujuk pada function member pada parent class 89 super() merujuk pada konstruktor pada parent class Dalam inheritance, member kelas yang diwariskan hanyalah variabel dan method saja. Sedangkan konstruktorparent class tidak diwariskan ke sub class. Tetapi ketika suatu obyek anak dibuat dalam artian ketika konstruktor anak dijalankan maka konstruktor parent class dijalankan terlebih dahulu dan selanjutnya menyelesaikan konstruktor anak. C. TUGAS PENDAHULUAN 1. Ada berapa modifier untuk pengontrolan akses? Jelaskan masing-masing! 2. Apakah kegunaan kata kunci super? Jelaskan ! 3. Apakah yang dimaksud dengan konstruktor tidak diwariskan? D. PERCOBAAN Percobaan 1 : Menggunakan kata kunci super Berikut ini listing penggunaan kata kunci super. class Parent { public int x = 5; } class Child extends Parent { public int x = 10; public void Info(int x) { System.out.println("Nilai x sebagai parameter = " + x); System.out.println("Data member x di class Child = " + this.x); System.out.println("Data member x di class Parent = " + super.x); } } public class NilaiX { public static void main(String args[]) { Child tes = new Child(); tes.Info(20); } 90 } Ketika program tersebut dijalankan, akan tampak hasil seperti dibawah ini : Nilai x sebagai parameter = 20 Data member x di class Child = 10 Data member x di class Parent = 5 Percobaan 2 : Konstruktor tidak diwariskan Buatlah class kosong bernama Parent seperti dibawah: public class Parent { } Buatlah class Child yang menurunkan class Parent seperti dibawah ini: public class Child extends Parent { int x; public Child() { x = 5; super(); } } Lakukan kompilasi pada Child diatas. Apa yang terjadi?. Pasti disana terjadi error. Sekarang ubahlah sedikit class Child diatas seperti dibawah ini: public class Child extends Parent { int x; public Child() { super(); x = 5; } } 91 Setelah dikompilasi, anda tidak mendapatkan error sebagaimana yang sebelumnya. Ini yang harus kita perhatikan bahwa untuk pemanggilan konstruktor parent class, kita harus melakukan pemanggilan tersebut di baris pertama pada konstruktor subclass. E. LATIHAN Latihan 1. Konstruktor tidak diwariskan Buatlah class berikut ini class Base{ Base(int i){ System.out.println("base constructor"); } Base(){ } } public class Sup extends Base{ public static void main(String argv[]){ Sup s= new Sup(); //baris 1 } Sup(){ // baris 2 } public void derived(){ // baris 3 } } Modifikasilah class Sup (di bagian //baris 1, //baris 2 atau //baris 3) sedemikian hingga konstruktor kelas Base (konstruktor Base(int i)) dipanggil dan menampilkan string “base constructor” ke layar! 92 Latihan 2. Konstruktor tidak diwariskan private class Base{ Base(){ int i = 100; System.out.println(i); } } public class Pri extends Base{ static int i = 200; public static void main(String argv[]){ Pri p = new Pri(); System.out.println(i); } } Kompile dan jalankan program diatas! Apa yang terjadi? Jelaskan ! Latihan 3. Apa yang tampil di layar bila kode dibawah ini dijalankan? class X{ Y b = new Y(); X(){ System.out.print("X"); } } class Y{ Y(){ System.out.print("Y"); } } public class Z extends X{ Y y = new Y(); Z(){ System.out.print("Z"); } public static void main(String[] args){ new Z(); } } 93 Latihan 4. Kompile dan jalankan program berikut! Apa yang terjadi? Jelaskan ! public class Hope{ public static void main(String argv[]){ Hope h = new Hope(); } protected Hope(){ for(int i =0; i <10; i ++){ System.out.println(i); } } } F. TUGAS Mengimplementasikan UML class diagram dalam program. a. Buatlah kelas-kelas berdasarkan UML class diagram dibawah ini! 94 b. Selanjutnya buatlah kelas Tes.java yang membuat obyek-obyek serta mengeset nilai variabel seperti pada Tabel 9.2.dan tampilkan data per obyek. Tabel 9.2. Data obyek Obyek truk1 truk2 jmlRoda warna 4 kuning 6 merah taksi1 taksi1 4 oranye 4 biru sepeda1 sepeda2 3 hitam 2 putih bahanBakar kapasitasMesin muatanMaks solar 1500 1000 solar 2000 5000 tarifAwal tarifPerKm bensin 1500 10000 5000 bensin 1300 7000 3500 jmlSadel jmlGir 1 2 2 5 G. LAPORAN RESMI Kumpulkan hasil latihan dan tugas di atas. Tambahkan analisa dalam laporan resmi. 95 PRAKTIKUM 12 OVERLOADING DAN OVERRIDING A. TUJUAN PEMBELAJARAN 1. Memahami tentang overloading 2. Memahami tentang overriding 3. Memahami aturan tentang overridden B. DASAR TEORI Overloading adalah suatu keadaan dimana beberapa method sekaligus dapat mempunyai nama yang sama, akan tetapi mempunyai fungsionalitas yang berbeda. Contoh penggunaan overloading dilihat dibawah ini: Gambar(int t1) 1 parameter titik, untuk menggambar titik Gambar(int t1,int t2) 2 parameter titik, untuk menggambar garis Gambar(int t1,int t2,int t3)3 parameter titik, untuk menggambar segitiga Gambar(int t1,int t2,int t3,int t4)4 parameter titik, untuk menggambar persegi empat Overloading ini dapat terjadi pada class yang sama atau pada suatu parent class dan subclass-nya. Overloading mempunyai ciri-ciri sebagai berikut: 1. Nama method harus sama 2. Daftar parameter harus berbeda 3. Return type boleh sama, juga boleh berbeda Overriding adalah suatu keadaan dimana method pada subclass menolak method pada parent class-nya. Overriding mempunyai ciri-ciri sebagai berikut : 1. Nama method harus sama 2. Daftar parameter harus sama 96 3. Return type harus sama Berikut ini contoh terjadinya overriding dimana method Info() pada class Child mengoverride method Info() pada class parent: class Parent { public void Info() { System.out.println(“Ini class Parent”); } } class Child extends Parent { public void Info() { System.out.println(“Ini class Child”); } } Method yang terkena override (overridden method) diharuskan tidak boleh mempunyai modifier yang lebih luas aksesnya dari method yang meng-override (overriding method). C. TUGAS PENDAHULUAN 1. Memahami tentang overloading 2. Memahami tentang overriding 3. Memahami aturan tentang overridden D. PERCOBAAN Melakukan overloading pada method Tulislah listing program berikut ini dan amati yang terjadi pada saat terjadinya overloading pada method. import java.awt.Point; public class Segiempat { int x1 = 0; 97 int y1 = 0; int x2 = 0; int y2 = 0; public void buatSegiempat(int x1, int y1, int x2, int y2) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; } public void buatSegiempat(Point topLeft, Point bottomRight) { x1 = topLeft.x; y1 = topLeft.y; x2 = bottomRight.x; y2 = bottomRight.y; } public void buatSegiempat(Point topLeft, int w, int h) { x1 = topLeft.x; y1 = topLeft.y; x2 = (x1 + w); y2 = (y1 + h); } void cetakSegiempat(){ System.out.print("Segiempat: <" + x1 + ", " + y1); System.out.println(", " + x2 + ", " + y2 + ">"); } public static void main(String[] arguments) { Segiempat rect = new Segiempat(); System.out.println("Buat segiempat dengan koordinat (25,25) dan (50,50)"); rect.buatSegiempat(25, 25, 50, 50); rect.cetakSegiempat(); System.out.println(); System.out.println("Buat segiempat dengan point (10,10) dan 98 point (20,20):"); rect.buatSegiempat(new Point(10,10), new Point(20,20)); rect.cetakSegiempat(); System.out.println(); System.out.print("Buat segiempat dengan 1 point (10,10), koodinat (50,50)"); rect.buatSegiempat(new Point(10,10), 50, 50); rect.cetakSegiempat(); } } E. LATIHAN Latihan 1. Overriding Apa yang terjadi bila program berikut ini dikompile dan dijalankan? Jelaskan ! class Base{ private void amethod(int iBase){ System.out.println("Base.amethod"); } } class Over extends Base{ public static void main(String argv[]){ Over o = new Over(); int iBase=0; o.amethod(iBase); } public void amethod(int iOver){ System.out.println("Over.amethod"); } } Latihan 2. Overloading Apa yang terjadi bila program berikut ini dikompile dan dijalankan? Jelaskan ! 99 class MyParent { int x, y; MyParent(int x, int y){ this.x = x; this.y = y; } public int addMe(int x, int y){ return this.x + x + y + this.y; } public int addMe(MyParent myPar){ return addMe(myPar.x, myPar.y); } } class MyChild extends MyParent{ int z; MyChild (int x, int y, int z) { super(x,y); this.z = z; } public int addMe(int x, int y, int z){ return this.x + x + this.y + y + this.z + z; } public int addMe(MyChild myChi){ return addMe(myChi.x, myChi.y, myChi.z); } public int addMe(int x, int y){ return this.x + x + this.y + y; } } public class MySomeOne{ public static void main(String args[]) MyChild myChi = new MyChild(10, 20, 30); MyParent myPar = new MyParent(10, 20); int x = myChi.addMe(10, 20, 30); int y = myChi.addMe(myChi); int z = myPar.addMe(myPar); System.out.println(x + y + z); } } { 100 Latihan 3. Overloading Apa yang terjadi bila program berikut ini dikompile dan dijalankan? Jelaskan ! class MyClass{ void myMethod(int i) { System.out.println("int version"); } void myMethod(String s) { System.out.println("String version"); } public static void main(String args[]){ MyClass obj = new MyClass(); char ch = 'c'; obj.myMethod(ch); } } Latihan 4. Mengimplementasikan UML class diagram dalam program 101 Transformasikan class diagram diatas ke dalam bentuk program? Tulislah listing program berikut ini sebagai pengetesan. public class TesLatihan{ public static void main(String args[]){ System.out.println("Memasukkan identitas dosen 1 : Agus"); Dosen dosen1 = new Dosen("Agus"); System.out.println("Memasukkan identitas dosen 2 : Budi, NIP. 1458"); Dosen dosen2 = new Dosen("Budi", 1458); System.out.println("Memasukkan identitas dosen 3 : Iwan, NIP. 1215, umur 47"); Dosen dosen3 = new Dosen("Iwan", 1215, 47); System.out.println(); dosen1.Info(); System.out.println(); dosen2.Info(); System.out.println(); dosen3.Info(); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Masukkan identitas dosen 1 : Agus Masukkan identitas dosen 2 : Budi, NIP. 1458 Masukkan identitas dosen 3 : Iwan, NIP. 1215, umur 47 Nama : Agus NIP : Umur : Nama : Budi NIP : 1458 Umur : Nama : Iwan NIP : 1215 Umur : 47 102 F. TUGAS Tugas 1: Mengimplementasikan UML class diagram dalam program RerataNilai + int average(int, int) + double average(double, double) + int average(int, int, int) Transformasikan class diagram diatas ke dalam bentuk program? Tulislah listing program berikut ini sebagai pengetesan public class TesTugas1{ public static void main(String args[]){ RerataNilai rn = new RerataNilai(); System.out.println("Rerata nilai 21 dan 13 adalah : " + rn.average(21, 13)); System.out.println("Rerata nilai 19.3 dan 39.5 adalah : " + rn.average(19.3, 39.5)); System.out.println("Rerata nilai 123, 567 dan 744 adalah : " + rn.average(123, 567, 744)); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti dibawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Rerata nilai 21 dan 13 adalah : 27 Rerata nilai 19.3 dan 39.5 adalah : 39.05 Rerata nilai 123, 567 dan 744 adalah : 938 103 Tugas 2: Mengimplementasikan UML class diagram dalam program Katak umur : int nama : String + Katak(int, String) + String caraBergerak() Kecebong panjangEkor : double + Kecebong(int, String, double) Transformasikan class diagram diatas ke dalam bentuk program? Buatlah TesTugas2.java yang membuat obyek dengan karakteristik sebagaimana Tabel 13.1. Selanjutnya tampilkan informasi nama, umur dan cara bergerak obyek-obyek tersebut! Tabel 13.1 Karakteristik obyek Obyek umur nama panjangEkor caraBergerak O1 5 Froggy melompat O2 2 Junior Frog 10 berenang G. LAPORAN RESMI Kumpulkan hasil latihan dan tugas di atas. Tambahkan analisa dalam laporan resmi. 104 PRAKTIKUM 13 POLIMORFISME A. TUJUAN PEMBELAJARAN 1. Memahami dan menerapkan konsep polimorfisme dalam pemrograman 2. Memahami proses terjadinya Virtual Method Invocation 3. Memahami dan menerapkan polymorphic arguments dalam pemrograman 4. Memahami penggunaan instanceof dan cara melakukan casting object B. DASAR TEORI Polymorphism (polimorfisme) adalah kemampuan untuk mempunyai beberapa bentuk class yang berbeda. Polimorfisme ini terjadi pada saat suatu obyek bertipe parent class, akan tetapi pemanggilan constructornya melalui subclass. Misalnya deklarasi pernyataan berikut ini: Employee employee=new Manager(); dimana Manager() adalah kontruktor pada class Manager yang merupakan subclass dari class Employee. Virtual Method Invocation (VMI) bisa terjadi jika terjadi polimorfisme dan overriding. Pada saat obyek yang sudah dibuat tersebut memanggil overridden method pada parent class, kompiler Java akan melakukan invocation (pemanggilan) terhadap overriding method pada subclass, dimana yang seharusnya dipanggil adalah overridden method. Berikut contoh terjadinya VMI: class Parent { int x = 5; public void Info() { 105 System.out.println(“Ini class Parent”); } } class Child extends Parent { int x = 10; public void Info() { System.out.println(“Ini class Child”); } } public class Tes { public static void main(String args[]) { Parent tes=new Child(); System.out.println(“Nilai x = “ + tes.x); tes.Info(); } } Hasil dari running program diatas adalah sebagai berikut: Nilai x = 5 Ini class Child Polymorphic arguments adalah tipe suatu parameter yang menerima suatu nilai yang bertipe subclass-nya. Berikut contoh dari polymorphics arguments: class Pegawai { … } class Manajer extends Pegawai { … } public class Tes { public static void Proses(Pegawai peg) { … 106 } public static void main(String args[]) { Manajer man = new Manajer(); Proses(man); } } Pernyataan instanceof sangat berguna untuk mengetahui tipe asal dari suatu polymorphic arguments. Untuk lebih jelasnya, misalnya dari contoh program sebelumnya, kita sedikit membuat modifikasi pada class Tes dan ditambah sebuah class baru Kurir, seperti yang tampak dibawah ini: … class Kurir extends Pegawai { … } public class Tes { public static void Proses(Pegawai peg) { if (peg instanceof Manajer) { …lakukan tugas-tugas manajer… } else if (peg instanceof Kurir) { …lakukan tugas-tugas kurir… } else { …lakukan tugas-tugas lainnya… } } public static void main(String args[]) { Manajer man = new Manajer(); Kurir kur = new Kurir(); Proses(man); Proses(kur); } } Seringkali pemakaian instanceof diikuti dengan casting object dari tipe 107 parameter ke tipe asal. Misalkan saja program kita sebelumnya. Pada saat kita sudah melakukan instanceof dari tipe Manajer, kita dapat melakukan casting object ke tipe asalnya, yaitu Manajer. Caranya adalah seperti berikut: … if (peg instanceof Manajer) { Manajer man = (Manajer) peg; …lakukan tugas-tugas manajer… } … C. TUGAS PENDAHULUAN 1. Apakah yang dimaksud dengan polimorfisme ? 2. Jelaskan proses terjadinya Virtual Method Invocation ! 3. Apakah yang dimaksud dengan polymorphic arguments ? 4. Apakah kegunaan kata kunci instanceof ? D. PERCOBAAN Memahami proses terjadinya Virtual Method Invocation Tulislah listing program berikut ini dan amati yang terjadi pada saat terjadinya Virtual Method Invocation. class Parent { int x = 5; public void Info() { System.out.println(“Ini class Parent”); } } class Child extends Parent { int x = 10; public void Info() { System.out.println(“Ini class Child”); } } 108 public class Tes { public static void main(String args[]) { Parent tes=new Child(); System.out.println(“Nilai x = “ + tes.x); tes.Info(); } } Apakah output program diatas? Jelaskan ! E. LATIHAN Latihan 1. Apa yang terjadi bila kode dibawah ini dikompile dan dijalankan jika sebelumnya Base.java belum dikompile? Jelaskan ! // Filename; SuperclassX.java package packageX; public class SuperclassX{ int superclassVarX; protected void superclassMethodX(){ } } // Filename SubclassY.java package packageX.packageY; public class SubclassY extends SuperclassX{ SuperclassX objX = new SubclassY(); SubclassY objY = new SubclassY(); void subclassMethodY(){ objY.superclassMethodX(); int i; i = objY.superclassVarX; } } 109 Latihan 2. Apa yang tampil di layar jika kode dibawah ini dijalankan? Jelaskan ! class Base { int i = 99; Base(){ amethod(); } public void amethod(){ System.out.println("Base.amethod()"); } } public class Derived extends Base{ int i = -1; public static void main(String argv[]){ Base b = new Derived(); System.out.println(b.i); b.amethod(); } public void amethod(){ System.out.println("Derived.amethod()"); } } Latihan 3. Apa yang tampil di layar jika kode dibawah ini dijalankan? Jelaskan ! class Parent{ private void method1(){ System.out.println("Parent's method1()"); } public void method2(){ System.out.println("Parent's method2()"); method1(); } } class Child extends Parent{ public void method1() System.out.println("Child's method1()"); } public static void main(String args[]){ Parent p = new Child(); p.method2(); } } 110 Latihan 4. Mengimplementasikan UML class diagram dalam program Suatu program terdiri dari class Pegawai sebagai parent class, class Manajer dan class Kurir sebagai subclass. Buatlah suatu program yang menerapkan konsep polymorphic argument sebagaimana yang telah disinggung dalam pembahasan sebelumnya. F. TUGAS Mengimplementasikan UML class Diagram dalam program Transformasikan class diagram diatas ke dalam bentuk program! Tulislah listing program berikut ini sebagai pengetesan. public class Bayaran{ public int hitungbayaran(Pegawai peg){ int uang = peg.infoGaji(); if (peg instanceof Manajer) uang += ((Manajer) peg).infoTunjangan(); else if (peg instanceof Programmer) 111 uang += ((Programmer) peg).infoBonus(); return uang; } public static void main(String args[]){ Manajer man = new Manajer("Agus", 800, 50); Programmer prog = new Programmer("Budi", 600, 30); Bayaran hr = new Bayaran(); System.out.println("Bayaran untuk Manajer : " + hr.hitungbayaran(man)); System.out.println("Bayaran untuk Programmer : " + hr.hitungbayaran(prog)); } } Lakukan kompilasi pada program diatas dan jalankan. Jika tampilan di layar tampak seperti di bawah ini, maka program anda sudah benar. Jika tidak sama, benahi kembali program anda dan lakukan hal yang sama seperti diatas. Bayaran untuk Manajer : 850 Bayaran untuk Programmer : 630 G. LAPORAN RESMI Kumpulkan hasil latihan dan tugas di atas. Tambahkan analisa dalam laporan resmi. 112 PRAKTIKUM 14 NESTED CLASS A. TUJUAN PEMBELAJARAN 1. Mampu mengimplementasikan konsep inner class B. DASAR TEORI Java membolehkan menyisipkan suatu kelas ke dalam kelas lainnya. Kelas sisipan ini disebut kelas Inner. Kelas Inner berguna untuk mendukung suatu proses yang akan dijalankan oleh kelas luarnya. Beberapa ketentuan kelas Inner : • Kelas Luar yang mengandung kelas Inner, bila dikompilasi akan menghasilkan dua file *.class, yaitu Luar.class dan Luar$Inner.class • Kelas Inner boleh tidak diberi nama, yang disebut Anonymous Inner. • Kelas Inner dapat diberi modifier akses public, atau protected, atau default, ataupun private. • Untuk mengakses referensi this dari kelas luar digunakan bentuk NamaKelasLuar.this. • Kelas Luar ikut bertanggung-jawab dalam instansiasi kelas Inner (yang non static) . Kalau objek kelas Luar adalah a, dan objek kelas Inner adalah b, maka sintaks yang benar adalah : Luar a = new Luar(); Luar.Inner b = a.new Inner(); • Jika kelas Inner bersifat static, maka objek milik kelas Inner dapat dibuat sendiri tanpa melalui kelas Luarnya, (Artinya kelas Inner tidak dapat mengakses attribute ataupun method non static milik kelas Luarnya). Inner Class adalah kelas yang disisipkan di dalam kelas yang lain. Fungsi kelas sisipan ini adalah mendukung suatu proses yang akan dijalankan oleh kelas utamanya. Inner Class bersifat 113 tersarang terhadap kelas – kelas utamanya, seperti halnya blok penyeleksian (if, for) yang tersarang pada blok penyeleksian lainnya atau method yang tersarang pada method lainnya. Analogi Inner Class Inner Class dapat dianalogikan sebagi hubungan antara manusia dan paru – paru. Setiap manusia pasti bernafas dengan menggunakan paru – paru. Dalam hal ini berarti kinerja dari paru – paru turut mendukung/menetukan kinerja dari manusia. Dalam bahasa pemrograman berorientasi objek manusia dapat dikatakan sebagai outer class dan paru – paru sebagai inner class-nya. C. TUGAS PENDAHULUAN Jelaskan kembali pengertian inner class menurut bahasa anda! D. PERCOBAAN Percobaan 1 : Non-Static Inner class yang dideklarasikan di dalam class 114 Percobaan 2 : Inner class yang dideklarasikan di dalam method. Percobaan 3 : Static Inner class. Perbaiki error yang terjadi. 115 Percobaan 4 : Non Static Inner class yang dideklarasikan dalam class 116 Percobaan 5 : Local Inner class 117 Percobaan 6 : Anony mous class 118 Percobaan 7 : Inner class yang dideklarasikan Inner class yang dideklarasikan di di dalam dalam method. 119 Percobaan 8 : Anony mous Inner Class. E. LATIHAN Latihan 1 : Program berikut tida k dapat dikompile. Perbaiaki agar dapat dikompile public class Problem { String s; static class Inner { void testMethod() { s = "Set from Inner"; } } } Latihan 2 : Gunakan Java API documentation untuk Box class (di javax.swing package) untuk menjawab pertanyaan berikut : 1. What static nested class does Box define? 2. What inner class does Box define? 3. What is the superclass of Box's inner class? 4. Which of Box's nested classes can you use from any class? 120 5. How do you create an instance of Box's Filler class? F. TUGAS Jelaskan kelebihan dan kelemahan penggunaan inner kelas! G. LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 121 PRAKTIKUM 15 TYPE WRAPPER A. TUJUAN PEMBELAJARAN 1. Memahami mengenai type Wrapper dan berbagai macam type Wrapper. 2. Memahami cara perpindahan dari tipe data primitif menjadi tipe Wrapper dan sebaliknya. 3. Memahami proses Autoboxing dan Auto-unboxing. B. DASAR TEORI B.1 Pengenalan dan Macam Type Wrapper Java mengenal 8 buah tipe data primitif dan tidak dapat dibuat objek. Karena hal ini mengalami kesulitan dalam penggunaannya karena beberapa class di library Java hanya dapat berinteraksi dengan objek. Untuk mengatasi masalah ini, Java menyediakan tipe data class untuk tipe data primitif. Class ini membungkus tipe data primitif agar dapat digunakan sebagai objek. Class ini disebut dengan type Wrapper. Tipe Data Primitif Class Wrapper Argument Constructor Boolean Boolean boolean atau String Byte Byte byte atau String Char Character char Double Double double atau String Float Float float, double atau String Int Integer int atau String Long Long long atau String Short Short short atau String B.2 Number (Class Byte, Short, Integer, Long, Float dan Double) Number adalah class abstract yang merupakan superclass dari semua class type wrapper yang membungkus tipe data numerik seperti byte, short ,int, long, float dan double. Konstruktor dari class wrapper ini mengizinkan untuk membuat nilai numerik dari objek 122 String. Namun jika objek String yang dilewatkan sebagai argument konstruktor bukan nilai numerik yang valid, maka melemparkan exception yang bertipe NumberFormatException. Constructor dari Class Byte, Short, Integer, Long, Float dan Double adalah : Byte(byte value) Byte(String s) throws NumberFormatException Contoh penggunaan Byte num1 = new Byte(100); Byte num2 = new Byte(“100”); Short(short value) Short (String s) throws NumberFormatException Contoh penggunaan Short num1 = new Short(100); Short num2 = new Short(“100”); Integer(int value) Integer(String s) throws NumberFormatException Contoh penggunaan Integer num1 = new Integer(100); Integer num2 = new Integer(“100”); Long(long value) Long(String s) throws NumberFormatException Contoh penggunaan Long num1 = new Long(100); Long num2 = new Long(“100”); Float(double value) Float(float value) Float(String s) throws NumberFormatException Contoh penggunaan Float num1 = new Float(100.4); Float num2 = new Float(100.4f); Float num3 = new Float(“100.4”); Double(double value) Double(String s) throws NumberFormatException Contoh penggunaan Double num1 = new Double(100); Double num2 = new Double(“100”); Setiap objek wrapper mempunyai konstanta MAX_VALUE dan MIN_VALUE MAX_VALUE : nilai numerik terbesar yang dapat ditampung oleh objek dengan tipe data class wrapper ini. 123 MIN_VALUE : nilai numerik terkecil yang dapat ditampung oleh objek dengan tipe data class wrapper ini. Byte byteObj = new Byte(Byte.MAX_VALUE); Short shortObj = new Short(Short.MAX_VALUE); Integer intObj = new Integer(Integer.MAX_VALUE); Long longObj = new Long(Long.MAX_VALUE); Float floatObj = new Float(Float.MAX_VALUE); Double doubleObj = new Double(Double.MAX_VALUE); Nilai dari maksimum dari objek wrapper adalah sebagai berikut: Byte Short Integer Long Float Double :127 :32767 :2147483647 :9223372036854775807 :3.4028235E38 :1.7976931348623157E308 B.3 Method-method pada class wrapper. • Method valueOf() Method valueOf() : mengubah suatu nilai menjadi object dari class tersebut dan melempar NumberFormatException(NFE) jika argument tidak sesuai. Class Long, Integer, Short dan Byte mempunyai tiga method valueOf() Method 1 menerima argument berupa nilai. Method 2 menerima argument nilai dalam bentuk String. Method 3 argument kedua berupa int radix yang menyatakan base dari argument pertama (binary, octal, atau hexadecimal) Class Boolean, Float dan Double mempunyai dua method valueOf() Contoh penggunaan method valueOf() 124 Integer Integer Integer Boolean Boolean Long n1 Long n1 • i1 = Integer.valueOf(42); i2 = Integer.valueOf(“42”); i3 = Integer.valueOf(“42”,2); b1 = Boolean .valueOf(true); b2 = Boolean .valueOf(“true”); = Long.valueOf(42000000L); = Long.valueOf(“42000000L”); Method xxxValue() Method xxxValue() digunakan untuk mengubah object dari class wrapper (object ini mempunyai nilai) menjadi nilai numerik Contoh penggunaan : Integer i2 = new Integer(42); byte b = i2.byteValue(); short s = i2.shortValue(); double d = i2.doubleValue(); Float f2 = new Float(3.14f); short s = f2.shortValue(); • Method parseXxx() Fungsi parseXxx() dan valueOf(), argument berupa String dan melempar NumberFormatException(NFE) jika argument tidak sesuai. Method parseXxx() mengembalikan nilai primitif, sedangkan method valueOf() mengembalikan object dari class wrapper B.4 Character. Class Character merupakan class wrapper untuk tipe data primitif char. Konstruktor dari class Character adalah : Character(char value) Method valueOf() digunakan untuk mendapat nilai char dengan tipe wrapper. Character hanya mempunyai satu method valueOf() Method charValue() untuk mendapatkan tipe data primitif char. char charValue() 125 B.5 Autoboxing / Auto-Unboxing Pada Java 5, dikenal istilah Autoboxing dan Auto-unboxing. Autoboxing adalah konversi secara otomatis oleh kompiler Java dari tipe data primitif ke tipe data sesuai dengan tipe wrappernya (misalnya, int dan Integer, double dan Double). Sedangkan mengubah object dari class wrapper menjadi nilai primitifnya disebut Autounboxing. Dengan Autoboxing Tanpa Autoboxing int i; int i; Integer j ; Integer j ; i=1; i=1; j=2; j=new Integer(2); i=j; i=j.intValue(); j=i; j=new Integer(i); Pada kode tanpa Autoboxing, harus secara eksplisit membuat objek Integer j dengan nilai primitif 2, sedangkan dengan autoboxing, maka proses perubahan dari tipe data primitif int secara otomatis akan di konversi menjadi objek Integer, sehingga pada java 1.5 keatas diperbolehkan dari Integer j ; j = new Integer(2) menjadi Integer j ; j=2; Contoh dengan Auto-unboxing: Integer y = new Integer(567); int x = y.intValue(); x++ ; y = new Integer(x) ; Contoh dengan Autoboxing: Integer y = new Integer(567); y++; Proses increment biasanya digunakan untuk tipe data primitif. Tapi untuk java 1.5 (dengan Autoboxing), proses increment dapat dilakukan pada objek wrapper. Pada Auto126 unboxing pada waktu hendak melakukan increment, nilai primitifnya harus terlebih dahulu diambil baru kemudian proses increment dapat dilakukan. Hasil increment tersebut kemudian dibuat menjadi objek Integer yang baru. C. TUGAS PENDAHULUAN Buatlah review mengenai tipe Wrapper dan macam-macamnya, dan penggunaan konstruktor dari masing-masing tipe Wrapper. D. PERCOBAAN Percobaan 1 : Memahami cara membuat objek Integer. Jika terjadi error atau exception, jelaskan penyebabnya ! public class TestInteger { public static void main(String[] args) { Integer i1 = new Integer(42); Integer i2 = new Integer(2147483647); Integer i3 = new Integer("42"); Integer i4 = new Integer("42.u"); } } public class TestInteger { public static void main(String[] args) { Integer i1 = new Integer(42); Integer i2 = new Integer(2147483650); Integer i3 = new Integer("42"); Integer i4 = new Integer("42.u"); } } Percobaan 2 : Mengetahui nilai maksimum dan minimum untuk tipe Wrapper. public class MaxMin { public static void main(String[] args) { System.out.println("Nilai Maximum"); Byte byteObj = new Byte(Byte.MAX_VALUE); System.out.println(byteObj); Short shortObj = new Short(Short.MAX_VALUE); System.out.println(shortObj); Integer intObj = new Integer(Integer.MAX_VALUE); System.out.println(intObj); Long longObj = new Long(Long.MAX_VALUE); System.out.println(longObj); Float floatObj = new Float(Float.MAX_VALUE); System.out.println(floatObj); Double doubleObj = new Double(Double.MAX_VALUE); 127 System.out.println(doubleObj); System.out.println("Nilai Minimum"); Byte byteObj2 = new Byte(Byte.MIN_VALUE); System.out.println(byteObj2); Short shortObj2 = new Short(Short.MIN_VALUE); System.out.println(shortObj2); Integer intObj2 = new Integer(Integer.MIN_VALUE); System.out.println(intObj2); Long longObj2 = new Long(Long.MIN_VALUE); System.out.println(longObj2); Float floatObj2 = new Float(Float.MIN_VALUE); System.out.println(floatObj2); Double doubleObj2 = new Double(Double.MIN_VALUE); System.out.println(doubleObj2); } } Percobaan 3 : Menampilkan bilangan integer menjadi biner, octal dan heksadesimal. public class TestInteger2 { public static void main(String[] args) { Integer i1 = new Integer(345); System.out.println("nilai int = " + i1); System.out.println("bil binary = " + Integer.toBinaryString(i1)); System.out.println("bil hexa = " + Integer.toHexString(i1)); System.out.println("bil oktal = " + Integer.toOctalString(i1)); Integer i2 = new Integer(675); System.out.println("nilai int = " + i2); System.out.println("bil binary = "+Integer.toString(i2, 2)); System.out.println("bil hexa = " +Integer.toString(i2, 8)); System.out.println("bil oktal = " + Integer.toString(i2, 16)); } } Percobaan 4 : Memahami cara konversi antar tipe Wrapper, misal dari objek Integer diassignkan ke objek Long dan sebaliknya. public class Konversi { public static void main(String[] args) { Integer i = 7 ; Long l = 345L ; i = l.intValue() ; System.out.println("Nilai pada Integer = " + i); l = i.longValue() ; System.out.println("Nilai pada Long = " + l) ; } } 128 Percobaan 5 : Jelaskan kegunaan dari method-method di bawah ini! public class WrapperMethod { public static void main(String[] args) { System.out.println(Integer.rotateLeft(3, 1)); System.out.println(Integer.rotateLeft(5, 2)); System.out.println(Integer.rotateRight(20, 1)); System.out.println(Integer.rotateRight(32, 1)); System.out.println(Integer.reverse(20)); System.out.println(Integer.highestOneBit(20)); System.out.println(Integer.lowestOneBit(20)); System.out.println(Integer.bitCount(20)); System.out.println(Integer.numberOfLeadingZeros(32)); System.out.println(Integer.numberOfTrailingZeros(32)); } } Percobaan 6 : Memahami mengenai Autoboxing dan Auto-unboxing. public class TestUnboxing { public static void main(String[] args) { int i; Integer j; i=1; j=new Integer(2); i=j.intValue(); j=new Integer(i); } } public class TestAutoboxing { public static void main(String[] args) { int i; Integer j; i=1; j=2; i=j; j=i; } } Percobaan 7 : Memahami mengenai Autoboxing dan Auto-unboxing(2) public class TestUnboxing2 { public static void main(String[] args) { Integer y = new Integer(567); int x = y.intValue(); System.out.println("x = " + x); x++ ; y = new Integer(x) ; System.out.println("y = " + y); } 129 } public class TestAutoboxing2 { public static void main(String[] args) { Integer y = new Integer(567); System.out.println(y); y++; System.out.println(y); } } E. LATIHAN 1. Terdapat program seperti di bawah ini ! class Hexy { public static void main(String[] args) { Integer i = 42; String s = (i<40)?"life":(i>50)?"universe":"everything"; System.out.println(s); } } What is the result? A. null B. life C. universe D. everything E. Compilation fails. F. An exception is thrown at runtime. 2. Given: 1. class Example { 2. public static void main(String[] args) { 3. Short s = 15; 4. Boolean b; 5. // insert code here 6. } 7. } Which, inserted independently at line 5, will compile? (Choose all that apply.) A. B. C. D. b b b b = = = = (Number instanceof s); (s instanceof Short); s.instanceof(Short); (s instanceof Number); 130 E. b = s.instanceof(Object); F. b = (s instanceof String); 3. Given: class Fork { public static void main(String[] args) { if(args.length == 1 | args[1] .equals("test")) { System.out.println ("test case"); } else { System.out.println("production " + args[0]) ; } } } And the command-line invocation: java Fork live2 What is the result? A. test case B. production C. test case live2 D. Compilation fails. E. An exception is thrown at runtime. 4. Given: class Foozit { public static void main(String[] args) { Integer x = 0; Integer y = 0; for(Short z = 0; z < 5; z++) if((++x > 2) || (++y > 2)) X++ ; System.out.println (x + " " + y); } } What is the result? A. B. C. D. E. F. G. H. 5 1 5 2 5 3 8 1 8 2 8 3 10 2 10 3 5. Given: 131 class Titanic { public static void main(String[] args) { Boolean bl = true; boolean b2 = false; boolean b3 = true; if((bl & b2) | (b2 & b3) & b3) System.out.print("alpha "); if((bl = false) | (b1 & b3) | (bl | b2)) System.out.print("beta "}; } } What is the result? A. beta B. alpha C. alpha beta D. Compilation fails. E. No output is produced. F. An exception is thrown at runtime 6. class Feline { public static void main(String[] args) { Long x = 42L; Long y = 44L; System.out.print (" " + 7 + 2 + " ") ; System.out.print(foo () + x + 5 + " "); System.out.println(x + y + foo()); } static String foo() { return "foo"; } } What is the result? A. 9 foo47 86foo B. 9 foo47 4244foo C. 9 foo425 86foo D. 9 foo425 4244foo E. 72 foo47 86foo F. 72 foo47 4244foo G. 72 foo425 86foo H. 72 foo425 4244foo I. Compilation fails. 7. Buatlah sebuah aplikasi untuk mengubah sebuah bilangan desimal menjadi bilangan biner, octal dan heksa berdasarkan inputan user. Input Masukkan bilangan : 345 Output biner : 101011001 oktal : 531 heksa : 159 132 8. Buatlah sebuah aplikasi menerima inputan user berupa bilangan dan basis dari bilangan tersebut, selanjutnya mengubah ke bilangan dengan basis yang lain (basis 2,8,10,16) Input Masukkan bilangan : 531 Basis : 8 Output biner : 101011001 desimal : 345 heksa : 159 9. a. Bagaimana program ini jika dijalankan? Jelaskan! b. Bagaimana cara mengubah objek Long menjadi objek Integer dan sebaliknya ? public class Coba { public static void main(String args[]){ Float f = 2.3f ; Double d = 34.7 ; i = j ; } } 10. Ubahlah object Double menjadi tipe data primitif byte, short, int, long, float. F. TUGAS 1. Buatlah suatu aplikasi untuk mengubah : int Tipe wrapper lain String Integer Tipe primitif 2. Buatlah sebuah program untuk menerima inputan beberapa bilangan(Subclass Number) dari command line dan menambahkannya. java Adder 1 3 2 10 Output : 16 G. LAPORAN RESMI Kerjakan hasil percobaan(D) dan latihan(E) di atas dan tambahkan analisa. 133 PRAKTIKUM 16 TYPE ENUM A. TUJUAN PEMBELAJARAN 1. Memahami mengenai konsep Enum 2. Memahami bentuk-bentuk penggunaan Enum 3. Memahami fungsi-fungsi yang terdapat di Enum B. DASAR TEORI Sebelum J2SE 5.0, solusi untuk menangani masalah sekumpulan nilai konstanta, dicontohkan seperti di bawah ini: (jenis credit card yang bisa diterima oleh aplikasi) • public static final int VISA = 1; • public static final int MASTER_CARD = 2; • public static final int AMERICAN_EXPRESS = 3; Permasalahan yang muncul adalah tidak ada yang mengikat ketiga nilai menjadi semacam set dan kita bisa memberikan nilai yang salah pada variabel-variabel tersebut. Kondisi seperti ini disebut not type safe (tipe yang tidak aman). Kondisi ini dapat diperbaiki dengan membuat tipe yang relatif aman (tipe safe) dengan mendefinisikan suatu class, yaitu class AllowedCreditCard. Class tersebut mendefinisikan : – konstanta-konstanta di dalam kelas – variabel untuk menyatakan state object dari class tersebut. – Constructor private untuk mengeset state. public class AllowedCreditCard { protected final String card ; public final static AllowedCreditCard VISA = new AllowedCreditCard("VISA"); public final static AllowedCreditCard MASTER_CARD = new AllowedCreditCard("MASTER CARD"); public final static AllowedCreditCard AMERICAN_EXPRESS = new AllowedCreditCard("AMERICAN_EXPRESS"); private AllowedCreditCard(String str){ card = str; 134 } public String getName(){ return card ; } } Pada pendekatan ini, terdapat 3 state dari class AllowedCreditCard yang dinyatakan oleh tiga object yang dicreate dengan memberikan nilai yang berbeda pada variabel card. Karena konstruktor private, sehingga tidak bisa create object diluar class. Design seperti ini masih dianggap type safe. Tapi pada J2SE 5.0 terdapat solusi yang bagus dengan mengenalkan tipe baru yaitu enum. Tipe data enum dikenalkan di J2SE 5.0 berguna untuk variabel yang berisi sekumpulan nilai. Cara mendefinisikan variabel enum: – Mendefinisikan tipe enum dengan sekumpulan nilai. – Mendefinisikan variabel yang menyimpan satu dari nilai-nilai tersebut. Contoh 1 : Class AllowedCreditCard dirubah menjadi bentuk enum. enum AllowedCreditCard {VISA, MASTER_CARD, AMERICAN_EXPRESS}; AllowedCreditCard visa = AllowedCreditCard.VISA; Contoh 2 : Mendeklarasikan enum di luar class enum CoffeeSize {BIG, HUGE, OVERWHELMING} public class Coffee { CoffeeSize size ; } class CoffeeTest1{ public static void main(String[] args) { Coffee drink = new Coffee(); drink.size = CoffeeSize.BIG ; } } Contoh 3 : Mendeklarasikan enum di dalam class public class Coffee2 { enum CoffeeSize {BIG, HUGE, OVERWHELMING} CoffeeSize size ; } class CoffeeTest2{ public static void main(String[] args) { Coffee2 drink = new Coffee2(); 135 drink.size = Coffee2.CoffeeSize.BIG ; } } Contoh 4 : Tidak bisa mendeklarasikan enum di dalam method //Tidak legal public class CoffeeTest3 { public static void main(String[] args) { enum CoffeeSize {BIG, HUGE, OVERWHELMING} Coffee drink = new Coffee(); drink.size = CoffeeSize.BIG ; } } Menentukan sendiri nilai konstanta dari enum. • Cara termudah dengan memberikan nilai enum (misal : BIG, HUGE, dan OVERWHELMING). Nilai enum sebagai object yang masing-masing mempunyai nilai instance variabel sendiri-sendiri. • Nilai ini diberikan pada saat enum diinisialisasi, dengan memberikan nilai pada konstruktor enum. enum CoffeeSize2{ BIG(8), HUGE(10), OVERWHELMING(16); CoffeeSize2(int ounces){ this.ounces = ounces ; } private int ounces ; public int getOunces() { return ounces; } } Konstruktor enum dijalankan secara otomatis. Contoh BIG(8) menjalankan konstruktor CoffeSize yang menerima parameter berupa int, dengan nilai 8. Konstruktor pada enum bisa lebih dari satu. Fungsi pada Enum • public static Apple[] values() Mengembalikan array yang berisi konstanta dari tipe enum, urutan sesuai pada saat pendeklarasian enum. • public static Apple valueOf(String name) 136 Mengembalikan konstanta enum sesuai dengan inputan dari parameter String • public final int ordinal() Mengembalikan ordinal dari enum konstanta (dimulai dari 0) • public final int compareTo(E o) Membandingkan object enum dengan object enum lainnya berdasarkan urutan. Mengembalikan nilai negatif (object enum 1 < object enum 2), 0 (object enum 1 = object enum 2) dan positif (object enum 1 > object enum 2). enum Apple { A(10), B(9), C, D(15), E(8); private int price; // price of each apple // Constructor Apple(int p) { price = p; } // Overloaded constructor Apple() { price = -1; } int getPrice() { return price; } } C. TUGAS PENDAHULUAN Buatlah review mengenai • Definisi enum • Merubah bentuk konstanta(terdapat lebih dari satu konstanta) menjadi bentuk enum • Letak yang diperbolehkan dan tidak diperbolehkan untuk pendeklarasian enum D. PERCOBAAN Percobaan 1 : Class AllowedCreditCard dirubah menjadi bentuk enum. public class AllowedCreditCard { protected final String card ; public final static AllowedCreditCard VISA = new AllowedCreditCard("VISA"); public final static AllowedCreditCard MASTER_CARD = new AllowedCreditCard("MASTER CARD"); public final static AllowedCreditCard AMERICAN_EXPRESS = new AllowedCreditCard("AMERICAN_EXPRESS"); private AllowedCreditCard(String str){ card = str; } public String getName(){ return card ; 137 } } enum AllowedCreditCard {VISA, MASTER_CARD, AMERICAN_EXPRESS}; AllowedCreditCard visa = AllowedCreditCard.VISA; Percobaan 2 : Mendeklarasikan enum di luar class enum CoffeeSize {BIG, HUGE, OVERWHELMING} public class Coffee { CoffeeSize size ; } class CoffeeTest1{ public static void main(String[] args) { Coffee drink = new Coffee(); drink.size = CoffeeSize.BIG ; } } Percobaan 3 : Mendeklarasikan enum di dalam class public class Coffee2 { enum CoffeeSize {BIG, HUGE, OVERWHELMING} CoffeeSize size ; } class CoffeeTest2{ public static void main(String[] args) { Coffee2 drink = new Coffee2(); drink.size = Coffee2.CoffeeSize.BIG ; } } Percobaan 4 : Tidak bisa mendeklarasikan enum di dalam method //Tidak legal public class CoffeeTest3 { public static void main(String[] args) { enum CoffeeSize {BIG, HUGE, OVERWHELMING} Coffee drink = new Coffee(); drink.size = CoffeeSize.BIG ; } } Percobaan 5 : Menentukan sendiri nilai konstanta dari enum enum CoffeeSize2{ BIG(8), HUGE(10), OVERWHELMING(16); CoffeeSize2(int ounces){ this.ounces = ounces ; 138 } private int ounces ; public int getOunces() { return ounces; } } Percobaan 6 : Enum dengan statement switch enum OperatingSystems { windows, unix, linux, macintosh } public class EnumExample1 { public static void main(String args[]) { OperatingSystems os; os = OperatingSystems.windows; switch(os) { case windows: System.out.println("You chose Windows!"); break; case unix: System.out.println("You chose Unix!"); break; case linux: System.out.println("You chose Linux!"); break; case macintosh: System.out.println("You chose Macintosh!"); break; default: System.out.println("I don't know your OS."); break; } } } Percobaan 7 : Fungsi pada Enum enum Apple { A(10), B(9), C, D(15), E(8); private int price; // price of each apple // Constructor Apple(int p) { price = p; } // Overloaded constructor Apple() { price = -1; } int getPrice() { return price; } } 139 Percobaan 8 : Melakukan enumerasi pada Enum enum Media { book, music_cd, music_vinyl, movie_vhs, movie_dvd; } public class MediaFactory { public static void main(String[] args) { System.out.println(MediaFactory.getMedia("Book")); } public static Media getMedia(String s) { return Enum.valueOf(Media.class, s.toLowerCase()); } public static Media getMedia(int n){ return Media.values()[n]; } } E. LATIHAN 1. Consider the following code fragment: 1. class EnumTest{ 2. enum Size{small, medium, large, Xlarge}; 3. public static void main(String [] args) { 4. for( Size s : Size.values()) { 5. if (s == Size.small) 6. System.out.print("small "); 7. else if (Size.medium.equals(s)) 8. System.out.println("medium "); 9. else if (s == Size.large) 10. System.out.println("large "); 11. else if (s.equals("Xlarge ")) 12. System.out.println("Xlarge "); 13. else if ( s == "Xlarge "); 14. System.out.println("Xlarge "); 15. } 16. } 17. } What is the result of this code? A. small medium large Xlarge Xlarge B. small medium large Xlarge C. small medium large 140 D. Compiler error at line 11 E. Compiler error at line 13 F. Throws exception at runtime 2. Consider the following code fragment: 1. enum Colors {BLUE, GREEN, YELLOW, RED} 2. class Picture { 3. public static void main(String [] args) { 4. int x = 0; 5. Colors c = Colors.GREEN; 6. switch(c) { 7. case BLUE: 8. System.out.print(c); 9. case GREEN: 10. System.out.print(c); 11. case YELLOW: 12. System.out.print(c); 13. default: 14. System.out.print(" BlackWhite "); 15. break; 16. case RED: 17. System.out.print(c); 18. } 19. System.out.println(" PicturePerfect"); 20. } 21. } What is the result? A. GREEN PicturePerfect B. GREENGREEN PicturePerfect C. GREENGREEN BlackWhite PicturePerfect D. GREENYELLOW BlackWhite PicturePerfect E. GREENGREEN BlackWhite Red PicturePerfect F. Compilation fails at line 6. G. Compilation fails at line 13. 3. Consider the following code fragment: 1. enum Colors {BLUE, GREEN, RED} 2. class Picture { 3. public static void main(String [] args) { 141 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. } 21. } int x = 0; Colors c = Colors.GREEN; switch(c) { case BLUE: System.out.print(c); case GREEN: System.out.print(c); case YELLOW: System.out.print(c); default: System.out.print(" BlackWhite "); break; case RED: System.out.print(c); } System.out.println(" PicturePerfect"); What is the result? A. GREEN PicturePerfect B. GREENYELLOW PicturePerfect C. GREENGREEN BlackWhite PicturePerfect D. GREEN BlackWhite Red PicturePerfect E. Compilation fails. F. An exception is thrown at runtime. 4. Consider the following code: 1. enum Villages {Pharwala, Gohawar, Phagwara, Goraya} 2. public class MyEnumTest { 3. public static enum Colors{RED, BLUE, GREEN, YELLOW, ORANGE}; 4. private enum weekend { Saturday, Sunday}; 5. public static void main(String[] args) { 6. enum Currency {Dollars, Rupees, Franc, Euro}; 7. System.out.println("Hello"); 8. } 9. } What is the result? A. Hello B. Compilation fails at line 1. C. Compilation fails at line 3. D. Compilation fails at line 6. 142 E. An exception is thrown at runtime. 5. Given: 1. enum Animals { 2. DOG ("woof"), CAT ("meow"), FISH ("burble"); 3. String sound; 4. Animals(String s) { sound = s; } 5. } 6. class TestEnum { 7. static Animals a; 8. public static void main(String[] args) { 9. System.out.println(a.DOG.sound + " " + a.FISH.sound); 10. } 11. } What is the result? A. woof burble B. Multiple compilation errors C. Compilation fails due to an error on line 2 D. Compilation fails due to an error on line 3 E. Compilation fails due to an error on line 4 F. Compilation fails due to an error on line 9 F. TUGAS Tugas 1 : Pada supermarket terdapat beberapa macam jenis buah Apel yaitu Apel Malang, Granny Smith, Pink Lady, Golden Delicious, Gala dan Red Delicious. Buatlah enum Apel dengan berbagai jenis apel dan harganya. Berikan deskripsi dari apel tersebut pada method getDeskripsi(). Selanjutnya tampilkan data semua Apel, harga dan deskripsi pada Supermarket tersebut. 143 Enum Apel{ MALANG(//harga),... public String getDeskripsi() {…} } G. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 144 PRAKTIKUM 17 MENANGANI EXCEPTION A. TUJUAN PEMBELAJARAN 1. Memahami mengenai exception 2. Memahami tipe exception yaitu Checked Exception dan Unchecked Exception. 3. Mengetahui cara menggunakan exception menggunakan blok try catch. B. DASAR TEORI Exception adalah suatu kondisi abnormal yang terjadi pada saat menjalankan program. Karena dalam java segala sesuatu merupakan objek, maka exception juga direpresentasikan dalam sebuah objek yang menjelaskan tentang exception tersebut. Contoh exception adalah pembagian bilangan dengan 0, pengisian elemen array diluar ukuran array, kegagalan koneksi database, file yang akan dibuka tidak ada, dan mengakses objek yang belum diinisialisasi. Terdapat dua penanganan exception yaitu: • Menangani sendiri exception tersebut. • Meneruskannya ke luar dengan cara membuat objek tentang exception tersebut dan melemparkannya (throw) keluar agar ditangani oleh kode yang memanggil method(method yang didalamnya terdapat exception) tersebut. Ada lima keyword yang digunakan oleh Java untuk menangani exception yaitu try, catch, finally, throw dan throws. B.1 Tipe-Tipe Exception Pada exception, superclass tertinggi adalah class Throwable, tetapi kita hampir tidak pernah menggunakan class ini secara langsung. Dibawah class Throwable terdapat dua subclass yaitu class Error dan class Exception. Class Error merupakan tipe exception yang tidak ditangani dengan blok try-catch, karena berhubungan dengan Java run-time system/environment. Untuk exception dengan tipe class Exception, merupakan exception 145 yang dapat ditangani oleh program. Terdapat subclass dari class Exception diantaranya RunTimeException, IOException, AWTException dan lain-lain. Semua exception bertipe RunTimeException dan turunannya tidak harus secara eksplisit ditangani dalam program (Unchecked Exception). Contoh subclass dari RunTimeException adalah ArrayIndexOutOfBoundsException, ArithmeticException, NullPointerException dan lain-lain. Semua tipe exception yang bukan turunan dari class RuntimeException merupakan exception yang harus ditangani atau jika tidak ditangani menyebab error. Dibawah ini adalah hirarki dari exception. B.2 Penggunaan Blok try-catch Untuk menangani exception dalam program, dengan meletakkan kode program yang memungkinkan terjadinya exception didalam blok try, diikuti dengan blok catch yang menentukan jenis exception yang ingin ditangani. Contoh : public class Percobaan2 { public static void main(String[] args) { int a[] = new int[5]; try{ a[5] = 100 ; }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Indeks Array melebihi batas"); } System.out.println("Setelah blok try-catch"); } 146 } Output : Terjadi exception karena Indeks Array melebihi batas Setelah blok try-catch Dapat terjadi kode yang terdapat dalam blok try mengakibatkan lebih dari satu exception. Dalam hal ini, kita dapat menuliskan lebih dari satu blok catch. Contoh : public class Percobaan5 { public static void main(String[] args) { int bil=10; String b[] = {"a","b","c"}; try{ System.out.println(bil/0); System.out.println(b[3]); }catch(ArithmeticException e){ System.out.println("Error Aritmetik"); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Error Kapasitas Array Melebihi Batas"); }catch(Exception e){ System.out.println("Terdapat Error"); } } } Blok catch yang dijalankan tergantung dengan exception yang terjadi. Java akan menjalankan blok catch yang sesuai dengan tipe exceptionnya saja. Dalam penggunaannya, blok catch dengan tipe subclass harus ditulis lebih dahulu baru diikuti dengan blok catch dengan tipe data superclassnya. B.3 Menggunakan Keyword ”finally” Terdapat kode yang harus dijalankan walaupun terjadi atau tidak terjadi exception, misalkan kita membuka file, hal ini memungkinkan terjadinya exception misal file tidak ada, file tidak bisa dibuka, selanjutnya yang harus dilakukan adalah menutup file tersebut. public class Percobaan2 { public static void main(String[] args) { int a[] = new int[5]; try{ a[5] = 100 ; }catch(ArrayIndexOutOfBoundsException e){ 147 System.out.println("Terjadi exception karena Indeks Array melebihi batas"); }finally{ System.out.println("Selalu Dijalankan"); } System.out.println("Setelah blok try-catch"); } } B.4 Menggunakan Keyword ”throw ” dan ”throws” Secara eksplisit, kita dapat melempar (throw) exception dari program menggunakan keyword throw. Jika exception tersebut adalah checked exception, maka pada method harus ditambahkan throws. Jika exception tersebut adalah unchecked exception, maka pada method tidak perlu ditambahkan throws. public class Percobaan6 { public static void method1() throws FileNotFoundException{ throw new FileNotFoundException("File Tidak Ada"); } public static void main(String[] args) { try { method1(); } catch (FileNotFoundException ex) { System.out.println(ex.getMessage()); } } } B.5 Membuat sendiri Subclass dari Exception Untuk melakukan ini, kita cukup membuat class baru yang merupakan subclass Exception. Didalam class ini kita cukup mendeklarasikan konstruktor. class Salah extends Exception{ public Salah(){} public Salah(String pesan){ super(pesan); } } C. TUGAS PENDAHULUAN Buatlah review mengenai definisi exception, jenis exception, dan berikan 2 contoh program yang menyebabkan exception beserta cara penangannya. D. PERCOBAAN 148 Percobaan 1 : Jalankan program di bawah ini ! Bagaimana output program ? Jelaskan ! public class Percobaan1 { public static void main(String[] args) { int a[] = new int[5]; a[5] = 100 ; } } Percobaan 2 : Memahami cara menangkap Exception dengan tipe ArrayIndexOutOfBoundsException public class Percobaan2 { public static void main(String[] args) { int a[] = new int[5]; try{ a[5] = 100 ; }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Indeks Array melebihi batas"); } } } Percobaan 3 : Jalankan percobaan 3, bagaimana output program ? Perbaiki dengan Percobaan32 untuk menangani exception. public class Percobaan3 { public static void main(String[] args) { int bil = 10 ; System.out.println(bil/0); } } public class Percobaan32 { public static void main(String[] args) { int bil = 10 ; try{ System.out.println(bil/0); }catch(ArithmeticException e){ System.out.println("Tidak boleh membagi bilangan dengan 0"); } } } Percobaan 4 : Memahami try bertingkat. public class Percobaan4 { 149 public static void main(String[] args) { int bil = 10 ; try{ System.out.println(bil/0); }catch(ArithmeticException e){ System.out.println("Terjadi exception membagi bilangan dengan 0"); }catch(Exception e){ System.out.println("Terdapat Error"); } } } karena tidak boleh Percobaan 5 : Bandingkan output dua program di bawah ini ! Jelaskan ! public class Percobaan5 { public static void main(String[] args) { int bil=10; String b[] = {"a","b","c"}; try{ System.out.println(bil/0); System.out.println(b[3]); }catch(ArithmeticException e){ System.out.println("Error Aritmetik"); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Error Kapasitas Array Melebihi Batas"); }catch(Exception e){ System.out.println("Terdapat Error"); } } } public class Percobaan52 { public static void main(String[] args) { int bil=10; String b[] = {"a","b","c"}; try{ System.out.println(b[3]); System.out.println(bil/0); }catch(ArithmeticException e){ System.out.println("Error Aritmetik"); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Error Kapasitas Array Melebihi Batas"); }catch(Exception e){ System.out.println("Terdapat Error"); } } } Percobaan 6 : Penggunaan finally public class ExcepTest{ public static void main(String args[]){ 150 int a[] = new int[2]; try{ System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } finally{ a[0] = 6; System.out.println("First element value: " +a[0]); System.out.println("The finally statement is executed"); } } } E. LATIHAN 1. Semua exception yang berasal dari java.lang.RuntimeException adalah unchecked exceptions, sedangkan java.lang.RuntimeException exception adalah lainnya checked yang tidak exceptions. berasal Jelaskan dari mengenai unchecked exceptions dan checked exceptions ,berikan contoh ! 2. Buatlah contoh program untuk menangani exception dengan cara menangkap exception seperti di bawah ini : • • • • • • • • • ArithmeticException ArrayStoreException ClassCastException ArrayIndexOutOfBoundsException StringIndexOutOfBoundsException NegativeArraySizeException NoSuchElementException NullPointerException, NumberFormatException F. TUGAS 1. Terdapat dua cara untuk menangani Exception yaitu dengan menangkap Exception dan melempar Exception. Lakukan penanganan exception dengan menangkap Exception menggunakan blok try-catch. Berilah penjelasan (apakah program termasuk unchecked exceptions atau checked exceptions) ! public class ReadFile { public static void main(String args[]){ File file = new File("Data.txt"); BufferedReader fileReader ; 151 fileReader = new BufferedReader(new FileReader(file)); while(true){ String line = fileReader.readLine(); if (line == null) break ; System.out.println(line); } } } G. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 152 PRAKTIKUM 18 MELEMPAR EXCEPTION DAN MEMBUAT EXCEPTION SENDIRI A. TUJUAN PEMBELAJARAN 1. Mengetahui cara menangani exception dengan cara melempar exception. 2. Mengetahui cara membuat sendiri class exception. B. DASAR TEORI Exception adalah suatu kondisi abnormal yang terjadi pada saat menjalankan program. Karena dalam java segala sesuatu merupakan objek, maka exception juga direpresentasikan dalam sebuah objek yang menjelaskan tentang exception tersebut. Contoh exception adalah pembagian bilangan dengan 0, pengisian elemen array diluar ukuran array, kegagalan koneksi database, file yang akan dibuka tidak ada, dan mengakses objek yang belum diinisialisasi. Terdapat dua penanganan exception yaitu: • Menangani sendiri exception tersebut. • Meneruskannya ke luar dengan cara membuat objek tentang exception tersebut dan melemparkannya (throw) keluar agar ditangani oleh kode yang memanggil method(method yang didalamnya terdapat exception) tersebut. Ada lima keyword yang digunakan oleh Java untuk menangani exception yaitu try, catch, finally, throw dan throws. B.1 Tipe-Tipe Exception Pada exception, superclass tertinggi adalah class Throwable, tetapi kita hampir tidak pernah menggunakan class ini secara langsung. Dibawah class Throwable terdapat dua subclass yaitu class Error dan class Exception. Class Error merupakan tipe exception yang tidak ditangani dengan blok try-catch, karena berhubungan dengan Java run-time system/environment. Untuk exception dengan tipe class Exception, merupakan exception 153 yang dapat ditangani oleh program. Terdapat subclass dari class Exception diantaranya RunTimeException, IOException, AWTException dan lain-lain. Semua exception bertipe RunTimeException dan turunannya tidak harus secara eksplisit ditangani dalam program (Unchecked Exception). Contoh subclass dari RunTimeException adalah ArrayIndexOutOfBoundsException, ArithmeticException, NullPointerException dan lain-lain. Semua tipe exception yang bukan turunan dari class RuntimeException merupakan exception yang harus ditangani atau jika tidak ditangani menyebab error. Dibawah ini adalah hirarki dari exception. B.2 Penggunaan Blok try-catch Untuk menangani exception dalam program, dengan meletakkan kode program yang memungkinkan terjadinya exception didalam blok try, diikuti dengan blok catch yang menentukan jenis exception yang ingin ditangani. Contoh : public class Percobaan2 { public static void main(String[] args) { int a[] = new int[5]; try{ a[5] = 100 ; }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Indeks Array melebihi batas"); } System.out.println("Setelah blok try-catch"); } 154 } Output : Terjadi exception karena Indeks Array melebihi batas Setelah blok try-catch Dapat terjadi kode yang terdapat dalam blok try mengakibatkan lebih dari satu exception. Dalam hal ini, kita dapat menuliskan lebih dari satu blok catch. Contoh : public class Percobaan5 { public static void main(String[] args) { int bil=10; String b[] = {"a","b","c"}; try{ System.out.println(bil/0); System.out.println(b[3]); }catch(ArithmeticException e){ System.out.println("Error Aritmetik"); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Error Kapasitas Array Melebihi Batas"); }catch(Exception e){ System.out.println("Terdapat Error"); } } } Blok catch yang dijalankan tergantung dengan exception yang terjadi. Java akan menjalankan blok catch yang sesuai dengan tipe exceptionnya saja. Dalam penggunaannya, blok catch dengan tipe subclass harus ditulis lebih dahulu baru diikuti dengan blok catch dengan tipe data superclassnya. B.3 Menggunakan Keyword ”finally” Terdapat kode yang harus dijalankan walaupun terjadi atau tidak terjadi exception, misalkan kita membuka file, hal ini memungkinkan terjadinya exception misal file tidak ada, file tidak bisa dibuka, selanjutnya yang harus dilakukan adalah menutup file tersebut. public class Percobaan2 { public static void main(String[] args) { int a[] = new int[5]; try{ a[5] = 100 ; }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Terjadi exception karena Indeks Array melebihi batas"); }finally{ 155 System.out.println("Selalu Dijalankan"); } System.out.println("Setelah blok try-catch"); } } B.4 Menggunakan Keyword ”throw ” dan ”throws” Secara eksplisit, kita dapat melempar (throw) exception dari program menggunakan keyword throw. Jika exception tersebut adalah checked exception, maka pada method harus ditambahkan throws. Jika exception tersebut adalah unchecked exception, maka pada method tidak perlu ditambahkan throws. public class Percobaan6 { public static void method1() throws FileNotFoundException{ throw new FileNotFoundException("File Tidak Ada"); } public static void main(String[] args) { try { method1(); } catch (FileNotFoundException ex) { System.out.println(ex.getMessage()); } } } B.5 Membuat sendiri Subclass dari Exception Untuk melakukan ini, kita cukup membuat class baru yang merupakan subclass Exception. Didalam class ini kita cukup mendeklarasikan konstruktor. class Salah extends Exception{ public Salah(){} public Salah(String pesan){ super(pesan); } } C. TUGAS PENDAHULUAN Buatlah review 1 halaman mengenai penanganan exception dengan cara melempar exception dan berikan 1 contoh program. D. PERCOBAAN Percobaan 1 : Method yang melempar unchecked exception public class Percobaan6 { public static void method1(){ throw new ArrayIndexOutOfBoundsException("Melebihi Kapasitas"); } 156 public static void main(String[] args) { try { method1(); } catch (ArrayIndexOutOfBoundsException ex) { System.out.println(ex.getMessage()); } } } Percobaan 2 : Method yang melempar checked exception public class Percobaan7 { public static void method1() throws FileNotFoundException{ throw new FileNotFoundException("File Tidak Ada"); } public static void main(String[] args) { try { method1(); } catch (FileNotFoundException ex) { System.out.println(ex.getMessage()); } } } Percobaan 3 : Memahami mengenai mekanisme exception. public class Exercise1 { static void f1() { System.out.print("1"); try { System.out.print("2"); f2(); System.out.print("3"); } catch (Exception e) { System.out.print("4"); } finally { System.out.print("5"); } System.out.println("6"); } static void f2 () throws Exception { if (true) throw new Exception(); } public static void main(String s[]) { f1(); } } Percobaan 4 : Menggunakan konsep Inheritance untuk membuat superclass dan subclass exception. Program menangani exception dengan menangkap subclass exception dengan superclass import javax.swing.*; class ExceptionA extends Exception {} class ExceptionB extends ExceptionA {} 157 class ExceptionC extends ExceptionB {} public class Demo { public static void main( String args[] ) { try { throw new ExceptionC(); } catch( ExceptionA a ) { JOptionPane.showMessageDialog( null, a.toString(), "Exception", JOptionPane.INFORMATION_MESSAGE ); } try { throw new ExceptionB(); } catch( ExceptionA b ) { JOptionPane.showMessageDialog( null, b.toString(), "Exception", JOptionPane.INFORMATION_MESSAGE ); } System.exit( 0 ); } } Percobaan 5 : Membuat exception sendiri class Salah extends Exception{ public Salah(){} public Salah(String pesan){ super(pesan); } } public class TesSalah{ public static void main(String [] arg) throws Salah{ Salah s = new Salah(“Salah disengaja ha..ha..”); int i = 0; if (i==0) throw s; } } Percobaan 6: Membuat exception sendiri class counterException extends Exception { // Define String complaint; public counterException(String c) { this.complaint = c; } public String toString( ) { return "counter Exception “ + complaint; } } class counter { 158 int n = 0; public int zero() { return n=0; } public int up() { return ++n; } public int down() throws counterException { // Throw if (n <= 0) throw new counterException (n + " count Down failed."); return --n; } } public class Example1 { public static void main( String args[] ) { counter aCounter = new counter( ); aCounter.zero( ); aCounter.up(); try { aCounter.down( ); } catch (counterException ce) { // Catch System.out.println("" + ce); } try { aCounter.down( ); } catch (counterException ce) { // Catch System.out.println("" + ce); } finally { System.out.println(“Finally”); } } } public class Example2 { public static void main( String args[] ) throws Exception { counter aCounter = new counter( ); aCounter.zero( ); aCounter.up(); aCounter.down( ); aCounter.down( ); System.out.println(“Completed”); } } E. LATIHAN 1. Terdapat dua cara untuk menangani Exception yaitu dengan menangkap Exception dan melempar Exception. Lakukan penanganan exception dengan melempar Exception menggunakan throw. Berilah penjelasan (apakah program termasuk unchecked exceptions atau checked exceptions) ! public class ReadFile { public static void main(String args[]){ File file = new File("Data.txt"); 159 BufferedReader fileReader ; fileReader = new BufferedReader(new FileReader(file)); while(true){ String line = fileReader.readLine(); if (line == null) break ; System.out.println(line); } } } F. TUGAS 1. Buatlah sebuah class Stack, FullStackException dan EmptyStackException. Class Stack ini menggambar Stack yang menerapkan konsep LIFO (Last In First Out). Konsep LIFO ini, data yang terakhir masuk akan keluar pertama kali. Class Stack mempunyai atribut: • size : menentukan besar array untuk menyimpan data. Array berdimensi satu dengan tipe Object. • top : merupakan tanda indeks yang paling atas, yang belum terisi. Sehingga data yang akan masuk akan dimasukkan pada indeks tersebut. • Object[] elemen : untuk menyimpan data. Class Stack mempunyai operasi: • public Stack() : jika kita membuat object Stack dengan konstruktor Stack() maka tentukan size = 5. • public Stack(int s) : jika kita membuat object Stack dengan konstruktor Stack(int s) maka tentukan size berdasarkan parameter s. • public int getSize() : untuk mendapatkan besar array dari Stack. • public int getTop() : untuk mendapatkan top dari Stack • public void push(Object o) : untuk memasukkan data ke array pada Stack. • public Object pop() : untuk mengambil data dari array. 160 Deskripsi Stack Buat objek Stack dengan nama stack, pertama kali top bernilai 0. 4 3 2 1 top = 0 Masukkan sebuah data String “satu”, data “satu” akan dimasukkan pada indeks yang ke-0 (sesuai dengan nilai top) selanjutnya top dinaikkan 1, sehingga top = 1. 4 3 2 1 top = 1 “satu” Masukkan sebuah data String “dua”, data “dua” akan dimasukkan pada indeks yang ke-1 (sesuai dengan nilai top) selanjutnya top dinaikkan 1, sehingga top = 2. 4 3 2 top = 2 1 “dua” “satu” Ambil sebuah data dari Stack, data yang diambil adalah data yang dimasukkan terakhir kali (“dua”). Kurangi nilai top dengan 1 sehingga menjadi nilai top = 1. Selanjutnya ambil data pada indeks ke -1. 161 4 3 2 1 top = 1 “satu” Ambil sebuah data dari Stack, data yang diambil adalah data yang terakhir (“satu”). Kurangi nilai top dengan 1 sehingga menjadi nilai top = 0. Selanjutnya apabila ada pengambilan data maka yang diambil adalah data pada indeks ke -0. 4 3 2 1 top = 0 Ambil sebuah data lagi dari Stack, jika kondisi top = 0, maka Stack kosong dan melempar exception EmptyStackException (class ini merupakan subclass dari class RuntimeException), dan muncul peringatan bahwa “Stack kosong”. Selanjutnya isilah Stack sampai penuh. top = 5 4 “lima” 3 “empat” 2 “tiga” 1 “dua” “satu” 162 Jika kita ingin memasukkan data baru lagi, jika kondisi top = 5, maka akan melempar exception yaitu FullStackException (class ini merupakan subclass dari class RuntimeException). top = 5 4 “lima” 3 “empat” 2 “tiga” 1 “dua” “satu” Masukkan data lagi Stack Full A. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 163 PRAKTIKUM 19 JAVA COLLECTION FRAMEWORK : SET DAN LIST A. TUJUAN PEMBELAJARAN 1. Memahami cara penyimpanan objek menggunakan Collection. 2. Mengetahui pengelompokan dari Collection. 3. Mengetahui perbedaan dari interface Set dan List. 4. Mengetahui penggunaan class-class dari interface Set dan List. 5. Mengetahui cara penggunaan Iterasi dan Enumeration. B. DASAR TEORI Collection adalah suatu objek yang bisa digunakan untuk menyimpan sekumpulan objek. Objek yang ada dalam Collection disebut elemen. Collection menyimpan elemen yang bertipe Object, sehingga berbagai tipe objek bisa disimpan dalam Collection. Class-class mengenai Collection tergabung dalam Java Collection Framework. Classclass Collection diletakkan dalam package java.util dan mempunyai dua interface utama yaitu Collection dan Map. Mulai java 1.5 (juga dikenal sebagai J2SE 5), semua class yang termasuk Java Collection Framework adalah class generics. Untuk kompatibilitas dengan versi java sebelumnya, penggunaan generics tidak diharuskan, namun sangat disarankan. Collection terbagi menjadi 3 kelompok yaitu Set, List dan Map. Berikut ini adalah struktur hierarki interface dan class yang termasuk dalam kelompok collection ini. 164 Java Collections Framework terbagi menjadi tiga kelompok: • Set Set mengikuti model himpunan, dimana objek/anggota yang tersimpan dalam Set harus unik. Urutan maupun letak dari anggota tidaklah penting, hanya keberadaan anggota saja yang penting. Class-class yang mengimplementasikan interface Set adalah HashSet. Interface SortedSet merupakan subInterface dari interface Set. Untuk mengurutkan Set, kita dapat menggunakan class yang mengimplementasikan interface SortedSet yaitu clas TreeSet. • List List digunakan untuk menyimpan sekumpulan objek berdasarkan urutan masuk (ordered) dan menerima duplikat. Cara penyimpanannya seperti array, oleh sebab itu memiliki posisi awal dan posisi akhir, menyisipkan objek pada posisi tertentu, mengakses dan menghapus isi list, dimana semua proses ini selalu didasarkan pada urutannya. Classclass yang mengimplementasikan interface List adalah Vector, Stack, Linked List dan Array List. 165 Terdapat interface Queue yang cara penyimpanan seperti List, interface ini menyimpan objek menggunakan metode FIFO (First In First Out) yaitu objek yang masuk pertama keluar pertama. Class-class yang mengimplementasikan interface Queue adalah PriorityQueue dan LinkedList. Data yang tersimpan pada objek PriorityQueue akan diurutkan, data tersebut harus mengimplementasikan objek Comparable atau Comparator. • Map Perbedaaan mendasar map dengan collection yang lain, untuk menyimpan objek pada Map, perlu sepasang objek, yaitu key yang bersifat unik dan nilai yang disimpan. Untuk mengakses nilai tersebut maka kita perlu mengetahui key dari nilai tersebut. Map juga dikenal sebagai dictionary/kamus. Pada saat menggunakan kamus, perlu suatu kata yang digunakan untuk pencarian. Class-class yang mengimplementasikan Map adalah Hashtable,HashMap, LinkedHashMap. Untuk mengurutkan Map menggunakan interface SortedMap, class yang mengimplementasikan interface tersebut adalah TreeMap. C. TUGAS PENDAHULUAN Buatlah resume 1 halaman mengenai Java Collection Framework dan pembagian kelompok Collection dan berikan penjelasannya. D. PERCOBAAN Percobaan 1 : Memahami penggunaan class-class yang mengimplementasikan interface Set yaitu class HashSet dan class TreeSet import java.util.*; public class SetExample { public static void main(String[] args) { Set set=new HashSet(); set.add("Bernadine"); set.add("Elizabeth"); set.add("Gene"); set.add("Elizabeth"); set.add("Clara"); System.out.print("Elemen pada HashSet : "); System.out.println(set); Set sortSet=new TreeSet(set); System.out.print("Elemen pada TreeSet : "); System.out.println(sortSet); 166 } } Percobaan 2 : Penggunaan Class HashSet public class FindDups { public static void main(String[] args) { Set<String> s = new HashSet<String>(); for (String a : args) if (!s.add(a)) System.out.println("Duplicate detected: " + a); System.out.println(s.size() + " distinct words: " + s); } } Jalankan dengan : java FindDups i came i saw i left public class FindDups2 { public static void main(String[] args) { Set<String> uniques = new HashSet<String>(); Set<String> dups = new HashSet<String>(); for (String a : args) if (!uniques.add(a)) dups.add(a); // Destructive set-difference uniques.removeAll(dups); System.out.println("Unique words: " + uniques); System.out.println("Duplicate words: " + dups); } } Jalankan dengan java FindDups i came i saw i left Percobaan 3 : Interface Set menerapkan konsep himpunan. Mengetahui implementasi konsep himpunan pada interface Set. import java.util.*; public class SetExample { public static void main(String[] args) { Set s1=new HashSet(); s1.add("Australia"); s1.add("Sweden"); s1.add("Germany"); Set s2=new HashSet(); s2.add("Sweden"); 167 s2.add("France"); Set union=new TreeSet(s1); union.addAll(s2); // gabungan dari s1 dan s2 print("Union",union); Set intersect=new TreeSet(s1); intersect.retainAll(s2); // irisan dari s1 dan s2 print("Intersection",intersect); } protected static void print(String label, Collection c){ System.out.println("---------------- "+ label+" --------------"); Iterator it=c.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } Percobaan 4 : Memahami penggunaan class-class yang mengimplementasikan interface List yaitu ArrayList dan LinkedList. import java.util.*; public class ListExample { public static void main(String[] args) { List list=new ArrayList(); list.add("Bernadine"); list.add("Elizabeth"); list.add("Gene"); list.add("Elizabeth"); list.add("Clara"); System.out.println(list); System.out.println("2 : "+list.get(2)); System.out.println("0 : "+list.get(0)); LinkedList queue=new LinkedList(); queue.addFirst("Bernadine"); queue.addFirst("Elizabeth"); queue.addFirst("Gene"); queue.addFirst("Elizabeth"); queue.addFirst("Clara"); System.out.println(queue); queue.removeLast(); queue.removeLast(); System.out.println(queue); } } 168 Percobaan 5 : Penggunaan Class Vector import java.util.Vector; public class VectorExample { public static void main(String[] args) { Vector<String> vc=new Vector<String>(); //<E> Element type of Vector e.g. String, Integer, Object ... // add vector elements vc.add("Vector Object 1"); vc.add("Vector Object 2"); vc.add("Vector Object 3"); vc.add("Vector Object 4"); vc.add("Vector Object 5"); // add vector element at index vc.add(3, "Element at fix position"); // vc.size() inform number of elements in Vector System.out.println("Vector Size :"+vc.size()); // get elements of Vector for(int i=0;i<vc.size();i++) { System.out.println("Vector Element "+i+" :"+vc.get(i)); } } } Percobaan 6 : Penggunaan Iterator import java.util.*; class IteratorDemo { public static void main(String args[]) { // create an array list ArrayList al = new ArrayList(); // add elements to the array list al.add("C"); al.add("A"); al.add("E"); al.add("B"); al.add("D"); al.add("F"); // use iterator to display contents of al System.out.print("Original contents of al: "); Iterator itr = al.iterator(); while (itr.hasNext()) { Object element = itr.next(); 169 System.out.print(element + " "); } System.out.println(); // modify objects being iterated ListIterator litr = al.listIterator(); while (litr.hasNext()) { Object element = litr.next(); litr.set(element + "+"); } System.out.print("Modified contents of al: "); itr = al.iterator(); while (itr.hasNext()) { Object element = itr.next(); System.out.print(element + " "); } System.out.println(); // now, display the list backwards System.out.print("Modified list backwards: "); while (litr.hasPrevious()) { Object element = litr.previous(); System.out.print(element + " "); } System.out.println(); } } Percobaan 7 : Penggunaan Enumeration import java.util.Vector; import java.util.Enumeration; public class EnumerationTester { public static void main(String args[]) { Enumeration days; Vector dayNames = new Vector(); dayNames.add("Sunday"); dayNames.add("Monday"); dayNames.add("Tuesday"); dayNames.add("Wednesday"); dayNames.add("Thursday"); dayNames.add("Friday"); dayNames.add("Saturday"); days = dayNames.elements(); while (days.hasMoreElements ()) System.out.println(days.nextElement()); } 170 } Percobaan 8 : Membuat Array List dari Enumerasi public class CreateArrayListFromEnumerationExample { public static void main(String[] args) { //create a Vector object Vector v = new Vector(); //Add elements to Vector v.add("A"); v.add("B"); v.add("D"); v.add("E"); v.add("F"); System.out.println("Vector contains : " + v); //Get Enumeration over Vector Enumeration e = v.elements(); //Create ArrayList from Enumeration of Vector ArrayList aList = Collections.list(e); System.out.println("Arraylist contains : " + aList); } } Percobaan 9 : Mengkopikan element dari ArrayList ke Vector import java.util.ArrayList; import java.util.Collections; import java.util.Vector; public class CopyElementsOfArrayListToVectorExample { public static void main(String[] args) { //create an ArrayList object ArrayList arrayList = new ArrayList(); //Add elements to Arraylist arrayList.add("1"); arrayList.add("4"); arrayList.add("2"); arrayList.add("5"); arrayList.add("3"); //create a Vector object Vector v = new Vector(); //Add elements to Vector v.add("A"); v.add("B"); v.add("D"); 171 v.add("E"); v.add("F"); v.add("G"); v.add("H"); System.out.println("Before copy, Vector Contains : " + v); //copy all elements of ArrayList to Vector using copy method of Collections class Collections.copy(v,arrayList); System.out.println("After Copy, Vector Contains : " + v); } } Percobaan 10 : Menambahkan elemen yang tersimpan di Collection pada ArrayList import java.util.ArrayList; import java.util.Vector; public class AppendAllElementsOfOtherCollectionToArrayListExample { public static void main(String[] args) { //create an ArrayList object ArrayList arrayList = new ArrayList(); //Add elements to Arraylist arrayList.add("1"); arrayList.add("2"); arrayList.add("3"); //create a new Vector object Vector v = new Vector(); v.add("4"); v.add("5"); //append all elements of Vector to ArrayList arrayList.addAll(v); //display elements of ArrayList System.out.println("After appending all elements of Vector, ArrayList contains.."); for (int i = 0; i < arrayList.size(); i++) { System.out.println(arrayList.get(i)); } } } 172 Percobaan 11 : Memahami Penggunaan dari class PriorityQueue import java.util.*; public class PriorityQueueDemo { PriorityQueue<String> stringQueue; public static void main(String[] args){ stringQueue = new PriorityQueue<String>(); stringQueue.add("ab"); stringQueue.add("abcd"); stringQueue.add("abc"); stringQueue.add("a"); //don't use iterator which may or may not //show the PriorityQueue's order while(stringQueue.size() > 0) System.out.println(stringQueue.remove()); } } Percobaan 12 : Memahami Penggunaan dari class PriorityQueue dan data yang tersimpan dalam objek PriorityQueue mengimplementasikan interface Comparator. import java.util.Comparator; import java.util.PriorityQueue; public class PQueueTest { public static void main(String[] args) { PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>(10, new Comparator<Integer>() { public int compare(Integer int1, Integer int2) { boolean flag1 = isPrime(int1); boolean flag2 = isPrime(int2); if (flag1 == flag2){ return int1.compareTo(int2); } else if (flag1) { return -1; } else if(flag2) { return 1; } return 0; } }); pQueue.add(1); pQueue.add(5); pQueue.add(6); pQueue.add(4); pQueue.add(2); 173 pQueue.add(9); pQueue.add(7); pQueue.add(8); pQueue.add(10); pQueue.add(3); while(true) { Integer head = pQueue.poll(); if(head == null) { break; } System.out.print(head + " <-- "); } } /** * * @param n * @return */ public static boolean isPrime(int n) { if (n <= 1) { return false; } if (n == 2) { return true; } if (n % 2 == 0) { return false; } long m = (long) Math.sqrt(n); for (long i = 3; i <= m; i += 2) { if (n % i == 0) { return false; } } return true; } } E. LATIHAN Latihan 1 : Penerapan konsep himpunan pada interface Set Terdapat sebuah himpunan A = {1,2,3,4,5} B = {5,6,7,8,9,10} Menggunakan class yang mengimplementasikan Interface Set, dapatkah output seperti : – A–B – A∩B 174 – AUB – ACB Latihan 2 : Memahami penggunaan interface List. Buatlah objek List, dengan data bertipe String lakukan langkah berikut : • Tampilkan data yang terdapat pada list. • Baliklah data yang terdapat pada list dan tampilkan. • Acaklah data tersebut dan tampilkan. • Urutkan data tersebut dan tampilkan. Latihan 3 : Memahami penggunaan interface List (2) Buatlah class Mahasiswa dengan informasi nrp dan nama(bertipe String). Buatlah objek List, dengan data bertipe String lakukan langkah berikut : • Tampilkan data yang terdapat pada list. • Baliklah data yang terdapat pada list dan tampilkan. • Acaklah data tersebut dan tampilkan. • Urutkan data tersebut, jangan lupa untuk mengimplementasikan interface Comparable/Comparator pada class Mahasiswa dan tampilkan. F. TUGAS Tugas 1 : Penggunaan class LinkedList pada interface List. Buatlah dua objek List (ArrayList) yaitu objek warna dan warnaDihapus. Objek ini berisi warna-warna, buatlah sebagian ada yang sama. Lakukan penghapusan data yang terdapat pada objek warna yang sama dengan data warna yang terdapat pada objek warnaDihapus, selanjutnya tampilkan. Warna : [MAGENTA, RED, WHITE, BLUE, CYAN] Warna yang dihapus : [RED, WHITE, BLUE] Output : Warna : [MAGENTA, CYAN] 175 Tugas 2 : Pengurutan data mahasiswa berdasarkan nilai. Buatlah class Mahasiswa dengan informasi : • Nrp (String) • Nama(String) • Nilai(Float) Terdapat 10 data mahasiswa yang tersimpan dalam queue, set nilai secara random antara 60-100, lakukan pengurutan data mahasiswa berdasarkan nilai tersebut ! G. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 176 PRAKTIKUM 20 JAVA COLLECTION FRAMEWORK : MAP A. TUJUAN PEMBELAJARAN 1. Mengetahui mengenai interface Map. 2. Memahami cara penyimpanan objek menggunakan Map. 3. Mengetahui implementasi penggunaan dari class-class pada interface Map. B. DASAR TEORI Collection adalah suatu objek yang bisa digunakan untuk menyimpan sekumpulan objek. Objek yang ada dalam Collection disebut elemen. Collection menyimpan elemen yang bertipe Object, sehingga berbagai tipe objek bisa disimpan dalam Collection. Class-class mengenai Collection tergabung dalam Java Collection Framework. Classclass Collection diletakkan dalam package java.util dan mempunyai dua interface utama yaitu Collection dan Map. Mulai java 1.5 (juga dikenal sebagai J2SE 5), semua class yang termasuk Java Collection Framework adalah class generics. Untuk kompatibilitas dengan versi java sebelumnya, penggunaan generics tidak diharuskan, namun sangat disarankan. Collection terbagi menjadi 3 kelompok yaitu Set, List dan Map. Berikut ini adalah struktur hierarki interface dan class yang termasuk dalam kelompok collection ini. 177 Java Collections Framework terbagi menjadi tiga kelompok: • Set Set mengikuti model himpunan, dimana objek/anggota yang tersimpan dalam Set harus unik. Urutan maupun letak dari anggota tidaklah penting, hanya keberadaan anggota saja yang penting. Class-class yang mengimplementasikan interface Set adalah HashSet. Interface SortedSet merupakan subInterface dari interface Set. Untuk mengurutkan Set, kita dapat menggunakan class yang mengimplementasikan interface SortedSet yaitu clas TreeSet. • List List digunakan untuk menyimpan sekumpulan objek berdasarkan urutan masuk (ordered) dan menerima duplikat. Cara penyimpanannya seperti array, oleh sebab itu memiliki posisi awal dan posisi akhir, menyisipkan objek pada posisi tertentu, mengakses dan menghapus isi list, dimana semua proses ini selalu didasarkan pada urutannya. Class- 178 class yang mengimplementasikan interface List adalah Vector, Stack, Linked List dan Array List. Terdapat interface Queue yang cara penyimpanan seperti List, interface ini menyimpan objek menggunakan metode FIFO (First In First Out) yaitu objek yang masuk pertama keluar pertama. Class-class yang mengimplementasikan interface Queue adalah PriorityQueue dan LinkedList. Data yang tersimpan pada objek PriorityQueue akan diurutkan, data tersebut harus mengimplementasikan objek Comparable atau Comparator. • Map Perbedaaan mendasar map dengan collection yang lain, untuk menyimpan objek pada Map, perlu sepasang objek, yaitu key yang bersifat unik dan nilai yang disimpan. Untuk mengakses nilai tersebut maka kita perlu mengetahui key dari nilai tersebut. Map juga dikenal sebagai dictionary/kamus. Pada saat menggunakan kamus, perlu suatu kata yang digunakan untuk pencarian. Class-class yang mengimplementasikan Map adalah Hashtable,HashMap, LinkedHashMap. Untuk mengurutkan Map menggunakan interface SortedMap, class yang mengimplementasikan interface tersebut adalah TreeMap. C. TUGAS PENDAHULUAN Buatlah resume 1 halaman mengenai interface Map dan 2 contoh dari interface Map. D. PERCOBAAN Percobaan 1 : Penggunaan HashMap, menambahkan data, menghapus data tertentu dan menghapus semua data pada objek HashMap. import java.util.HashMap; public class RemoveValueFromHashMapExample { public static void main(String[] args) { //create HashMap object HashMap hMap = new HashMap(); //add key value pairs to HashMap hMap.put("1","One"); hMap.put("2","Two"); 179 hMap.put("3","Three"); Object obj = hMap.remove("2"); System.out.println(obj + " Removed from HashMap"); hMap.clear(); System.out.println("Total key value pairs in HashMap are : " + hMap.size()); } } Percobaan 2 : Melakukan iterasi pada value HashMap import java.util.Collection; import java.util.HashMap; import java.util.Iterator; public class IterateValuesOfHashMapExample { public static void main(String[] args) { //create HashMap object HashMap hMap = new HashMap(); //add key value pairs to HashMap hMap.put("1","One"); hMap.put("2","Two"); hMap.put("3","Three"); Collection c = hMap.values(); //obtain an Iterator for Collection Iterator itr = c.iterator(); //iterate through HashMap values iterator while(itr.hasNext()) System.out.println(itr.next()); } } Percobaan 3 : Mendapatkan key, melakukan iterasi pada key dan menghapus key tertentu pada objek HashMap public class GetSetViewOfKeysFromHashMapExample { public static void main(String[] args) { //create HashMap object HashMap hMap = new HashMap(); //add key value pairs to HashMap hMap.put("1","One"); hMap.put("2","Two"); hMap.put("3","Three"); 180 Set st = hMap.keySet(); System.out.println("Set created from HashMap Keys contains :"); //iterate through the Set of keys Iterator itr = st.iterator(); while(itr.hasNext()) System.out.println(itr.next()); //remove 2 from Set st.remove("2"); } } Percobaan 4 : Mengecek apakah objek HashMap mempunyai value tertentu. import java.util.HashMap; public class CheckValueOfHashMapExample { public static void main(String[] args) { //create HashMap object HashMap hMap = new HashMap(); //add key value pairs to HashMap hMap.put("1","One"); hMap.put("2","Two"); hMap.put("3","Three"); boolean blnExists = hMap.containsValue("Two"); System.out.println("Two exists in HashMap ? : " + blnExists); } } Percobaan 5 : Mengecek apakah objek HashMap berisi key tertentu import java.util.HashMap; public class CheckKeyOfHashMapExample { public static void main(String[] args) { //create HashMap object HashMap hMap = new HashMap(); //add key value pairs to HashMap hMap.put("1","One"); hMap.put("2","Two"); hMap.put("3","Three"); boolean blnExists = hMap.containsKey("3"); 181 System.out.println("3 exists in HashMap ? : " + blnExists); } } Percobaan 6 : Menambahkan objek Hash Map ke objek Hashtable dan penggunaan Enumeration. import java.util.Enumeration; import java.util.Hashtable; import java.util.HashMap; public class CreateHashtableFromHashMap { public static void main(String[] args) { //create HashMap HashMap hMap = new HashMap(); //populate HashMap hMap.put("1","One"); hMap.put("2","Two"); hMap.put("3","Three"); //create new Hashtable Hashtable ht = new Hashtable(); //populate Hashtable ht.put("1","This value would be REPLACED !!"); ht.put("4","Four"); //print values of Hashtable before copy from HashMap System.out.println("Hashtable contents before copy"); Enumeration e = ht.elements(); while(e.hasMoreElements()) System.out.println(e.nextElement()); ht.putAll(hMap); //display contents of Hashtable System.out.println("Hashtable contents after copy"); e = ht.elements(); while(e.hasMoreElements()) System.out.println(e.nextElement()); } } Percobaan 7 : Mendapatkan key terendah dan tertinggi dari objek TreeMAp. import java.util.TreeMap; public class GetLowestHighestKeyTreeMapExample { public static void main(String[] args) { 182 //create TreeMap object TreeMap treeMap = new TreeMap(); //add key value pairs to TreeMap treeMap.put("1","One"); treeMap.put("3","Three"); treeMap.put("2","Two"); treeMap.put("5","Five"); treeMap.put("4","Four"); System.out.println("Lowest key Stored in Java TreeMap is : " + treeMap.firstKey()); System.out.println("Highest key Stored in Java TreeMap is : " + treeMap.lastKey()); } } Percobaan 8 : Mendapatkan TailMap dari objek TreeMap import java.util.SortedMap; import java.util.TreeMap; public class GetTailMapFromTreeMapExample { public static void main(String[] args) { //create TreeMap object TreeMap treeMap = new TreeMap(); //add key value pairs to TreeMap treeMap.put("1","One"); treeMap.put("3","Three"); treeMap.put("2","Two"); treeMap.put("5","Five"); treeMap.put("4","Four"); SortedMap sortedMap = treeMap.tailMap("2"); System.out.println("Tail Map Contains : " + sortedMap); } } Percobaan 9 : Mendapatkan SubMap dari objek TreeMap import java.util.TreeMap; import java.util.SortedMap; public class GetSubMapFromTreeMapExample { public static void main(String[] args) { 183 //create TreeMap object TreeMap treeMap = new TreeMap(); //add key value pairs to TreeMap treeMap.put("1","One"); treeMap.put("3","Three"); treeMap.put("2","Two"); treeMap.put("5","Five"); treeMap.put("4","Four"); SortedMap sortedMap = treeMap.subMap("2","5"); System.out.println("SortedMap Contains : " + sortedMap); } } Percobaan 10 : Mendapatkan HeadMap dari objek TreeMap import java.util.SortedMap; import java.util.TreeMap; public class GetHeadMapFromTreeMapExample { public static void main(String[] args) { //create TreeMap object TreeMap treeMap = new TreeMap(); //add key value pairs to TreeMap treeMap.put("1","One"); treeMap.put("3","Three"); treeMap.put("2","Two"); treeMap.put("5","Five"); treeMap.put("4","Four"); SortedMap sortedMap = treeMap.headMap("3"); System.out.println("Head Map Contains : " + sortedMap); } } E. LATIHAN Latihan 1 : Mengetahui penggunaan class TreeMap Inputkan kalimat, buatlah sebagian kata-kata dalam kalimat tersebut ada yang sama, output berupa kata (sebagai key) dan jumlah kata (value) dalam kalimat tersebut yang tersimpan dalam TreeMap, selanjutnya tampilkan. Input : televisi kursi televisi kursi meja televisi monitor. Output : kursi = 2 meja = 1 monitor = 1 televisi = 3 184 Latihan 2 : Mengetahui penggunaan class TreeMap Melanjutkan latihan 1, tampilkan : • Tampilkan nilai terendah dan tertinggi Output : Nilai terendah : Meja = 1 Nilai tertinggi : Televisi = 3 • Tampilkan berdasarkan key dengan awalan m. Output : meja = 1 monitor = 1 F. TUGAS Tugas 1 : Ibukota propinsi di Indonesia Terdapat objek TreeMap 1 yang berisi pulau(sebagai key) beserta propinsi- propinsinya(value). Terdapat objek TreeMap 2 yang berisi propinsi(sebagai key) beserta ibukotanya(value). Tampilkan : • Ibukota propinsi yang terdapat di pulau Sumatera • Ibukota propinsi yang terdapat di pulau Jawa • Ibukota propinsi yang berawalan S (Sumatera Utara, Sumatera Barat, Sumatera Selatan, Sulawesi Barat, Sulawesi Tengah, Sulawesi Utara, Sulawesi Tenggara, Sulawesi Selatan) G. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 185 PRAKTIKUM 21 COMPARABLE A. TUJUAN PEMBELAJARAN 1. Mengetahui untuk mengurutkan data dengan cara membandingkan satu objek dengan objek lainnya. 2. Mengetahui class-class di Java yang mengimplementasikan interface Comparable. 3. Mengetahui cara mengurutkan data dengan class yang didefinisikan sendiri, dengan cara mengimplementasikan interface Compable. B. DASAR TEORI Pada kehidupan nyata, object-object sering dibandingkan, misal : • Mobil Andi lebih mahal dibandingkan dengan mobil Budi • Buku A lebih tebal dibandingkan dengan Buku B • Usia Andi lebih muda dibandingkan dengan usia Intan Dalam pemrograman object oriented, sering sekali ada kebutuhan untuk membandingkan object-object dari class yang sama, misalkan membandingkan object untuk mengurutkan data, pencarian data yang diurutkan berdasarkan umur. Pada praktikum ini akan membahas bagaimana merancang object dari class untuk bisa dibandingkan menggunakan interface java.lang.Comparable and java.util.Comparator. B.1 Mengurutkan Objek String Terdapat array dengan tipe String, untuk mengurutkan data String pada array gunakan Arrays.sort(). import java.util.Arrays; public class ArrayString { public static void main(String args[]){ String animals[] = new String[6]; animals[0] = "snake"; animals[1] = "kangaroo"; 185 animals[2] = "wombat"; animals[3] = "bird"; System.out.println("\nSEBELUM DISORTING"); for (int i = 0; i < 4; i++) { System.out.println("animal " + i + " : " + animals[i]); } Arrays.sort(animals,0,4); System.out.println("\nSETELAH DISORTING"); for (int i = 0; i < 4; i++) { System.out.println("animal " + i + " : " + animals[i]); } } } Output : SEBELUM DISORTING animal 0 : snake animal 1 : kangaroo animal 2 : wombat animal 3 : bird SETELAH DISORTING animal 0 : bird animal 1 : kangaroo animal 2 : snake animal 3 : wombat Terdapat data String yang tersimpan dalam ArrayList, untuk mengurutkan data menggunakan Collections.sort() import java.util.ArrayList; import java.util.Collections; public class SortList { public static void main(String args[]){ ArrayList insects = new ArrayList(); insects.add("mosquito"); insects.add("butterfly"); insects.add("dragonfly"); insects.add("fly"); System.out.println("\nSEBELUM DISORTING"); int size = insects.size(); for (int i = 0; i < size; i++) { System.out.println("insect " + i + " : " + (String) insects.get(i)); } Collections.sort(insects); 186 System.out.println("\nSETELAH DISORTING"); for (int i = 0; i < size; i++) { System.out.println("insect " + i + " : " + (String) insects.get(i)); } } } Output : SEBELUM DISORTING insect 0 : mosquito insect 1 : butterfly insect 2 : dragonfly insect 3 : fly SETELAH DISORTING insect 0 : butterfly insect 1 : dragonfly insect 2 : fly insect 3 : mosquito B.2 Mengurutkan Objek Yang Kita Definisikan Sendiri Kita buat class Mahasiswa yang terdapat informasi nama dan nrp dengan tipe String. Terdapat beberapa data mahasiswa yang disimpan di array, selanjutnya kita urutkan berdasarkan nrp. public class Mahasiswa { private String nrp ; private String nama ; public Mahasiswa(String nrp, String nama) { this.nrp = nrp; this.nama = nama; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getNrp() { return nrp; } public void setNrp(String nrp) { this.nrp = nrp; } 187 @Override public String toString() { return "Mahasiswa{" + "nrp=" + nrp + " nama=" + nama + '}'; } } Buatlah class TestMahasiswa untuk menampilkan output : import java.util.Arrays; public class TestMahasiswa { public static void main(String[] args) { Mahasiswa dataMhs[] = {new Mahasiswa("05", "Cahya"),new Mahasiswa("04", "Rudi"), new Mahasiswa("01", "Endah"),new Mahasiswa("03", "Rita"),new Mahasiswa("02", "Tika")}; System.out.println("SEBELUM SORTING"); System.out.println(Arrays.toString(dataMhs)); Arrays.sort(dataMhs); System.out.println("\nSESUDAH SORTING"); System.out.println(Arrays.toString(dataMhs)); } } Output : Exception in thread "main" java.lang.ClassCastException: prak.Mahasiswa cannot be cast to java.lang.Comparable at java.util.Arrays.mergeSort(Arrays.java:1144) at java.util.Arrays.sort(Arrays.java:1079) at prak.TestMahasiswa.main(TestMahasiswa.java:16) Java Result: 1 Pada output program terjadi exception. Mengapa? Karena untuk mengurutkan objek (proses mengurutkan ini dilakukan dengan cara membandingkan satu objek dengan objek yang lain), maka objek tersebut harus mengimplementasikan interface Comparable. Dengan mengimplementasikan interface Comparable pada sebuah class, menyebabkan object-object tersebut bisa dibandingkan (comparable). Kalau pada percobaan sebelumnya data yang diurutkan adalah String, dapat diurutkan karena String mengimplementasikan interface Comparable. public final class String extends Object implements Serializable, Comparable<String>, CharSequence Interface ini mempunyai sebuah method compareTo() yang menentukan bagaimana cara membandingkan antara dua object dari class tersebut. 188 Bentuk methodnya: public int compareTo(Object o) Mehod compareTo() menerima Object, sehingga kita bisa memasukkan sembarang object, tapi harus mempunyai tipe yang sama. Kalau object yang kita masukkan adalah object yang berbeda maka melemparkan exception java.lang.ClassCastException. Return value dari method compareTo() • 0 jika dua object yang dibandingkan sama. • Bilangan positif, jika object 1 lebih besar dibandingkan dengan object 2 • Bilangan negatif, jika object 1 lebih kecil dibandingkan dengan object 2 Bagaimana caranya supaya bisa menggunakan Array.sort() pada contoh kasus diatas. Pada class Mahasiswa implementasikan interface Comparable, berarti harus mengimplementasikan method compareTo(). Isilah method ini dengan tujuan untuk membandingkan object dari class Mahasiswa berdasarkan umur. Jangan lupa untuk mengcasting object menjadi object dari class Mahasiswa terlebih dahulu. public class Mahasiswa implements Comparable { private String nrp ; private String nama ; public Mahasiswa(String nrp, String nama) { this.nrp = nrp; this.nama = nama; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getNrp() { return nrp; } public void setNrp(String nrp) { this.nrp = nrp; } @Override public String toString() { return "Mahasiswa{" + "nrp=" + nrp + " nama=" + nama + '}'; } 189 public int compareTo(Object o) { Mahasiswa m2 = (Mahasiswa) o ; return this.nrp.compareTo(m2.nrp); } } Selanjutnya jalankan class TestMahasiswa lagi. Output : SEBELUM SORTING [Mahasiswa{nrp=05 nama=Cahya}, Mahasiswa{nrp=04 nama=Rudi}, Mahasiswa{nrp=01 nama=Endah}, Mahasiswa{nrp=03 nama=Rita}, Mahasiswa{nrp=02 nama=Tika}] SESUDAH SORTING [Mahasiswa{nrp=01 nama=Endah}, Mahasiswa{nrp=02 nama=Tika}, Mahasiswa{nrp=03 nama=Rita}, Mahasiswa{nrp=04 nama=Rudi}, Mahasiswa{nrp=05 nama=Cahya}] B.3 Penggunaan Class Comparator Dengan mengimplementasikan interface Comparable kita hanya bisa menentukan satu cara saja untuk membandingkan object-object dari class Mahasiswa, untuk contoh sebelumnya, yang kita bandingkan berdasarkan nrp. Bagaimana jika object-object dari class Mahasiswa diurutkan berdasarkan nama? Berarti object-object tersebut dibandingkan berdasarkan nama. Kita masih memerlukan satu cara lagi untuk membandingkan object-object dari class Mahasiswa. Kita memerlukan comparator. Untuk membuat comparator, buat class yang mengimplementasikan interface java.util.Comparator, dan method compare(). public int compare(Object o1, Object o2) Return value dari method compare() • 0 jika dua object yang dibandingkan sama. • Bilangan positif, jika object 1 lebih besar dibandingkan dengan object 2 • Bilangan negatif, jika object 1 lebih kecil dibandingkan dengan object 2 Class Comparator public class NamaComparator implements Comparator { public int compare(Object o1, Object o2) { Mahasiswa m1 = (Mahasiswa) o1; 190 Mahasiswa m2 = (Mahasiswa) o2; return m1.getNama().compareTo(m2.getNama()); } } Penggunaan objek Comparator pada Arrays.sort() public class TestMahasiswa2 { public static void main(String[] args) { Mahasiswa dataMhs[] = {new Mahasiswa("05", "Cahya"),new Mahasiswa("04", "Rudi"), new Mahasiswa("01", "Endah"),new Mahasiswa("03", "Rita"),new Mahasiswa("02", "Tika")}; System.out.println("SEBELUM SORTING"); System.out.println(Arrays.toString(dataMhs)); Arrays.sort(dataMhs, new NamaComparator()); System.out.println("\nSESUDAH SORTING"); System.out.println(Arrays.toString(dataMhs)); } } Output : Mengurutkan Data Mahasiswa berdasarkan Nama SEBELUM SORTING [Mahasiswa{nrp=05 nama=Cahya}, Mahasiswa{nrp=04 nama=Rudi}, Mahasiswa{nrp=01 nama=Endah}, Mahasiswa{nrp=03 nama=Rita}, Mahasiswa{nrp=02 nama=Tika}] SESUDAH SORTING [Mahasiswa{nrp=05 nama=Cahya}, Mahasiswa{nrp=01 nama=Endah}, Mahasiswa{nrp=03 nama=Rita}, Mahasiswa{nrp=04 nama=Rudi}, Mahasiswa{nrp=02 nama=Tika}] C. TUGAS PENDAHULUAN Buatlah resume 1 halaman mengenai interface Comparable dan berikan 1 contoh penggunaan interface Comparable. D. PERCOBAAN Percobaan 1 : Mengurutkan data dengan tipe String yang tersimpan di array. import java.util.Arrays; public class ArrayString { public static void main(String args[]){ String animals[] = new String[6]; animals[0] = "snake"; animals[1] = "kangaroo"; animals[2] = "wombat"; 191 animals[3] = "bird"; System.out.println("\nSEBELUM DISORTING"); for (int i = 0; i < 4; i++) { System.out.println("animal " + i + " : " + animals[i]); } Arrays.sort(animals,0,4); System.out.println("\nSETELAH DISORTING"); for (int i = 0; i < 4; i++) { System.out.println("animal " + i + " : " + animals[i]); } } } Percobaan 2 : Mengurutkan data dengan tipe String yang tersimpan di List. import java.util.ArrayList; import java.util.Collections; public class SortList { public static void main(String args[]){ ArrayList insects = new ArrayList(); insects.add("mosquito"); insects.add("butterfly"); insects.add("dragonfly"); insects.add("fly"); System.out.println("\nSEBELUM DISORTING"); int size = insects.size(); for (int i = 0; i < size; i++) { System.out.println("insect " + i + " : " + (String) insects.get(i)); } Collections.sort(insects); System.out.println("\nSETELAH DISORTING"); for (int i = 0; i < size; i++) { System.out.println("insect " + i + " : " + (String) insects.get(i)); } } } Percobaan 3 : Membuat class Mahasiswa dengan variabel nama dan nrp dengan tipe String. Membuat data mahasiswa yang tersimpan di array. Selanjutnya lakukan pengurutan data mahasiswa tersebut, apa yang terjadi? Jelaskan! public class Mahasiswa { private String nrp ; private String nama ; 192 public Mahasiswa(String nrp, String nama) { this.nrp = nrp; this.nama = nama; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getNrp() { return nrp; } public void setNrp(String nrp) { this.nrp = nrp; } @Override public String toString() { return "Mahasiswa{" + "nrp=" + nrp + " nama=" + nama + '}'; } } import java.util.Arrays; public class TestMahasiswa { public static void main(String[] args) { Mahasiswa dataMhs[] = {new Mahasiswa("05", "Cahya"),new Mahasiswa("04", "Rudi"), new Mahasiswa("01", "Endah"),new Mahasiswa("03", "Rita"),new Mahasiswa("02", "Tika")}; System.out.println("SEBELUM SORTING"); System.out.println(Arrays.toString(dataMhs)); Arrays.sort(dataMhs); System.out.println("\nSESUDAH SORTING"); System.out.println(Arrays.toString(dataMhs)); } } Percobaan 4 : Mengimplementasikan interface Comparable pada class Mahasiswa untuk membandingkan antar objek mahasiswa berdasarkan nrp, lalu urutkan data mahasiswa, apa yang terjadi ? Jelaskan ! public class Mahasiswa implements Comparable { private String nrp ; private String nama ; public Mahasiswa(String nrp, String nama) { 193 this.nrp = nrp; this.nama = nama; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getNrp() { return nrp; } public void setNrp(String nrp) { this.nrp = nrp; } @Override public String toString() { return "Mahasiswa{" + "nrp=" + nrp + " nama=" + nama + '}'; } public int compareTo(Object o) { Mahasiswa m2 = (Mahasiswa) o ; return this.nrp.compareTo(m2.nrp); } } E. LATIHAN Latihan 1 : Sebutkan class-class yang mengimplementasikan interface Comparable. Latihan 2 : Kembangkan untuk Class Mahasiswa dengan memberikan variabel baru berupa nilai IPK (double), selanjutkan lakukan pengurutan data Mahasiswa berdasarkan nrp, nama dan nilai IPK (menggunakan Comparable) Latihan 3 : Pada Supermarket Buah, terdapat beberapa macam buah dan informasi stock dari buah tersebut. Terdapat menu penjualan (supermarket ke konsumen) dan pembelian (supermarket ke pemasok) (menggunakan Comparable) F. TUGAS Tugas 1 : Permainan Remi 194 Pada permainan Remi terdapat 52 kartu, terdapat empat jenis kartu yaitu hati, keriting, wajik dan waru. Setiap jenis kartu terdapat 13 kartu yaitu dua, tiga, empat, lima, enam, tujuh, delapan, sembilan, sepuluh, jack, queen, king, ace. Kartu-kartu ini bisa dibandingkan berdasarkan aturan tertentu. Untuk kartu dengan jenis yang sama, maka misalkan untuk kartu dua hati memiliki nilai yang lebih rendah dibandingkan dengan sembilan hati, kartu king hati lebih tinggi dibandingkan dengan jack hati. Di bawah ini adalah urutan yang berlaku berdasarkan jenis kartu. Untuk selanjutnya urutan ini disebut dengan BagianMuka dua,tiga,empat,lima,enam,tujuh,delapan,sembilan,sepuluh,jack,quee n,king,ace Untuk mengimplementasikan Permainan Remi maka buat : • Enum Bagian Muka • Class Kartu : terdiri dari dua variabel yaitu variabel BagianMuka(tipe Enum BagianMuka) dan variabel jenis(tipe String) Contoh : • • ace keriting (bagianMuka : ace, jenis : keriting) • lima hati (bagianMuka : lima, jenis : hati) Class TumpukanKartu : berisi variabel List dengan nama tumpukanKartu. Kerjakan method-method berikut ini di Class TumpukanKartu dan selanjutnya ujilah method tersebut. • inisialisasi() : untuk membuat tumpukan kartu sebanyak 52 kartu dengan jenis "Hati","Waru","Wajik","Keriting", masing-masing jenis mempunyai bagian muka dua,tiga,empat,lima,enam,tujuh,delapan,sembilan,sepuluh,jack,queen,king,ace. • acakKartu() : untuk mengacak tumpukan kartu. • subList(n) : untuk mengambil sebanyak n kartu dari tumpukan kartu. • subList(int awal, int akhir) : untuk mengambil kartu mulai dari indek ke-awal sampai ke-(akhir-1) dari tumpukan kartu. • indexOf(Object o) : untuk mencari objek Kartu pertama kali yang diinginkan. Gunakan method indexOf() pada List, tapi pada class Kartu harus 195 mengimplementasikan interface Comparable, sehingga perlu menambahkan method compareTo(Object o). • remove(int awal, int akhir): untuk menghapus tumpukan kartu mulai dari indek ke-awal sampai ke-(akhir-1) dari tumpukan kartu. enum BagianMuka { dua,tiga,empat,lima,enam,tujuh,delapan,sembilan,sepuluh,jack,queen,king ,ace ; } public class Kartu { private BagianMuka bagianMuka ; private String jenis; ... } public class TumpukanKartu { public TumpukanKartu() { tumpukanKartu = new Vector(); } public TumpukanKartu(List tumpukanKartu) { this.tumpukanKartu = tumpukanKartu; } } public class TestPrak { public static void main(String args[]){ TumpukanKartu tk = new TumpukanKartu(); tk.inisialisasi(); System.out.println("\nSEBELUM DIACAK\n"); System.out.println(tk.toString()); System.out.println("\nSETELAH DIACAK\n"); tk.acakKartu(); System.out.println(tk.toString()); } } G. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 196 PRAKTIKUM 22 COMPARATOR A. TUJUAN PEMBELAJARAN 1. Memahami untuk mengurutkan data dengan cara membandingkan satu objek dengan objek lainnya. 2. Mengetahui cara mengurutkan data dengan class yang didefinisikan sendiri, dengan cara mengimplementasikan Comparator. B. DASAR TEORI Pada kehidupan nyata, object-object sering dibandingkan, misal : • Mobil Andi lebih mahal dibandingkan dengan mobil Budi • Buku A lebih tebal dibandingkan dengan Buku B • Usia Andi lebih muda dibandingkan dengan usia Intan Dalam pemrograman object oriented, sering sekali ada kebutuhan untuk membandingkan object-object dari class yang sama, misalkan membandingkan object untuk mengurutkan data, pencarian data yang diurutkan berdasarkan umur. Pada praktikum ini akan membahas bagaimana merancang object dari class untuk bisa dibandingkan menggunakan interface java.lang.Comparable and java.util.Comparator. B.1 Mengurutkan Objek String Terdapat array dengan tipe String, untuk mengurutkan data String pada array gunakan Arrays.sort(). import java.util.Arrays; public class ArrayString { public static void main(String args[]){ String animals[] = new String[6]; animals[0] = "snake"; animals[1] = "kangaroo"; animals[2] = "wombat"; 197 animals[3] = "bird"; System.out.println("\nSEBELUM DISORTING"); for (int i = 0; i < 4; i++) { System.out.println("animal " + i + " : " + animals[i]); } Arrays.sort(animals,0,4); System.out.println("\nSETELAH DISORTING"); for (int i = 0; i < 4; i++) { System.out.println("animal " + i + " : " + animals[i]); } } } Output : SEBELUM DISORTING animal 0 : snake animal 1 : kangaroo animal 2 : wombat animal 3 : bird SETELAH DISORTING animal 0 : bird animal 1 : kangaroo animal 2 : snake animal 3 : wombat Terdapat data String yang tersimpan dalam ArrayList, untuk mengurutkan data menggunakan Collections.sort() import java.util.ArrayList; import java.util.Collections; public class SortList { public static void main(String args[]){ ArrayList insects = new ArrayList(); insects.add("mosquito"); insects.add("butterfly"); insects.add("dragonfly"); insects.add("fly"); System.out.println("\nSEBELUM DISORTING"); int size = insects.size(); for (int i = 0; i < size; i++) { System.out.println("insect " + i + " : " + (String) insects.get(i)); } Collections.sort(insects); System.out.println("\nSETELAH DISORTING"); 198 for (int i = 0; i < size; i++) { System.out.println("insect " + i + " : " + (String) insects.get(i)); } } } Output : SEBELUM DISORTING insect 0 : mosquito insect 1 : butterfly insect 2 : dragonfly insect 3 : fly SETELAH DISORTING insect 0 : butterfly insect 1 : dragonfly insect 2 : fly insect 3 : mosquito B.2 Mengurutkan Objek Yang Kita Definisikan Sendiri Kita buat class Mahasiswa yang terdapat informasi nama dan nrp dengan tipe String. Terdapat beberapa data mahasiswa yang disimpan di array, selanjutnya kita urutkan berdasarkan nrp. public class Mahasiswa { private String nrp ; private String nama ; public Mahasiswa(String nrp, String nama) { this.nrp = nrp; this.nama = nama; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getNrp() { return nrp; } public void setNrp(String nrp) { this.nrp = nrp; } @Override 199 public String toString() { return "Mahasiswa{" + "nrp=" + nrp + " nama=" + nama + '}'; } } Buatlah class TestMahasiswa untuk menampilkan output : import java.util.Arrays; public class TestMahasiswa { public static void main(String[] args) { Mahasiswa dataMhs[] = {new Mahasiswa("05", "Cahya"),new Mahasiswa("04", "Rudi"), new Mahasiswa("01", "Endah"),new Mahasiswa("03", "Rita"),new Mahasiswa("02", "Tika")}; System.out.println("SEBELUM SORTING"); System.out.println(Arrays.toString(dataMhs)); Arrays.sort(dataMhs); System.out.println("\nSESUDAH SORTING"); System.out.println(Arrays.toString(dataMhs)); } } Output : Exception in thread "main" java.lang.ClassCastException: prak.Mahasiswa cannot be cast to java.lang.Comparable at java.util.Arrays.mergeSort(Arrays.java:1144) at java.util.Arrays.sort(Arrays.java:1079) at prak.TestMahasiswa.main(TestMahasiswa.java:16) Java Result: 1 Pada output program terjadi exception. Mengapa? Karena untuk mengurutkan objek (proses mengurutkan ini dilakukan dengan cara membandingkan satu objek dengan objek yang lain), maka objek tersebut harus mengimplementasikan interface Comparable. Dengan mengimplementasikan interface Comparable pada sebuah class, menyebabkan object-object tersebut bisa dibandingkan (comparable). Kalau pada percobaan sebelumnya data yang diurutkan adalah String, dapat diurutkan karena String mengimplementasikan interface Comparable. public final class String extends Object implements Serializable, Comparable<String>, CharSequence Interface ini mempunyai sebuah method compareTo() yang menentukan bagaimana cara membandingkan antara dua object dari class tersebut. 200 Bentuk methodnya: public int compareTo(Object o) Mehod compareTo() menerima Object, sehingga kita bisa memasukkan sembarang object, tapi harus mempunyai tipe yang sama. Kalau object yang kita masukkan adalah object yang berbeda maka melemparkan exception java.lang.ClassCastException. Return value dari method compareTo() • 0 jika dua object yang dibandingkan sama. • Bilangan positif, jika object 1 lebih besar dibandingkan dengan object 2 • Bilangan negatif, jika object 1 lebih kecil dibandingkan dengan object 2 Bagaimana caranya supaya bisa menggunakan Array.sort() pada contoh kasus diatas. Pada class Mahasiswa implementasikan interface Comparable, berarti harus mengimplementasikan method compareTo(). Isilah method ini dengan tujuan untuk membandingkan object dari class Mahasiswa berdasarkan umur. Jangan lupa untuk mengcasting object menjadi object dari class Mahasiswa terlebih dahulu. public class Mahasiswa implements Comparable { private String nrp ; private String nama ; public Mahasiswa(String nrp, String nama) { this.nrp = nrp; this.nama = nama; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getNrp() { return nrp; } public void setNrp(String nrp) { this.nrp = nrp; } @Override public String toString() { return "Mahasiswa{" + "nrp=" + nrp + " nama=" + nama + '}'; } 201 public int compareTo(Object o) { Mahasiswa m2 = (Mahasiswa) o ; return this.nrp.compareTo(m2.nrp); } } Selanjutnya jalankan class TestMahasiswa lagi. Output : SEBELUM SORTING [Mahasiswa{nrp=05 nama=Cahya}, Mahasiswa{nrp=04 nama=Rudi}, Mahasiswa{nrp=01 nama=Endah}, Mahasiswa{nrp=03 nama=Rita}, Mahasiswa{nrp=02 nama=Tika}] SESUDAH SORTING [Mahasiswa{nrp=01 nama=Endah}, Mahasiswa{nrp=02 nama=Tika}, Mahasiswa{nrp=03 nama=Rita}, Mahasiswa{nrp=04 nama=Rudi}, Mahasiswa{nrp=05 nama=Cahya}] B.3 Penggunaan Class Comparator Dengan mengimplementasikan interface Comparable kita hanya bisa menentukan satu cara saja untuk membandingkan object-object dari class Mahasiswa, untuk contoh sebelumnya, yang kita bandingkan berdasarkan nrp. Bagaimana jika object-object dari class Mahasiswa diurutkan berdasarkan nama? Berarti object-object tersebut dibandingkan berdasarkan nama. Kita masih memerlukan satu cara lagi untuk membandingkan object-object dari class Mahasiswa. Kita memerlukan comparator. Untuk membuat comparator, buat class yang mengimplementasikan interface java.util.Comparator, dan method compare(). public int compare(Object o1, Object o2) Return value dari method compare() • 0 jika dua object yang dibandingkan sama. • Bilangan positif, jika object 1 lebih besar dibandingkan dengan object 2 • Bilangan negatif, jika object 1 lebih kecil dibandingkan dengan object 2 Class Comparator public class NamaComparator implements Comparator { public int compare(Object o1, Object o2) { Mahasiswa m1 = (Mahasiswa) o1; 202 Mahasiswa m2 = (Mahasiswa) o2; return m1.getNama().compareTo(m2.getNama()); } } Penggunaan objek Comparator pada Arrays.sort() public class TestMahasiswa2 { public static void main(String[] args) { Mahasiswa dataMhs[] = {new Mahasiswa("05", "Cahya"),new Mahasiswa("04", "Rudi"), new Mahasiswa("01", "Endah"),new Mahasiswa("03", "Rita"),new Mahasiswa("02", "Tika")}; System.out.println("SEBELUM SORTING"); System.out.println(Arrays.toString(dataMhs)); Arrays.sort(dataMhs, new NamaComparator()); System.out.println("\nSESUDAH SORTING"); System.out.println(Arrays.toString(dataMhs)); } } Output : Mengurutkan Data Mahasiswa berdasarkan Nama SEBELUM SORTING [Mahasiswa{nrp=05 nama=Cahya}, Mahasiswa{nrp=04 nama=Rudi}, Mahasiswa{nrp=01 nama=Endah}, Mahasiswa{nrp=03 nama=Rita}, Mahasiswa{nrp=02 nama=Tika}] SESUDAH SORTING [Mahasiswa{nrp=05 nama=Cahya}, Mahasiswa{nrp=01 nama=Endah}, Mahasiswa{nrp=03 nama=Rita}, Mahasiswa{nrp=04 nama=Rudi}, Mahasiswa{nrp=02 nama=Tika}] C. TUGAS PENDAHULUAN Buatlah resume 1 halaman mengenai kegunaan interface Comparator, dan 1 contoh penggunaan dari interface Comparator. D. PERCOBAAN Percobaan 1 : Mengurutkan data secara descending, data tersimpan di ArrayList import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class SortArrayListInDescendingOrderExample { public static void main(String[] args) { 203 //create an ArrayList object ArrayList arrayList = new ArrayList(); //Add elements to Arraylist arrayList.add("A"); arrayList.add("B"); arrayList.add("C"); arrayList.add("D"); arrayList.add("E"); Comparator comparator = Collections.reverseOrder(); System.out.println("Before sorting ArrayList in descending order : " + arrayList); Collections.sort(arrayList,comparator); System.out.println("After sorting ArrayList in descending order : " + arrayList); } } Percobaan 2 : Membuat sendiri class yang akan diurutkan dan membuat objek Comparator. import java.util.*; class Employee{ private int age; private String name; public void setAge(int age){ this.age=age; } public int getAge(){ return this.age; } public void setName(String name){ this.name=name; } public String getName(){ return this.name; } } class AgeComparator implements Comparator{ public int compare(Object emp1, Object emp2){ 204 int emp1Age = ((Employee)emp1).getAge(); int emp2Age = ((Employee)emp2).getAge(); if(emp1Age > emp2Age) return 1; else if(emp1Age < emp2Age) return -1; else return 0; } } class NameComparator implements Comparator{ public int compare(Object emp1, Object emp2){ //parameter are of type Object, so we have to downcast it to Employee objects String emp1Name = ((Employee)emp1).getName(); String emp2Name = ((Employee)emp2).getName(); //uses compareTo method of String class to compare names of the employee return emp1Name.compareTo(emp2Name); } } public class JavaComparatorExample{ public static void main(String args[]){ //Employee array which will hold employees Employee employee[] = new Employee[2]; //set different attributes of the individual employee. employee[0] = new Employee(); employee[0].setAge(40); employee[0].setName("Joe"); employee[1] = new Employee(); employee[1].setAge(20); employee[1].setName("Mark"); System.out.println("Order of employee before sorting is"); //print array as is. for(int i=0; i < employee.length; i++){ System.out.println( "Employee " + (i+1) + " name :: " + employee[i].getName() + ", Age :: " + employee[i].getAge()); } //Sorting array on the basis of employee age by passing AgeComparator Arrays.sort(employee, new AgeComparator()); 205 System.out.println("\n\nOrder of employee after sorting by employee age is"); for(int i=0; i < employee.length; i++){ System.out.println( "Employee " + (i+1) + " name :: " + employee[i].getName() + ", Age :: " + employee[i].getAge()); } //Sorting array on the basis of employee Name by passing NameComparator Arrays.sort(employee, new NameComparator()); System.out.println("\n\nOrder of employee after sorting by employee name is"); for(int i=0; i < employee.length; i++){ System.out.println( "Employee " + (i+1) + " name :: " + employee[i].getName() + ", Age :: " + employee[i].getAge()); } } } Percobaan 3 : Membuat class Mahasiswa dengan variabel nama dan nrp dengan tipe String. Membuat data mahasiswa yang tersimpan di array. Selanjutnya lakukan pengurutan data mahasiswa tersebut, apa yang terjadi? Jelaskan! public class Mahasiswa { private String nrp ; private String nama ; public Mahasiswa(String nrp, String nama) { this.nrp = nrp; this.nama = nama; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getNrp() { return nrp; } public void setNrp(String nrp) { this.nrp = nrp; } @Override 206 public String toString() { return "Mahasiswa{" + "nrp=" + nrp + " nama=" + nama + '}'; } } import java.util.Arrays; public class TestMahasiswa { public static void main(String[] args) { Mahasiswa dataMhs[] = {new Mahasiswa("05", "Cahya"),new Mahasiswa("04", "Rudi"), new Mahasiswa("01", "Endah"),new Mahasiswa("03", "Rita"),new Mahasiswa("02", "Tika")}; System.out.println("SEBELUM SORTING"); System.out.println(Arrays.toString(dataMhs)); Arrays.sort(dataMhs); System.out.println("\nSESUDAH SORTING"); System.out.println(Arrays.toString(dataMhs)); } } Percobaan 4 : Mengurutkan data mahasiswa berdasarkan nama, dengan mengimplementasikan interface Comparator. Class Comparator public class NamaComparator implements Comparator { public int compare(Object o1, Object o2) { Mahasiswa m1 = (Mahasiswa) o1; Mahasiswa m2 = (Mahasiswa) o2; return m1.getNama().compareTo(m2.getNama()); } } Penggunaan objek Comparator pada Arrays.sort() public class TestMahasiswa2 { public static void main(String[] args) { Mahasiswa dataMhs[] = {new Mahasiswa("05", "Cahya"),new Mahasiswa("04", "Rudi"), new Mahasiswa("01", "Endah"),new Mahasiswa("03", "Rita"),new Mahasiswa("02", "Tika")}; System.out.println("SEBELUM SORTING"); System.out.println(Arrays.toString(dataMhs)); Arrays.sort(dataMhs, new NamaComparator()); System.out.println("\nSESUDAH SORTING"); System.out.println(Arrays.toString(dataMhs)); } } 207 Percobaan 5 : Membuat sendiri class yang akan diurutkan dan membuat objek Comparator. Mengurutkan objek secara descending. import import import import import java.util.ArrayList; java.util.Arrays; java.util.Collections; java.util.Comparator; java.util.List; public class EmpComparator implements Comparator { public int compare(Object obj1, Object obj2) { Person emp1 = (Person) obj1; Person emp2 = (Person) obj2; int nameComp = emp1.getFirstName().compareTo(emp2.getFirstName()); return ((nameComp == 0) ? emp1.getLastName().compareTo( emp2.getLastName()) : nameComp); } public static void main(String args[]) { String names[] = { "Bart", "Hugo", "Lisa", "Marge", "Homer", "Maggie", "Roy" }; // Convert to list List list = new ArrayList(Arrays.asList(names)); // Ensure list sorted Collections.sort(list); System.out.println("Sorted list: [length: " + list.size() + "]"); System.out.println(list); // Search for element in list int index = Collections.binarySearch(list, "Maggie"); System.out.println("Found Maggie @ " + index); // Search for element not in list index = Collections.binarySearch(list, "Jimbo Jones"); System.out.println("Didn't find Jimbo Jones @ " + index); // Insert int newIndex = -index - 1; list.add(newIndex, "Jimbo Jones"); System.out.println("With Jimbo Jones added: [length: " + list.size() + "]"); System.out.println(list); // Min should be Bart System.out.println(Collections.min(list)); // Max should be Roy System.out.println(Collections.max(list)); 208 Comparator comp = Collections.reverseOrder(); // Reversed Min should be Roy System.out.println(Collections.min(list, comp)); // Reversed Max should be Bart System.out.println(Collections.max(list, comp)); } } class Person implements Comparable { String firstName, lastName; public Person(String f, String l) { this.firstName = f; this.lastName = l; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public String toString() { return "[ name=" + firstName + ",name=" + lastName + "]"; } public int compareTo(Object obj) { Person emp = (Person) obj; int deptComp = firstName.compareTo(emp.getFirstName()); return ((deptComp == 0) ? lastName.compareTo(emp.getLastName()) : deptComp); } public boolean equals(Object obj) { if (!(obj instanceof Person)) { return false; } Person emp = (Person) obj; return firstName.equals(emp.getFirstName()) && lastName.equals(emp.getLastName()); } } E. LATIHAN 209 Latihan 1 : Kembangkan untuk Class Mahasiswa dengan memberikan variabel baru berupa nilai IPK (double), selanjutkan lakukan pengurutan data Mahasiswa berdasarkan nrp, nama dan nilai IPK (menggunakan Comparator). Latihan 2 : Pada Supermarket Buah, terdapat beberapa macam buah dan informasi stock dari buah tersebut. Terdapat menu penjualan (supermarket ke konsumen) dan pembelian (supermarket ke pemasok) (menggunakan Comparator) F. TUGAS Tugas 1 : Ubahlah contoh FindDups di bawah ini menggunakan SortedSet untuk menggantikan Set. Definisikan Comparator, sehingga pada saat melakukan sorting berlaku non- case sensitive. import java.util.*; public class FindDups { public static void main(String[] args) { Set<String> s = new HashSet<String>(); for (String a : args) if (!s.add(a)) System.out.println("Duplicate detected: " + a); System.out.println(s.size() + " distinct words: " + s); } } G. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 210 PRAKTIKUM 23 GENERICS : MEMBUAT CLASS GENERIC, GENERIC PADA COLLECTION A. TUJUAN PEMBELAJARAN 1. Memahami mengenai konsep generic 2. Mengetahui cara merubah dari bentuk non generic menjadi generic 3. Memahami generics pada Collection B. DASAR TEORI Generics merupakan cara Java dalam melakukan generalisasi terhadap tipe data tanpa mengurangi kemampuan Java dalam menjaga keamanan penggunaan tipe data. public class NonGen { Object ob; NonGen(Object o) { ob = o; } Object getob() { return ob; } void showType() { System.out.println("Type of ob is " + ob.getClass().getName()); } } Pada object Box, kita bisa memasukkan sembarang object karena parameter pada method add() adalah Class Object, tapi pada saat mengambil object tersebut harus diubah sesuai dengan tipe dari object tersebut. public class NonGenDemo { public static void main(String args[]) { NonGen integerObject; integerObject = new NonGen(88); integerObject.showType(); int v = (Integer) integerObject.getob(); 211 System.out.println("value: " + v); NonGen strOb = new NonGen("10"); strOb.showType(); String str = (String) strOb.getob(); System.out.println("value: " + str); //menyebabkan exception Integer i = (Integer) strOb.getob(); } } Terjadi exception karena pada object strOb dimasukkan object 10 tapi dengan tipe String, tapi pada saat mengambil object, diubah menjadi tipe Integer. Tipe data tidak sesuai sehingga menyebabkan terjadinya exception. Output : Type of ob is java.lang.Integer value: 88 Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer Type of ob is java.lang.String value: Non-Generics Test at com.NonGenDemo.main(NonGenDemo.java:30) Java Result: 1 Permasalahan yang muncul dengan penyimpanan objek yang non homogeneous adalah memerlukan banyak casting. Tidak ada pengecekan pada saat kompile, kesalahan baru bisa terdeteksi pada saat runtime. Cara mendeklarasikan Class Generics Ubah class Box Non Generics menjadi class Box Generic. Pendeklarasian type generics dengan mengubah public class Box() menjadi public class Box <T> – T biasanya disebut parameter type formal (formal type parameter) – T adalah type parameter yang akan diganti dengan tipe sebenarnya (Type dari T bisa berupa class, interface atau tipe variabel lainnya). 212 – T adalah nama dari type parameter. public class Gen<T> { T ob; // declare an object of type T Gen(T o) { ob = o; } T getob() { return ob; } void showType() { System.out.println("Type of T is " + ob.getClass().getName()); } } public class GenDemo { public static void main(String args[]) { Gen<Integer> iOb; iOb = new Gen<Integer>(88); iOb.showType(); int v = iOb.getob(); System.out.println("value: " + v); System.out.println(); Gen<String> strOb = new Gen<String>("Generics Test"); String v2 = strOb.getob(); } } Objek iOb adalah objek dari class Generic, menggunakan tipe data Integer, sehingga pada saat mengambil objek menggunakan fungsi get(), tidak perlu proses casting. Aturan Penamaan Type Parameter Nama type parameter biasanya satu huruf dan huruf besar. Jenis nama tipe parameter yang sering digunakan : – E - Element (biasanya digunakan untuk Collection Framework) – K – Key – N – Number – T - Type 213 – V - Value – S,U,V dll. - 2nd, 3rd, 4th types Generics pada Method Pada contoh sebelumnya, kita mendefinisikan type parameter pada level class. Sebenarnya tipe variable ini juga dapat didefinisikan pada level method. public class GenericMethodTest { public static<E> void printArray(E[] inputArray){ for(E element : inputArray) System.out.printf("%s",element); System.out.println(""); } public static void main(String[] args) { Integer[] intArray = {1,2,3,4,5} ; Double[] doubleArray = {1.1,2.2,3.3,4.4,5.5}; Character[] charArray = {'J','A','V','A'}; printArray(intArray); printArray(doubleArray); printArray(charArray); } } Subtyping Jika B adalah suatu subtype dari A dan G adalah suatu tipe data generics, maka tidak berarti G<B> adalah subtype dari G<A>. Generics pada Collection • List <E> myList ; E disebut type variabel, variabel yang diganti dengan type. Jika E adalah class, maka kita bisa melewatkan subclass E. Jika E adalah interface maka kita bisa melewatkan class yang mengimplementasikan E. public class ArrayListGenericDemo { public static void main(String[] args) { ArrayList<String> data = new ArrayList<String>(); data.add("hello"); data.add("goodbye"); // data.add(new Date()); This won't compile! } 214 Objek List data bertipe String, sehingga yang bisa dimasukkan hanya bertipe String saja, jika kita memasukkan objek selain String maka error. Type parameter yang dibatasi Jika kita ingin memberikan batasan type yang diperbolehkan untuk dilewatkan ke type parameter. Contoh method dengan parameter number, hanya menerima object dari class Number dan subclass. Hal ini yang disebut bounded type parameter. • Cara <U extends Number> • Jika terdapat interface yang harus diimplementasikan gunakan & <U extends Number & MyInterface> Menggunakan ? Wildcard Jika kita mendeklarasikan sebuah List<aType>, isi List adalah object dengan tipe aType, maka kita bisa menyimpan di List object dengan tipe : – Object dari aType – Object dari subclass aType, jika aType adalah class – Object dari class yang mengimplementasikan aType, jika aType adalah interface Sedangkan List<?> berarti semua tipe data bisa masuk, terlalu luas bentuk lain : List<? extends Number> List<? extends T> C. TUGAS PENDAHULUAN Buatlah review mengenai : • permasalahan pada class non generic • merubah bentuk class non generic menjadi class generic • manfaat dari class generics • generic pada collection. 215 D. PERCOBAAN Percobaan 1 : Membuat class NonGeneric, membuat objek dan mengambil nilai dari class NonGeneric public class NonGen { Object ob; NonGen(Object o) { ob = o; } Object getob() { return ob; } void showType() { System.out.println("Type of ob is " + ob.getClass().getName()); } } public class NonGenDemo { public static void main(String args[]) { NonGen integerObject; integerObject = new NonGen(88); integerObject.showType(); int v = (Integer) integerObject.getob(); System.out.println("value: " + v); NonGen strOb = new NonGen("Non-Generics Test"); strOb.showType(); String str = (String) strOb.getob(); System.out.println("value: " + str); //ini yang menyebabkan excepton integerObject = strOb; v = (Integer) integerObject.getob(); } } Percobaan 2 : Membuat class NonGeneric, membuat objek dan mengambil nilai dari class NonGeneric public class Gen<T> { T ob; // declare an object of type T Gen(T o) { ob = o; 216 } T getob() { return ob; } void showType() { System.out.println("Type of T is " + ob.getClass().getName()); } } public class GenDemo { public static void main(String args[]) { Gen<Integer> iOb; iOb = new Gen<Integer>(88); iOb.showType(); int v = iOb.getob(); System.out.println("value: " + v); System.out.println(); Gen<String> strOb = new Gen<String>("Generics Test"); strOb.showType(); String str = strOb.getob(); System.out.println("value: " + str); } } Percobaan 3 : Class Generic dengan Dua Type Parameter class TwoGen<T, V> { T ob1; V ob2; TwoGen(T o1, V o2) { ob1 = o1; ob2 = o2; } void showTypes() { System.out.println("Type of T is " + ob1.getClass().getName()); System.out.println("Type of V is " + ob2.getClass().getName()); } T getob1() { return ob1; } V getob2() { 217 return ob2; } } public class TwoGenDemo { public static void main(String args[]) { TwoGen<Integer, String> tgObj = new TwoGen<Integer, String>(88, "Generics"); tgObj.showTypes(); int v = tgObj.getob1(); System.out.println("value: " + v); String str = tgObj.getob2(); System.out.println("value: " + str); } } Percobaan 4 : Generic pada Method public class GenericMethodTest { public static<E> void printArray(E[] inputArray){ for(E element : inputArray) System.out.printf("%s",element); System.out.println(""); } public static void main(String[] args) { Integer[] intArray = {1,2,3,4,5} ; Double[] doubleArray = {1.1,2.2,3.3,4.4,5.5}; Character[] charArray = {'J','A','V','A'}; printArray(intArray); printArray(doubleArray); printArray(charArray); } } Percobaan 5 : Generic Pada List public class ArrayListGenericDemo { public static void main(String[] args) { ArrayList<String> data = new ArrayList<String>(); data.add("hello"); data.add("goodbye"); // data.add(new Date()); This won't compile! Iterator<String> it = data.iterator(); while (it.hasNext()) { String s = it.next(); System.out.println(s); } } } 218 Percobaan 6 : Generic pada Map public class GenericMap { public static void main(String args[]) { HashMap<String,Integer> hm = new HashMap<String,Integer>(); hm.put("apel", 20); hm.put("anggur", 13); hm.put("jeruk", 5); } } Percobaan 7 : Subtyping public class GenSubtypingDemo { public static void main(String args[]) { Gen<String> gen1 = new Gen("abc"); Gen<Object> gen2 = new Gen("abc"); gen2 = gen1 ; //error pada saat dikompile } } E. LATIHAN 1. Buatlah method generic untuk menghitung banyaknya bilangan prima yang tersimpan di collection. Input : [3,5,7,9,12,15,19] Terdapat 4 bilangan prima. Alur pengerjaan, dapat mengikuti cara di bawah ini : public interface UnaryPredicate<T> { public boolean test(T obj); } class PrimePredicate implements UnaryPredicate<Integer> { public boolean test(Integer i) { //isilah } } public final class Algorithm { public static <T> int countIf(Collection<T> c, UnaryPredicate<T> p) { int count = 0; for (T elem : c) if (p.test(elem)) ++count; 219 return count; } } public class Test { public static void main(String[] args) { Collection<Integer> ci = Arrays.asList(1, 2, 3, 4); int count = Algorithm.countIf(ci, new PrimePredicate()); System.out.println("Number of prime integers = " + count); } } 2. Apakah program di bawah ini dapat dikompile ? Jika tidak, jelaskan ! public final class Algorithm { public static T max(T x, T y) { return x > y ? x : y; } } 3. Buatlah method generic untuk menukar posisi dua element yang tersimpan di array public static <T> void swap(T[] a, int i, int j) {..} 4. Apakah program di bawah ini dapat dikompile ? Jika tidak, jelaskan ! public class Singleton<T> { public static T getInstance() { if (instance == null) instance = new Singleton<T>(); return instance; } private static T instance = null; } F. TUGAS Tugas 1 : Apakah program di bawah ini dapat dikompile ? Jika tidak, jelaskan ! class Shape { /* ... */ } class Circle extends Shape { /* ... */ } class Rectangle extends Shape { /* ... */ } class Node<T> { /* ... */ } Node<Circle> nc = new Node<>(); Node<Shape> ns = nc; 220 Tugas 2 : Apakah program di bawah ini dapat dikompile ? Jika tidak, jelaskan ! class Node<T> implements Comparable<T> { public int compareTo(T obj) { /* ... */ } // ... } Node<String> node = new Node<>(); Comparable<String> comp = node; G. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 221 PRAKTIKUM 24 GENERICS : BOUNDED TYPE PARAMETER DAN WILDCARD A. TUJUAN PEMBELAJARAN 1. Memahami mengenai konsep generic 2. Memahami penggunaan tipe parameter yang dibatasi (Bounded Type Parameter). 3. Memahami penggunaan wildcard B. DASAR TEORI Generics merupakan cara Java dalam melakukan generalisasi terhadap tipe data tanpa mengurangi kemampuan Java dalam menjaga keamanan penggunaan tipe data. public class NonGen { Object ob; NonGen(Object o) { ob = o; } Object getob() { return ob; } void showType() { System.out.println("Type of ob is " + ob.getClass().getName()); } } Pada object Box, kita bisa memasukkan sembarang object karena parameter pada method add() adalah Class Object, tapi pada saat mengambil object tersebut harus diubah sesuai dengan tipe dari object tersebut. public class NonGenDemo { public static void main(String args[]) { NonGen integerObject; integerObject = new NonGen(88); integerObject.showType(); 222 int v = (Integer) integerObject.getob(); System.out.println("value: " + v); NonGen strOb = new NonGen("10"); strOb.showType(); String str = (String) strOb.getob(); System.out.println("value: " + str); //menyebabkan exception Integer i = (Integer) strOb.getob(); } } Terjadi exception karena pada object strOb dimasukkan object 10 tapi dengan tipe String, tapi pada saat mengambil object, diubah menjadi tipe Integer. Tipe data tidak sesuai sehingga menyebabkan terjadinya exception. Output : Type of ob is java.lang.Integer value: 88 Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer Type of ob is java.lang.String value: Non-Generics Test at com.NonGenDemo.main(NonGenDemo.java:30) Java Result: 1 Permasalahan yang muncul dengan penyimpanan objek yang non homogeneous adalah memerlukan banyak casting. Tidak ada pengecekan pada saat kompile, kesalahan baru bisa terdeteksi pada saat runtime. Cara mendeklarasikan Class Generics Ubah class Box Non Generics menjadi class Box Generic. Pendeklarasian type generics dengan mengubah public class Box() menjadi public class Box <T> – T biasanya disebut parameter type formal (formal type parameter) 223 – T adalah type parameter yang akan diganti dengan tipe sebenarnya (Type dari T bisa berupa class, interface atau tipe variabel lainnya). – T adalah nama dari type parameter. public class Gen<T> { T ob; // declare an object of type T Gen(T o) { ob = o; } T getob() { return ob; } void showType() { System.out.println("Type of T is " + ob.getClass().getName()); } } public class GenDemo { public static void main(String args[]) { Gen<Integer> iOb; iOb = new Gen<Integer>(88); iOb.showType(); int v = iOb.getob(); System.out.println("value: " + v); System.out.println(); Gen<String> strOb = new Gen<String>("Generics Test"); String v2 = strOb.getob(); } } Objek iOb adalah objek dari class Generic, menggunakan tipe data Integer, sehingga pada saat mengambil objek menggunakan fungsi get(), tidak perlu proses casting. Aturan Penamaan Type Parameter Nama type parameter biasanya satu huruf dan huruf besar. Jenis nama tipe parameter yang sering digunakan : – E - Element (biasanya digunakan untuk Collection Framework) – K – Key 224 – N – Number – T - Type – V - Value – S,U,V dll. - 2nd, 3rd, 4th types Generics pada Method Pada contoh sebelumnya, kita mendefinisikan type parameter pada level class. Sebenarnya tipe variable ini juga dapat didefinisikan pada level method. public class GenericMethodTest { public static<E> void printArray(E[] inputArray){ for(E element : inputArray) System.out.printf("%s",element); System.out.println(""); } public static void main(String[] args) { Integer[] intArray = {1,2,3,4,5} ; Double[] doubleArray = {1.1,2.2,3.3,4.4,5.5}; Character[] charArray = {'J','A','V','A'}; printArray(intArray); printArray(doubleArray); printArray(charArray); } } Subtyping Jika B adalah suatu subtype dari A dan G adalah suatu tipe data generics, maka tidak berarti G<B> adalah subtype dari G<A>. Generics pada Collection • List <E> myList ; E disebut type variabel, variabel yang diganti dengan type. Jika E adalah class, maka kita bisa melewatkan subclass E. Jika E adalah interface maka kita bisa melewatkan class yang mengimplementasikan E. public class ArrayListGenericDemo { public static void main(String[] args) { ArrayList<String> data = new ArrayList<String>(); data.add("hello"); data.add("goodbye"); // data.add(new Date()); This won't compile! } 225 Objek List data bertipe String, sehingga yang bisa dimasukkan hanya bertipe String saja, jika kita memasukkan objek selain String maka error. Type parameter yang dibatasi Jika kita ingin memberikan batasan type yang diperbolehkan untuk dilewatkan ke type parameter. Contoh method dengan parameter number, hanya menerima object dari class Number dan subclass. Hal ini yang disebut bounded type parameter. • Cara <U extends Number> • Jika terdapat interface yang harus diimplementasikan gunakan & <U extends Number & MyInterface> Menggunakan ? Wildcard Jika kita mendeklarasikan sebuah List<aType>, isi List adalah object dengan tipe aType, maka kita bisa menyimpan di List object dengan tipe : – Object dari aType – Object dari subclass aType, jika aType adalah class – Object dari class yang mengimplementasikan aType, jika aType adalah interface Sedangkan List<?> berarti semua tipe data bisa masuk, terlalu luas bentuk lain : List<? extends Number> List<? extends T> C. TUGAS PENDAHULUAN Buatlah review mengenai : • Generic dengan type parameter yang dibatasi. • Generic dengan wildcard D. PERCOBAAN Percobaan 1 : Type parameter yang dibatasi class Stats<T extends Number> { 226 T[] nums; Stats(T[] o) { nums = o; } double average() { double sum = 0.0; for (int i = 0; i < nums.length; i++) sum += nums[i].doubleValue(); return sum / nums.length; } } public class BoundsDemo { public static void main(String args[]) { Integer inums[] = { 1, 2, 3, 4, 5 }; Stats<Integer> iob = new Stats<Integer>(inums); double v = iob.average(); System.out.println("iob average is " + v); Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; Stats<Double> dob = new Stats<Double>(dnums); double w = dob.average(); System.out.println("dob average is " + w); } } Percobaan 2 : Generic pada konstruktor, dengan type parameter dibatasi. class GenCons { private double val; <T extends Number> GenCons(T arg) { val = arg.doubleValue(); } void showval() { System.out.println("val: " + val); } } public class GenConsDemo { public static void main(String args[]) { GenCons test = new GenCons(100); GenCons test2 = new GenCons(123.5F); test.showval(); test2.showval(); 227 } } Percobaan 3 : Menggunakan Interface Comparable Generic interface MinMax<T extends Comparable<T>> { T min(); T max(); } class MyClass<T extends Comparable<T>> implements MinMax<T> { T[] vals; MyClass(T[] o) { vals = o; } public T min() { T v = vals[0]; for(int i=1; i < vals.length; i++) if(vals[i].compareTo(v) < 0) v = vals[i]; return v; } public T max() { T v = vals[0]; for(int i=1; i < vals.length; i++) if(vals[i].compareTo(v) > 0) v = vals[i]; return v; } } public class GenIFDemo { public static void main(String args[]) { Integer inums[] = {3, 6, 2, 8, 6 }; Character chs[] = {'b', 'r', 'p', 'w' }; MyClass<Integer> iob = new MyClass<Integer>(inums); MyClass<Character> cob = new MyClass<Character>(chs); System.out.println("Max value in inums: " + iob.max()); System.out.println("Min value in inums: " + iob.min()); System.out.println("Max value in chs: " + cob.max()); System.out.println("Min value in chs: " + cob.min()); } } Percobaan 4 : Menggunakan Unbounded Wildcard(1) public class TestGeneric { public static void printList(List<?> list) { 228 for (Object elem : list) { System.out.print(elem + " "); } System.out.println(); } public static void main(String[] args) { List<Integer> li = Arrays.asList(1, 2, 3); List<String> ls = Arrays.asList("one", "two", "three"); printList(li); printList(ls); } } Percobaan 5 : Menggunakan Unbounded Wildcard(2) class Stats<T extends Number> { T[] nums; // array of Number or subclass // Pass the constructor a reference to // an array of type Number or subclass. Stats(T[] o) { nums = o; } // Return type double in all cases. double average() { double sum = 0.0; for(int i=0; i < nums.length; i++) sum += nums[i].doubleValue(); return sum / nums.length; } // Determine if two averages are the same. // Notice the use of the wildcard. boolean sameAvg(Stats<?> ob) { if(average() == ob.average()) return true; return false; } } // Demonstrate wildcard. public class WildCardDemo { public static void main(String args[]) { Integer inums[] = { 1, 2, 3, 4, 5 }; Stats<Integer> iob = new Stats<Integer>(inums); double v = iob.average(); System.out.println("iob average is " + v); Double dnums[] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; Stats<Double> dob = new Stats<Double>(dnums); 229 double w = dob.average(); System.out.println("dob average is " + w); Float fnums[] = { 1.0F, 2.0F, 3.0F, 4.0F, 5.0F }; Stats<Float> fob = new Stats<Float>(fnums); double x = fob.average(); System.out.println("fob average is " + x); // See which arrays have same average. System.out.print("Averages of iob and dob "); if(iob.sameAvg(dob)) System.out.println("are the same."); else System.out.println("differ."); System.out.print("Averages of iob and fob "); if(iob.sameAvg(fob)) System.out.println("are the same."); else System.out.println("differ."); } } Percobaan 6 : Menggunakan UpperBound Wildcard(2) import java.util.Arrays; import java.util.List; public class TestGeneric2 { public static double sumOfList(List<? extends Number> list) { double s = 0.0; for (Number n : list) { s += n.doubleValue(); } return s; } public static void main(String[] args) { List<Integer> li = Arrays.asList(1, 2, 3); System.out.println("sum = " + sumOfList(li)); List<Double> ld = Arrays.asList(1.2, 2.3, 3.5); System.out.println("sum = " + sumOfList(ld)); } } Percobaan 7 : Menggunakan UpperBound Wildcard(2) class TwoD { int x, y; TwoD(int a, int b) { x = a; y = b; 230 } } // Three-dimensional coordinates. class ThreeD extends TwoD { int z; ThreeD(int a, int b, int c) { super(a, b); z = c; } } // Four-dimensional coordinates. class FourD extends ThreeD { int t; FourD(int a, int b, int c, int d) { super(a, b, c); t = d; } } // This class holds an array of coordinate objects. class Coords<T extends TwoD> { T[] coords; Coords(T[] o) { coords = o; } } // Demonstrate a bounded wildcard. public class BoundedWildcard { static void showXY(Coords<?> c) { System.out.println("X Y Coordinates:"); for(int i=0; i < c.coords.length; i++) System.out.println(c.coords[i].x + " " + c.coords[i].y); System.out.println(); } static void showXYZ(Coords<? extends ThreeD> c) { System.out.println("X Y Z Coordinates:"); for(int i=0; i < c.coords.length; i++) System.out.println(c.coords[i].x + " " + c.coords[i].y + " " + c.coords[i].z); System.out.println(); } static void showAll(Coords<? extends FourD> c) { System.out.println("X Y Z T Coordinates:"); for(int i=0; i < c.coords.length; i++) 231 System.out.println(c.coords[i].x + " " + c.coords[i].y + " " + c.coords[i].z + " " + c.coords[i].t); System.out.println(); } public static void main(String args[]) { TwoD td[] = { new TwoD(0, 0), new TwoD(7, 9), new TwoD(18, 4), new TwoD(-1, -23) }; Coords<TwoD> tdlocs = new Coords<TwoD>(td); System.out.println("Contents of tdlocs."); showXY(tdlocs); // OK, is a TwoD showXYZ(tdlocs); // Error, not a ThreeD showAll(tdlocs); // Erorr, not a FourD // // // Now, create some FourD objects. FourD fd[] = { new FourD(1, 2, 3, 4), new FourD(6, 8, 14, 8), new FourD(22, 9, 4, 9), new FourD(3, -2, -23, 17) }; Coords<FourD> fdlocs = new Coords<FourD>(fd); System.out.println("Contents of fdlocs."); // These are all OK. showXY(fdlocs); showXYZ(fdlocs); showAll(fdlocs); } } Percobaan 8 : Menggunakan LowerBound Wildcard public class BoxImpl<T> implements Box<T> { private T element; public T get() { return element; } public void put(T element) { this.element = element; } } 232 public class TestBoxKu { public static void main(String[] args) { BoxKu<Integer> bIn = new BoxKu<Integer>(7); BoxKu<Number> bNum = new BoxKu<Number>(10); System.out.println(bIn.toString()); System.out.println(bNum.toString()); bIn.copyTo(bNum); System.out.println(bIn.toString()); System.out.println(bNum.toString()); } } E. LATIHAN 1. Apakah program di bawah ini dapat dikompile ? Jika tidak, jelaskan ! public static void print(List<? extends Number> list) { for (Number n : list) System.out.print(n + " "); System.out.println(); } 2. Buatlah method generic untuk mencari nilai maksimul pada range [begin, end] dari list. public static <T extends Object & Comparable<? super T>> T max(List<? extends T> list, int begin, int end) {...} F. TUGAS Tugas 1 : Buatlah interface Box seperti dibawah ini! Dan buatlah class BoxImpl yang mengimplementasikan interface Box. public interface Box<T> { public T get(); public void put(T element); public void put(Box<T> box); } public class BoxImpl<T> implements Box<T> { private T element ; public T get() { //isilah } 233 public void put(T element) { //isilah } public void put(Box<T> box) { //isilah } } Jelaskan mengapa program di bawah ini error ! public class TestBoxImpl { public static void main(String[] args) { Box<Number> nBox = new BoxImpl<Number>(); Box<Integer> iBox = new BoxImpl<Integer>(); nBox.put(iBox); // ERROR } } Perbaiki interface Box seperti di bawah ini ! Jelaskan mengapa dengan perubahan seperti ini program yang sebelumnya error menjadi tidak error ? public interface Box<T> { public T get(); public void put(T element); public void put(Box<? extends T> box); } Tambahkan pada interface Box method containsSame dan interface EqualityComparator public interface Box<T> { public T get(); public void put(T element); public void put(Box<? extends T> box); boolean containsSame(Box<? extends T> other, EqualityComparator<T> comparator); public interface EqualityComparator<T> { public boolean compare(T first, T second); } } Tambahkan pada class TestBoxImpl. Jelaskan mengapa EqualityComparator error ? public class TestBoxImpl { 234 public static EqualityComparator<T> sameObject = new EqualityComparator<T>() { public boolean compare(T o1, T o2) { return o1 == o2; } } public static void main(String[] args) { Box<Number> nBox = new BoxImpl<Number>(); Box<Integer> iBox = new BoxImpl<Integer>(); //sebelumnya error menjadi OK nBox.put(iBox); boolean b = nBox.containsSame(iBox, sameObject); } } Ubahlah menjadi bentuk seperti di bawah ini ! Jelaskan mengapa method containsSame() masih error ? public class TestBoxImpl { public static EqualityComparator<Object> sameObject = new EqualityComparator<Object>() { public boolean compare(Object o1, Object o2) { return o1 == o2; } }; public static void main(String[] args) { Box<Number> nBox = new BoxImpl<Number>(); Box<Integer> iBox = new BoxImpl<Integer>(); //sebelumnya error menjadi OK nBox.put(iBox); boolean b = nBox.containsSame(iBox, sameObject); } } Ubahlah interface Box menjadi seperti di bawah ini ! Ubah pula pada class BoxImpl public interface Box<T> { public T get(); public void put(T element); public void put(Box<? extends T> box); boolean containsSame(Box<? extends T> other, EqualityComparator<? super T> comparator); public interface EqualityComparator<T> { public boolean compare(T first, T second); 235 } } Lakukan cek pada method containsSame() apakah error ? Jelaskan ! G. LAPORAN RESMI Kerjakan hasil percobaan(D), latihan(E) dan tugas(F) di atas dan tambahkan analisa. 236 PRAKTIKUM 25 INPUT DAN OUTPUT A. TUJUAN PEMBELAJARAN 1. Memahami konsep Input/Output di Java 2. Mengenal kelas – kelas yang berhubungan dengan IO. 3. Mampu membuat program yang menerapkan konsep Input Output. B. DASAR TEORI Dalam pemrograman Java, Stream and File bukanlah istilah yang asing didengar. Stream and File merupakan proses penulisan dan pembacaan data sering yang di sebut dengan proses input dan output, dimana penulisan data berarti mengalirkan data ke output dan menerima atau mendapatkan data dari input. Penerapan dalam pemrograman java ini selalu melakukan proses input dan output yaitu memindahkan byte data dari satu system ke system lain. Data yang dibaca dari server yang mengirim data tidak berbeda dengan membaca data dari sebuah file. Java mengangani I/O secara berbeda dari bahasa-bahasa pemrograman yang lainnya. STREAM Stream merupakan dasar operasi input-output ( I/O ) dalam Java yang menggunakan package java.io sebagai package utama. Stream adalah representasi abstrak dari input dan output device, dimana aliran bytes akan ditransfer seperti file dalam harddisk, file pada sistem remote atau printer. Kita dapat membaca data dari input stream, yang dapat berupa file, keyboard atau komputer remote. Dalam Stream ini terdapat proses input dan output sebagai berikut : 1. Input Stream 237 Kelas java.io.InputStream adalah: public abstract class InputStream Adapun 2 method utama dari InputStream adalah : • Read Method ini digunakan untuk membaca stream. • Close Method ini digunakan untuk menutup koneksi input stream. Dalam proses Penginputan Stream ini pun terdapat pembagian dalam kelasnya, yaitu : a) Byte Stream Merupakan kelas dan interface ini digunakan untuk menangani data biner. b) Character Stream Merupakan kelompok kelas ini digunakan untuk menangani proses baca tulis karakter Unicode. Kelas ini merupakan pengembangan dari kelas Byte Stream sehingga lebih efisien. Data input dalam Stream ini berfungsi untuk saling melengkapi dengan DataOutputStream, yaitu untuk mendapatkan data yang telah ditulis. 2. Output Stream Subclass-subclass dari outputStream adalah : ByteArrayOutputStream : digunakan untuk menuliskan stream menjadi byte array. FileOutputStream : digunakan untuk menulis pada file FilterOutputStream :merupakan superclass dari subclass-subclass seperti DataOutputStream, BufferOutputStream, PrintStream, CheckedOutputStream ObjectOutputStream : digunakan untuk menuliskan objek pada OutputStream. PipedOutputStream : digunakan untuk menjadi output dari PipedInputStream. Data Output dalam stream ini merupakan class yang menyediakan cara praktis untuk menuliskan tipe data primitif ke output stream yang lebih mudah digunakan dalam penyelesaian program dalam java. 238 FILE File merupakan data yang siap diinput dan diproses dalam Stream yang merupaka data operasi dalam pemrograman. Keterkaitan antara keduanya, proses Input dan Ouput tetap dilakukan walau dengan cara yang berbeda, dari subclass maupun method yang digunakan. File Input Stream dan File Output Stream FileInputStream digunakan untuk membaca data dari file yang merupakan turunan langsung dari class InputStream dan FileOutputStream untuk menuliskan data ke file merupakan turunan langsung dari class OutputStream. Dalam file pun terdapat subclass – subclass dan method, sama halnya dengan Stream, seperti : 1. Class File Class File merupakan langkah awal dalam mempelajari proses input-output dengan Java, karena File merupakan objek yang mewakili path, file, atau direktori pada harddisk. Ada tiga cara membuat objek File, yaitu : Menggunakan objek string sebagai argumen yang menginformasikan path untuk file atau direktori. Menggunakan dua langkah, dimana yang pertama untuk mendefinisikan direktori dan yang kedua untuk file. Menggunakan dua argumen, dimana yang pertama adalah argumen string yang mendefinisikan direktori, dan yang kedua adalah argumen string yang mendefinisikan nama file. 2. File Writer Di dalam aplikasi web, disamping database, penggunaan file untuk menyimpan data cukup banyak dilakukan karena kebutuhan penyimpanan data yang sederhana cukup dengan menggunakan file. File Writer merupakan subclass dari OutputStreamWriter yang merupakan subclass dari class abstract Writer. Class FileWriter memiliki konstruktor yang umum seperti berikut : a) FileWriter ( File objekfile ); b) FileWriter ( String pathkefile ); c) FileWriter ( String pathkefile, boolean append ); 3. File Reader 239 File Reader merupakan class yang dapat digunakan untuk membaca file teks. Konstruktor dari FileReader : FileReader(File objekfile); FileReader(String pathkefile); Method yang digunakan : Read(char[] array); Read(char[] array, int offset, int length); C. TUGAS PENDAHULUAN Pelajari konsep IO Java pada Java API documentation D. PERCOBAAN Percobaan 1: Melihat direktori 240 Percobaan 2 : Menggunakan FileInputStream 241 Percobaan 3 : Contoh menggunakan BufferedInputStream 242 Percobaan 4 : Contoh menggunakan PushbackInputStream 243 Percobaan 5 : Contoh menggunakan Serialization E. LATIHAN 1. Buat program untuk menghitung jumlah kemunculan suatu karakter missal karakter ‘e’ pada text file. Contoh text berikut disimpan pada file example.txt. 244 In Xanadu did Kubla Khan A stately pleasure-dome decree: Where Alph, the sacred river, ran Through caverns measureless to man Down to a sunless sea. F. TUGAS Buatlah tabel mengenai kelas Input Output Java G. LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 245 PRAKTIKUM 26 INPUT DAN OUTPUT 2 A. TUJUAN PEMBELAJARAN 1. Memahami konsep Input dan Output di Java 2. Mengenal kelas – kelas yang berhubungan dengan IO. 3. Mampu membuat program yang menerapkan konsep Input Output. B. DASAR TEORI Dalam pemrograman Java, Stream and File bukanlah istilah yang asing didengar. Stream and File merupakan proses penulisan dan pembacaan data sering yang di sebut dengan proses input dan output, dimana penulisan data berarti mengalirkan data ke output dan menerima atau mendapatkan data dari input. Penerapan dalam pemrograman java ini selalu melakukan proses input dan output yaitu memindahkan byte data dari satu system ke sistem lain. Data yang dibaca dari server yang mengirim data tidak berbeda dengan membaca data dari sebuah file. Java mengangani I/O secara berbeda dari bahasa-bahasa pemrograman yang lainnya. STREAM Stream merupakan dasar operasi input-output ( I/O ) dalam Java yang menggunakan package java.io sebagai package utama. Stream adalah representasi abstrak dari input dan output device, dimana aliran bytes akan ditransfer seperti file dalam harddisk, file pada sistem remote atau printer. Kita dapat membaca data dari input stream, yang dapat berupa file, keyboard atau komputer remote. Dalam Stream ini terdapat proses input dan output sebagai berikut : 1. Input Stream 246 Kelas java.io.InputStream adalah: public abstract class InputStream Adapun 2 method utama dari InputStream adalah : • Read Method ini digunakan untuk membaca stream. • Close Method ini digunakan untuk menutup koneksi input stream. Dalam proses Penginputan Stream ini pun terdapat pembagian dalam kelasnya, yaitu : a) Byte Stream Merupakan kelas dan interface ini digunakan untuk menangani data biner. b) Character Stream Merupakan kelompok kelas ini digunakan untuk menangani proses baca tulis karakter Unicode. Kelas ini merupakan pengembangan dari kelas Byte Stream sehingga lebih efisien. Data input dalam Stream ini berfungsi untuk saling melengkapi dengan DataOutputStream, yaitu untuk mendapatkan data yang telah ditulis. 2. Output Stream Subclass-subclass dari outputStream adalah : ByteArrayOutputStream : digunakan untuk menuliskan stream menjadi byte array. FileOutputStream : digunakan untuk menulis pada file FilterOutputStream :merupakan superclass dari subclass-subclass seperti DataOutputStream, BufferOutputStream, PrintStream, CheckedOutputStream ObjectOutputStream : digunakan untuk menuliskan objek pada OutputStream. PipedOutputStream : digunakan untuk menjadi output dari PipedInputStream. Data Output dalam stream ini merupakan class yang menyediakan cara praktis untuk menuliskan tipe data primitif ke output stream yang lebih mudah digunakan dalam penyelesaian program dalam java. 247 FILE File merupakan data yang siap diinput dan diproses dalam Stream yang merupaka data operasi dalam pemrograman. Keterkaitan antara keduanya, proses Input dan Ouput tetap dilakukan walau dengan cara yang berbeda, dari subclass maupun method yang digunakan. File Input Stream dan File Output Stream FileInputStream digunakan untuk membaca data dari file yang merupakan turunan langsung dari class InputStream dan FileOutputStream untuk menuliskan data ke file merupakan turunan langsung dari class OutputStream. Dalam file pun terdapat subclass – subclass dan method, sama halnya dengan Stream, seperti : 1. Class File Class File merupakan langkah awal dalam mempelajari proses input-output dengan Java, karena File merupakan objek yang mewakili path, file, atau direktori pada harddisk. Ada tiga cara membuat objek File, yaitu : Menggunakan objek string sebagai argumen yang menginformasikan path untuk file atau direktori. Menggunakan dua langkah, dimana yang pertama untuk mendefinisikan direktori dan yang kedua untuk file. Menggunakan dua argumen, dimana yang pertama adalah argumen string yang mendefinisikan direktori, dan yang kedua adalah argumen string yang mendefinisikan nama file. 2. File Writer Di dalam aplikasi web, disamping database, penggunaan file untuk menyimpan data cukup banyak dilakukan karena kebutuhan penyimpanan data yang sederhana cukup dengan menggunakan file. File Writer merupakan subclass dari OutputStreamWriter yang merupakan subclass dari class abstract Writer. Class FileWriter memiliki konstruktor yang umum seperti berikut : a) FileWriter ( File objekfile ); b) FileWriter ( String pathkefile ); c) FileWriter ( String pathkefile, boolean append ); 3. File Reader 248 File Reader merupakan class yang dapat digunakan untuk membaca file teks. Konstruktor dari FileReader : FileReader(File objekfile); FileReader(String pathkefile); Method yang digunakan : Read(char[] array); Read(char[] array, int offset, int length); C. TUGAS PENDAHULUAN Pelajari konsep IO Java pada Java API documentation 249 D. PERCOBAAN Percobaan 1 : Mencari file dengan ekstensi Tertentu 250 Percobaan 2 : Membaca ukuran file 251 Percobaan 3 : Contoh menggunakan BufferedInputStream Asumsi menggunakan file dengan nama ihave10lines.txt 252 Percobaan 4 : Membaca file enkode UTF-8 253 Percobaan 5 : Menulis Enkode UTF-8 ke File 254 Percobaan 6 : Mengubah String ke InputStream Percobaan 7 : Membaca space Harddisk 255 E. LATIHAN Latihan 1 : Modifikasi program berikut agar dapat di kompile F. TUGAS Buatlah tabel mengenai kelas Input Output Java G. LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 256 PRAKTIKUM 27 ANTAR MUKA GRAFIS A. TUJUAN PEMBELAJARAN 1. Memahami konsep Graphical User Interface (GUI). 2. Mampu membuat program yang menerapkan konsep GUI. 3. Mampu membuat program berbasis GUI yang melibatkan penggunaan komponen GUI. B. DASAR TEORI Ciri utama dari tampilan model ini adalah seluruh data ditampilkan dalam bentuk teks (text based). Model tampilan ini memiliki kelemahan yaitu lebih sulit membuat tampilan program menjadi indah dan menarik, dikarenakan kurangnya dukungan warna. Monitor model teks hanya mendukung warna sampai 16, berbeda dengan model grafik yang mendukung warna sampai 224 (2 pangkat 24) bahkan bisa lebih, tergantung graphic-card yang digunakan. Bab ini akan membahas tentang Graphical User Interface (GUI), suatu metode untuk antar-muka komputer berbasis grafis. GUI digunakan dalam pembuatan program aplikasi dengan mempertimbangkan dua aspek yaitu keindahan tampilan dan kemudahan penggunaan program. Keindahan tampilan akan mempengaruhi orang untuk melihat dan merasa senang terhadap program yang kita buat, dan kemudahan penggunaan program akan berdampak pada ketertarikan orang untuk terus menggunakan program yang kita buat. Di dunia bisnis, hal ini merupakan target jangka panjang. Materi dalam bab ini akan disajikan secara sistematis dan terstruktur, mulai dari pengenalan objek utama, penambahan objek-objek pendukung (lebih dikenal sebagai komponen) sampai interaksi komputer dengan user. Untuk melengkapi uraian tentang GUI ini, pada akhir bab kita membuat sebuah project yang diberi nama ”Kalkulator Mini". Project ini menyajikan pembuatan sebuah kalkulator sederhana yang bisa digunakan untuk melakukan proses perhitungan 257 matematika biasa. Beberapa fungsi yang rumit dari kalkulator sesungguhnya tidak dimasukkan dalam project ini. Anda bisa mengembangkan project ini secara mandiri. Pembahasan kita mulai class JFrame. Dalam lingkup Java, sebuah interface window dikenal dengan sebutan frame. Bagi anda yang pernah menggunakan software Delphi (bahasa visual untuk Pascal) tentu pernah menjumpai komponen TFrame. Perlu diingat bahwa frame dalam lingkup Delphi berbeda dengan frame dalam lingkup Java. Frame dalam lingkup Java identik dengan TForm di Delphi atau Form di Visual Basic. Perlu juga diketahui bahwa seluruh pembahasan pada bab ini mengacu kepada sistem operasi Windows, tepatnya Windows 2000 atau Windows XP. Anda yang menggunakan sistem operasi lain seperti UNIX atau LINUX mungkin akan melihat beberapa perbedaan tampilan yang tidak mengganggu. Jika anda membuka program Windows Explorer maka secara tidak sadar anda telah mengaktifkan sebuah window (atau frame). Frame adalah sebuah objek yang merepresentasikan suatu area di layar yang berisi sejumlah objek lain untuk menyampaikan informasi kepada user. Kita bisa menambahkan sejumlah komponen lain ke dalam sebuah framw dengan tujuan yang sesuai dengan fungsi komponen tersebut. Sebuah objek yang merupakan instansiasi dari class JFrame bisa dipanggil melalui dua cara, yaitu: 1. Dipanggil melalui class utama yang mengandung fungsi main(). 2. Dipanggil melalui class lain yang merupakan class tersendiri turunan dari JFrame. Manajemen Pemasangan Komponen Manajemen pemasangan komponen (layout management) diperlukan untuk mengatur penempatan komponen di dalam frame agar bisa menghasilkan bentuk interface yang menarik. Penggunaan layout-manager dalam mengatur letak komponen juga akan memudahkan kita menempelkan komponen pada frame. Java menyediakan sejumlah metode dalam mengatur penempelan komponen ke dalam frame. Pada bagian ini kita hanya akan membahas tiga metode: FlowLayout, GridLayout dan BorderLayout. Masing-masing metode memiliki keunggulan dan kekurangan dibandingkan dengan metode yang lain. Hal yang menarik adalah kita tidak harus terpaku pada satu metode 258 dalam mengatur pemasangan komponen; kita boleh mengkombinasikan beberapa metode agar pemasangan komponen menjadi lebih baik dan mudah. Method setLayout(LayoutManager) digunakan untuk mengatur jenis metode yang digunakan pada saat memasang komponen. Method ini bisa kita gunakan pada class JFrame, JPanel dan Container. Pembahasan selanjutnya akan menunjukkan penggunaan berbagai metode pengaturan penempelan komponen pada frame. C. TUGAS PENDAHULUAN 1. Pelajari layout – layout yang bisa digunakan untuk mengatur tata letak komponen, kemudian buat daftar mengenai layout tersebut, beserta penjelasan dan contoh tampilannya. D. PERCOBAAN Percobaan 1: Membuat jendela sederhana dengan JFrame 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import javax.swing.JFrame; //-------------------------// Definisi class MYFRAME //-------------------------class MyFrame extends JFrame { MyFrame() { super ("Contoh frame"); show(); } } //--------------// Class utama //--------------public class JFrame_4 { public static void main (String[] args) { new MyFrame(); } } 259 Percobaan 2: Menghapus Frame dari Memori 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import javax.swing.JFrame; //-------------------------// Definisi class MYFRAME //-------------------------class MyFrame extends JFrame { MyFrame() { super ("Contoh frame"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); show(); } } //--------------// Class utama //--------------public class JFrame_5 { public static void main (String[] args) { new MyFrame(); } } Percobaan 3: Frame dengan Ukuran Tetap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import javax.swing.JFrame; //-------------------------// Definisi class MYFRAME //-------------------------class MyFrame extends JFrame { MyFrame() { super ("Contoh frame"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setLocation (200,100); setSize (300,100); setResizable (false); show(); } } //--------------- 260 21 22 23 24 25 26 27 28 29 // Class utama //--------------public class JFrame_8 { public static void main (String[] args) { new MyFrame(); } } Percobaan 4: Strategi “Tempel Langsung” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import javax.swing.*; import java.awt.*; class MyFrame extends JFrame { private Container container = new Container(); private JButton tombol = new JButton ("Tombol"); MyFrame() { super ("Strategi 'Tempel-Langsung'"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (250,80); setLocation (100,100); container = getContentPane(); container.add (tombol); show(); } } public class TempelLangsung_1 { public static void main (String[] args) { new MyFrame(); } } Percobaan 5: Manajemen Pemasangan Komponen – Flowlayout 1 2 3 import javax.swing.*; import java.awt.*; 261 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class MyFrame extends JFrame { private Container container = new Container(); private JButton tombol = new JButton ("Tombol"); private JLabel tulisan = new JLabel ("Tulisan"); MyFrame() { super ("Demo FlowLayout"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (250,80); setLocation (100,100); container = getContentPane(); container.setLayout (new FlowLayout()); container.add (tombol); container.add (tulisan); show(); } } public class FlowLayout_1 { public static void main (String[] args) { new MyFrame(); } } Percobaan 6: Manajemen Pemasangan Komponen – Gridlayout 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import javax.swing.*; import java.awt.*; class MyFrame extends JFrame { private Container container = new Container(); private JButton tombol = new JButton ("Tombol"); private JLabel tulisan = new JLabel ("Tulisan"); MyFrame() { super ("GridLayout 1-baris 2-kolom"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (250,80); setLocation (100,100); 262 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 container = getContentPane(); container.setLayout (new GridLayout(1,2)); container.add (tulisan); container.add (tombol); show(); } } public class GridLayout_1 { public static void main (String[] args) { new MyFrame(); } } Percobaan 7: Manajemen Pemasangan Komponen – Borderlayout 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import javax.swing.*; import java.awt.*; class MyFrame extends JFrame { private Container container = new Container(); private private private private private JButton JButton JButton JButton JButton tombolUtara = new JButton ("NORTH"); tombolSelatan = new JButton ("SOUTH"); tombolTimur = new JButton ("EAST"); tombolBarat = new JButton ("WEST"); tombolTengah = new JButton ("CENTER"); MyFrame() { super ("Demo BorderLayout"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (250,130); setLocation (100,100); container = getContentPane(); container.setLayout (new BorderLayout()); container.add container.add container.add container.add container.add (tombolUtara, BorderLayout.NORTH); (tombolSelatan, BorderLayout.SOUTH); (tombolTimur, BorderLayout.EAST); (tombolBarat, BorderLayout.WEST); (tombolTengah, BorderLayout.CENTER); show(); 263 32 33 34 35 36 37 38 39 40 41 } } public class BorderLayout_1 { public static void main (String[] args) { new MyFrame(); } } Percobaan 8: Layout Komponen dalam JPanel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import javax.swing.*; import java.awt.*; class MyFrame extends JFrame { private Container container = new Container(); private JPanel jPanel = new JPanel(); private JLabel labelUserName = new JLabel ("User name :"); private JLabel labelPassword = new JLabel ("Password :"); private JTextField textFieldUserName = new JTextField ("", 8); private JTextField textFieldPassword = new JTextField ("", 8); private JButton buttonOK = new JButton ("OK"); private JButton buttonCancel = new JButton ("Cancel"); MyFrame() { super ("Demo JPanel - Login"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (250,10); setLocation (100,100); jPanel.setLayout (new GridLayout (3,2)); jPanel.add (labelUserName); jPanel.add (textFieldUserName); jPanel.add (labelPassword); jPanel.add (textFieldPassword); jPanel.add (buttonOK); jPanel.add (buttonCancel); container = getContentPane(); container.add (jPanel); 264 35 36 37 38 39 40 41 42 43 44 45 E. show(); } } public class JPanel_2 { public static void main (String[] args) { new MyFrame(); } } LATIHAN Latihan 1: Membuat tampilan HP mini Buatlah tampilan HP seperti pada gambar berikut : Latihan 2: Membuat tampilan input data Buatlah tampilan input data seperti gambar berikut : 265 Latihan 3: Desain user interface sesuai petunjuk pada gambar berikut Petunjuk : Gantilah JApplet dengan JPanel F. TUGAS Buatlah tampilan kalkulator mini seperti pada gambar berikut : G. LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 266 PRAKTIKUM 28 PENANGANAN EVENT A. TUJUAN PEMBELAJARAN 1. Memahami konsep Graphical User Interface (GUI). 2. Mampu membuat program yang menerapkan konsep GUI. 3. Mampu membuat program berbasis GUI yang melibatkan penggunaan komponen GUI. 4. Mampu membuat program berbasis GUI yang bisa menerima respon user, baik melalui mouse maupun keyboard. B. DASAR TEORI User bisa berinteraksi dengan program aplikasi melalui sejumlah komponen. Sebagai contoh, setelah memasukkan data-data yang diperlukan pada proses login, kita menekan sebuah button untuk memasukkan data-data tersebut ke dalam program. Dalam hal ini objek button tersebut menerima event click. Tidak hanya objek button yang bisa menerima event. Objek lain seperti textfield juga bisa menerima event, hanya saja jenis event yang terjadi pada objek textfield berbeda dengan objek button. Jadi kita harus memahami jenis event apa yang bisa dikenakan terhadap suatu jenis objek tertentu. Java menerima event melalui sebuah interface. Setiap komponen yang akan menerima suatu event harus disetting terlebih dahulu agar terasosiasi dengan event tersebut. Tanpa didahului dengan proses asosiasi ini, sebuah komponen tidak akan bisa "menangkap" (Java memberi istilah "mendengar" / listening) suatu event walaupun sesungguhnya bisa. Sebagai contoh, jika kita memasang sebuah objek button untuk membatalkan suatu proses, sebelum kita mengasosiasi objek tersebut dengan event yang menangani click mouse maka button tersebut tidak akan 267 memberikan efek pembatalan proses pada saat kita melakukan proses click tombol mouse di atasnya. Bagian ini membahas tentang bagaimana proses interaksi antara user dan program melalui sejumlah komponen dapat terjadi. Dari sejumlah interface untuk menangani event yang disediakan oleh Java, kita akan membahas 4 (empat) saja yang kami rasa mudah dimengerti sebagai pengantar untuk memahami interface-interface yang lain. Keempat interface tersebut adalah: 1. Interface ActionListener 2. Interface MouseListener 3. Interface MouseMotionListener 4. Interface KeyListener Interface pertama akan menangkap event yang ditimbulkan oleh mouse dan keyboard, interface kedua dan ketiga akan menangkap event yang ditimbulkan oleh mouse dan interface keempat akan menangkap event yang ditimbulkan oleh keyboard. Mouse dan keyboard adalah dua piranti yang sudah sangat umum digunakan pada komputer masa kini. Bentuk umum penggunaan interface adalah: [public|private] class NamaClass [extends BaseClass] [implements NamaInterface] { …isi class… } Implementasi sebuah interface mengharuskan kita memasukkan sejumlah method yang akan digunakan untuk melakukan suatu proses dalam interface tersebut. Pada bagian selanjutnya anda akan menjumpai method apa saja yang harus disediakan jika kita mengimplementasikan suatu interface. Interface ActionListener Interface ActionListener berguna untuk menerima event yang ditimbulkan oleh mouse atau keyboard. Pada prakteknya interface ini akan memeriksa objek yang terkena event, tidak perduli alat mana yang menimbulkan event tersebut. Sebuah objek button misalnya, mungkin akan 268 mengalami event click dari mouse atau event enter dari keyboard, yang jelas keduanya merupakan event dari button. Button inilah yang diperiksa oleh ActionListener. Class yang mengimlementasikan interface ActionPerformed harus mengandung method bernama actionPerformed(ActionEvent) sekalipun di dalamnya tidak ada instruksi apa pun. Kita bisa memeriksa objek yang menimbulkan event di dalam method ini. Seperti telah dijelaskan di depan, agar sebuah objek bisa "mendengar" terjadinya event, objek tersebut harus diasosiasikan dengan interface yang berhubungan dengan event tersebut. Java menyediakan method addActionListener(ActionListener) untuk mengasosiasikan sebuah objek dengan interface ActionListener. Method ini membutuhkan parameter berupa class yang mengimplementasikan interface ActionListener. Jika class tersebut merupakan class yang sama dengan tempat objek dimaksud, maka parameter ini cukup diberi nilai this. Interface MouseListener Interface MouseListener digunakan untuk menangkap event yang diakibatkan oleh mouse. Event yang dibangkitkan oleh keyboard tidak akan memberi efek, kecuali kita menggunakan interface ActionListener bersamaan dengan interface MouseListener. Dan sebenarnya anda boleh menggunakan sejumlah interface sesuai keperluan, tidak terbatas harus satu interface saja. Objek yang akan mendengar event dari MouseListener diasosiasikan menggunakan method addMouseListener(MouseListener). Class yang mengimplementasikan interface MouseListener harus menyediakan 5 (lima) method, walaupun tidak ada isinya. Kelima method tersebut adalah: 1. Method mouseClicked(MouseEvent), dipanggil pada saat tombol mouse ditekan lalu dilepas. 2. Method mouseEntered(MouseEvent), dipanggil pada saat kursor mouse memasuki area komponen. 3. Method mouseExited(MouseEvent), dipanggil pada saat kursor mouse meninggalkan area komponen. 4. Method mousePressed(MouseEvent), dipanggil pada saat tombol mouse ditekan. 5. Method mouseReleased(MouseEvent), dipanggil pada saat tombol mouse dilepas. Kita bisa katakan bahwa method mouseClicked(MouseEvent) merupakan perpaduan antara mousePressed(MouseEvent) dan mouseReleased(MouseEvent). Berbagai method pada class 269 MouseEvent bisa kita gunakan dalam proses event mouse ini, misalnya mendeteksi posisi kursor mouse saat ini. Interface MouseMotionListener Java menyediakan interface MouseMotionListener untuk mendukung MouseListener. Interface MouseMotionListener menyediakan dua method yang akan memantau pergerakan mouse yaitu mouseDragged(MouseEvent) dan mouseMoved(MouseEvent). • Method mouseDragged(MouseEvent) digunakan untuk memantau pergerakan mouse yang melintasi objek pada saat tombol mouse ditekan. Tindakan ini persis sama dengan tindakan kita pada saat memindahkan sebuah window. • Method mouseMoved(MouseEvent) digunakan untuk memantau pergerakan mouse pada saat mouse melintasi area suatu objek. Pada saat ini tidak ada tombol mouse yang ditekan; kita hanya memindahkan pointer mouse melalui objek. Berikut ini urutan method yang dieksekusi setelah event mouse ditangkap, diasumsikan kita melibatkan interface MouseListener dan MouseMotionListener. 1. Method mouseEntered(MouseEvent) : dijalankan pada saat pointer mouse digerakkan memasuki area objek. 2. Method mouseMoved(MouseEvent) : dijalankan pada saat pointer mouse digerakkan melintasi objek dalam kondisi tidak ada tombol mouse yang ditekan. 3. Method mousePressed(MouseEvent) : dijalankan pada saat tombol mouse ditekan. 4. Method mouseDragged(MouseEvent) : dijalankan pada saat pointer mouse digeser melintasi objek sambil tombol mouse ditekan. 5. Method mouseClicked(MouseEvent) : dijalankan pada saat tombol mouse dilepas setelah ditekan dengan rentang waktu yang tidak terlalu lama. 6. Method mouseReleased(MouseEvent) : dijalankan pada saat tombol mouse dilepas. 7. Method mouseExited(MouseEvent) : dijalankan pada saat pointer mouse meninggalkan area objek. Setelah pointer mouse berada di luar objek, segala macam event mouse tidak diperhatikan lagi, sampai pointer mouse memasuki area objek. 270 Interface KeyListener Setelah mengetahui cara menghandle event yang dibangkitkan oleh piranti mouse, sekarang kita akan membahas bagaimana caranya menghandle event yang dibangkitkan oleh piranti keyboard. Interface KeyListener disediakan untuk menangani event yang terjadi akibat tindakan dari keyboard, misalnya jika terjadi penekanan tombol ENTER atau ESCAPE. Interface KeyListener mengharuskan kehadiran tiga method: • Method keyPressed(KeyEvent) : akan dijalankan pada saat sebuah tombol keyboard ditekan. • Method keyReleased(KeyEvent) : akan dijalankan pada saat sebuah tombol keyboard dilepas. • Method keyTyped(KeyEvent) : akan dijalankan pada saat sebuah tombol keyboard ditekan dan dilepas dengan selisih waktu yang singkat. C. TUGAS PENDAHULUAN 1. Pelajari event – event handling yang berhubungan dengan User Interface, kemudian buatlah ringkasan kelas/interface event handling tersebut beserta kegunaannya. D. PERCOBAAN Percobaan 1: Membuat program meneba k angka 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyFrame extends JFrame implements ActionListener { private Container container = new Container(); private Button tombolCek = new Button ("Cek"); private TextField inputan = new TextField ("", 8); private int angkaAcak = (int)(Math.random()*10); MyFrame() { super ("Tebak angka"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (200,65); 271 18 19 20 21 22 23 24 setLocation (100,100); tombolCek.addActionListener (this); container = getContentPane(); container.setLayout (new BorderLayout()); container.add (new JLabel("Tebak angka antara 0-9"), BorderLayout.NORTH); container.add (new JLabel ("Tebakan anda :"), BorderLayout.WEST); container.add (inputan, BorderLayout.CENTER); container.add (tombolCek, BorderLayout.EAST); 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 show(); } public void actionPerformed (ActionEvent e) { Object objek = e.getSource(); if (objek == tombolCek) { int jawaban = Integer.parseInt(inputan.getText()); if (jawaban == angkaAcak) JOptionPane.showMessageDialog (null, "Benar.. Anda memang peramal jitu"); else JOptionPane.showMessageDialog (null, "Jawaban anda salah.."); 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 } } } // ------------// Class utama // ------------public class ActionListener_1 { public static void main (String[] args) { new MyFrame(); } } Percobaan 2: Membuat program dengan event mouselistener 1 2 3 4 import javax.swing.*; import java.awt.*; import java.awt.event.*; 272 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 class MyFrame extends JFrame implements MouseListener { private Container container = new Container(); private JLabel labelClicked = new JLabel (""); private JLabel labelEntered = new JLabel (""); private JLabel labelExited = new JLabel (""); private JLabel labelPressed = new JLabel (""); private JLabel labelReleased = new JLabel (""); MyFrame() { super ("Test MouseListener"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (220,150); setLocation (100,100); // --------------------------------------------// mengasosiasi seluruh objek dg event-handler // --------------------------------------------labelClicked.addMouseListener (this); labelEntered.addMouseListener (this); labelExited.addMouseListener (this); labelPressed.addMouseListener (this); labelReleased.addMouseListener (this); // -----------------------------// penambahan komponen ke frame // -----------------------------container = getContentPane(); container.setLayout (new GridLayout (5,2)); container.add (new JLabel ("mouseClicked :")); container.add (labelClicked); container.add (new JLabel ("mouseEntered :")); container.add (labelEntered); container.add (new JLabel ("mouseExited :")); container.add (labelExited); container.add (new JLabel ("mousePressed :")); container.add (labelPressed); container.add (new JLabel ("mouseReleased :")); container.add (labelReleased); show(); } public void mouseClicked (MouseEvent e) { labelClicked.setText ("AKTIF"); labelEntered.setText (""); labelExited.setText (""); labelPressed.setText (""); labelReleased.setText (""); } 273 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 public void mouseEntered (MouseEvent e) { labelClicked.setText (""); labelEntered.setText ("AKTIF"); labelExited.setText (""); labelPressed.setText (""); labelReleased.setText (""); } public void mouseExited (MouseEvent e) { labelClicked.setText (""); labelEntered.setText (""); labelExited.setText ("AKTIF"); labelPressed.setText (""); labelReleased.setText (""); } public void mousePressed (MouseEvent e) { labelClicked.setText (""); labelEntered.setText (""); labelExited.setText (""); labelPressed.setText ("AKTIF"); labelReleased.setText (""); } public void mouseReleased (MouseEvent e) { labelClicked.setText (""); labelEntered.setText (""); labelExited.setText (""); labelPressed.setText (""); labelReleased.setText ("AKTIF"); } } // ------------// Class utama // ------------public class MouseListener_1 { public static void main (String[] args) { new MyFrame(); } } Percobaan 3: Memantau kondisi mouse dan menerima event pada saat mouse digerakkan 1 import javax.swing.*; 274 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import java.awt.*; import java.awt.event.*; class MyFrame extends JFrame implements MouseMotionListener { private Container container = new Container(); private JLabel labelDragged = new JLabel (""); private JLabel labelMoved = new JLabel (""); MyFrame() { super ("Test MouseListener"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (250,80); setLocation (100,100); // --------------------------------------------// mengasosiasi seluruh objek dg event-handler // --------------------------------------------labelDragged.addMouseMotionListener (this); labelMoved.addMouseMotionListener (this); // -----------------------------// penambahan komponen ke frame // -----------------------------container = getContentPane(); container.setLayout (new GridLayout (2,2)); container.add (new JLabel ("mouseDragged :")); container.add (labelDragged); container.add (new JLabel ("mouseMoved :")); container.add (labelMoved); show(); } public void mouseDragged (MouseEvent e) { labelDragged.setText ("AKTIF"); labelMoved.setText (""); } public void mouseMoved (MouseEvent e) { labelDragged.setText (""); labelMoved.setText ("AKTIF"); } } // ------------// Class utama // ------------public class MouseMotionListener_1 275 55 56 57 58 59 60 { public static void main (String[] args) { new MyFrame(); } } Percobaan 4: Mendeteksi penekanan tombol ENTER pada sebuah objek textfield 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 import javax.swing.*; import java.awt.*; import java.awt.event.*; class MyFrame extends JFrame implements KeyListener { private Container container = new Container(); private JTextField textField = new JTextField ("", 8); MyFrame() { super ("Tebak angka"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (250,150); setLocation (100,100); // --------------------------------------------// mengasosiasi seluruh objek dg event-handler // --------------------------------------------textField.addKeyListener (this); // -----------------------------// penambahan komponen ke frame // -----------------------------container = getContentPane(); container.setLayout (new GridLayout (3,1)); container.add (new JPanel()); container.add (textField); container.add (new JPanel()); show(); } public void keyTyped (KeyEvent e) { if (e.getKeyCode() == e.VK_ENTER) textField.setText("ENTER ->> ditekan + dilepas"); } public void keyPressed (KeyEvent e) { 276 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 E. if (e.getKeyCode() == e.VK_ENTER) textField.setText ("Tombol ENTER ->> ditekan"); } public void keyReleased (KeyEvent e) { if (e.getKeyCode() == e.VK_ENTER) textField.setText ("Tombol ENTER ->> dilepas"); } } // ------------// Class utama // ------------public class KeyListener_1 { public static void main (String[] args) { new MyFrame(); } } LATIHAN Latihan 1: Membuat tampilan input data dan menampilkan hasil input ketika ditekan OK 277 Latihan 2 : Buat Tampilan dan event handling yang sesuai, seperti pada gambar Latihan 3: Modifikasi latihan 2 untuk pembelian tiket online pada konser music F. LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 278 PRAKTIKUM 29 GUI: KALKULATOR MINI A. TUJUAN PEMBELAJARAN 1. Memahami konsep Graphical User Interface (GUI). 2. Mampu membuat program yang menerapkan konsep GUI. 3. Mampu membuat program berbasis GUI yang melibatkan penggunaan komponen GUI. 4. Mampu membuat program berbasis GUI yang bisa menerima respon user, baik melalui mouse maupun keyboard. B. DASAR TEORI Project ini kami beri nama Kalkulator Mini, sebuah project sederhana yang mengimplementasikan teori GUI di Java. Dari namanya sudah bisa ditebak kegiatan utama dari project ini adalah membuat sebuah program aplikasi yang mensimulasikan sebuah kalkulator dengan kemampuan yang sangat minim. Kalkulator ini didesain untuk bisa menangani beberapa operasi matematika biasa, meliputi penjumlahan, pengurangan, perkalian, pembagian dan perpangkatan. Karena buku ini tidak didesain sebagai buku acuan tentang materi Struktur Data, maka teknik yang digunakan untuk menangani proses matematika tersebut tidak terlalu rumit. Program akan menerima tiga inputan : • Data pertama berupa data numerik yang bertindak sebagai data pertama yang akan diproses. • Data kedua berupa data karakter yang menyatakan jenis proses yang akan dilakukan. • Data ketiga berupa data numerik menyatakan data kedua yang akan diproses. Seluruh data inputan tersebut diberikan melalui pengaktifan sejumlah objek button yang tersedia di layar. Kita tidak melakuan pengetikan, misalnya angka, untuk memasukkan data numerik, 279 sehingga objek textfield yang digunakan kita pasifkan. Method setEnabled(boolean) digunakan secara luas untuk tujuan mempasifkan suatu objek agar tidak bisa diakses. Desain Tampilan Kalkulator ini hanya memiliki 5 (lima) button untuk lima proses matematika, yaitu "+", "-", "*", "/" dan "^". Sebagai tambahan, sebuah objek berjenis JCheckBox disediakan untuk mengatur penggunaan karakter pemisah ribuan Area tampilan Pemisah ribuan Hapus Batal 7 8 4 5 1 2 0 . Area informasi Ulang 9 6 3 = ^ * / + Exit Berikut ini keterangan setiap item pada desain tampilan tersebut: • "Area tampilan" merupakan objek berjenis JTextField, tempat dimana angka-angka yang diclick akan ditampilkan. Area ini juga digunakan sebagai tempat untuk menampilkan hasil proses. • "Pemisah ribuan" merupakan objek berjenis JCheckBox yang digunakan sebagai flag atau tanda apakah kita akan menggunakan pemisah ribuan atau tidak. Untuk deretan angka yang cukup banyak, penggunaan pemisah ribuan akan sangat membantu kita membaca data yang tersaji. • "Hapus" merupakan sebuah objek berjenis JButton yang digunakan untuk menghapus data yang sedang terlihat di layar satu karakter demi satu karakter dari belakang. • "Batal" merupakan sebuah objek berjenis JButton yang digunakan untuk membatalkan data yang kali dimasukkan terakhir. Jika button ini di-click pada saat kita memasukkan data kedua, maka data kedua akan dibatalkan sedangkan data pertama tetap dianggap valid. • "Ulang" merupakan sebuah objek berjenis JButton yang digunakan untuk membatalkan seluruh data yang telah dimasukkan. Dalam bagan automata di atas respon dari button ini sama dengan tindakan "cancel". • "Exit" merupakan sebuah objek berjenis JButton yang digunakan untuk mengakhiri jalannya program. Window akan ditutup dan kendali dikembalikan ke sistem operasi. 280 • ".", "0" sampai "9" merupakan objek berjenis JButton yang digunakan untuk memasukkan data numerik dan tanda pemisah desimal pada bilangan pecahan. • "^", "*", "/", "+" dan "-" merupakan objek berjenis JButton yang digunakan untuk menentukan jenis operator yang akan digunakan pada proses matematika. • "=" merupakan objek berjenis JButton yang digunakan untuk memerintahkan komputer melakukan proses sesuai dengan data-data yang diberikan, lalu menampilkan hasilnya di "Area tampilan". • "Area informasi" merupakan objek berjenis JLabel yang kita gunakan untuk menampilkan informasi biasa, misalnya nama kita. C. TUGAS PENDAHULUAN 1. Pelajari kelas – kelas di Java yang berhubungan dengan User Interfaces. Kemudan buatlah daftar kelasnya dan fungsi kelas tersebut. D. PERCOBAAN Percobaan 1: Implementasi Kalkulator Mini 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import javax.swing.*; import java.awt.*; import java.awt.event.*; class MiniCalculator extends JFrame implements ActionListener { private JPanel panelAtas = new JPanel(); private JPanel panelTengah = new JPanel(); private JPanel panelBawah = new JPanel(); private JTextField tampilan = new JTextField (""); private JCheckBox pemisahRibuan = new JCheckBox ("Pemisah ribuan", true); private Button[] tombolFungsi = { new Button ("Hapus"), new Button ("Ulang"), new Button ("7"), new Button ("9"), new new new new Button Button Button Button ("Batal"), ("^"), ("8"), ("*"), 281 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 new new new new new new ("4"), ("6"), ("1"), ("3"), ("0"), ("="), new new new new new new Button Button Button Button Button Button ("5"), ("/"), ("2"), ("-"), ("."), ("+") }; private JLabel informasi = new JLabel (" R.Purnama, 2003"); private Button tombolExit = new Button ("Exit"); private private private private private private private char operator = ' '; double dataPertama = 0.0; double dataKedua = 0.0; double dataHasil = 0.0; boolean awalKetikan = true; boolean entryPertama = true; boolean entryDesimal = false; //--------------------// Constructor class //--------------------public MiniCalculator() { super ("Kalkulator sederhana"); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setLocation (100,100); setSize (300,200); setResizable (false); setPanelAtas(); setPanelTengah(); setPanelBawah(); resetNilai(); getContentPane().setLayout (new BorderLayout()); getContentPane().add (panelAtas, BorderLayout.NORTH); getContentPane().add (panelTengah, BorderLayout.CENTER); getContentPane().add (panelBawah, BorderLayout.SOUTH); 56 57 58 59 60 61 Button Button Button Button Button Button show(); } 282 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 //------------------------// Mereset seluruh nilai //------------------------private void resetNilai() { operator = ' '; dataPertama = 0.0; dataKedua = 0.0; dataHasil = 0.0; awalKetikan = true; entryPertama = true; entryDesimal = false; } //----------------------// Mengatur panel atas //----------------------private void setPanelAtas() { pemisahRibuan.setForeground (new Color (0,0,0)); pemisahRibuan.setFont ( new Font ("arial", Font.PLAIN, 11)); tampilan.setEnabled (false); tampilan.setHorizontalAlignment (JTextField.RIGHT); tampilan.setFont (new Font ("arial",Font.BOLD,15)); panelAtas.setLayout (new BorderLayout()); panelAtas.add (tampilan, BorderLayout.CENTER); panelAtas.add (pemisahRibuan, BorderLayout.SOUTH); } //------------------------// Mengatur panel tengah //------------------------private void setPanelTengah() { panelTengah.setLayout (new GridLayout (5,4)); for (int i=0; i<5*4; i++) { tombolFungsi[i].addActionListener (this); tombolFungsi[i].setFont ( new Font ("arial", Font.BOLD, 11)); 106 283 107 108 109 110 111 112 113 114 115 116 117 118 panelTengah.add (tombolFungsi[i]); } } //-----------------------// Mengatur panel bawah //-----------------------private void setPanelBawah() { tombolExit.addActionListener (this); informasi.setFont ( new Font ("arial", Font.BOLD, 11)); tombolExit.setFont ( new Font ("arial", Font.BOLD, 11)); 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 panelBawah.setLayout (new BorderLayout()); panelBawah.add (informasi, BorderLayout.WEST); panelBawah.add (tombolExit, BorderLayout.EAST); } //-------------------------------// Proses pemisahan data ribuan //-------------------------------private String pisahkan (StringBuffer data) { String temp = data.toString(); if (data.length() > 3) { temp = data.substring (data.length()-3); data.delete (data.length()-3, data.length()); temp = pisahkan (data) + ',' + temp.toString(); } return (temp); } //-----------------// Pemisah ribuan //-----------------private String pisahkanRibuan (double data) { String string = Double.toString (data); int titik = string.indexOf ('.'); String pecahan = string.substring (titik); 284 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 long bulat = new Double (dataHasil).longValue(); string = Long.toString (bulat); string = pisahkan (new StringBuffer (string)); return (string + pecahan); } //------------------------------// Menghapus karakter terakhir //------------------------------private void hapusKarakter() { if (tampilan.getText().length() > 0) { StringBuffer data = new StringBuffer (tampilan.getText()); char terakhir = data.charAt (data.length()-1); if (terakhir == '.') entryDesimal = false; data.deleteCharAt (data.length()-1); tampilan.setText (data.toString()); } } //----------------------------// Membatalkan data terakhir //----------------------------private void batalkanData() { if (entryPertama) dataPertama = 0.0; else dataKedua = 0.0; tampilan.setText (""); } //------------------------// Mengupdate data angka //------------------------private void updateData (int index) { if (awalKetikan) tampilan.setText (""); 285 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 String label = tombolFungsi[index].getLabel(); char karakter = label.charAt(0); StringBuffer data = new StringBuffer (tampilan.getText()); tampilan.setText (data.toString() + karakter); awalKetikan = false; } //---------------------------// Mengupdate data operator //---------------------------private void updateOperator (int index) { if (entryPertama) { StringBuffer data = new StringBuffer (tampilan.getText()); dataPertama = Double.parseDouble (data.toString()); } String label = tombolFungsi[index].getLabel(); operator = label.charAt(0); entryPertama = false; awalKetikan = true; } //-------------------------------// Melakukan proses perhitungan //-------------------------------private void prosesPerhitungan() { StringBuffer data = new StringBuffer (tampilan.getText()); dataKedua = Double.parseDouble (data.toString()); switch (operator) { case '+' : dataHasil break; case '-' : dataHasil break; case '*' : dataHasil break; case '/' : dataHasil = dataPertama + dataKedua; = dataPertama - dataKedua; = dataPertama * dataKedua; = dataPertama / dataKedua; 286 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 break; case '^' : dataHasil = Math.pow (dataPertama, dataKedua); } if (pemisahRibuan.isSelected()) tampilan.setText (pisahkanRibuan (dataHasil)); else tampilan.setText (Double.toString (dataHasil)); entryPertama = true; awalKetikan = true; } //-------------------------// Menambah tanda desimal //-------------------------private void tambahTandaDesimal() { if (!entryDesimal && !awalKetikan) { entryDesimal = true; StringBuffer data = new StringBuffer (tampilan.getText()); tampilan.setText (data.toString() + '.'); } } //------------------------------// Action terhadap respon user //------------------------------public void actionPerformed (ActionEvent event) { Object objek = event.getSource(); int lokasi = 0; if (objek == tombolExit) System.exit (0); else { for ( ; lokasi<20; lokasi++) if (objek == tombolFungsi[lokasi]) break; switch (lokasi) { 287 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 case case case case case case case case case case case case case case case case case case case case 0 : hapusKarakter(); break; 1 : batalkanData(); break; 2 : resetNilai(); tampilan.setText (""); break; 16 : ; 12 : ; 13 : ; 14 : ; 8 : ; 9 : ; 10 : ; 4 : ; 5 : ; 6 : updateData (lokasi); break; 3 : ; 7 : ; 11 : ; 15 : ; 19 : updateOperator (lokasi); break; 18 : prosesPerhitungan(); break; 17 : tambahTandaDesimal(); break; } } } } //--------------// Class utama //--------------public class CobaCalculator { public static void main (String[] args) { new MiniCalculator(); } } 288 E. LATIHAN Latihan 1: Modifkasi project kalkulator Modifikasi kalkulator mini tersebut, sehingga dapat melakukan perhitungan saintifik lain, seperti trigonometri (sin, cos, dll), perpangkatan, logarirmik. Latihan 2: Buatlah sebuah aplikasi converter untuk mengubah jarak dalam satuan mil ke km seperti pada gambar berikut 289 Latihan 3: Buatlah sebuah aplikasi yang menampilkan pilihan checkbox dan radiobutton seperti pada gambar Latihan 4: Modifikasi latihan 2 sehingga aplikasi dapat mengubah jarak dari km ke mil. Petunjuk : Berikan tambahan pilihan konversi berupa radio button. Latihan 5: Aplikasi konversi suhu Farenheit - Celcius. Buatlah aplikasi GUI untuk mengkonversi input suhu dari Farenheit ke Celcius dan sebaliknya. F. TUGAS Buatlah sebuah game Memory. Dalam aplikasi ini diberikan grid kotak 2 dimensi yang berisi pasangan gambar atau string yang sesuai. Ketika mengklik kotak, isinya akan terbuka. Kemudian klik kotak yang lain. Jika isinya sama, maka kotak akan tetap terlihat isinya. Jika tidak akan tertutup kembali. Aplikasi dapat dimainkan ulang dengan posisi isi kotak yang teracak, tidak sama dengan sebelumnya. G. LAPORAN RESMI Kumpulkan hasil percobaan di atas dan tambahkan analisa untuk tiap percobaan, latihan, dan tugas yang telah dibuat. 290 PRAKTIKUM 30 PROYEK 1 A. TUJUAN PEMBELAJARAN 1. Mengimplementasikan konsep pemrograman Java dalam sebuah proyek. B. DASAR TEORI Proyek 1 ini mengimplementasikan konsep pemrograman Java yang telah dipelajari. Mahasiswa diharapkan dapat menghasilkan aplikasi yang memiliki kegunaan dan tujuan. C. TUGAS PENDAHULUAN 1. Pelajari kelas – kelas di Java yang berhubungan dengan proyek yang dikerjakan. D. PERCOBAAN Tidak Ada E. LATIHAN Latihan 1: Petunjuk Pelaksanaan Proyek 1 F. - Mahasiswa wajib membuat aplikasi berbasis Java yang telah diajarkan sebelumnya - Aplikasi yang dibuat memiliki kegunaan yang jelas beserta tujuan aplikasi tersebut - Aplikasi dibuat oleh masing – masing mahasiswa TUGAS Tidak ada G. LAPORAN RESMI Buat laporan yang berisi progress pembuatan proyek 291 PRAKTIKUM 31 PROYEK 2 A. TUJUAN PEMBELAJARAN 1. Mengimplementasikan konsep pemrograman Java dalam sebuah proyek. B. DASAR TEORI Proyek 1 ini mengimplementasikan konsep pemrograman Java yang telah dipelajari. Mahasiswa diharapkan dapat menghasilkan aplikasi yang memiliki kegunaan dan tujuan. C. TUGAS PENDAHULUAN 1. Pelajari kelas – kelas di Java yang berhubungan dengan proyek yang dikerjakan. D. PERCOBAAN Tidak Ada E. LATIHAN Latihan 1: Petunjuk Pelaksanaan Proyek 2 F. - Mahasiswa wajib membuat aplikasi berbasis Java yang telah diajarkan sebelumnya - Aplikasi yang dibuat memiliki kegunaan yang jelas beserta tujuan aplikasi tersebut - Aplikasi dibuat oleh masing – masing mahasiswa TUGAS Tidak ada G. LAPORAN RESMI Buat laporan yang berisi progress pembuatan proyek 293 PRAKTIKUM 32 PRESENTASI A. TUJUAN PEMBELAJARAN 1. Mengimplementasikan konsep pemrograman Java dalam sebuah proyek. B. DASAR TEORI Presentasi bertujuan untuk mendemokan hasil aplikasi yang telah dikembangkan pada proyek 1 dan proyek 2. C. TUGAS PENDAHULUAN Tidak Ada D. PERCOBAAN Tidak Ada E. LATIHAN Latihan 1: Petunjuk Pelaksanaan Presentasi - Mahasiswa wajib mempresentasikan aplikasi yang telah dibuat pada proyek - Mahasiswa menjelaskan manfaat dan tujuan dikembangkannya aplikasi tersebut - Mahasiswa wajib menjelaskan kelas apa saja yang digunakan untuk mengembangkan aplikasi tersebut. F. TUGAS Tidak ada G. LAPORAN RESMI Buat laporan yang berisi presentasi hasil proyek 293 Daftar Pustaka 1. Chuck Cavaness, Geoff Friesen, Special Edition Using JavaTM 2 SE, QUE, 2000 2. Horstmann, Gary cornel, Cay S, Core Java 2 Volume I, Fundamentals 7th Edition, Prentice hall, 2005 3. Herbert Schildt, The Complete Reference Java J2SETM 5th Edition, Mc Graw-Hill, Osborne, 2005. 4. James Gosling, The JavaTM Language Specification, Third Edition – Sun Mycrosystems, Addison-Wesley, 2005 5. Laura Lemay, Sams Teach Yourself Java 2 in 21 Days, Second Edition, SAMS, 2000 6. Patrick Niemeyer, Jonathan Knudsen, Learning Java, O’reilly, CA, 2000 7. Sun Java Programming, Sun Educational Services, Student Guide, Sun Microsystems 2001. 8. https://sites.google.com/site/icsshdhs/java-a/java-unit-2/2-2-java-string-assignments/2-2-1java-string-exercise-parse-this