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.
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
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);
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;
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;
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.
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.
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
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
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
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
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;
for (int i=0; i
System.out.println("Nilai Mata Kuliah\n"); System.out.println("MK \tMinggu1\tMinggu2\tMinggu3\tRataRata");
38
for (int i=0; i
Percobaan 3 : Mendapatkan informasi panjang elemen array multi dimensi public class CariPanjangElemen { public static void main(String args[]) { int x[][][][]=new int[2][][][];
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.
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);
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 { [deklarasi_atribut] [deklarasi_konstruktor] [deklarasi_metode] }
Contoh: public class Siswa { … }
Deklarasi atribut dapat dilakukan dengan sintaks sebagai berikut: <modifier> ;
Contoh: public class Siswa { public int nrp; 53
public String nama; }
Deklarasi metode dapat dilakukan dengan sintaks sebagai berikut: <modifier> ([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“); }
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
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
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); }
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");
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()
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 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”);
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
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
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. 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) {
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){
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 : • • • • • • • • •
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{
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"); }
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 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
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
public class PQueueTest { public static void main(String[] args) { PriorityQueue pQueue = new PriorityQueue(10, new Comparator() { 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");
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) {
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]); } } }
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)); } } }
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); } }
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;
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.
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]); } } }
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)); } } }
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); } }
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;
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){
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));
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
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
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();
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 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 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 iOb; iOb = new Gen(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 adalah subtype dari G.