Selasa, 10 Desember 2013

cara membuat foto menjadi video menggunakan windows movie maker

Windows movie maker merupakan software bawaan Windows XP , Windows Vista, dan Windows 7, biasanya terinstal secara langsung saat menginstal windows xp service pack 2. Jika dikomputer belum terinstal bisa download di situs microsoft atau disini download windows movie maker portable . Software ini bisa digunakan untuk membuat koleksi foto anda menjadi sebuah video clip yang dilengkapi dengan background lagu. Beberapa software profesional yang bisa digunakan untuk mengedit video adalah Pinaccle dan Ulead Video Studio , dll. Prosedur untuk membuat video dari foto 1. Siapkan beerapa file foto format jpg atau bmp 2. Siapkan lagu mp3 untuk jadi background video clip Windows movie maker memiliki keterbatasan, tidak dapat mengenali file audio atau lagu mp3 . Agar lagu mp3 dapat disisipkan maka harus dikonversi ke format wav, bisa dilhat panduannya disini konversi mp3 menjadi wav 3. Buka aplikasi windows movie maker Pilih Import pictures , masukkan gambar atau foto 4. Di task window pilih gambar macan kemudian Ctrl+A untuk memilih otomatis semua gambar Klik kanan kemudian pilih Add to Storyboard 5. Tambahkan video effects Ada beberapa cara a. secara manual pilih efek yang ada di task window kemudin drag ke story board satu persatu b. pilih semua gambar yg ada di storyboard (gunakan Ctrl+A untuk memilih otomatis semua gambar) Klik kanan di video efek yang ada di task window pilih add to storyboard (lihat gambar langkah 4) 6. Video transition Ada beberapa cara a. secara manual pilih video transisi yang ada di task window kemudian drag ke story board satu persatu b. pilih semua gambar yg ada di storyboard (gunakan Ctrl+A untuk memilih otomatis semua gambar) Klik kanan di video transitions yang ada di task window pilih add to storyboard (lihat gambar langkah 4) 7. Selanjutnya import audio or music , bisa dilihat panduannya disini Memasukkan lagu ke video clip 8. Tambahkan title dan kredit 9. Klik Save to my computer untuk menyimpan file video clip. Ikuti saja option defaultnya, Kemudian Next -next hingga finish. terimakasih kepada artikelkomputerku OLIVER EVANS MARPAUNG

Minggu, 29 September 2013

Netbeans programing

J.E.N.I. BAB 1 Review Konsep Dasar dalam Java 1.1 Tujuan Sebelum melangkah pada fitur-fitur menarik yang ada pada Java, mari kita melihat kembali beberapa hal yang telah Anda pelajari pada pelajaran pemograman pertama Anda. Pembelajaran kali ini menyajikan diskusi tentang perbedaan konsep-konsep berorientasi object dalam Java. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Mengetahui dan menggunakan konsep dasar beorientasi object.  class  object  atribut  method  cnstructor 2. Mengetahui dengan jelas tentang konsep lanjutan berorientasi object dan menggunakannya dengan baik  package  enkapsulasi  abstraksi  pewarisan  polimorfisme  interface 3. Mengetahui dengan jelas penggunaan kata kunci this, super, final dan static 4. Membedakan antara method overloading dan method overridding 1.2 Konsep Berorientasi object 1.2.1 Desain Berorientasi object Desain berorientasi object adalah sebuah teknik yang memusatkan desain pada object dan class berdasarkan pada skenario dunia nyata. Hal ini menegaskan keadaan(state), behaviour dan interaksi dari object. Selain itu juga menyediakan manfaat akan kebebasan pengembangan, meningkatkan kualitas, mempermudah pemeliharaan, mempertinggi kemampuan dalam modifikasi dan meningkatkan penggunaan kembali software. 1.2.2 Class Pengenalan Pemrograman 2 1 J.E.N.I. Class mengizinkan Anda dalam mendeklarasikan tipe data baru. Ia dijalankan sebagai blueprint, dimana model dari object yang Anda buat berdasarkan pada tipe data baru ini. 1.2.3 Object Sebuah object adalah sebuah entiti yang memiliki keadaan, behaviour dan identitas yang yang tugasnya dirumuskan dalam suatu lingkup masalah dengan baik. Inilah instance sebenarnya dari sebuah class. Ini juga dikenal sebagai instance. Instance dibuat sewaktu Anda meng-instantiate class menggunakan kata kunci new. Dalam sistem registrasi siswa, contoh dari sebuah object yaitu entiti Student. 1.2.4 Atribut Atribut menunjuk pada elemen data dari sebuah object. Atribut menyimpan informasi tentang object. Dikenal juga sebagai member data, variabel instance, properti atau sebuah field data. Kembali lagi ke contoh sistem registrasi siswa, atribut dari sebuah siswa adalah nomor siswa. 1.2.5 Method Sebuah method menjelaskan behaviour dari sebuah object. Method juga dikenal sebagai fungsi atau prosedur. Sebagai contoh, method yang mungkin tersedia untuk entiti siswa adalah method register. 1.2.6 Constructor Constructor adalah sebuah tipe khusus dari method yang digunakan untuk membuat dan menginisialisasi sebuah object baru. Ingat bahwa constructor bukan member (yaitu atribut, method atau inner class dari sebuah object). 1.2.7 Package Package menunjuk pada pengelompokkan class dan/atau subpackages. Strukturnya dapat disamakan dengan direktorinya. 1.2.8 Enkapsulasi Enkapsulasi menunjuk pada prinsip dari menyembunyikan desain atau mengimplementasikan informasi yang tidak sesuai pada object yang ada. 1.2.9 Abstraksi Sementara enkapsulasi menyembunyikan detail, abstraksi mengabaikan aspek dari subyek yang tidak sesuai dengan tujuan yang ada supaya lebih banyak mengkonsentrasikan yang ada. 1.2.10 Pewarisan Pewarisan adalah hubungan antara class dimana dalam satu class ada superclass atau class induk dari class yang lain. Pewarisan menunjuk pada properti dan behaviour yang diterima dari nenek moyang dari class. Ini dikenal juga sebagai hubungan “is-a”. Perhatikan pada hirarki berikut. Pengenalan Pemrograman 2 2 J.E.N.I. Gambar 1.1: Contoh Pewarisan SuperHero adalah superclass dari class FlyingSuperHero dan UnderwaterSuperHero. Catatan bahwa FlyingSuperHero “is-a” SuperHero. Sebagaimana juga UnderwaterSuperHero “is-a” SuperHero 1.2.11 Polimorfisme Polimorfisme adalah kemampuan dari sebuah object untuk membolehkan mengambil beberapa bentuk yang berbeda. Secara harfiah, “poli” berarti banyak sementara “morph” berarti bentuk. Menunjuk pada contoh sebelumnya pada pewarisan, kita lihat bahwa object SuperHero dapat juga menjadi object FlyingSuperHero atau object UnderwaterSuperHero. 1.2.12 Interface Sebuah interface adalah sebuah contract dalam bentuk kumpulan method dan deklarasi konstanta. Ketika sebuah class implements sebuah interface, ini mengimplementasikan semua method yang dideklarasikan dalam interface. 1.3 Struktur Program Java Pada bagian ini meringkaskan syntax dasar yang digunakan dalam pembuatan aplikasi Java. 1.3.1 Mendeklarasikan class Java ::= class { * * * } SuperHero FlyingSuperHero UnderwaterSuperHero dimana adalah sebuah access modifier, yang mana boleh dikombinasikan dengan tipe yang lain dari modifier. Pengenalan Pemrograman 2 3 J.E.N.I. Petunjuk Penulisan Program: * = berarti bahwa boleh ada 0 atau lebih kejadian dari deret tersebut yang menggunakannya juga. = menunjukkan bahwa Anda harus mengganti nilai sebenarnya untuk bagian ini daripada menguranginya penulisannya. Ingat bahwa untuk class teratas, acces modifier yang valid hanyalah public dan package(yakni jika tidak ada acces modifier mengawali kata kunci class). Contoh berikut ini mendeklarasikan blueprint SuperHero. Class SuperHero { String superPowers[]; void setSuperPowers(String superPowers[]) { this.superPowers = superPowers; } void printSuperPowers() { for (int i = 0; i < superPowers.length; i++) { System.out.println(superPowers[i]); } } } 1.3.2 Mendeklarasikan Atribut ::= [= ]; ::= byte | short | int | long | char | float | double | boolean | Petunjuk Penulisan Program: [] = Menunjukkan bahwa bagian ini hanya sebagai pilihan. Inilah contohnya. } public class AttributeDemo { private String studNum; public boolean graduating = false; protected float unitsTaken = 0.0f; String college; 1.3.3 Mendeklarasikan Method ::= (*) { * } ::= [,] Pengenalan Pemrograman 2 4 J.E.N.I. Sebagai contoh: } class MethodDemo { int data; int getData() { return data; } void setData(int data) { this.data = data; } void setMaxData(int data1, int data2) { data = (data1>data2)? data1 : data2; } 1.3.4 Mendeklarasikan sebuah Constructor } ::= (*) { * Jika tidak ada constructor yang disediakan secara jelas, constructor default secara otomatis membuatkannya untuk Anda. Constructor default tidak membawa argumen dan tidak berisi pernyataan pada tubuh class. Petunjuk Penulisan Program: Nama constructor harus sama dengan nama class. yang valid untuk constructor adalah public, protected, dan private. Constructor tidak memiliki nilai return. Perhatikan contoh berikut. class ConstructorDemo { private int data; public ConstructorDemo() { data = 100; } ConstructorDemo(int data) { this.data = data; } } 1.3.5 Meng-instantiate sebuah class Untuk meng-instantiate sebuah class, dengan sederhana kita gunakan kata kunci new diikuti dengan pemanggilan sebuah constructor. Mari lihat langsung ke contohnya. class ConstructObj { int data; ConstructObj() { /* menginisialisasi data */ } public static void main(String args[]) { Pengenalan Pemrograman 2 5 J.E.N.I. } ConstructObj obj = new ConstructObj(); //di-instantiate } 1.3.6 Mengakses Anggota object Untuk mengakses anggota dari sebuah object, kita gunakan notasi “dot”. Penggunaanya seperti berikut: . Contoh selanjutnya berdasar pada sebelumnya dengan pernyataan tambahan untuk mengakses anggota dan method tambahan. } class ConstructObj { int data; ConstructObj() { /* inisialisasi data */ } void setData(int data) { this.data = data; } public static void main(String args[]) { ConstructObj obj = new ConstructObj(); //instantiation obj.setData = 10; //access setData() System.out.println(obj.data); //access data } 1.3.7 Package Untuk menunjukkan bahwa file asal termasuk package khusus, kita gunakan syntax berikut: ::= package ; Untuk mengimpor package lain, kita gunakan syntax berikut: ::= import ; Dengan ini, source code Anda harus memiliki format berikut: [] * + Petunjuk Penulisan Program: + menunjukkan bahwa boleh ada 1 atau lebih kejadian pada baris ini dalam pengaplikasiannya. Pengenalan Pemrograman 2 6 J.E.N.I. Sebagai contoh. package registration.reports; import registration.processing.*; import java.util.List; import java.lang.*; //imported by default class MyClass { /* rincian dari MyClass */ 1.3.8 Acces Modifier Tabel berikut meringkas acces modifier dalam Java. private default/package protected public class yang sama Yes Yes Yes Yes package yang sama Yes Yes Yes package yang berbeda (subclass) Yes Yes package yang berbeda (nonsubclass) 1.3.9 Enkapsulasi Yes Tabel 1.2: Acces Modifier Menyembunyikan elemen dari penggunaan sebuah class dapat dilakukan dengan pembuatan anggota yang ingin Anda sembunyikan secara private. Contoh berikut menyembunyikan field secret. Catatan bahwa field ini tidak langsung diakses oleh program lain menggunakan method getter dan setter. class Encapsulation { private int secret; //field tersembunyi public boolean setSecret(int secret) { if (secret < 1 || secret > 100) { return false; } this.secret = secret; return true; } public getSecret() { return secret; } } 1.3.10 Pewarisan Pengenalan Pemrograman 2 7 J.E.N.I. Untuk membuat class anak atau subclass berdasarkan class yang telah ada, kita gunakan kata kunci extend dalam mendeklarasikan class. Sebuah class hanya dapat meng-extend satu class induk. Sebagai contoh, class Point di bawah ini adalah superclass dari class ColoredPoint. } import java.awt.*; class Point { int x; int y; } class ColoredPoint extends Point { Color color; 1.3.11 Method Overriding Method subclass override terhadap method superclass ketika subclass mendeklarasikan method yang signaturenya serupa ke method dalam superclass. Signature dari method hanyalah informasi yang ditemukan dalam definisi method bagian atas. Signature mengikutkan tipe return, nama dan daftar parameter method tetapi itu tidak termasuk acces modifier dan tipe yang lain dari kata kunci seperti final dan static. Inilah perbedaan dari method overloading. Method overloading secara singkat didiskusikan dalam sub bagian pada kata kunci this. } class Superclass { void display(int n) { System.out.println("super: " + n); } } class Subclass extends Superclass { void display(int k) { //method overriding System.out.println("sub: " + k); } } class OverrideDemo { public static void main(String args[]) { Subclass SubObj = new Subclass(); Superclass SuperObj = SubObj; SubObj.display(3); ((Superclass)SubObj).display(4); } Ini akan menghasilkan keluaran sebagai berikut. sub: 3 sub: 4 Pemanggilan method ditentukan oleh tipe data sebenarnya dari object yang diminta method. Acces modifier untuk method yang dibutuhkan tidak harus sama. Bagaimanapun, acces modifier Pengenalan Pemrograman 2 8 J.E.N.I. dari method overridding mengharuskan salah satunya punya acces modifier yang sama seperti itu dari method overridden atau acces modifier yang kurang dibatasi. Perhatikan contoh selanjutnya. Periksa yang mana dari method overridding berikut akan menyebabkan waktu meng-compile akan menyebabkan error. class Superclass { void overriddenMethod() { } } class Subclass1 extends Superclass { public void overriddenMethod() { } } class Subclass2 extends Superclass { void overriddenMethod() { } } class Subclass3 extends Superclass { protected void overriddenMethod() { } } class Subclass4 extends Superclass { private void overriddenMethod() { } } 1.3.12 Class Abstract dan Method Bentuk umum dari sebuah method abstract adalah sebagai berikut: abstract (*); Sebuah class yang berisi method abstract harus dideklarasikan sebagai sebuah class abstract. } abstract (*);abstract class { /* constructors, fields and methods */ Kata kunci tidak dapat digunakan pada constructor atau method static. Ini juga penting untuk diingat bahwa class abstract tidak dapat di-instantiate. Class yang meng-extends sebuah class abstract harus mengimplementasikan semua method abstract. Jika tidak subclass sendiri dapat dideklarasikan sebagai abstract. Petunjuk Penulisan Program: catatan bahwa mendeklarasikan sebuah method abstract hampir mirip dalam mendeklarasikan class normal kecuali itu suatu method abstract yang tidak memiliki tubuh dan kepala sehingga dengan segera diakhiri dengan semicolon(;). Pengenalan Pemrograman 2 9 J.E.N.I. Sebagai contoh: abstract class SuperHero { String superPowers[]; void setSuperPowers(String superPowers[]) { this.superPowers = superPowers; } void printSuperPowers() { for (int i = 0; i < superPowers.length; i++) { System.out.println(superPowers[i]); } } abstract void displayPower(); } class UnderwaterSuperHero extends SuperHero { void displayPower() { System.out.println("Communicate with sea creatures..."); System.out.println("Fast swimming ability..."); } } class FlyingSuperHero extends SuperHero { void displayPower() { System.out.println("Fly..."); } } 1.3.13 Interface Mendeklarasikan sebuah interface pada dasarnya mendeklarasikan sebuah class tetapi sebagai penggantinya menggunakan kata kunci class, kata kunci interface digunakan. Berikut syntax-nya. } ::= interface { * [ (*);]* Anggotanya adalah public ketika interface dideklarasikan public. Petunjuk Penulisan Program: Secara mutlak atribut adalah static dan final dan harus diinisialisasi dengan nilai konstanta. Seperti mendeklarasikan class teratas, acces modifier yang valid hanyalah public dan package(yakni jika tidak ada acces modifier mengawali kata kunci class). Class mengimplementasikan sebuah interface yang telah ada dengan menggunakan kata kunci implements. Class ini dibuat untuk mengimplementasikan semua method interface. Sebuah class boleh mengimplementasikan lebih dari satu interface. Contoh berikut menunjukkan bagaimana mendeklarasikan dan menggunakan sebuah interface. Pengenalan Pemrograman 2 10 J.E.N.I. interface MyInterface { void iMethod(); } class MyClass1 implements MyInterface { public void iMethod() { System.out.println("Interface method."); } void myMethod() { System.out.println("Another method."); } } class MyClass2 implements MyInterface { public void iMethod() { System.out.println("Another implementation."); } } class InterfaceDemo { public static void main(String args[]) { MyClass1 mc1 = new MyClass1(); MyClass2 mc2 = new MyClass2(); mc1.iMethod(); mc1.myMethod(); mc2.iMethod(); } } 1.3.14 Kata kunci this Kata kunci this dapat digunakan untuk beberapa alasan berikut: 1. Adanya ambigu pada atribut lokal dari variabel lokal 2. Menunjuk pada object yang meminta method non-static 3. Menunjuk pada constructor lain. Sebagai contoh pada maksud pertama, perhatikan kode berikut dimana variabel data disediakan sebagai sebuah atribut dan parameter lokal pada saat yang sama. } class ThisDemo1 { int data; void method(int data) { this.data = data; /* this.data menunjuk ke atribut sementara data menunjuk ke variabel lokal */ } Contoh berikut menunjukkan bagaimana object this secara mutlak menunjuk ketika anggota non- Pengenalan Pemrograman 2 11 J.E.N.I. static dipanggil. } class ThisDemo2 { int data; void method() { System.out.println(data); //this.data } void method2() { method(); //this.method(); Sebelum melihat ke contoh yang lain, mari pertama meninjau pengertian method overloading. Constructor seperti juga method dapat juga menjadi overload. Method yang berbeda dalam class dapat memberi nama yang sama asalkan list parameter juga berbeda. Method overloaded harus berbeda dalam nomor dan/atau tipe dari parameternya. Contoh selanjutnya memiliki constructor overloaded dan referensi this yang dapat digunakan untuk menunjuk versi lain dari constructor. class ThisDemo3 { int data; ThisDemo3() { this(100); } ThisDemo3(int data) { this.data = data; } } Petunjuk Penulisan Program: Memanggil this() harus ada pernyataan pertama dalam constructor. 1.3.15 Kata kunci super Penggunaan kata kunci super berhubungan dengan pewarisan. Super digunakan untuk meminta constructor superclass. Super juga dapat digunakan seperti kata kunci this untuk menunjuk pada anggota dari superclass. Program berikut mendemonstrasikan bagaimana referensi super digunakan untuk memanggil constructor superclass. class Person { String firstName; String lastName; Person(String fname, String lname) { firstName = fname; lastName = lname; } } class Student extends Person { String studNum; Student(String fname, String lname, String sNum) { super(fname, lname); Pengenalan Pemrograman 2 12 J.E.N.I. } studNum = sNum; } Petunjuk Penulisan Program: super() menunjuk pada superclass dengan segera. Ini harus berada pada pernyataan pertama dalam constructor superclass. Kata kunci dapat juga digunakan untuk menunjuk anggota superclass seperti yang ditunjukkan pada contoh berikut. } class Superclass{ int a; void display_a(){ System.out.println("a = " + a); } } class Subclass extends Superclass { int a; void display_a(){ System.out.println("a = " + a); } void set_super_a(int n){ super.a = n; } void display_super_a(){ super.display_a(); } } class SuperDemo { public static void main(String args[]){ Superclass SuperObj = new Superclass(); Subclass SubObj = new Subclass(); SuperObj.a = 1; SubObj.a = 2; SubObj.set_super_a(3); SuperObj.display_a(); SubObj.display_a(); SubObj.display_super_a(); System.out.println(SubObj.a); } Program tersebut akan menampilkan hasil berikut. a = 1 2 a = 2 a = 3 Pengenalan Pemrograman 2 13 J.E.N.I. 1.3.16 Kata Kunci static Kata kunci static dapat digunakan untuk anggota dari sebuah class. Kata kunci ini menyediakan static atau anggota class untuk diakses sama sebelum beberapa instance dari class dibuat. Variabel class bersifat seperti variabel umum. Ini artinya bahwa variabel dapat diakses oleh semua instance dari class. Method class mungkin dapat diambil tanpa membuat sebuah object dari class tersebut. Bagaimanapun, mereka hanya dapat mengakses anggota static dari class. Ditambahkan juga, mereka tidak dapat menunjuk this dan super. Kata kunci static dapat juga diaplikasikan pada blok. Ini dinamakan dengan blok static. Blok ini dieksekusi hanya sekali, ketika class diisi. Hal ini biasanya digunakan untuk menginisialisasi variabel class. class Demo { static int a = 0; static void staticMethod(int i) { System.out.println(i); } static { //blok static System.out.println("This is a static block."); a += 1; } } class StaticDemo { public static void main(String args[]) { System.out.println(Demo.a); Demo.staticMethod(5); Demo d = new Demo(); System.out.println(d.a); d.staticMethod(0); Demo e = new Demo(); System.out.println(e.a); d.a += 3; System.out.println(Demo.a+", " +d.a +", " +e.a); } } Keluaran dari source kode ditunjukkan di bawah ini. This is a static block. 1 5 1 0 1 4, 4, 4 1.3.17 Kata Kunci final Kata kunci final dapat diaplikasikan pada variabel, method dan class. Untuk mengingat fungsi dari kata kunci, ingat bahwa itu secara mudah dibatasi apa yang kita dapat lakukan dengan variabel, method dan class. Nilai dari variabel final dapat tidak lama diubah sesudah nilainya telah diatur. Sebagai contoh, final int data = 10; Pernyataan berikut akan menyebabkan terjadi compilation error: Pengenalan Pemrograman 2 14 J.E.N.I. data++; Method final tidak dapat di-override dalam class anak. final void myMethod() { //in a parent class } myMethod tidak dapat lama di-override dalam class anak. class final tidak dapat diwariskan tidak seperti class yang biasanya. final public class MyClass { } Petunjuk Penulisan Program: Perintah penulisan kata kunci final dan public memungkinkan bertukar tempat. Pernyataan ini akan menyebabkan kesalahan compilation terjadi karena MyClass dapat tidak lama di-extended. } public WrongClass extends MyClass { 1.3.18 Inner Classes Sebuah inner class secara mudah dideklarasikan dalam class lain. } class OuterClass { int data = 5; class InnerClass { int data2 = 10; void method() { System.out.println(data); System.out.println(data2); } } public static void main(String args[]) { OuterClass oc = new OuterClass(); InnerClass ic = oc.new InnerClass(); System.out.println(oc.data); System.out.println(ic.data2); ic.method(); } Untuk mampu mengakses anggota dari inner class, kita butuh sebuah instance dari inner class. Method-method dari inner class dapat secara langsung mengakses anggota dari outer class. Pengenalan Pemrograman 2 15 J.E.N.I. 1.4 Latihan 1.4.1 Tabel Perkalian Tulis program yang mempunyai masukkan size dari user dan mencetak tabel perkalian dengan size yang ditetapkan. Size untuk tabel perkalian : 5 Tabel perkalian dari size 5: 1 2 3 4 5 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 1.4.2 Greatest Common Factor(GCF) Tulis sebuah program yang mempunyai tiga integer dan menghitung nilai GCF dari tiga angka. GCF adalah angka terbesar yang secara rata dibagi ke semua angka yang diberikan. Input 1: 25 Input 1: 1 Input 1: 9 Input 2: 15 Input 2: 2 Input 2: 27 Input 3: 35 Input 3: 3 Input 3: 12 GCF: 5 GCF: 1 GCF: 3 1.4.3 Shape Buatlah class Shape. class memiliki dua field String: name dan size. class mempunyai method printShapeInfo, dimana hanya mengeluarkan nilai name dan field size dari object Shape. Juga memiliki method printShapeName dan printShapeSize, dimana mencetak nama dan size dari object, berturut-turut. Menggunakan pewarisan, buat class Square dengan field yang sama dan method seperti itu dari class Shape. Class ini mempunyai dua tambahan field integer: length dan width. Method printShapeLength dan printShapeWidth yang mencetak panjang dan lebar object yang juga termasuk dalam class ini. Anda juga harus meng-override printShapeInfo untuk mencetak keluaran field tambahan dalam subclass juga. 1.4.4 Binatang Buatlah interface Animal yang mempunyai tiga method:eat dan move. Semua method ini tidak punya argumen atau nilai return. Method ini hanya mengeluarkan bagaimana object Animal makan dan bergerak. Sebagai contoh, seekor kelinci memakan wortel dan bergerak dengan melompat. Buat class Fish dan Bear yang menggunakan interface Animal. Terserah kepada Anda bagaimana menggunakan method eat dan move. Pengenalan Pemrograman 2 16 J.E.N.I. 2.1 Tujuan BAB 2 Exceptions dan Assertions Dasar penanganan exception telah dikenalkan pada Anda di pelajaran pemrograman pertama. Bab ini membahas secara lebih dalam mengenai exception dan sedikit menyinggung tentang assertion. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Menangani exception dengan menggunakan try, catch dan finally 2. Membedakan penggunaan antara throw dengan throws 3. Menggunakan exception class yang berbeda – beda 4. Membedakan antara checked exceptions dan unchecked exceptions 5. Membuat exception class tersendiri 6. Menjelaskan keunggulan penggunaan assertions 7. Menggunakan assertions 2.2 Apa itu Exception? 2.2.1 Pendahuluan Bugs dan error dalam sebuah program sangat sering muncul meskipun program tersebut dibuat oleh programmer berkemampuan tinggi. Untuk menghindari pemborosan waktu pada proses error-checking, Java menyediakan mekanisme penanganan exception. Exception adalah singkatan dari Exceptional Events. Kesalahan (errors) yang terjadi saat runtime, menyebabkan gangguan pada alur eksekusi program. Terdapat beberapa tipe error yang dapat muncul. Sebagai contoh adalah error pembagian 0, mengakses elemen di luar jangkauan sebuah array, input yang tidak benar dan membuka file yang tidak ada. 2.2.2 Error dan Exception Classes Seluruh exceptions adalah subclasses, baik secara langsung maupun tidak langsung, dari sebuah root class Throwable. Kemudian, dalam class ini terdapat dua kategori umum : Error class dan Exception class. Exception class menunjukkan kondisi yang dapat diterima oleh user program. Umumnya hal tersebut disebabkan oleh beberapa kesalahan pada kode program. Contoh dari exceptions adalah pembagian oleh 0 dan error di luar jangkauan array. Pengenalan Pemrograman 2 1 J.E.N.I. Error class digunakan oleh Java run-time untuk menangani error yang muncul pada saat dijalankan. Secara umum hal ini di luar control user karena kemunculannya disebabkan oleh run-time environment. Sebagai contoh adalah out of memory dan harddisk crash. 2.2.3 Sebuah Contoh Perhatikan contoh program berikut : class DivByZero { public static void main(String args[]) { } } System.out.println(3/0); System.out.println(“Cetak.”); Jika kode tersebut dijalankan, akan didapatkan pesan kesalahan sebagai berikut : Exception in thread "main" java.lang.ArithmeticException: / by zero at DivByZero.main(DivByZero.java:3) Pesan tersebut menginformasikan tipe exception yang terjadi pada baris dimana exception itu berasal. Inilah aksi default yang terjadi bila terjadi exception yang tidak tertangani. Jika tidak terdapat kode yang menangani exception yang terjadi, aksi default akan bekerja otomatis. Aksi tersebut pertama-tama akan menampilkan deskripsi exception yang terjadi. Kemudian akan ditampilkan stack trace yang mengindentifikasi method dimana exception terjadi. Pada bagian akhir, aksi default tersebut akan menghentikan program secara paksa. Bagaimana jika Anda ingin melakukan penanganan atas exception dengan cara yang berbeda? Untungnya, bahasa pemrograman Java memiliki 3 keywords penting dalam penanganan exception, yaitu try, catch dan finally. Pengenalan Pemrograman 2 2 J.E.N.I. 2.3 Menangkap Exception 2.3.1 Try - Catch Seperti yang telah dijelaskan sebelumnya, keyword try, catch dan finally digunakan dalam menangani bermacam tipe exception. 3 Keyword tersebut digunakan bersama, namun finally bersifat opsional. Akan lebih baik jika memfokuskan pada dua keyword pertama, kemudian membahas finally pada bagian akhir. Berikut ini adalah penulisan try-catch secara umum : try { } catch ( ) { } ... } catch ( ) { } Petunjuk Penulisan Program : Blok catch dimulai setelah kurung kurawal dari kode try atau catch terkait. Penulisan kode dalam blok yang dimasukkan Gunakan contoh kode tersebut pada program DivByZero yang telah dibuat sebelumnya : class DivByZero { public static void main(String args[]) { try { } } System.out.println(3/0); System.out.println(“Cetak.”); } catch (ArithmeticException exc) { //Reaksi atas kejadian System.out.println(exc); } System.out.println(“Setelah Exception.”); Kesalahan pembagian dengan bilangan 0 adalah salah satu contoh dari ArithmethicException. Tipe exception kemudian mengindikasikan klausa catch pada class ini. Program tersebut menangani kesalahan yang terjadi dengan menampilkan deskripsi dari permasalahan. Pengenalan Pemrograman 2 3 J.E.N.I. Output program saat eksekusi akan terlihat sebagai berikut : java.lang.ArithmeticException: / by zero After exception. Bagian kode yang terdapat pada blok try dapat menyebabkan lebih dari satu tipe exception. Dalam hal ini, terjadinya bermacam tipe kesalahan dapat ditangani menggunakan beberapa blok catch. Perlu dicatat bahwa blok try dapat hanya menyebabkan sebuah exception pada satu waktu, namun dapat pula menampikan tipe exception yang berbeda di lain waktu. Berikut adalah contoh kode yang menangani lebih dari satu exception : class MultipleCatch { public static void main(String args[]) { try { } } int den = Integer.parseInt(args[0]); //baris 4 System.out.println(3/den); //baris 5 } catch (ArithmeticException exc) { System.out.println(“Nilai Pembagi 0.”); } catch (ArrayIndexOutOfBoundsException exc2) { System.out.println(“Missing argument.”); } System.out.println(“After exception.”); Pada contoh ini, baris ke-4 akan menghasilkan kesalahan berupa ArrayIndexOutOfBoundsException bilamana seorang user alpa dalam memasukkan argument, sedang baris ke-5 akan menghasilkan kesalahan ArithmethicException jika pengguna memasukkan nilai 0 sebagai sebuah argument. Pelajari apakah yang akan terjadi terhadap program bila argumen – argumen berikut dimasukkan oleh user : a) Tidak ada argument b) 1 c) 0 Penggunaan try bersarang diperbolehkan dalam pemrograman Java. class NestedTryDemo { public static void main(String args[]){ try { int a = Integer.parseInt(args[0]); try { int b = Integer.parseInt(args[1]); System.out.println(a/b); } catch (ArithmeticException e) { System.out.println(“Divide by zero error!"); } } catch (ArrayIndexOutOfBoundsException) { System.out.println(“2 parameters are required!"); } } Pengenalan Pemrograman 2 4 J.E.N.I. } Pelajari apa yang akan terjadi pada program jika argument – argument berikut dimasukkan : a) Tidak ada argumen b) 15 c) 15 3 d) 15 0 Kode berikut menggunakan try bersarang tergabung dengan penggunaan method. } class NestedTryDemo2 { static void nestedTry(String args[]) { try { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); System.out.println(a/b); } catch (ArithmeticException e) { System.out.println("Divide by zero error!"); } } public static void main(String args[]){ try { nestedTry(args); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("2 parameters are required!"); } } Bagaimana output program tersebut jika diimplementasikan terhadap argument – argument berikut : a) Tidak ada argumen b) 15 c) 15 3 d) 15 0 2.3.2 Keyword Finally Saatnya Anda mengimplementasikan finally dalam blok try-cacth. Berikut ini cara penggunaan keyword tersebut : try { } catch ( ) { } ... } finally { } Pengenalan Pemrograman 2 5 J.E.N.I. Petunjuk Penulisan Program : Sekali lagi, ketentuan penulisan program juga mengatur penggunaan finally seperti halnya pada blok catch. Penggunaan finally dimulai setelah kurung kurawal penutup blok catch terkait. Penulisan dalam blok tersebut juga mengalami indentasi. Blok finally mengandung kode penanganan setelah penggunaan try dan catch. Blok kode ini selalu tereksekusi walaupun sebuah exception terjadi atau tidak pada blok try. Blok kode tersebut juga akan menghasilkan nilai true meskipun return, continue ataupun break tereksekusi. Terdapat 4 kemungkinan skenario yang berbeda dalam blok try-catch-finally. Pertama, pemaksaan keluar program terjadi bila control program dipaksa untuk melewati blok try menggunakan return, continue ataupun break. Kedua, sebuah penyelesaian normal terjadi jika try-catch-finally tereksekusi secara normal tanpa terjadi error apapun. Ketiga, kode program memiliki spesifikasi tersendiri dalam blok catch terhadap exception yang terjadi. Yang terakhir, kebalikan skenario ketiga. Dalam hal ini, exception yang terjadi tidak terdefinisikan pada blok catch manapun. Contoh dari skenario – skenario tersebut terlihat pada kode berikut ini : class FinallyDemo { } static void myMethod(int n) throws Exception{ try { switch(n) { case 1: System.out.println("case pertama"); return; case 3: System.out.println("case ketiga"); throw new RuntimeException("demo case ketiga"); case 4: System.out.println("case keempat"); throw new Exception("demo case keempat"); case 2: System.out.println("case Kedua"); } } catch (RuntimeException e) { System.out.print("RuntimeException terjadi: "); System.out.println(e.getMessage()); } finally { System.out.println("try-block entered."); } } public static void main(String args[]){ for (int i=1; i<=4; i++) { try { } } FinallyDemo.myMethod(i); } catch (Exception e){ System.out.print("Exception terjadi: "); System.out.println(e.getMessage()); } System.out.println(); Pengenalan Pemrograman 2 6 J.E.N.I. 2.4 Melempar Exception 2.4.1 Keyword Throw Disamping menangkap exception, Java juga mengijinkan seorang user untuk melempar sebuah exception. Sintaks pelemparan exception cukup sederhana. throw ; Perhatikan contoh berikut ini. /* Melempar exception jika terjadi kesalahan input */ class ThrowDemo { } public static void main(String args[]){ String input = “invalid input”; try { } } 2.4.2 Keyword Throws if (input.equals(“invalid input”)) { throw new RuntimeException("throw demo"); } else { System.out.println(input); } System.out.println("After throwing"); } catch (RuntimeException e) { System.out.println("Exception caught here."); System.out.println(e); Jika sebuah method dapat menyebabkan sebuah exception namun tidak menangkapnya, maka digunakan keyword throws. Aturan ini hanya berlaku pada checked exception. Anda akan mempelajari lebih lanjut tentang checked exception dan unchecked exception pada bagian selanjutnya, “Kategori Exception”. Berikut ini penulisan syntax menggunakan keyword throws : () throws { } Sebuah method perlu untuk menangkap ataupun mendaftar seluruh exceptions yang mungkin terjadi, namun hal itu dapat menghilangkan tipe Error, RuntimeException, ataupun subclass-nya. Pengenalan Pemrograman 2 7 J.E.N.I. Contoh berikut ini menunjukkan bahwa method myMethod tidak menangani ClassNotFoundException. class ThrowingClass { static void myMethod() throws ClassNotFoundException { throw new ClassNotFoundException ("just a demo"); } } class ThrowsDemo { public static void main(String args[]) { try { } } ThrowingClass.myMethod(); } catch (ClassNotFoundException e) { System.out.println(e); } 2.5 Kategori Exception 2.5.1 Exception Classes dan Hierarki Seperti yang disebutkan sebelumnya, root class dari seluruh exception classes adalah Throwable class. Yang disebutkan dibawah ini adalah exception class hierarki. Seluruh exceptions ini terdefinisi pada package java.lang. Tabel 1.4. Hirarki Exception Class Pengenalan Pemrograman 2 8 J.E.N.I. Sekarang Anda sudah cukup familiar dengan beberapa exception classes, saatnya untuk mengenalkan aturan : catch lebih dari satu harus berurutan dari subclass ke superclass. class MultipleCatchError { public static void main(String args[]){ } } try { int a = Integer.parseInt(args [0]); int b = Integer.parseInt(args [1]); System.out.println(a/b); } catch (Exception e) { System.out.println(e); } catch (ArrayIndexOutOfBoundsException e2) { System.out.println(e2); } System.out.println("After try-catch-catch."); Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception class adalah superclass dari ArrayIndexOutOfBoundsException class. MultipleCatchError.java:9: exception java.lang.ArrayIndexOutOfBoundsException has already been caught } catch (ArrayIndexOutOfBoundsException e2) { 2.5.2 Checked dan Unchecked Exceptions Exception terdiri atas checked dan unchecked exceptions. Checked exceptions adalah exception yang diperiksa oleh Java compiler. Compiler memeriksa keseluruhan program apakah menangkap atau mendaftar exception yang terjadi dalam sintax throws. Apabila checked exception tidak didaftar ataupun ditangkap, maka compiler error akan ditampilkan. Tidak seperti checked exceptions, unchecked exceptions tidak berupa compile-time checking dalam penanganan exceptions. Pondasi dasar dari unchecked exception classes adalah Error, RuntimeException dan subclass-nya. 2.5.3 User Defined Exceptions Meskipun beberapa exception classes terdapat pada package java.lang namun tidak mencukupi untuk menampung seluruh kemungkinan tipe exception yang mungkin terjadi. Sehingga sangat mungkin bahwa Anda perlu untuk membuat tipe exception tersendiri. Dalam pembuatan tipe exception Anda sendiri, Anda hanya perlu untuk membuat sebuah extended class terhadap RuntimeException class, maupun Exception class lain. Selanjutnya tergantung pada Anda dalam memodifikasi class sesuai permasalahan yang akan diselesaikan. Members dan constructors dapat dimasukkan pada exception class milik Anda. Pengenalan Pemrograman 2 9 J.E.N.I. Berikut ini contohnya : class HateStringException extends RuntimeException{ /* Tidak perlu memasukkan member ataupun construktor */ } class TestHateString { } public static void main(String args[]) { String input = "invalid input"; try { if (input.equals("invalid input")) { throw new HateStringException(); } System.out.println("String accepted."); } catch (HateStringException e) { System.out.println("I hate this string: " + input + "."); } } 2.6 Assertions 2.6.1 User Defined Exceptions Assertions mengijinkan programmer untuk menentukan asumsi yang dihadapi. Sebagai contoh, sebuah tanggal dengan area bulan tidak berada antara 1 hingga 12 dapat diputuskan bahwa data tersebut tidak valid. Programmer dapat menentukan bulan harus berada diantara area tersebut. Meskipun hal itu dimungkinkan untuk menggunakan contructor lain untuk mensimulasikan fungsi dari assertions, namun sulit untuk dilakukan karena fitur assertion dapat tidak digunakan. Hal yang menarik dari assertions adalah seorang user memiliki pilihan untuk digunakan atau tidak pada saat runtime. Assertion dapat diartikan sebagai extensi atas komentar yang menginformasikan pembaca kode bahwa sebagian kondisi harus terpenuhi. Dengan menggunakan assertions, maka tidak perlu untuk membaca keseluruhan kode melalui setiap komentar untuk mencari asumsi yang dibuat dalam kode. Namun, menjalankan program tersebut akan memberitahu Anda tentang assertion yang dibuat benar atau salah. Jika assertion tersebut salah, maka AssertionError akan terjadi. 2.6.2 Mengaktifkan dan Menonaktifkan Exceptions Penggunaan assertions tidak perlu melakukan import package java.util.assert. Menggunakan assertions lebih tepat ditujukan untuk memeriksa parameter dari nonpublic methods jika public methods dapat diakses oleh class lain. Hal itu mungkin terjadi bila penulis dari class lain tidak menyadari bahwa mereka dapat menonaktifkan assertions. Dalam hal ini program tidak dapat bekerja dengan baik. Pada non-public methods, hal tersebut tergunakan secara langsung oleh kode yang ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga Pengenalan Pemrograman 2 10 J.E.N.I. mereka menyadari bahwa saat menjalankannya, assertion harus dalam keadaan aktif. Untuk mengkompilasi file yang menggunakan assertions, sebuah tambahan parameter perintah diperlukan seperti yang terlihat dibawah ini : javac –source 1.4 MyProgram.java Jika Anda ingin untuk menjalankan program tanpa menggunakan fitur assertions, cukup jalankan program secara normal. java MyProgram Namun, jika Anda ingin mengaktifkan assertions, Anda perlu menggunakan parameter –enableassertions atau –ea. java –enableassertions MyProgram 2.6.3 Sintaks Assertions Penulisan assertions memiliki dua bentuk. Bentuk yang paling sederhana terlihat sebagai berikut : assert ; dimana adalah kondisi dimana assertion bernilai true. Bentuk yang lain menggunakan dua ekspresi, berikut ini cara penulisannya : assert : ; dimana adalah kondisi assertion bernilai true dan adalah informasi yang membantu pemeriksaan mengapa program mengalami kesalahan. class AgeAssert { public static void main(String args[]) { } } int age = Integer.parseInt(args[0]); assert(age>0); /* jika masukan umur benar (misal, age>0) */ if (age >= 18) { System.out.println(“Congrats! You're an adult! =)”); } Pengenalan Pemrograman 2 11 J.E.N.I. 2.7 Latihan 2.7.1 Heksadesimal ke Desimal Tentukan sebuah angka heksadesimal sebagai input. Konversi angka tersebut menjadi bilangan desimal. Tentukan exception class Anda sendiri dan lakukan penanganan jika input dari user bukan berupa bilangan heksadesimal. 2.7.2 Menampilkan Sebuah Berlian Tentukan nilai integer positif sebagai input. Tampilkan sebuah berlian menggunaakan karakter asterisk (*) sesuai angka yang diinput oleh user. Jika user memasukkan bilangan integer negatif, gunakan assertions untuk menanganinya. Sebagai contoh, jika user memasukkan integer bernilai 3, program Anda harus menampilkan sebuah berlian sesuai bentuk berikut : * *** ***** *** * Pengenalan Pemrograman 2 12 J.E.N.I. 3.1 Tujuan BAB 3 Teknik Pemrograman Lanjut Modul ini mengenalkan suatu teknik pemrograman yang lebih tinggi. Dalam bagian ini Anda akan mempelajari rekursif dan tipe data abstrak. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Memahami dan menggunakan rekursif 2. Mengetahui perbedaan antara stacks dan queues 2. Mengimplementasikan suatu implementasi sequensial dari stacks dan queues 3. Mengimplementasikan suatu implementasi linked dari stacks and queues 4. Menggunakan class-class Collection yang ada 3.2 Rekursif 3.2.1 Apa yang dimaksud dengan Rekursif? Rekursif adalah teknik pemecahan masalah yang powerful dan dapat digunakan ketika inti dari masalah terjadi berulang kali. Tentu saja, tipe dari masalah ini dapat dipecahkan mengunakan perkataan berulang-ulang (yaitu, menggunakan konstruksi looping seperti for, while dan do-while). Sesungguhnya, iterasi atau perkataan berulang-ulang merupakan peralatan yang lebih efisien jika dibandingkan dengan rekursif tetapi rekursif menyediakan solusi yang lebih baik untuk suatu masalah. Pada rekursif, method dapat memanggil dirinya sendiri. Data yang berada dalam method tersebut seperti argument disimpan sementara ke dalam stack sampai method pemanggilnya diselesaikan. 3.2.2 Rekursif Vs. Iterasi Untuk pengertian yang lebih baik dari rekursif, mari kita lihat pada bagaimana macammacam dari teknik iterasi. Dalam teknik-teknik tersebut juga dapat kita lihat penyelesaian sebuah loop yang lebih baik menggunakan rekursif daripada iterasi. Penyelesaian masalah dengan perulangan menggunakan iterasi secara tegas juga digunakan pada struktur kontrol pengulangan. Sementara itu, untuk rekursif, task diulangi dengan memanggil sebuah method perulangan. Maksud dari hal tersebut adalah untuk menggambarkan sebuah masalah ke dalam lingkup yang lebih kecil dari perulangan itu sendiri. Pertimbangkan penghitungan faktorial dalam penentuan bilangan bulat. Definisi rekursif dari hal tersebut dapat diuraikan sebagai berikut: factorial(n) = factorial(n-1) * n; factorial(1) = 1. Sebagai contohnya, nilai faktorial dari 2 sama dengan fatorial (1)*2, dimana hasilnya adalah 2. Faktorial dari 3 adalah 6, dimana sama dengan faktorial dari (2)*3. Pengenalan Pemrograman 2 1 J.E.N.I. Gambar 1: Contoh Factorial Dengan iterasi, proses diakhiri ketika kondisi loop gagal atau salah. Dalam kasus dari penggunaan rekursif, proses yang berakhir dengan kondisi tertentu disebut permasalahan dasar yang telah tercukupi oleh suatu pembatasan kondisi. Permasalahan yang mendasar merupakan kejadian yang paling kecil dari sebuah masalah. Sebagai contoh, dapat dilihat pada kondisi rekursif pada faktorial, kasus yang mudah adalah ketika masukannya adalah 1. 1 dalam kasus ini merupakan dasar dari masalah. Penggunaan dari iterasi dan rekursif dapat bersama-sama memandu loops jika hal ini tidak digunakan dengan benar. Keuntungan iterasi dibandingkan rekursif adalah performance yang lebih baik. Hal tersebut lebih cepat untuk rekursif sejak terbentuknya sebuah parameter pada sebuah method yang menyebabkan adanya suatu CPU time. Bagaimanapun juga, rekursif mendorong pelatihan perancangan software yang lebih baik, sebab teknik ini biasanya dihasilkan dalam kode yang singkat yang lebih mudah untuk dimengerti dan juga mempromosikan reusability pada suatu solusi yang sebelumnya telah diterapkan. Memilih antara iterasi dan rekursif merupakan permasalahan dari menjaga keseimbangan antara baiknya sebuah performance dan baiknya perancangan software. 3.2.3 Faktorial: Contoh Listing program berikut ini menunjukkan bagaimana menghitung faktorial menggunakan teknik iterasi. class FactorialIter { static int factorial(int n) { int result = 1; for (int i = n; i > 1; i--) { result *= i; } Pengenalan Pemrograman 2 2 J.E.N.I. return result; } public static void main(String args[]) { int n = Integer.parseInt(args[0]); System.out.println(factorial(n)); } } Dibawah ini merupakan listing program yang sama tetapi menggunakan rekursif. } class FactorialRecur { static int factorial(int n) { if (n == 1) { /* The base case */ return 1; } /* Recursive definition; Self-invocation */ return factorial(n-1)*n; } public static void main(String args[]) { int n = Integer.parseInt(args[0]); System.out.println(factorial(n)); } 3.2.4 Print n in any Base: Contoh yang lain Sekarang, mempertimbangkan dari masalah dalam pencetakkan suatu angka desimal yang nilai basenya telah ditetapkan oleh pengguna. Ingat bahwa solusi dalam hal ini untuk menggunakan repetitive division dan untuk menulis sisa perhitungannya. Proses akan berakhir ketika sisa hasil pembagian kurang dari base yang ditetapkan. Dapat diasumsikan jika nilai input desimal adalah 10 dan kita akan mengkonversinya menjadi base 8. Inilah solusinya dengan perhitungan menggunakan pensil dan kertas. Dari solusi diatas, 10 adalah sama dengan 12 base 8. Contoh berikutnya. Nilai input desimalnya adalah 165 dan akan dikonversi ke base 16. Pengenalan Pemrograman 2 3 J.E.N.I. 165 adalah sama dengan A5 base 16. Catatan: A=10. Berikut ini merupakan solusi iterative untuk masalah diatas. class DecToOthers { public static void main(String args[]) { int num = Integer.parseInt(args[0]); int base = Integer.parseInt(args[1]); printBase(num, base); } static void printBase(int num, int base) { int rem = 1; String digits = "0123456789abcdef"; String result = ""; /* langkah interasi */ while (num!=0) { rem = num%base; num = num/base; result = result.concat(digits.charAt(rem)+""); } /* mencetak reverse dari result */ for(int i = result.length()-1; i >= 0; i--) { System.out.print(result.charAt(i)); } } } Berikut ini merupakan rekursif untuk masalah yang sama dengan solusi sebelumnya. class DecToOthersRecur { } static void printBase(int num, int base) { String digits = "0123456789abcdef"; /* Langkah Rekursif*/ if (num >= base) { printBase(num/base, base); } /* Base case: num < base */ System.out.print(digits.charAt(num%base)); } public static void main(String args[]) { int num = Integer.parseInt(args[0]); int base = Integer.parseInt(args[1]); printBase(num, base); } Pengenalan Pemrograman 2 4 J.E.N.I. 3.3 Tipe Data Abstract 3.3.1 Apa yang Dimaksud dengan Tipe Data Abstract? Abstract Data Type (ADT) adalah kumpulan dari elemen-elemen data yang disajikan dengan satu set operasi yang digambarkan pada elemen-elemen data tersebut. Stacks, queues dan pohon biner adalah tiga contoh dari ADT. Dalam bab ini, Anda akan mempelajari tentang stacks dan queues. 3.3.2 Stacks Stack adalah satu set atau urutan elemen data dimana manipulasi data dari elemenelemen hanya diperbolehkan pada tumpukan teratas dari stack. Hal ini merupakan perintah pengumpulan data secara linier yang disebut “last in, first out” (LIFO). Stacks berguna untuk bermacam-macam aplikasi seperti pattern recognition dan pengkonversian antar notasi infix, postfix dan prefix. Dua operasi yang dihubungkan dengan stacks adalah operasi push dan pop. Push berarti memasukkan data ke dalam stacks yang paling atas dimana pop sebagai penunjuk/pointer untuk memindahkan elemen ke atas stacks. Untuk memahami bagaimana cara kerja stacks, pikirkan bagaimana Anda dapat menambah atau memindakan sebuah data dari tumpukan data. Pikiran Anda akan memberitahu Anda untuk menambah atau memindahkan data hanya pada stack yang paling atas karena jika menggunakan cara lain, dapat menyebabkan tumpukan stack akan terjatuh. Dibawah ini merupakan ilustrasi bagaimana tampilan dari stacks. n-1 ... 6 5 Jayz top 4 KC 3 Jojo 2 Toto 1 Kyla 0 DMX bottom Tabel 1.2.2: Ilustrasi Stack Stack akan berarti penuh jika jangkauan sel teratas disimbolkan dengan n-1. Jika nilai teratas / top sama dengan -1, stack berarti kosong. Pengenalan Pemrograman 2 5 J.E.N.I. 3.3.3 Queues Queues adalah contoh lain dari ADT. Hal ini merupakan perintah pengumpulan data yang disebut “first-in, first-out”. Aplikasi ini meliputi tugas penjadwalan dalam sistem operasi, topological sorting dan graph traversal. Enqueue dan dequeue merupakan operasi yang berhubungan dengan queues. Enqueue menunjuk pada memasukkan data pada akhir queue sedangkan dequeue berarti memindahkan elemen dari queue tersebut. Untuk mengingat bagaimana queue bekerja, ingatlah arti khusus dari queue yaitu baris. Berikut ini bagaimana cara kerja queue. Siapa yang akan mendapatkan kesempatan pertama untuk bertemu bintang idolanya dari mereka yang sedang menunggu dalam sebuah barisan? Seharusnya orang pertama yang berada pada barisan tersebut. Orang ini mendapat kesempatan pertama untuk meninggalkan barisan. Hubungkan hal tersebut dengan bagaimana queue bekerja. Berikut ini merupakan ilustrasi dari bagaimana tampilan dari queue. 0 1 2 3 4 5 6 7 8 9 ... n-1 Eve Jayz KC Jojo Toto Kyla DMX Insert front end Delete Tabel 1.2.3: Ilustrasi Queue Queue akan kosong jika nilai end kurang dari front. Sementara itu, akan penuh jika end sama dengan n-1. 3.3.4 Sequential and Linked Representation ADTs biasanya dapat diwakilkan menggunakan sequential dan linked representation. Hal ini memudahkan untuk membuat sequential representation dengan menggunakan array. Bagaimanapun juga, masalah dengan menggunakan array adalah pembatasan size, yang membuatnya tidak fleksibel. Dengan menggunakan array, sering terjadi kekurangan atau kelebihan space memori. Mempertimbangkan hal tersebut, Anda harus membuat sebuah array dan mendeklarasikannya agar mampu menyimpan 50 elemen. Jika user hanya memasukkan 5 elemen, maka 45 space pada memori akan sia-sia. Disisi lain, jika user ingin memasukkan 51 elemen, space yang telah disediakan didalam array tidak akan cukup. Dibandingkan dengan sequential representation, linked representation lebih sedikit rumit tetapi lebih fleksibel. Linked representation menyesuaikan memori yang dibutuhkan oleh user. Penjelasan lebih lanjut pada linked representation akan didiskusikan pada bab berikutnya. 3.3.5 Sequential Representation dari Integer Stack class SeqStack { int top = -1; /* pada permulaan, stack kosong*/ int memSpace[]; /* penyimpanan untuk integer */ int limit; /* ukuran dari memSpace */ Pengenalan Pemrograman 2 6 J.E.N.I. SeqStack() { memSpace = new int[10]; limit = 10; } SeqStack(int size) { memSpace = new int[size]; limit = size; } boolean push(int value) { top++; /* memeriksa apakah stack penuh */ if (top < limit) { memSpace[top] = value; } else { top--; return false; } return true; } int pop() { int temp = -1; /* memeriksa apakah stack kosong */ if (top >= 0) { temp = memSpace[top]; top--; } else { return -1; } return temp; } public static void main(String args[]) { SeqStack myStack = new SeqStack(3); myStack.push(1); myStack.push(2); myStack.push(3); myStack.push(4); System.out.println(myStack.pop()); System.out.println(myStack.pop()); System.out.println(myStack.pop()); System.out.println(myStack.pop()); } } 3.3.6 Linked Lists Sebelum mengimplementasikan linked representation dari stacks, pertama mari kita pelajari bagaimana membuat linked representation. Dalam hal ini, kita akan menggunakan linked list. Linked list merupakan struktur dinamis yang berlawanan dengan array, dimana merupakan struktur statis. Hal ini berarti linked list dapat tumbuh dan berkurang dalam ukuran yang bergantung pada kebutuhan user. Linked list digambarkan sebagai kumpulan dari nodes, Yang masing-masing berisi data dan link atau pointer ke node berikutnya di dalam list. Pengenalan Pemrograman 2 7 J.E.N.I. Gambar dibawah ini menunjukkan tampilan dari node. Gambar 2.6a: Sebuah node Berikut ini merupakan contoh dari non-empty linked list dengan 3 node. Gambar 3.6b: Non-empty linked list dengan tiga node Berikut ini bagaimana class node diimplementasikan. Class ini dapat digunakan untuk membuat linked list. class Node { int data; /* integer data diisikan dalam node */ Node nextNode; /* node selanjutnya dalam list */ } class TestNode { public static void main(String args[]) { Node emptyList = null; /* membuat list kosong */ /* head points untuk node pertama dalam list */ Node head = new Node(); /* inisialisasi node pertama dalam list */ head.data = 5; head.nextNode = new Node(); head.nextNode.data = 10; /* null menandai akhir dari list */ head.nextNode.nextNode = null; /* mencetak elemen list */ Node currNode = head; while (currNode != null) { System.out.println(currNode.data); currNode = currNode.nextNode; } } } Pengenalan Pemrograman 2 8 J.E.N.I. 3.3.7 Linked Representation dari Integer Stack Sekarang Anda telah mempelajari tentang linked list. Maka Anda telah siap untuk menerapkan apa yang telah Anda pelajari untuk implementasi linked representation dari stack. class DynamicIntStack{ private IntStackNode top; /* head atau puncak dari stack */ class IntStackNode { /* class node */ int data; IntStackNode next; IntStackNode(int n) { data = n; next = null; } } void push(int n){ /* no need to check for overflow */ IntStackNode node = new IntStackNode(n); node.next = top; top = node; } int pop() { if (isEmpty()) { return -1; /* may throw a user-defined exception */ } else { int n = top.data; top = top.next; return n; } } boolean isEmpty(){ return top == null; } public static void main(String args[]) { DynamicIntStack myStack = new DynamicIntStack(); myStack.push(5); myStack.push(10); /* mencetak elemen dari stack */ IntStackNode currNode = myStack.top; while (currNode!=null) { System.out.println(currNode.data); currNode = currNode.next; } System.out.println(myStack.pop()); System.out.println(myStack.pop()); } } Pengenalan Pemrograman 2 9 J.E.N.I. 3.3.8 Java Collections Gambar 1.2.7: Implementasi linked dari stack Saat ini Anda telah diperkenalkan kepada dasar tipe data abstract. Pada intinya, Anda telah mempelajari tentang dasar dari linked lists, stacks dan queue. Berita baik bahwa tipe data abstract telah siap untuk diimplementasikan dan dimasukkan dalam Java. Class Stack dan LinkedList diperbolehkan digunakan tanpa perlu pengertian yang lengkap dari konsep ini. Bagaimanapun juga, sebagai ilmuwan komputer, sangat penting untuk mengerti konsep dari tipe data abstract. Oleh karena itu, penjelasan terperinci masih disampaikan dalam bagian yang terdahulu. Dengan peluncuran dari J2SE 5.0, queue interface telah tersedia. Untuk detail pada class dan interface ini, dapat dilihat pada dokumentasi Java API. Kepada kita, Java telah menyajikan classes dan interfaces Collection yang lain, dimana semuanya dapat ditemukan di java.util package. Contoh dari classes Collection termasuk LinkedList, ArrayList, HashSet dan TreeSet. Class tersebut benar-benar implementasi dari collection interfaces yang berbeda. Induk hirarki dari collection interfaces adalah interfaces Collection itu sendiri. Sebuah collection hanyalah sebuah grup dari object yang diketahui sebagai elemennya sendiri. Collection memperbolehkan penggandaan/salinan dan tidak membutuhkan pemesanan elemen secara spesifik. SDK tidak menyediakan implementasi built-in yang lain dari interface ini tetapi mengarahkan subinterfaces, interfaces Set dan interfaces List diperbolehkan. Sekarang, apa perbedaan dari kedua interface tersebut. Set merupakan collection yang tidak dipesan dan tidak ada penggandaan di dalamnya. Sementara itu, list merupakan collection yang dipesan dari elemen-elemen dimana juga diperbolehkannya penggandaan. HashSet, LinkedHashSet dan TreeSet suatu implementasi class dari interfaces Set. ArrayList, LinkedList dan Vector suatu implementasi class dari List interfaces. Collection Set List HashSet LinkedHashSet TreeSet ArrayList LinkedList Vector Tabel 1.2.8a: Java collections Berikut ini adalah daftar dari beberapa methods Collections yang disediakan dalam Collection API dari Java 2 Platform SE v1.4.1. Dalam Java 2 Platform SE v.1.5.0, methods ini telah dimodifikasi untuk menampung generic types. Karena generic types masih belum selesai dibahas, sebaiknya mempertimbangkan method ini terlebih dahulu. Pengenalan Pemrograman 2 10 J.E.N.I. Disarankan bahwa Anda mengacu pada Collection methods yang terbaru dimana Anda lebih mudah mengerti generic types, yang akan didiskusikan pada chapter berikutnya. Collection Methods public boolean add(Object o) Memasukkan Object o ke dalam collection ini. Mengembalikan nilai true jika o telah sukses ditambahkan ke dalam collection. public void clear() Menghapus semua elemen dari collection ini. public boolean remove(Object o) Menghapus single instance dari Object o pada collection ini, jika hal tersebut telah diinputkan. Mengembalikan nilai true jika o telah ditemukan dan dihapus dari collection. public boolean contains(Object o) Mengembalikan nilai true jika collection ini berisi Object o. public boolean isEmpty() Mengembalikan nilai true jika collection ini tidak berisi object atau elemen apapun. public int size() Mengembalikan jumlah dari elemen pada collection ini. public Iterator iterator() Mengembalikan sebuah iterator yang menunjukkan kita pada isi collection ini. public boolean equals(Object o) Mengembalikan nilai true jika Object o sama dengan yang ada pada collection ini. public int hashCode() Mengembalikan nilai hash code (yaitu ID) untuk collection ini. Objects atau collections yang sama memiliki nilai hash code atau ID yang sama. Tabel 1.2.8b: Methods dari class Collection Anda diharapkan mengacu pada dokumentasi API untuk mengetahui daftar lengkap dari methods dalam interface Collection, List dan Set. Saat ini kita akan melihat beberapa classes collection. Harap mengacu pada API untuk daftar dari methods yang dimasukkan ke dalam class ini. Pada bagian sebelumnya, Anda telah melihat bagaimana mengimplementasikan linked list dengan cara Anda sendiri. Java SDK juga telah menyediakan built-implementation dari linked list untuk kita. Class LinkedList berisi methods yang memperbolehkan linked list digunakan seperti stacks, queue atau ADT yang lain. Listing program berikut ini menunjukan bagaimana menggunakan class LinkedList. Pengenalan Pemrograman 2 11 J.E.N.I. import java.util.*; class LinkedListDemo { public static void main(String args[]) { LinkedList list = new LinkedList(); list.add(new Integer(1)); list.add(new Integer(2)); list.add(new Integer(3)); list.add(new Integer(1)); System.out.println(list + ", size = " + list.size()); list.addFirst(new Integer(0)); list.addLast(new Integer(4)); System.out.println(list); System.out.println(list.getFirst() + ", " + list.getLast()); System.out.println(list.get(2) + ", " + list.get(3)); list.removeFirst(); list.removeLast(); System.out.println(list); list.remove(new Integer(1)); System.out.println(list); list.remove(3); System.out.println(list); list.set(2, "one"); System.out.println(list); } } ArrayList merupakan versi fleksibel dari array biasa. Yang mengimplementasikan List interface. Telitilah kode berikut ini. import java.util.*; class ArrayListDemo { public static void main(String args[]) { ArrayList al = new ArrayList(2); System.out.println(al + ", size = " + al.size()); al.add("R"); al.add("U"); al.add("O"); System.out.println(al + ", size = " + al.size()); al.remove("U"); System.out.println(al + ", size = " + al.size()); ListIterator li = al.listIterator(); while (li.hasNext()) System.out.println(li.next()); Object a[] = al.toArray(); for (int i=0; i10: " + String.valueOf(10>10)); /* method toString secara implisit dipanggil method println */ System.out.println("String representation of boolean expression 10<10: " + (10<10)); /* Catatan, tidak ada perubahan pada nama objek String meskipun setelah penggunaan semua method. */ System.out.println("name: " + name); } } Ini adalah output dari program yang dibuat. name: Jonathan 3rd character of name: n Jonathan compared to Solomon: -9 Solomon compared to Jonathan: 9 Jonathan compared to jonathan: -32 Jonathan compared to jonathan (ignore case): 0 Is Jonathan equal to Jonathan? true Is Jonathan equal to jonathan? false Is Jonathan equal to jonathan (ignore case)? true content of charArr after getChars method: Hi Jo Length of name: 8 Replace a's with e's in name: Jonethen A substring of name: Jo Trim " a b c d e f ": "a b c d e f" String representation of boolean expression 10>10: false String representation of boolean expression 10<10: false name: Jonathan Pengenalan Pemrograman 2 6 J.E.N.I. 4.3.3 Class StringBuffer Ketika objek String diciptakan, objek String tidak bisa lagi dimodifikasi. Objek StringBuffer serupa dengan objek String, kecuali kenyataan bahwa objek StringBuffer bersifat dapat berubah atau dapat dimodifikasi, sedangkan pada object String bersifat konstan. Panjang dan isi dapat diubah hingga beberapa pemanggilan method. Ini adalah beberapa method pada class StringBuffer. Lihatlah acuan pada dokumentasi Java API. Method-Method StringBuffer public int capacity() Mengirim jumlah memori yang dialokasikan untuk StringBuffer. public StringBuffer append(-) Appends merepresentasikan string dari argument untuk objek StringBuffer. Menggunakan parameter tunggal seperti tipe-tipe data berikut: boolean, char, char [], double, float, int, long, Object, String and StringBuffer. Masih mempunyai versi yang di-overload lainnya. public char charAt(int index) Mengirim character di lokasi tertentu di StringBuffer yang ditentukan parameter index. public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) Mendapatkan characters dari objek yang dimulai pada indeks srcBegin hingga indeks srcEnd dan menyalin karakter-karakter tersebut pada array dst dimulai pada indeks dstBegin. public StringBuffer delete(int start, int end) Menghapus karakter-karakter pada range yang ditentukan. public StringBuffer insert(int offset, -) Menyisipkan beragam tipe data di offset tertentu di StringBuffer. Sebuah method yang di-overload. Tipe data yang mungkin digunakan: boolean, char, char [], double, float, int, long, Object and String. Masih mempunyai versi yang di-overload lainnya. public int length() Memperoleh panjang atau jumlah karakter di objek StringBuffer. public StringBuffer replace(int start, int end, String str) Mengganti bagian dari objek, seperti yang ditentukan oleh argumen kedua pertama, dengan string str yang ditentukan. public String substring(int start, int end) Substring menyaring bagian tertentu dari string, dimulai pada penentuan indeks start hingga indeks the end. public String toString() Mengkonversi objek ke representasi string. Tabel 1.2.2: Beberapa method dari class StringBuffer Pengenalan Pemrograman 2 7 J.E.N.I. Program di bawah ini menunjukkan bagaimana menggunakan method-method tersebut. class StringBufferDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("Jonathan"); System.out.println("sb = " + sb); /* initial capacity is 16 */ System.out.println("capacity of sb: " + sb.capacity()); System.out.println("append \'O\' to sb: " + sb.append("O")); System.out.println("sb = " + sb); System.out.println("3 rd character of sb: " + sb.charAt(2)); char charArr[] = "Hi XX".toCharArray(); /* Need to add 1 to the endSrc index of getChars */ sb.getChars(0, 2, charArr, 3); System.out.print("getChars method: "); System.out.println(charArr); System.out.println("Insert \'jo\' at the 3rd cell: " + sb.insert(2, "jo")); System.out.println("Delete \'jo\' at the 3rd cell: " + sb.delete(2,4)); System.out.println("length of sb: " + sb.length()); System.out.println("replace: " + sb.replace(3, 9, " Ong")); /* Need to add 1 to the endIndex parameter of substring*/ System.out.println("substring (1st two characters): " + sb.substring(0, 3)); System.out.println("implicit toString(): " + sb); } } Ini adalah output dari program yang telah dibuat di atas. Sekali lagi, bereksperimen secara bebas dengan code-code merupakan cara terbaik mempelajari sintaks-sintaks yang ada. sb = Jonathan capacity of sb: 24 append 'O' to sb: JonathanO sb = JonathanO 3rd character of sb: n getChars method: Hi Jo Insert 'jo' at the 3rd cell: JojonathanO Delete 'jo' at the 3rd cell: JonathanO length of sb: 9 replace: Jon Ong substring (1st two characters): Jon implicit toString(): Jon Ong Pengenalan Pemrograman 2 8 J.E.N.I. 4.4 Class-class Wrapper Sesungguhnya, tipe data primitive seperti int, char and long bukanlah sebuah objek. Sehingga, variabel-variabel tipe data ini tidak dapat mengakses method-method dari class Object. Hanya objek-objek nyata, yang dideklarasikan menjadi referensi tipe data, dapat mengakses method-method dari class Object. Ada suatu keadaan, bagaimanapun, ketika Anda membutuhkan sebuah representasi objek untuk variabel-variabel tipe primitive dalam rangka menggunakan method-method Java built-in. Sebagai contoh, Anda boleh menambahkan variabel tipe primitif pada objek Collection. Disinilah class wrapper masuk. Class wrapper adalah representasi objek sederhana dari variabelvariabel non-objek yang sederhana. Demikian daftar dari class wrapper. Tipe Data Primitive Class Wrapper yang Sesuai Boolean Boolean Char Character Byte Byte Short Short Int Integer Long Long Float Float Double Double Tabel 1.3: Tipe data primitif dan class wrappernya yang sesuai Nama-nama class wrapper cukup mudah untuk diingat selama nama-nama itu sama dengan tipe data primitive. Dan juga sebagai catatan, bahwa class-class wrapper diawali dengan huruf besar dan versi yang ditunjukkan dari tipe data primitive. Di bawah ini contoh penggunaan class wrapper untuk boolean. class BooleanWrapper { public static void main(String args[]) { boolean booleanVar = 1>2; Boolean booleanObj = new Boolean("TRue"); /* primitif ke objek; dapat juga menggunakan method valueOf */ Boolean booleanObj2 = new Boolean(booleanVar); System.out.println("booleanVar = " + booleanVar); System.out.println("booleanObj = " + booleanObj); System.out.println("booleanObj2 = " + booleanObj2); System.out.println("compare 2 wrapper objects: " + booleanObj.equals(booleanObj2)); /* objek ke primitif */ booleanVar = booleanObj.booleanValue(); System.out.println("booleanVar = " + booleanVar); } } Pengenalan Pemrograman 2 9 J.E.N.I. 4.5 Class Process dan Runtime 4.5.1 Class Process class Process menyediakan method-method untuk memanipulasi proses-proses, seperti mematikan proses, menjalankan proses dan mengecek status proses. Class ini merepresentasikan program- program yang berjalan. Di bawah ini beberapa method pada class Process. Method-Method Process public abstract void destroy() Mengakhiri proses. public abstract int waitFor() throws InterruptedException Tidak mengirim sampai proses yang dipanggil berakhir. 4.5.2 Class Runtime Tabel 1.4.1: Beberapa method dari class Process Di sisi lain, class Runtime merepresentasikan lingkungan runtime. Dua method penting pada class Runtime adalah method getRuntime dan exec. Method-Method Runtime public static Runtime getRuntime() Mengirim objek runtime yang merepresentasikan lingkungan runtime yang berhubungan dengan aplikasi Java saat itu. public Process exec(String command) throws IOException Disebabkan command yang ditentukan untuk dieksekusi. Memperbolehkan Anda mengeksekusi proses baru. Tabel 1.4.2: Beberapa method dari class Runtime 4.5.3 Membuka Registry Editor Berikut program untuk membuka registry editor tanpa harus mengetikkan perintah dari command prompt. class RuntimeDemo { public static void main(String args[]) { Runtime rt = Runtime.getRuntime(); Process proc; try { proc = rt.exec("regedit"); proc.waitFor(); //cobalah menghapus baris ini } catch (Exception e) { System.out.println("regedit is an unknown command."); } Pengenalan Pemrograman 2 10 J.E.N.I. } } 4.6 Class System Gambar 1.4.3: Membuka registry editor Class System menyediakan beberapa field dan method bermanfaat, seperti standard input, standard output dan sebuah method yang berguna untuk mempercepat penyalinan bagian sebuah array. Di bawah ini beberapa method menarik dari class System. Sebagai catatan, bahwa semua method-method class adalah static Method-Method System Public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) Mengkopi length elemen dari array src dimulai pada posisi srcPos ke dest yang dimulai pada indeks destPos. Lebih cepat daripada memprogram secara manual code untuk Anda sendiri. Public static long currentTimeMillis() Waktu ditentukan dalam GMT (Greenwich Mean Time) serta merupakan jumlah milidetik yang telah dilewati sejak tengan malam 1 Januari 1970. Waktu dalam ukuran milidetik. Public static void exit(int status) Mematikan Java Virtual Machine (JVM) yang sedang berjalan. Nilai bukan nol untuk status konvensi yang mengindikasikan keluar yang abnormal. Public static void gc() Menjalankan garbage collector, yang mereklamasi space memori tak terpakai untuk digunakan kembali. Public static void setIn(InputStream in) Mengubah stream yang berhubungan dengan System.in, yang mana standart mengacu pada keyboard. Public static void setOut(PrintStream out) Mengubah stream yang berhubungan dengan System.out, yang mana standart Pengenalan Pemrograman 2 11 J.E.N.I. Method-Method System mengacu pada console. Tabel 1.5: Beberapa method dari class System Ini adalah demo dari beberapa method-method tersebut. import java.io.*; class SystemDemo { public static void main(String args[]) throws IOException { int arr1[] = new int[1050000]; int arr2[] = new int[1050000]; long startTime, endTime; /* menginisialisasi arr1 */ for (int i = 0; i < arr1.length; i++) { arr1[i] = i + 1; } /* mengkopi secara manual */ startTime = System.currentTimeMillis(); for (int i = 0; i < arr1.length; i++) { arr2[i] = arr1[i]; } endTime = System.currentTimeMillis(); System.out.println("Time for manual copy: " + (endTime-startTime) + " ms."); /* menggunakan utilitas copy yang disediakan oleh java – yaitu method arraycopy */ startTime = System.currentTimeMillis(); System.arraycopy(arr1, 0, arr2, 0, arr1.length); endTime = System.currentTimeMillis(); System.out.println("Time for manual copy: " + (endTime- startTime) + " ms."); System.gc(); //force garbage collector to work System.setIn(new FileInputStream("temp.txt")); System.exit(0); } } Pengenalan Pemrograman 2 12 J.E.N.I. 4.7 Latihan 4.7.1 Evaluasi Ekspresi Menggunakan method-method class built-in Math, buatlah sebuah program yang menggunakan nilai double x sebagai inputan dan evaluasilah nilai mutlak dari ekspresi yang mengikuti. x 2 * cos(45derajat) + akar(e), e adalah angka Euler. Input: 10 Output: 72.35939938935488 Input: 11 Output: 87.20864179427238 4.7.2 Palindrome Palindrome adalah sebuah string yang membaca sama ketika mengarah ke depan atau sebaliknya. Beberapa contoh dari palindrome : hannah, ana, and bib. Menggunakan String atau class StringBuffer, buatlah sebuah program yang menggunakan satu string sebagai inputan dan tentukan jika ini sebuah palindrome atau bukan. 4.7.3 Notepad Menggunakan class Process and Runtime, bukalah aplikasi notepad dari program java. Pengenalan Pemrograman 2 13 J.E.N.I. 5.1 Tujuan BAB 5 Aplikasi Berbasis Teks Pembahasan kali ini akan menitikberatkan pada bahasan penggunaan argument command-line. Selebihnya, Anda akan mempelajari mengenai penggunaan streams untuk mendapatkan nilai input dari user pada saat runtime, sekaligus dalam proses manipulasi file. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Mendapatkan input dari command-line 2. Mengetahui cara untuk memanipulasi properties dari sistem 3. Membaca standart input 4. Membaca dan menulis file 5.2 Argument Command-Line dan System Properties Seperti yang telah Anda ketahui pada pembahasan sebelumnya, JAVA mengijinkan user untuk memasukkan data dari command-line. Sebagai contoh, untuk meneruskan argument 1 dan 2 kepada program Java bernama Calculate, anda dapat menuliskan baris berikut pada command prompt java Calculate 1 2 Pada contoh berikut ini, data 1 disimpan pada variabel args[0], begitu pula dengan data 2 yang disimpan pada args[1]. Sehingga, tujuan dari deklarasi String args[] sebagai sebuah parameter pada method utama menjadi jelas. Selain melewatkan argument menuju method utama, Anda juga dapat memanipulasi system properties dari command-line. System properties hampir menyamai environment variables, namun tidak memiliki ketergantungan pada spesifikasi platform yang digunakan. Sebuah property secara sederhana berupa pemetaan antara property name dan value yang dimilikinya. Hal ini ditunjukkan pada Java dalam class Properties. Class System menyediakan sebuah method untuk menentukan system properties yang digunakan, method getProperties yang menghasilkan sebuah object Properties. Class yang sama juga menyediakan method getProperty yang memiliki dua buah bentuk. Pengenalan Pemrograman 2 1 J.E.N.I. public static String getProperty(String key) Bentuk ini menghasilkan nilai String dari System Properties yang ditunjukkan oleh key yang ditentukan. Jika hasil menunjukkan nilai null, berarti tidak terdapat property dengan key yang ditentukan. public static String getProperty(String key, String def) Bentuk ini juga menghasilkan nilai String dari System Properties sesuai key yang ditentukan. Akan menghasilkan nilai def, sebuah nilai default, jika tidak terdapat property dengan key yang sesuai. Tabel 1.1: getProperty() method dari class System Kita tidak dapat cukup berhenti pada detail dari system properties, namun dilanjutkan dengan memanipulasi system properties yang digunakan. Jika Anda tertarik mempelajari lebih lanjut tentang system properties, Anda dapat menelusuri dokumentasi API yang disediakan. Anda dapat menggunakan argument opsional –D pada perintah Java dalam command-line untuk menambahkan property baru. java -D=value Sebagai contoh, untuk mengatur system property dengan nama user.home bernilai phillipines, gunakan perintah berikut : java -Duser.home=philippines Untuk menampilkan daftar system properties yang tersedia pada sistem Anda, gunakan method getProperties seperti yang ditunjukkan sebagai berikut : System.getProperties().list(System.out); 5.3 Membaca Standard Input Dibandingkan dengan mendapatkan masukan user dari command-line, sebagian user lebih memilih untuk memasukkan data bilamana diminta oleh program pada saat eksekusi. Satu cara dalam melakukan hal ini adalah dengan menggunakan stream. Sebuah stream adalah abstraksi dari sebuah file atau sebuah perangkat yang mengijinkan beberapa set item untuk dibaca atau ditulis. Streams terhubung dengan physical devices seperti keyboards, consoles dan files. Terdapat dua bentuk umum dari streams, byte streams dan character streams. Byte streams digunakan pada data biner, sedangkan character streams digunakan pada karakter Unicode. System.in dan System.out adalah dua contoh dari byte streams yang digunakan Pengenalan Pemrograman 2 2 J.E.N.I. dalam Java. Contoh pertama mereferensikan pada keyboard, kemudian contoh kedua mereferensikan pada console. Untuk membaca karakter dari keyboard, Anda dapat menggunakan byte stream System.in yang terdapat pada object BufferedReader. Baris berikut menunjukkan bagaimana untuk melakukan hal tersebut : BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Method read dari object BufferedReader selanjutnya digunakan untuk membaca nilai input dari perangkat input. ch=(int)br.read(); //method read menghasilkan nilai integer Cobalah contoh kode berikut : import java.io.*; class FavoriteCharacter { public static void main(String args[]) throws IOException { System.out.println("Hi, what's your favorite character?"); char favChar; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); favChar = (char) br.read(); System.out.println(favChar + " is a good choice!"); } } Jika Anda lebih memilih untuk membaca keseluruhan baris daripada membaca satu karakter tiap waktu, gunakan method readLine : str = br.readLine(); Berikut ini sebuah program yang hampir menyerupai contoh sebelumnya, namun membaca keseluruhan string, bukan satu karakter. import java.io.*; class GreetUser { public static void main(String args[]) throws IOException { System.out.println("Hi, what's your name?"); String name; Pengenalan Pemrograman 2 3 J.E.N.I. } } BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); name = br.readLine(); System.out.println("Nice to meet you, " + name + "! :)"); Pada saat menggunakan streams, jangan lupa untuk mengimport package java.io seperti yang ditunjukkan dibawah ini : import java.io.*; Satu hal lagi yang perlu untuk diingat, pembacaan dari streams dapat menyebabkan terjadinya exception. Jangan lupa untuk menangani exception tersebut menggunakan perintah try-catch atau dengan mengindikasikan exception pada klausa throws dalam method. 5.4 Menangani File Pada beberapa kasus, masukan data disimpan pada sebuah file. Selanjutnya, terdapat beberapa cara jika Anda ingin menyimpan output dari program pada sebuah file. Pada sistem terkomputerisasi, data dari Siswa yang dapat digunakan sebagai input oleh sistem umumnya tersimpan pada sebuah file terpisah. Kemudian, salah satu kemungkinan output dari sistem adalah informasi tentang mata pelajaran yang diikuti oleh siswa. Sekali lagi, output dalam hal ini dapat disimpan dalam sebuah file. Seperti yang terlihat pada aplikasi, terdapat suatu kebutuhan untuk membaca dan menulis sebuah file. Anda akan mempelajari tentang file input dan output pada bagian ini. 5.4.1 Membaca sebuah File Untuk membaca sebuah file, Anda dapat menggunakan class FileInputStream. Berikut ini adalah salah satu constructor dari class tersebut : FileInputStream(String filename) Constructor tersebut membuat sebuah koneksi terhadap file dimana nama dari file tersebut ditunjukkan sebagai sebuah argument. Exception berupa FileNotFoundException akan muncul jika file tidak ditemukan atau tidak dapat dibuka dan kemudian dibaca. Setelah membuat sebuah input stream, Anda kemudian dapat menggunakannya untuk membaca sebuah file dengan menggunakan method read. Method read menghasilkan sebuah nilai integer, dan akan menunjukkan nilai 1 jika telah mencapai batas akhir file. Pengenalan Pemrograman 2 4 J.E.N.I. Berikut ini contohnya : import java.io.*; class ReadFile { public static void main(String args[]) throws IOException { System.out.println("What is the name of the file to read from?"); String filename; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); filename = br.readLine(); System.out.println("Now reading from " + filename + "..."); FileInputStream fis = null; try { } } fis = new FileInputStream(filename); } catch (FileNotFoundException ex) { System.out.println("File not found."); } try { char data; int temp; do { temp = fis.read(); data = (char) temp; if (temp != -1) { System.out.print(data); } } while (temp != -1); } catch (IOException ex) { System.out.println("Problem in reading from the file."); } 5.4.2 Menulis sebuah file Untuk menuliskan sebuah file, Anda dapat menggunakan class FileOutputStream. Berikut ini salah satu constructor yang dapat Anda gunakan. FileOutputStream(String filename) Pengenalan Pemrograman 2 5 J.E.N.I. Contructor tersebut menyediakan jalur output stream terhadap sebuah file yang akan ditulis. Sebuah Exception berupa FileNotFoundException akan muncul jika file yang dimaksud tidak dapat dibuka untuk ditulis. Jika output stream telah dibuat, Anda dapat menggunakannya untuk menulis file yang dituju menggunakan method write. Method tersebut menggunakan penandaan sebagai berikut : void write(int b) Parameter b mereferensikan data yang akan dituliskan pada file sesuai dengan hasil output stream. Program berikut menunjukkan contoh penulisan terhadap file : import java.io.*; class WriteFile { public static void main(String args[]) throws IOException { System.out.println("What is the name of the file to be written to?"); String filename; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); filename = br.readLine(); System.out.println("Enter data to write to " + filename + "..."); System.out.println("Type q$ to end."); FileOutputStream fos = null; try { fos = new FileOutputStream(filename); } catch (FileNotFoundException ex) { } try { System.out.println("File cannot be opened for writing."); boolean done = false; int data; do { data = br.read(); if ((char)data == 'q') { data = br.read(); if ((char)data == '$') { done = true; } else { } } else { fos.write('q'); fos.write(data); fos.write(data); } } while (!done); } catch (IOException ex) { System.out.println("Problem in reading from the file."); } Pengenalan Pemrograman 2 6 J.E.N.I. } } 5.5 Latihan 5.5.1 Spasi menjadi Underscore ( _ ) Buatlah sebuah program yang memuat dua String sebagai argument, sumber dan nama file tujuan. Kemudian, baca file sumber dan tuliskan isi dari file tersebut terhadap file tujuan, seluruh spasi yang ada (‘ ‘) diubah menjadi underscore (‘ _ ‘). Pengenalan Pemrograman 2 7 J.E.N.I. 6.1 Tujuan BAB 6 Algoritma Sorting Sorting adalah proses menyusun elemen – elemen dengan tata urut tertentu dan proses tersebut terimplementasi dalam bermacam aplikasi. Kita ambil contoh pada aplikasi perbankan. Aplikasi tersebut mampu menampilkan daftar account yang aktif. Hampir seluruh pengguna pada sistem akan memilih tampilan daftar berurutan secara ascending demi kenyamanan dalam penelusuran data. Beberapa macam algoritma sorting telah dibuat karena proses tersebut sangat mendasar dan sering digunakan. Oleh karena itu, pemahaman atas algoritma – algoritma yang ada sangatlah berguna. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Memahami dan menjelaskan algoritma dari insertion sort, selection sort, merge sort dan quick sort. 2. Membuat implementasi pribadi menggunakan algoritma yang ada 6.2 Insertion Sort Salah satu algoritma sorting yang paling sederhana adalah insertion sort. Ide dari algoritma ini dapat dianalogikan seperti mengurutkan kartu. Penjelasan berikut ini menerangkan bagaimana algoritma insertion sort bekerja dalam pengurutan kartu. Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling kecil hingga yang paling besar. Seluruh kartu diletakkan pada meja, sebutlah meja ini sebagai meja pertama, disusun dari kiri ke kanan dan atas ke bawah. Kemudian kita mempunyai meja yang lain, meja kedua, dimana kartu yang diurutkan akan diletakkan. Ambil kartu pertama yang terletak pada pojok kiri atas meja pertama dan letakkan pada meja kedua. Ambil kartu kedua dari meja pertama, bandingkan dengan kartu yang berada pada meja kedua, kemudian letakkan pada urutan yang sesuai setelah perbandingan. Proses tersebut akan berlangsung hingga seluruh kartu pada meja pertama telah diletakkan berurutan pada meja kedua. Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi dua bagian, yang belum diurutkan (meja pertama) dan yang sudah diurutkan (meja kedua). Elemen pertama diambil dari bagian array yang belum diurutkan dan kemudian diletakkan sesuai posisinya pada bagian lain dari array yang telah diurutkan. Langkah ini dilakukan secara berulang hingga tidak ada lagi elemen yang tersisa pada bagian array yang belum diurutkan. Pengenalan Pemrograman 2 1 J.E.N.I. 6.2.1 Algoritma void insertionSort(Object array[], int startIdx, int endIdx) { for (int i = startIdx; i < endIdx; i++) { } } int k = i; for (int j = i + 1; j < endIdx; j++) { if (((Comparable) array[k]).compareTo(array[j])>0) { k = j; } } swap(array[i],array[k]); 6.2.2 Sebuah Contoh Data 1 st Pass 2 nd Pass 3 rd Pass 4 Mango Mango Apple Apple Apple Apple Apple Mango Mango Banana Peach Peach Peach Orange Mango Orange Orange Orange Peach Orange Banana Banana Banana Banana Peach Gambar 1.1.2: Contoh insertion sort Pada akhir modul ini, anda akan diminta untuk membuat implementasi bermacam algoritma sorting yang akan dibahas pada bagian ini. 6.3 Selection Sort Jika Anda diminta untuk membuat algoritma sorting tersendiri, anda mungkin akan menemukan sebuah algoritma yang mirip dengan selection sort. Layaknya insertion sort, algoritma ini sangat rapat dan mudah untuk diimplementasikan. Mari kita kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket kartu. Asumsikan bahwa kartu tersebut akan diurutkan secara ascending. Pada awalnya, kartu tersebut akan disusun secara linier pada sebuah meja dari kiri ke kanan, dan dari atas ke bawah. Pilih nilai kartu yang paling rendah, kemudian tukarkan posisi kartu ini dengan kartu yang terletak pada pojok kiri atas meja. Lalu cari kartu dengan nilai paling rendah diantara sisa kartu yang tersedia. Tukarkan kartu yang baru saja terpilih dengan kartu pada posisi kedua. Ulangi langkah – langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan dapat digeser dengan kartu yang bernilai lebih rendah. Pengenalan Pemrograman 2 2 th Pass J.E.N.I. Ide utama dari algoritma selection sort adalah memilih elemen dengan nilai paling rendah dan menukar elemen yang terpilih dengan elemen ke-i. Nilai dari i dimulai dari 1 ke n, dimana n adalah jumlah total elemen dikurangi 1. 6.3.1 Algoritma void selectionSort(Object array[], int startIdx, int endIdx) { } int min; for (int i = startIdx; i < endIdx; i++) { min = i; for (int j = i + 1; j < endIdx; j++) { if (((Comparable)array[min]).compareTo(array[j])>0) { min = j; } } swap(array[min], array[i]); } 6.3.2 Sebuah Contoh Data 1 st Pass 2 nd Pass 3 rd Pass 4 Maricar Hannah Hannah Hannah Hannah Vanessa Vanessa Margaux Margaux Margaux Margaux Margaux Vanessa Maricar Maricar Hannah Maricar Maricar Vanessa Rowena Rowena Rowena Rowena Rowena Vanessa 6.4 Merge Sort Figure 1.2.2: Contoh selection sort Sebelum mendalami algoritma merge sort, mari kita mengetahui garis besar dari konsep divide and conquer karena merge sort mengadaptasi pola tersebut. 6.4.1 Pola Divide and Conquer Beberapa algoritma mengimplementasikan konsep rekursif untuk menyelesaikan permasalahan. Permasalahan utama kemudian dipecah menjadi sub-masalah, Pengenalan Pemrograman 2 3 th Pass J.E.N.I. kemudian solusi dari sub-masalah akan membimbing menuju solusi permasalahan utama. Pada setiap tingkatan rekursi, pola tersebut terdiri atas 3 langkah. 1. Divide Memilah masalah menjadi sub masalah 2. Conquer Selesaikan sub masalah tersebut secara rekursif. Jika sub-masalah tersebut cukup ringkas dan sederhana, pendekatan penyelesaian secara langsung akan lebih efektif 3. Kombinasi Mengkombinasikan solusi dari sub-masalah, yang akan membimbing menuju penyelesaian atas permasalahan utama 6.4.2 Memahami Merge Sort Seperti yang telah dijelaskan sebelumnya, Merge sort menggunakan pola divide and conquer. Dengan hal ini deskripsi dari algoritma dirumuskan dalam 3 langkah berpola divide-and-conquer. Berikut langkah kerja dari Merge sort: 1. Divide Memilah elemen – elemen dari rangkaian data menjadi dua bagian. 2. Conquer Conquer setiap bagian dengan memanggil prosedur merge sort secara rekursif 3. Kombinasi Mengkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan rangkaian data berurutan Proses rekursi berhenti jika mencapai elemen dasar. Hal ini terjadi bilamana bagian yang akan diurutkan menyisakan tepat satu elemen. Sisa pengurutan satu elemen tersebut menandakan bahwa bagian tersebut telah terurut sesuai rangkaian. 6.4.3 Algoritma void mergeSort(Object array[], int startIdx, int endIdx) { if (array.length != 1) { //Membagi rangkaian data, rightArr dan leftArr mergeSort(leftArr, startIdx, midIdx); mergeSort(rightArr, midIdx+1, endIdx); combine(leftArr, rightArr); } } Pengenalan Pemrograman 2 4 J.E.N.I. 6.4.4 Sebuah Contoh Rangkaian data: 7 2 5 6 Membagi rangkaian menjadi dua bagian: LeftArr RightArr 27 27 65 65 Membagi LeftArr menjadi dua bagian: LeftArr RightArr 77 22 Mengkombinasikan 2 7 Membagi RightArr menjadi dua bagian: LeftArr RightArr Mengkombinasikan 5 6 Mengkombinasikan LeftArr dan RightArr. 2 5 6 7 6.5 Quicksort Gambar 1.3.4: Contoh merge sort Quicksort ditemukan oleh C.A.R Hoare. Seperti pada merge sort, algoritma ini juga berdasar pada pola divide-and-conquer. Berbeda dengan merge sort, algoritma ini hanya mengikuti langkah – langkah sebagai berikut : 1. Divide Memilah rangkaian data menjadi dua sub-rangkaian A[p…q-1] dan A[q+1…r] dimana setiap elemen A[p…q-1] adalah kurang dari atau sama dengan A[q] dan setiap elemen pada A[q+1…r] adalah lebih besar atau sama dengan elemen pada A[q]. A[q] disebut sebagai elemen pivot. Perhitungan pada elemen q merupakan salah satu bagian dari prosedur pemisahan. Pengenalan Pemrograman 2 5 J.E.N.I. 2. Conquer Mengurutkan elemen pada sub-rangkaian secara rekursif Pada algoritma quicksort, langkah ”kombinasi” tidak di lakukan karena telah terjadi pengurutan elemen – elemen pada sub-array 6.5.1 Algoritma void quickSort(Object array[], int leftIdx, int rightIdx) { int pivotIdx; /* Kondisi Terminasi */ if (rightIdx > leftIdx) { } } 6.5.2 Sebuah Contoh pivotIdx = partition(array, leftIdx, rightIdx); quickSort(array, leftIdx, pivotIdx-1); quickSort(array, pivotIdx+1, rightIdx); Rangkaian data: 3 1 4 1 5 9 2 6 5 3 5 8 Pilih sebuah elemen yang akan menjadi elemen pivot. 3 1 4 1 5 9 2 6 5 3 5 8 Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen akhir. kiri kanan 3 1 4 1 5 9 2 6 5 3 5 8 Geser elemen kiri kearah kanan sampai ditemukan nilai yang lebih besar dari elemen pivot tersebut. Geser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen yang tidak lebih besar dari elemen tersebut. kiri kanan 3 1 4 1 5 9 2 6 5 3 5 8 Tukarkan antara elemen kiri dan kanan kiri kanan 3 1 3 1 5 9 2 6 5 4 5 8 Pengenalan Pemrograman 2 6 J.E.N.I. Geserkan lagi elemen kiri dan kanan. kiri kanan 3 1 3 1 5 9 2 6 5 4 5 8 Tukarkan antar elemen kembali. kiri kanan 3 1 3 1 2 9 5 6 5 4 5 8 Geserkan kembali elemen kiri dan kanan. kanan kiri 3 1 3 1 2 9 5 6 5 4 5 8 Terlihat bahwa titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen kanan < elemen kiri. Dalam hal ini tukarkan elemen pivot dengan elemen kanan. pivot 2 1 3 1 3 9 5 6 5 4 5 8 Gambar 1.4.2: Contoh quicksort Kemudian urutkan elemen sub-rangkaian pada setiap sisi dari elemen pivot. 6.6 Latihan 6.6.1 Insertion Sort Impelementasikan algoritma insertion sort dalam Java untuk mengurutkan serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command line. 6.6.2 Selection Sort Pengenalan Pemrograman 2 7 J.E.N.I. Impelementasikan algoritma selection sort dalam Java untuk mengurutkan serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command line. 6.6.3 Merge Sort Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer. class MergeSort { static void mergeSort(int array[], int startIdx, int endIdx) { if(startIdx == _____) { } return; } int length = endIdx-startIdx+1; int mid = _____; mergeSort(array, _____, mid); mergeSort(array, _____, endIdx); int working[] = new int[length]; for(int i = 0; i < length; i++) { working[i] = array[startIdx+i]; } int m1 = 0; int m2 = mid-startIdx+1; for(int i = 0; i < length; i++) { if(m2 <= endIdx-startIdx) { if(m1 <= mid-startIdx) { if(working[m1] > working[m2]) { array[i+startIdx] = working[m2++]; } else { array[i+startIdx] = _____; } } else { array[i+startIdx] = _____; } } else { array[_____] = working[m1++]; } } public static void main(String args[]) { int numArr[] = new int[args.length]; for (int i = 0; i < args.length; i++) { } } 6.6.4 Quicksort numArr[i] = Integer.parseInt(args[i]); } mergeSort(numArr, 0, numArr.length-1); for (int i = 0; i < numArr.length; i++) { System.out.println(numArr[i]); } Pengenalan Pemrograman 2 8 J.E.N.I. Gunakan implementasi quicksort berikut ini terhadap serangkaian data integer. class QuickSort { static void quickSort (int[] array, int startIdx, int endIdx) { // startIdx adalah index bawah // endIdx is index atas // dari array yang akan diurutkan int i=startIdx, j=endIdx, h; //pilih elemen pertama sebagai pivot int pivot=array[_____]; // memilah do { while (array[i]_____pivot) { i++; } while (array[j]>_____) { j--; } if (i<=j) { } } while (i<=j); // rekursi if (startIdxListener. void addListener(Listener listenerObj) tergantung pada tipe dari event source. Dapat berupa Key, Mouse, Focus, Component, Action dan lainnya. Beberapa listeners dapat diregistrasi dengan satu event source untuk menerima pemberitahuan event. Listener yang telah teregistrasi dapat juga tidak diregistrasikan lagi menggunakan method removeListener. void removeListener(Listener listenerObj) 8.3 Class-Class Event Sebuah event object mempunyai sebuah class event sebagai tipe data acuannya. Akar dari hirarki class event adalah class EventObject, yang dapat ditemukan pada paket java.util. Immediate subclass dari class EventObject adalah class AWTEvent. Class AWTEvent didefinisikan pada paket java.awt. Itu merupakan akar dari semua AWTbased events. Berikut ini beberapa dari class-class AWT event. Class Event Deskripsi ComponentEvent Extends AWTEvent. Dijalankan ketika sebuah komponen dipindahkan, di-resize, dibuat visible atau hidden. InputEvent Extends ComponentEvent. Abstrak root class event untuk semua komponen-level input class-class event. ActionEvent Extends AWTEvent. Dijalankan ketika sebuah tombol ditekan, melakukan double-klik daftar item, atau memilih sebuah menu. ItemEvent Extends AWTEvent. Dijalankan ketika sebuah item dipilih atau di- deselect oleh user, seperti sebuah list atau checkbox. KeyEvent Extends InputEvent. Dijalankan ketika sebuah key ditekan, dilepas atau diketikkan. MouseEvent Extends InputEvent. Dijalankan ketika sebuah tombol mouse ditekan, dilepas, atau di-klik (tekan dan lepas), atau ketika sebuah kursor mouse masuk atau keluar dari bagian visible dari komponen. TextEvent Extends AWTEvent. Dijalankan ketika nilai dari text field atau text area dirubah. WindowEvent Extends ComponentEvent. Dijalankan sebuah object Window dibuka, ditutup, diaktifkan, nonaktifkan, iconified, deiconified, atau ketika focus ditransfer kedalam atau keluar window. Tabel 1.2: Class-Class Event Catatan, bahwa semua subclass-subclass AWTEvent mengikuti konvensi nama berikut ini: Event Pengenalan Pemrograman 2 3 J.E.N.I. 8.4 Event Listeners Event listeners adalah class yang mengimplementasikan interfaces Listener. Tabel di bawah menunjukkan beberapa listener interfaces yang biasanya digunakan. Event Listeners Deskripsi ActionListener Bereaksi atas perubahan mouse atau atau keyboard. MouseListener Bereaksi atas pergerakan mouse. MouseMotionListener Interface MouseMotionListener mendukung MouseListener. Menyediakan method-method yang akan memantau pergerakan mouse,seperti drag dan pemindahan mouse. WindowListener Bereaksi atas perubahan window. 8.4.1 Method ActionListener Tabel 1.3: Event Listeners Interface ActionListener hanya terdiri dari satu method. Method ActionListener public void actionPerformed(ActionEvent e) Mengendalikan ActionEvent e yang terjadi. Tabel 1.3.1: Method ActionListener 8.4.2 Method MouseListener Di bawah ini adalah method-method MouseListener yang seharusnya digunakan dalam penerapan class. Method-method MouseListener public void mouseClicked(MouseEvent e) Dipanggil pada saat tombol mouse di click (seperti tekan dan lepas). public void mouseEntered(MouseEvent e) Dipanggil pada saat kursor mouse memasuki area komponen. public void mouseExited(MouseEvent e) Dipanggil pada saat kursor mouse meninggalkan area komponen. public void mousePressed(MouseEvent e) Dipanggil pada saat tombol mouse ditekan di atas komponen public void mouseReleased(MouseEvent e) Dipanggil pada saat tombol mouse dilepas di atas komponen Tabel 1.3.2: Method-Method MouseListener Pengenalan Pemrograman 2 4 J.E.N.I. 8.4.3 Method-Method MouseMotionListener MouseMotionListener mempunyai dua method untuk diimplementasikan. Method-method MouseListener public void mouseDragged(MouseEvent e) Digunakan untuk memantau pergerakan mouse yang melintasi object pada saat tombol mouse ditekan. Tindakan ini persis sama dengan tindakan pada saat memindahkan sebuah window. public void mouseMoved(MouseEvent e) Digunakan untuk memantau pergerakan mouse pada saat mouse melintasi area suatu object. Pada saat ini tidak ada mouse yang ditekan, hanya memindahkan pointer mouse melalui object. Tabel 1.3.3: The MouseMotionListener methods 8.4.4 Method-Method WindowListener Di bawah ini method-method dari interface WindowListener. Method-method WindowListener public void windowOpened(WindowEvent e) Dipanggil pada saat object window dibuka (pertama kali window dibuat tampil). public void windowClosing(WindowEvent e) Dipanggil pada saat user mencoba untuk menutup object Window dari menu sistem object. public void windowClosed(WindowEvent e) Dipanggil pada saat object Window ditutup setelah memanggil penempatan (misal, release dari resource-resource yang digunakan oleh source) pada object. public void windowActivated(WindowEvent e) Dilibatkan ketika object Window adalah window yang aktif (window masih dipakai). public void windowDeactivated(WindowEvent e) Dilibatkan ketika object Window tidak lagi merupakan window yang aktif. public void windowIconified(WindowEvent e) Dipanggil ketika object Window di-minimize. public void windowDeiconified(WindowEvent e) Dipanggil ketika object Window kembali setelah di-minimize ke keadaan normal. Tabel 1.3.4: Method-Method WindowListener Pengenalan Pemrograman 2 5 J.E.N.I. 8.4.5 Petunjuk untuk Menciptakan Aplikasi Handling GUI Events Berikut ini langkah-langkah yang Anda butuhkan untuk mengingat ketika ingin membuat aplikasi GUI dengan event handling. 1. Buatlah sebuah class yang menguraikan dan membuat suatu tampilan dari aplikasi GUI Anda. 2. Buatlah sebuah class yang menerapkan interface listener yang sesuai. Class ini boleh mengacu pada class yang sama seperti pada langkah awal. 3. Dalam menerapkan class, gunakan semua method-method dengan interface listener yang sesuai. Uraikan masing-masing method bagaimana Anda ingin mengendalikan event-event. Anda dapat memberikan implementasi kosong untuk method yang tidak ingin Anda gunakan. 4. Daftarkan object listener, instansiatiate dari class listener pada langkah 2, dengan source component menggunakan method addListener. 8.4.6 Contoh Mouse Events import java.awt.*; import java.awt.event.*; public class MouseEventsDemo extends Frame implements MouseListener, MouseMotionListener { TextField tf; public MouseEventsDemo(String title){ super(title); tf = new TextField(60); addMouseListener(this); } public void launchFrame() { /* Menambah komponen pada frame */ add(tf, BorderLayout.SOUTH); setSize(300,300); setVisible(true); } public void mouseClicked(MouseEvent me) { String msg = "Mouse clicked."; tf.setText(msg); } public void mouseEntered(MouseEvent me) { String msg = "Mouse entered component."; tf.setText(msg); } public void mouseExited(MouseEvent me) { String msg = "Mouse exited component."; tf.setText(msg); } public void mousePressed(MouseEvent me) { String msg = "Mouse pressed."; tf.setText(msg); } public void mouseReleased(MouseEvent me) { String msg = "Mouse released."; tf.setText(msg); Pengenalan Pemrograman 2 6 J.E.N.I. } public void mouseDragged(MouseEvent me) { String msg = "Mouse dragged at " + me.getX() + "," + me.getY(); tf.setText(msg); } public void mouseMoved(MouseEvent me) { String msg = "Mouse moved at " + me.getX() + "," + me.getY(); tf.setText(msg); } public static void main(String args[]) { MouseEventsDemo med = new MouseEventsDemo("Mouse Events Demo"); med.launchFrame(); } } 8.4.7 Contoh Menutup Window import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame implements WindowListener { Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(this); } void launchFrame() { setSize(300,300); setVisible(true); } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } Pengenalan Pemrograman 2 7 J.E.N.I. public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } } 8.5 Class-class Adapter Class Menerapkan semua method dari interface yang semuanya akan membutuhkan banyak pekerjaan. Di satu sisi, Anda terkadang lebih sering tertarik menerapkan hanya beberapa method dari interface saja. Untungnya, Java menyediakan untuk kita class- class adapter yang menerapkan semua method dari masing-masing listener interface dengan lebih dari satu method. Implementasi dari method-method semuanya adalah kosong. 8.5.1 Close Window Example import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CFListener w = new CFListener(this); CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(w); } void launchFrame() { setSize(300,300); setVisible(true); } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } } class CFListener extends WindowAdapter{ CloseFrame ref; CFListener( CloseFrame ref ){ this.ref = ref; } public void windowClosing(WindowEvent e) { ref.dispose(); System.exit(1); } } Pengenalan Pemrograman 2 8 J.E.N.I. 8.6 Inner Class dan Anonymous Inner Class Bagian ini memberi Anda tinjauan ulang atas konsep yang sudah Anda pelajari di pelajaran pemrograman pertama. Inner class dan anonymous inner class sangatlah bermanfaat untuk GUI event handling. 8.6.1 Inner Class Inner class, seperti namanya, adalah sebuah class yang dideklarasikan di dalam class lain. Kegunaan inner classes akan dapat membantu Anda menyederhanakan program, terutama dalam event handling seperti yang ditunjukkan pada contoh. 8.6.2 Contoh Menutup Window import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(new CFListener()); } void launchFrame() { setSize(300,300); setVisible(true); } class CFListener extends WindowAdapter { public void windowClosing(WindowEvent e) { dispose(); System.exit(1); } } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } } Pengenalan Pemrograman 2 9 J.E.N.I. 8.6.3 Anonymous Inner Class Anonymous inner class adalah inner class tanpa nama. Kegunaan dari anonymous inner class akan menyederhanakan kode-kode Anda lebih lanjut. Di bawah ini merupakan modifikasi dari contoh bagian sebelumnya. 8.6.4 Contoh Menutup Window import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ dispose(); System.exit(1); } }); } void launchFrame() { setSize(300,300); setVisible(true); } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } } Pengenalan Pemrograman 2 10 J.E.N.I. 8.7 Latihan 8.7.1 Tic-Tac-Toe Extend program papan Tic-Tac-Toe yang telah Anda kembangkan sebelumnya dan tambahkan event handlers ke kode tersebut untuk membuat program berfungsi penuh. Permainan Tic-Tac-Toe dimainkan dengan dua pemain. Pemain mengambil giliran mengubah. Setiap giliran, pemain dapat memilih kotak pada papan. Ketika kotak dipilih, kotak ditandai oleh simbol pemain (O dan X biasanya digunakan sebagai simbol). Pemain yang sukses menaklukkan 3 kotak membentuk garis horisontal, vertikal, atau diagonal, memenangkan permainan. Permainan akan berakhir ketika pemain menang atau ketika semua kotak telah terisi. Gambar 8.2 : Program Tic-Tac-Toe Pengenalan Pemrograman 2 11 J.E.N.I. 8.1 Tujuan BAB 8 GUI Event Handling Pada modul ini, Anda akan belajar bagaimana mengendalikan events triggered ketika user berinteraksi dengan aplikasi GUI Anda. Setelah menyelesaikan modul ini, Anda akan dapat mengembangkan aplikasi GUI yang dapat merespon interaksi user. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Menerangkan komponen-komponen delegation event model 2. Mengerti bagaimana delegation event model bekerja 3. Menciptakan aplikasi GUI yang berinteraksi dengan user 4. Mendiskusikan manfaat dari class-class adapter 5. Mendiskusikan keuntungan-keuntungan dari menggunakan inner dan anonymous class 8.2 Delegation Event Model Delegasi event model menguraikan bagaimana program Anda dapat merespon interaksi dari user. Untuk memahami model, pertama-tama mari kita pelajari melalui tiga komponen utamanya. 1. Event Source Event source mengacu pada komponen GUI yang meng-generate event. Sebagai contoh, jika user menekan tombol, event source dalam hal ini adalah tombol. 2. Event Listener/Handler Event listener menerima berita dari event-event dan proses-proses interaksi user. Ketika tombol ditekan, listener akan mengendalikan dengan menampilkan sebuah informasi yang berguna untuk user. 3. Event Object Ketika sebuah event terjadi (misal, ketika user berinteraksi dengan komponen GUI), sebuah object event diciptakan. Object berisi semua informasi yang perlu tentang event yang telah terjadi. Informasi meliputi tipe dari event yang telah terjadi, seperti ketika mouse telah di-klik. Ada beberapa class event untuk kategori yang berbeda dari user action. Sebuah event object mempunyai tipe data mengenai salah satu dari class ini. Pengenalan Pemrograman 2 1 J.E.N.I. Di bawah ini adalah delegation event model. Gambar 8.1: Delegation Event Model Pada awalnya, sebuah listener seharusnya diregistrasikan dengan sebuah source sehingga dapat menerima informasi tentang event-event yang terjadi pada source tersebut. Hanya listener yang sudah teregistrasi yang dapat menerima pemberitahuan event-event. Ketika telah teregistrasi, sebuah listener hanya tinggal menunggu sampai event terjadi. Ketika sesuatu terjadi dengan event source, sebuah event object akan menguraikan event yang diciptakan. Event kemudian ditembak oleh source pada listener yang teregistrasi. Saat listener menerima sebuah event object (pemberitahuan) dari source, dia akan bekerja. Menerjemahkan pemberitahuan dan memproses event yang terjadi. Pengenalan Pemrograman 2 2 J.E.N.I. 8.2.1 Registrasi Listeners Event source mendaftarkan sebuah listener melalui method addListener. void addListener(Listener listenerObj) tergantung pada tipe dari event source. Dapat berupa Key, Mouse, Focus, Component, Action dan lainnya. Beberapa listeners dapat diregistrasi dengan satu event source untuk menerima pemberitahuan event. Listener yang telah teregistrasi dapat juga tidak diregistrasikan lagi menggunakan method removeListener. void removeListener(Listener listenerObj) 8.3 Class-Class Event Sebuah event object mempunyai sebuah class event sebagai tipe data acuannya. Akar dari hirarki class event adalah class EventObject, yang dapat ditemukan pada paket java.util. Immediate subclass dari class EventObject adalah class AWTEvent. Class AWTEvent didefinisikan pada paket java.awt. Itu merupakan akar dari semua AWTbased events. Berikut ini beberapa dari class-class AWT event. Class Event Deskripsi ComponentEvent Extends AWTEvent. Dijalankan ketika sebuah komponen dipindahkan, di-resize, dibuat visible atau hidden. InputEvent Extends ComponentEvent. Abstrak root class event untuk semua komponen-level input class-class event. ActionEvent Extends AWTEvent. Dijalankan ketika sebuah tombol ditekan, melakukan double-klik daftar item, atau memilih sebuah menu. ItemEvent Extends AWTEvent. Dijalankan ketika sebuah item dipilih atau di- deselect oleh user, seperti sebuah list atau checkbox. KeyEvent Extends InputEvent. Dijalankan ketika sebuah key ditekan, dilepas atau diketikkan. MouseEvent Extends InputEvent. Dijalankan ketika sebuah tombol mouse ditekan, dilepas, atau di-klik (tekan dan lepas), atau ketika sebuah kursor mouse masuk atau keluar dari bagian visible dari komponen. TextEvent Extends AWTEvent. Dijalankan ketika nilai dari text field atau text area dirubah. WindowEvent Extends ComponentEvent. Dijalankan sebuah object Window dibuka, ditutup, diaktifkan, nonaktifkan, iconified, deiconified, atau ketika focus ditransfer kedalam atau keluar window. Tabel 1.2: Class-Class Event Catatan, bahwa semua subclass-subclass AWTEvent mengikuti konvensi nama berikut ini: Event Pengenalan Pemrograman 2 3 J.E.N.I. 8.4 Event Listeners Event listeners adalah class yang mengimplementasikan interfaces Listener. Tabel di bawah menunjukkan beberapa listener interfaces yang biasanya digunakan. Event Listeners Deskripsi ActionListener Bereaksi atas perubahan mouse atau atau keyboard. MouseListener Bereaksi atas pergerakan mouse. MouseMotionListener Interface MouseMotionListener mendukung MouseListener. Menyediakan method-method yang akan memantau pergerakan mouse,seperti drag dan pemindahan mouse. WindowListener Bereaksi atas perubahan window. 8.4.1 Method ActionListener Tabel 1.3: Event Listeners Interface ActionListener hanya terdiri dari satu method. Method ActionListener public void actionPerformed(ActionEvent e) Mengendalikan ActionEvent e yang terjadi. Tabel 1.3.1: Method ActionListener 8.4.2 Method MouseListener Di bawah ini adalah method-method MouseListener yang seharusnya digunakan dalam penerapan class. Method-method MouseListener public void mouseClicked(MouseEvent e) Dipanggil pada saat tombol mouse di click (seperti tekan dan lepas). public void mouseEntered(MouseEvent e) Dipanggil pada saat kursor mouse memasuki area komponen. public void mouseExited(MouseEvent e) Dipanggil pada saat kursor mouse meninggalkan area komponen. public void mousePressed(MouseEvent e) Dipanggil pada saat tombol mouse ditekan di atas komponen public void mouseReleased(MouseEvent e) Dipanggil pada saat tombol mouse dilepas di atas komponen Tabel 1.3.2: Method-Method MouseListener Pengenalan Pemrograman 2 4 J.E.N.I. 8.4.3 Method-Method MouseMotionListener MouseMotionListener mempunyai dua method untuk diimplementasikan. Method-method MouseListener public void mouseDragged(MouseEvent e) Digunakan untuk memantau pergerakan mouse yang melintasi object pada saat tombol mouse ditekan. Tindakan ini persis sama dengan tindakan pada saat memindahkan sebuah window. public void mouseMoved(MouseEvent e) Digunakan untuk memantau pergerakan mouse pada saat mouse melintasi area suatu object. Pada saat ini tidak ada mouse yang ditekan, hanya memindahkan pointer mouse melalui object. Tabel 1.3.3: The MouseMotionListener methods 8.4.4 Method-Method WindowListener Di bawah ini method-method dari interface WindowListener. Method-method WindowListener public void windowOpened(WindowEvent e) Dipanggil pada saat object window dibuka (pertama kali window dibuat tampil). public void windowClosing(WindowEvent e) Dipanggil pada saat user mencoba untuk menutup object Window dari menu sistem object. public void windowClosed(WindowEvent e) Dipanggil pada saat object Window ditutup setelah memanggil penempatan (misal, release dari resource-resource yang digunakan oleh source) pada object. public void windowActivated(WindowEvent e) Dilibatkan ketika object Window adalah window yang aktif (window masih dipakai). public void windowDeactivated(WindowEvent e) Dilibatkan ketika object Window tidak lagi merupakan window yang aktif. public void windowIconified(WindowEvent e) Dipanggil ketika object Window di-minimize. public void windowDeiconified(WindowEvent e) Dipanggil ketika object Window kembali setelah di-minimize ke keadaan normal. Tabel 1.3.4: Method-Method WindowListener Pengenalan Pemrograman 2 5 J.E.N.I. 8.4.5 Petunjuk untuk Menciptakan Aplikasi Handling GUI Events Berikut ini langkah-langkah yang Anda butuhkan untuk mengingat ketika ingin membuat aplikasi GUI dengan event handling. 1. Buatlah sebuah class yang menguraikan dan membuat suatu tampilan dari aplikasi GUI Anda. 2. Buatlah sebuah class yang menerapkan interface listener yang sesuai. Class ini boleh mengacu pada class yang sama seperti pada langkah awal. 3. Dalam menerapkan class, gunakan semua method-method dengan interface listener yang sesuai. Uraikan masing-masing method bagaimana Anda ingin mengendalikan event-event. Anda dapat memberikan implementasi kosong untuk method yang tidak ingin Anda gunakan. 4. Daftarkan object listener, instansiatiate dari class listener pada langkah 2, dengan source component menggunakan method addListener. 8.4.6 Contoh Mouse Events import java.awt.*; import java.awt.event.*; public class MouseEventsDemo extends Frame implements MouseListener, MouseMotionListener { TextField tf; public MouseEventsDemo(String title){ super(title); tf = new TextField(60); addMouseListener(this); } public void launchFrame() { /* Menambah komponen pada frame */ add(tf, BorderLayout.SOUTH); setSize(300,300); setVisible(true); } public void mouseClicked(MouseEvent me) { String msg = "Mouse clicked."; tf.setText(msg); } public void mouseEntered(MouseEvent me) { String msg = "Mouse entered component."; tf.setText(msg); } public void mouseExited(MouseEvent me) { String msg = "Mouse exited component."; tf.setText(msg); } public void mousePressed(MouseEvent me) { String msg = "Mouse pressed."; tf.setText(msg); } public void mouseReleased(MouseEvent me) { String msg = "Mouse released."; tf.setText(msg); Pengenalan Pemrograman 2 6 J.E.N.I. } public void mouseDragged(MouseEvent me) { String msg = "Mouse dragged at " + me.getX() + "," + me.getY(); tf.setText(msg); } public void mouseMoved(MouseEvent me) { String msg = "Mouse moved at " + me.getX() + "," + me.getY(); tf.setText(msg); } public static void main(String args[]) { MouseEventsDemo med = new MouseEventsDemo("Mouse Events Demo"); med.launchFrame(); } } 8.4.7 Contoh Menutup Window import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame implements WindowListener { Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(this); } void launchFrame() { setSize(300,300); setVisible(true); } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } Pengenalan Pemrograman 2 7 J.E.N.I. public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } } 8.5 Class-class Adapter Class Menerapkan semua method dari interface yang semuanya akan membutuhkan banyak pekerjaan. Di satu sisi, Anda terkadang lebih sering tertarik menerapkan hanya beberapa method dari interface saja. Untungnya, Java menyediakan untuk kita class- class adapter yang menerapkan semua method dari masing-masing listener interface dengan lebih dari satu method. Implementasi dari method-method semuanya adalah kosong. 8.5.1 Close Window Example import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CFListener w = new CFListener(this); CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(w); } void launchFrame() { setSize(300,300); setVisible(true); } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } } class CFListener extends WindowAdapter{ CloseFrame ref; CFListener( CloseFrame ref ){ this.ref = ref; } public void windowClosing(WindowEvent e) { ref.dispose(); System.exit(1); } } Pengenalan Pemrograman 2 8 J.E.N.I. 8.6 Inner Class dan Anonymous Inner Class Bagian ini memberi Anda tinjauan ulang atas konsep yang sudah Anda pelajari di pelajaran pemrograman pertama. Inner class dan anonymous inner class sangatlah bermanfaat untuk GUI event handling. 8.6.1 Inner Class Inner class, seperti namanya, adalah sebuah class yang dideklarasikan di dalam class lain. Kegunaan inner classes akan dapat membantu Anda menyederhanakan program, terutama dalam event handling seperti yang ditunjukkan pada contoh. 8.6.2 Contoh Menutup Window import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(new CFListener()); } void launchFrame() { setSize(300,300); setVisible(true); } class CFListener extends WindowAdapter { public void windowClosing(WindowEvent e) { dispose(); System.exit(1); } } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } } Pengenalan Pemrograman 2 9 J.E.N.I. 8.6.3 Anonymous Inner Class Anonymous inner class adalah inner class tanpa nama. Kegunaan dari anonymous inner class akan menyederhanakan kode-kode Anda lebih lanjut. Di bawah ini merupakan modifikasi dari contoh bagian sebelumnya. 8.6.4 Contoh Menutup Window import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ dispose(); System.exit(1); } }); } void launchFrame() { setSize(300,300); setVisible(true); } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } } Pengenalan Pemrograman 2 10 J.E.N.I. 8.7 Latihan 8.7.1 Tic-Tac-Toe Extend program papan Tic-Tac-Toe yang telah Anda kembangkan sebelumnya dan tambahkan event handlers ke kode tersebut untuk membuat program berfungsi penuh. Permainan Tic-Tac-Toe dimainkan dengan dua pemain. Pemain mengambil giliran mengubah. Setiap giliran, pemain dapat memilih kotak pada papan. Ketika kotak dipilih, kotak ditandai oleh simbol pemain (O dan X biasanya digunakan sebagai simbol). Pemain yang sukses menaklukkan 3 kotak membentuk garis horisontal, vertikal, atau diagonal, memenangkan permainan. Permainan akan berakhir ketika pemain menang atau ketika semua kotak telah terisi. Gambar 8.2 : Program Tic-Tac-Toe Pengenalan Pemrograman 2 11 J.E.N.I. BAB 10 Jaringan Java memperbolehkan Anda dalam mempermudah pengembangan aplikasi yang mengerjakan berbagai pekerjaan melalui jaringan. Ini adalah suatu cita-cita pembuatan Java yang menjadi salah satu kekuatan Java sejak dapat dibuat untuk ditampilkan melalui internet. Sebelum mempelajari tentang jaringan dalam Java. Pertama-tama Anda akan diperkenalkan kepada beberapa konsep dasar jaringan. Pada akhir pembahasan, diharapkan pembaca dapat : 1.Mengerti konsep dasar jaringan  IP address  protokol  ports  paradigma client/server  socket 2.Membuat aplikasi menggunakan package jaringan Java  ServerSocket  Socket  MulticastSocket  DatagramPacket 10.1 Konsep Dasar Jaringan Jika sebelumnya Anda telah mengetahui, bahwa internet adalah jaringan global dengan berbagai jenis komputer yang berbeda yang tersambung dalam berbagai cara. Walaupun terdapat perbedaan dalam software dan hardware yang tersambung bersama-sama, hal tersebut sangatlah bagus bahwa internet masih dapat berfungsi. Hal ini memungkinkan karena standar komunikasi memiliki ketetapan dan juga keselarasan. Standar ini menjamin kesesuaian dan kekuatan komunikasi diantara luasnya sistem pada internet. Mari kita pelajari beberapa standar yang berlaku. 10.1.1 IP Address Pada setiap komputer yang tersambung dengan internet memiliki alamat IP yang unik. Alamat IP secara logika hampir sama dengan alamat pengiriman surat tradisional dimana memiliki arti bahwa alamat yang bersifat unik tersebut mewakili dari keterangan sebuah object. Alamat tersebut diwakilkan dalam 32-bit nomor yang digunakan sebagai pengenal yang bersifat unik dari setiap komputer yang tersambung dengan internet. 192.1.1.1 adalah contoh dari sebuah alamat IP. Mereka juga bisa ditulis dengan bentuk simbol seperti docs.rinet.ru. 10.1.2 Protokol Karena terdapat jenis komunikasi yang berbeda-beda yang mungkin terjadi pada internet, di sana harus terdapat suatu jumlah yang sama untuk mekanisme penangangan komunikasi. Setiap jenis komunikasi membutuhkan protokol yang spesifik dan unik. Protokol mengatur peraturan dan standar yang menetapkan jenis komunikasi internet yang khusus. Hal tersebut menjelaskan format data yang dikirim lewat internet, seiring dengan bagaimana dan kapan itu dikirim. Konsep dari protokol tentunya tidak terlalu asing untuk kita. Mengingat sudah beberapa kali Anda telah menggunakan jenis percakapan ini : Pengenalan Pemrograman 2 1 J.E.N.I. "Hallo." "Hallo. Selamat siang. Bolehkah saya berbicara dengan Joan?" "Okay, mohon tunggu sebentar." "terima kasih." ... Ini adalah protokol sosial yang digunakan ketika dalam pembicaraan melalui telepon. Jenis protokol tipe ini memberikan kita kepercayaan untuk mengetahui apa yang harus dilakukan dalam situasi tersebut. Mari kita lihat beberapa protokol penting yang digunakan pada internet. Hypertext Transfer Protocol (HTTP) adalah salah satu protokol yang sering digunakan. Digunakan untuk mentransfer dokumen HTML pada Web. Kemudian, ada juga File Transfer Protocol (FTP) dimana lebih umum dibandingkan dengan HTTP dan memperbolehkan Anda untuk mentransfer file biner lewat intenet. Kedua protokol tersebut memiliki peraturan masing-masing dan standar dalam pengiriman data. Java juga mendukung kedua protokol tersebut. 10.1.3 Port Sekarang, protokol hanya bisa dipertimbangkan jika digunakan dalam konteks suatu jasa. Sebagai contoh, protokol HTTP digunakan ketika Anda menyediakan isi Web melalui layanan HTTP. Setiap komputer pada internet dapat menyediakan berbagai jenis layanan melalui berbagai jenis protokol yang mendukung. Masalahnya, bagaimanapun juga, kita harus mengetahui jenis layanan sebelum sebuah informasi dapat ditransfer. Untuk itulah port digunakan. Port adalah 16-bit nomor dimana mengenal setiap layanan yang ditawarkan oleh server jaringan. Untuk menggunakan layanan khusus dan oleh karena itu, jalur komunikasi yang melewati protokol tertentu, Anda perlu menyambungkan pada port yang sesuai. Port dihubungkan dengan nomor dan beberapa nomor bersifat spesifik yang berhubungan dengan jenis layanan khusus. Port dengan layanan pekerjaan tertentu disebut port standar. Sebagai contoh, layanan FTP terletak pada port 21 sedangkan layanan HTTP terletak pada port 80. Jika Anda ingin menggunakan file transfer FTP, Anda perlu terhubung dengan port 21 pada komputer Anda. Sekarang, semua standar layanan tertentu diberikan nilai port dibawah 1024. port dengan nilai diatas 1024 disediakan untuk komunikasi custom. Jika terdapat kasus dimana port dengan nilai diatas 1024 telah digunakan oleh beberapa komunikasi custom, Anda harus mencari nilai lain yang tidak digunakan. 10.1.4 Paradigma client/server Paradigma client/server adalah dasar untuk framework jaringan Java. Tentunya, penetapan ini terdiri dari dua elemen besar, yaitu client dan server. Client adalah mesin yang membutuhkan beberapa jenis informasi sedangkan server adalah mesin yang menyimpan informasi dan menunggu untuk menyampaikannya pada client. Paradigma ini menjelaskan sebuah skenario sederhana. Tentunya, client terhubung dengan sever dan meminta informasi. Kemudian server mengingat permintaan dan mengembalikan informasi yang tersedia kepada client. Pengenalan Pemrograman 2 2 J.E.N.I. 10.1.5 sockets Gambar1.1.4: Model Client/Server Konsep umum jaringan yang terakhir sebelum kita membahas lebih dalam tentang Java networking adalah dengan memperhatikan sockets. Kebanyakan pemrograman Java network menggunakan jenis khusus dari komunikasi jaringan yang diketahui sebagai sockets. Socket adalah software abstrak untuk media input atau output komunikasi. Socket digunakan oleh Java untuk mengatasi komunikasi pada jaringan level rendah. Jalur komunikasi ini memungkinkan untuk mentransfer data melalui port khusus. Singkatnya, socket adalah point terakhir untuk komunikasi antara dua mesin. 10.2 The Java Networking Package Package dari java.net menyediakan banyak class yang berguna untuk pengembangan aplikasi jaringan. Untuk daftar lengkap dari class jaringan dan interface, dapat dilihat pada dokumentasi API. Pembelajaran akan difokuskan pada empat class yaitu : class ServerSocket, Socket, MulticastSocket, dan DatagramPacket. 10.2.1 Class ServerSocket dan Socket Class ServerSocket menyediakan fungsi-fungsi dasar dari sebuah server. Tabel berikut menjelaskan dua dari empat constructor pada class ServerSocket: Pengenalan Pemrograman 2 3 J.E.N.I. Constructor ServerSocket ServerSocket(int port) Ketika sebuah server menetapkan suatu port tertentu, sebuah port 0 menugaskan sebuah server kepada port bebas manapun. Panjang antrian maksimum untuk koneksi yang akan datang diatur sebanyak 50 sebagai defaultnya. ServerSocket(int port, int backlog) Ketika sebuah server menetapkan suatu port tertentu, panjang antrian maksimum untuk koneksi yang akan datang berdasarkan pada parameter backlog. Tabel 1.2.1a: Constructor ServerSocket Berikut ini adalah beberapa method class pada ServerSocket : Method ServerSocket public Socket accept() Menyebabkan server untuk menunggu dan mendengarkan dari koneksi client, kemudian menerimanya. public void close() Menutup socket server. Client tidak dapat lagi terhubung ke server hingga dibuka kembali public int getLocalPort() Mengembalikan port dimana socket juga membatasi public boolean isClosed() Mendeteksi apakah socket tertutup atau belum Tabel 1.2.1b: Method ServerSocket Contoh yang berhasil melakukan implementasi sebuah server sederhana, dimana sebuah informasi sederhana dikirim oleh client dapat dilihat pada listing program berikut ini : import java.net.*; import java.io.*; public class EchoingServer { public static void main(String [] args) { ServerSocket server = null; Socket client; try { server = new ServerSocket(1234); Pengenalan Pemrograman 2 4 J.E.N.I. //1234 nomor port yang belum digunakan } catch (IOException ie) { System.out.println("Cannot open socket."); System.exit(1); } while(true) { try { client = server.accept(); OutputStream clientOut = client.getOutputStream(); PrintWriter pw = new PrintWriter(clientOut, true); InputStream clientIn = client.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)); pw.println(br.readLine()); } catch (IOException ie) { } } } } Ketika class ServerSocket mengimplementasikan server socket, Class Socket mengimplementasikan socket client. Class Socket memiliki delapan constructor, dua diantaranya siap dipanggil. Langsung saja kita lihat dua constructor tersebut. Constructor Socket Socket(String host, int port) Membuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada host tertentu. Socket(InetAddress address, int port) Membuat sebuah socket client dimana dihubungkan dengan diberikannya nomor port pada alamat IP tertentu. Tabel 1.2.1c: Constructor Socket Berikut adalah beberapa dari method class pada Socket : public void close() Menutup socket client public InputStream getInputStream() Method Socket Menerima kembali input stream yang berhubungan dengan socket ini. public OutputStream getOutputStream() Menerima kembali output stream yang berhubungan dengan socket ini. public InetAddress getInetAddress() Pengenalan Pemrograman 2 5 J.E.N.I. Method Socket Mengembalikan alamat IP kepada socket ini pada saat masih terhubung. public int getPort() Mengembalikan remote port kepada socket ini pada saat masih terhubung. public boolean isClosed() Mendeteksi apakah socket telah tertutup atau tidak Tabel 1.2.1d: Method Socket Contoh yang berhasil melakukan implementasi sebuah client sederhana, dimana mengirim data kepada server dapat dilihat pada listing program dibawah ini : import java.io.*; import java.net.*; public class MyClient { public static void main(String args[]) { try { //Socket client = new Socket("133.0.0.1", 1234); Socket client = new Socket(InetAddress.getLocalHost(), 1234); InputStream clientIn = client.getInputStream(); OutputStream clientOut = client.getOutputStream(); PrintWriter pw = new PrintWriter(clientOut, true); BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Type a message for the server: "); pw.println(stdIn.readLine()); System.out.println("Server message: "); System.out.println(br.readLine()); pw.close(); br.close(); client.close(); } catch (ConnectException ce) { System.out.println("Cannot connect to the server."); } catch (IOException ie) { System.out.println("I/O Error."); } } } 10.2.2 Class MulticastSocket dan DatagramPacket Class MulticastSocket sangat berguna untuk aplikasi yang mengimplementasikan komunikasi secara berkelompok. Alamat IP untuk kelompok multicast berkisar antara 224.0.0.0 hingga 239.255.255.255. Meskipun begitu, alamat 224.0.0.0 telah dipesan dan seharusnya tidak digunakan. Class ini memiliki tiga constructor tetapi yang akan dibahas hanya salah satu dari ketiga constructor ini. Pengenalan Pemrograman 2 6 J.E.N.I. Constructor MulticastSocket MulticastSocket(int port) Membuat multicast socket dibatasi dengan pemberian nomor port Tabel 1.2.2a: Constructor MulticastSocket Tabel berikutnya memberikan penjelasan beberapa method MulticastSocket. Method MulticastSocket public void joinGroup(InetAddress mcastaddr) Bergabung dengan kelompok multicast pada alamat tertentu public void leaveGroup(InetAddress mcastaddr) Meninggalkan kelompok multicast pada alamat tertentu public void send(DatagramPacket p) Metode turunan dari class DatagramSocket. Mengirim p dari socket ini. Tabel 1.2.2b:Method MulticastSocket Sebelum seseorang dapat mengirim pesan kepada suatu kelompok, pertama kali yang harus dilakukan oleh orang tersebut adalah harus menjadi anggota dari multicast kelompok dengan menggunakan method joinGroup. Sekarang seorang anggota dapat mengirim pesan melalui method send. Jika Anda telah selesai berbicara dengan kelompok, Anda dapat menggunakan method leaveGroup untuk melepaskan keanggotaan Anda. Sebelum melihat contoh dalam menggunakan class multicastSocket, pertama-tama mari kita lihat pada class DatagramPacket. Perhatikan bahwa dalam method send dari class multiSocket, dibutuhkan parameter yaitu object DatagramPacket. Sehingga, kita harus mengerti object jenis ini sebelum menggunakan method send. Class DatagramPacket digunakan untuk mengirim data melalui protokol connectionless seperti multicast. Masalah yang ditimbulkan bahwa pengiriman packet tidak terjamin. Mari kita perhatikan dua dari enam constructor. Constructor DatagramPacket DatagramPacket(byte[] buf, int length) Constructor dari datagramPacket untuk menerima paket dengan panjang length. Seharusnya kurang dari atau sama dengan ukuran dari buffer buf. DatagramPacket(byte[] buf, int length, InetAddress address, int port) Constructor dari datagramPacket untuk mengirim paket dengan panjang length dengan nomor port tertentu dan host tertentu. Tabel 1.2.2c: Constructor DatagramPacket Pengenalan Pemrograman 2 7 J.E.N.I. Berikut adalah beberapa method dari class DatagramPacket. Method-method DatagramPacket public byte[] getData() Mengembalikan buffer dimana data telah disimpan public InetAddress getAddress() Mengembalikan alamat IP mesin dimana paket yang dikirim atau yang diterima public int getLength() Mengembalikan panjang data yang dikirim atau diterima public int getPort() Mengembalikan nomor port pada remote host dimana paket yang dikirim atau yang diterima Table 1.2.2d: Method DatagramPacket Contoh multicast kita juga mengandung dua class, server dan client. Server menerima pesan dari client dan mencetak pesan tersebut. Berikut adalah class server import java.net.*; public class ChatServer { public static void main(String args[]) throws Exception { MulticastSocket server = new MulticastSocket(1234); InetAddress group = InetAddress.getByName("234.5.6.7"); //getByName – Mengembalikan alamat IP yang diberikan oleh Host server.joinGroup(group); boolean infinite = true; /* Server terus-menerus menerima data dan mencetaknya*/ while(infinite) { byte buf[] = new byte[1024]; DatagramPacket data = new DatagramPacket(buf, buf.length); server.receive(data); String msg = new String(data.getData()).trim(); System.out.println(msg); } server.close(); } } Berikut adalah class client import java.net.*; import java.io.*; public class ChatClient { public static void main(String args[]) throws Exception { MulticastSocket chat = new MulticastSocket(1234); Pengenalan Pemrograman 2 8 J.E.N.I. } InetAddress group = InetAddress.getByName("234.5.6.7"); chat.joinGroup(group); String msg = ""; System.out.println("Type a message for the server:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); msg = br.readLine(); DatagramPacket data = new DatagramPacket(msg.getBytes(), 0, msg.length(), group, 1234); chat.send(data); chat.close(); } 10.3 Latihan 10.3.1 Trivia Server Buatlah sebuah server yang berisi satu set pertanyaan yang mudah. Secara sederhana, akan ada sekitar 5-10 pertanyaan. Client yang terhubung ke server mengirim sebuah permintaan untuk sebuah pertanyaan atau jawaban sebuah pertanyaan, Client mengirim pesan “permintaan”. Untuk jawaban dari sebuah pertanyaan, client mengirim pesan “jawaban”. Ketika menerima pesan “permintaan”, secara acak server akan memilih satu pertanyaan dari koleksi yang ada. Dia mengirimkan pertanyaan yang dipilih sesuai dengan nomor yang bersangkutan kepada client. Ketika server menerima pesan “jawaban” dari client, dia menginformasikan user bahwa user perlu mengirimkan jawaban sesuai dengan nomor pertanyaan kepada server. Jawaban itu harus dalam format #. Berikut adalah contoh skenario : Client: "permintaan" Server: "3#Siapa pembuat Java?" Client: "jawaban" Server: "Berikan jawabanmu dengan format: #" Client: "3#James Gosling" Server: Kerja yang bagus! ... Pengenalan Pemrograman 2 9 J.E.N.I. 11.1 Tujuan BAB 11 Applet Applet adalah satu fitur yang paling menarik dalam java. Applet merupakan program yang Anda jalankan melalui web browser. Pada pembelajaran ini Anda akan belajar tentang membuat sebuah applet. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Mendefinisikan apa yang dimaksud dengan applet 2. Membuat applet sendiri 3. Mengetahui siklus yang terdapat pada applet  init  start  stop  destroy 4. Menggunakan method applet yang lain  paint  showStatus  Method untuk memainkan sebuah audio clip 5. Memahami tag html pada applet 11.2 Membentuk Applet Sebuah applet adalah tipe yang spesial dari program java yang dieksekusi melalui internet. Secara khusus berjalan pada suatu web browser seperti Netscape Navigator, Mozilla, atau Microsoft Internet Explorer. Bagaimanapun juga, jika dibandingkan dengan aplikasi Java yang normal, tidak diperbolehkan mengakses applet pada komputer yang dijalankan untuk alasan keamanan. Applet ini cukup terbatas jika dibandingkan dengan aplikasi Java. Pada module ini, Anda akan mempelajari tentang membuat applet menggunakan AWT. 11.2.1 Hello World Applet Class Applet adalah sebuah subclass dari class Panel yang didefinisikan dalam AWT. Cara terbaik untuk memahami bagaimana membuat applet adalah dengan contoh. Jadi, berikut ini adalah contoh applet sederhana yang menampilkan "Hello world!". import java.awt.*; import java.applet.*; Pengenalan Pemrograman 2 1 J.E.N.I. /* masukkan bagian ini dalam kode html */ public class AppletDemo extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 80, 25); } } Setelah proses kompilasi, usahakan menjalankan contoh ini menggunakan perintah java. Apa yang terjadi? Ingat bahwa applet adalah aplikasi java yang spesial. Mereka tidak dieksekusi menggunakan perintah java. Bahkan applet berjalan pada web browser atau menggunakan applet viewer. Untuk membuka applet melalui sebuah web browser, secara sederhana buka dokumen HTML dimana applet terintegrasi ke dalamnya menggunakan applet HTML tag (Perintah mengeluarkan kode pada contoh Hello World). Cara lain untuk menjalankan sebuah applet adalah melalui perintah appletviewer. Untuk lebih mudahnya ikuti syntax berikut ini: appletviewer Untuk menjalankan contoh applet yang dijalankan , menggunakan: appletviewer AppletDemo.java Tag HTML pada contoh yang diberikan mengindikasikan bahwa sebuah applet dibuat dengan lebar 300 pixel dan tinggi 100 pixel. Kemudian, method drawString menggambar string "Hello world!" pada posisi pixel (80,25) menghitung kebawah dari bagian kanan. Gambar 1.1.1: Contoh Applet Ketika membuat sebuah applet, diharuskan meng-extend class Applet. Sebagaimana yang disebutkan sebelumnya, classnya dapat ditemukan dalam package java.applet. Oleh karena itu, mengimport package java.applet merupakan suatu keharusan. Juga, telah disebutkan sebelumnya bahwa class Applet adalah subclass dari class Panel. Hal ini mengimplikasikan bahwa beberapa method dari class applet ditemukan dalam class Panel. Untuk mengakses method atau field dalam class Panel atau class-class induk, diperlukan suatu aksi untuk import package java.awt . Pengenalan Pemrograman 2 2 J.E.N.I. 11.3 Method-Method Applet Bagian ini membahas manfaat-manfaat method applet. 11.3.1 Siklus Applet (The Applet Life Cycle) Bahkan untuk memulai eksekusi pada method main seperti dalam aplikasi khas Java, browser atau applet viewer berhubungan dengan applet melalui method-method berikut: 1. init() init adalah method yang dipanggil pertama kali. Yang sebenarnya berisi permintaan pertama ketika applet di load. 2. start() Setelah meminta method init, mulai dengan method yang dipangil selanjutnya. method ini meminta dokumen HTML yang ditampilkan applet setiap waktu. Eksekusi ringkasan dengan method ini dilakukan ketika applet ditampilkan kembali. 3. stop() Ketika web browser meninggalkan dokumen HTML applet,method ini dipanggil untuk menginformasikan applet bahwa dia harus menghentikan proses eksekusinya. 4. destroy() Method ini dipanggil ketika applet perlu dihapus dari memory. Method stop selalu dipanggil sebelum method ini diminta untuk dijalankan. Pengenalan Pemrograman 2 3 J.E.N.I. Ketika membuat applet, sedikitnya beberapa dari method ini telah meng-override. contoh applet berikut meng-override method berikut. import java.applet.*; import java.awt.*; /* */ class LifeCycleDemo extends Applet { String msg =""; public void init() { msg += "initializing... "; repaint(); } public void start() { msg += "starting... "; repaint(); } public void stop() { msg += "stopping... "; repaint(); } public void destroy() { msg += "preparing for unloading..."; repaint(); } public void paint(Graphics g) { g.drawString(msg, 15, 15); } } Contoh dokumen html berikut tergabung dalam applet LifeCycleDemo . Life Cycle Demo Pengenalan Pemrograman 2 4 J.E.N.I. 11.3.2 Method paint Method lain yang tidak kalah penting adalah method paint, yang mana class Applet menurunkannya dari class induknya yaitu class Component, yang meminta output applet setiap waktu yang diperlukan untuk dapat digambar kembali. Sebagai contoh dari setiap instance adalah ketika sebuah applet tersembunyi oleh window lain dapat dibuat terlihat lagi. Method ini selalu menolak ketika Anda ingin membuat bagaimana applet yang Anda buat harus terlihat seperti yag Anda inginkan. Pada contoh Hello World, applet memiliki string "Hello world!"pada background setelah menolak method paint. 11.3.3 Method ShowStatus Applet memiliki window status, dimana memberi informasi kepada Anda tentang apa yang sebenarnya dilakukan applet. Jika Anda ingin memberi output ke window status, secara sederhana memanggil method showStatus. Contoh berikut ini sama seperti contoh Hello World tapi dengan pernyataan tambahan yang memodifikasi isi dari window status. import java.awt.*; import java.applet.*; /* */ public class AppletDemo extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 80, 25); showStatus("This is an important information."); } } Berikut ini adalah contoh hasil outputnya: Gambar 1.2.3: contoh showStatus() Pengenalan Pemrograman 2 5 J.E.N.I. 11.3.4 Memainkan Klip Audio Applet juga menyediakan layanan melalui adanya suatu method yang memungkinkan Anda untuk memainkan file audio. Memainkan audio clips dalam sebuah applet melibatkan dua langkah dasar : 1. Dapatkan audio clip menggunakan method getAudioClip. 2. Untuk memainkan audio clip, menggunakan method play atau loop pada object audio clip. play memungkinkan Anda untuk memainkan audio satu kali mengingat loop berulang pada audio clip dan berhenti hanya ketika method stop dipanggil. Contoh berikutnya memainkan file audio secara terus-menerus hingga method stop applet dipanggil. import java.awt.*; import java.applet.*; /* */ public class AudioApplet extends Applet { AudioClip ac; public void init() { try { /*audio clip tersimpan dalam direktori yang sama seperti kode javanya*/ /* spaceMusic telah terdownload dari java.sun.com */ ac = getAudioClip(getCodeBase(), "spaceMusic.au"); ac.loop(); } catch (Exception e) { System.out.println(e); } } public void stop() { ac.stop(); } public void paint(Graphics g) { g.drawString("Playing space music!", 80, 25); } } Pengenalan Pemrograman 2 6 J.E.N.I. 11.4 Tag-tag Applet HTML Pada contoh sebelum-sebelumnya, Anda sudah melihat bagaimana tag-tag applet HTML digunakan dalam dokumen HTML atau source code java. Sekarang, Anda akan dikenalkan pada versi tag-tag applet HTML yang lebih lengkap. [] [] ... [] [HTML that will be dsiplayed in the absence of Java] Kata kunci Applet HTML Tag CODEBASE Direktori dimana class applet diletakkan. Untuk dokumen HTML, direktori URL sesuai dengan setting awalnya/defaultnya. CODE Nama file yang berisi kode applet. Dengan atau tanpa nama ekstensi .java atau .class . ALT Text ditampilkan jika browser mengerti applet tags tapi applet tidak dapat dieksekusi secara langsung. Mungkin terjadi jika Javanya disabled. NAME Nama dari applet. Digunakan untuk memungkinkan applet yang lain untuk berkomunikasi dengan applet ini dengan menunjukkan suatu applet berdasarkan namanya. WIDTH, HEIGHT Width dan height dari window applet. Dinyatakan dalam pixel. ALIGN Pengenalan Pemrograman 2 7 J.E.N.I. Kata kunci Applet HTML Tag Alignment atau pengaturan posisi dari applet. Satu diantara "left", "right", "top", "bottom", "middle", "baseline", "texttop", "absmiddle", atau "absbottom". Peletakan posisi secara Default tergantung pada lingkungan. "top" – posisi atas dari applet diratakan dengan item tertinggi dalam baris yang ada. "bottom", baseline – posisi bawah dari applet diratakan dengan bawah dari content lain dalam baris yang sama. "middle" – tengah dari applet diratakan dengan bawah dari content yang lain dalam baris yang sama. "texttop" – posisi atas dari applet diratakan dengan posisi atas dari applet diratakan dengan posisi tertinggi dari posisi atas pada baris yang sama. "absmiddle" – tengah dari applet diratakan dengan vertical middle dari content lain pada baris yang sama. "absbottom" – posisi bawah dari applet diratakan dengan posisi bawah dari content lain dalam baris yang sama. VSPACE, HSPACE Spasi diatas dan dibawah (VSPACE) dan pada sisi (HSPACE) dari applet.. PARAM NAME, VALUE Untuk mengelompokkan parameter yang dapat menampilkan applet; applet dapat meminta method getParameter(String paramName). Table 1.3: Applet HTML Tags Contoh dibawah ini mendemokan bagaimana untuk mengakses parameter tertentu pada HTML tag. import java.awt.*; import java.applet.*; /* */ public class ParamDemo extends Applet { public void paint(Graphics g) { g.drawString(getParameter("myParam"), 80, 25); } } Output dari program ini sama seperti applet Hello World. Pengenalan Pemrograman 2 8 J.E.N.I. 11.5 Latihan 11.5.1 Tic-Tac-Toe Applet satu-player Buat game satu-player Tic-Tac-Toe. User memainkannya melawan komputer. Untuk setiap giliran, pemain harus menggeser kotak dari papan. Sekali sebuah kotak terpilih, kotak tersebut ditandai oleh symbol pemain (O dan X yang selalu digunakan sebagai simbol). pemain yang berhasil mengatasi 3 kotak membentuk baris horizontal, vertical atau diagonal memenangkan game ini. Game ini berakhir ketika pemain menang atau ketika semua kotak sudah berhasil dibentuk. Desain dan gerakan komputer seakan-akan user akan memenangkan pertandingan melawan komputer. Pengenalan Pemrograman 2 9 J.E.N.I. 12.1 Tujuan BAB 12 Stream I/O Lanjut Dalam module sebelumnya, Anda telah mempelajari bagaimana untuk mendapatkan input user dan memanipulasi file-file menggunakan strea. Kini Anda akan mempelajari lebih banyak tentang stream dan class-class stream yang lain. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Tahu tipe-tipe stream yang umum digunakan 2. Menggunakan class File dan methodnya  Karakter dan Stream byte  Input dan Output Streams  Node dan Filter Streams 3. Menggunakan class-class Input/Output yang berbeda  Reader  Writer  InputStream  OutputStream 4. Memahami konsep dari stream chaining 5. Mendefinisikan serialisasi 6. Memahami penggunaan dari kata kunci transient 7. Menulis dan membaca dari sebuah object stream 12.2 Tipe-Tipe Stream yang Umum Digunakan 12.2.1 Stream Karakter dan Byte Seperti yang telah disebutkan sebelumnya, secara umum ada dua tipe dari stream, yaitu stream karakter dan byte. Kita hanya mengulang perbedaan mendasar antara keduanya. Stream byte adalah abstraksi file atau alat untuk data biner sedangkan stream karakter adalah untuk karakter Unicode. Class InputStream adalah abstraksi class root untuk semua input stream byte sedangkan class OutputStream adalah class root abstraksi dari semua output stream byte. Untuk stream karakter, superclasss yang sesuai dari semua class-class secara berturut-turut adalah class Reader dan the Writer. Kedua class-class ini adalah abstraksi class-class untuk membaca dan menulis stream karakter. 12.2.2 Input dan Output Stream Stream juga dikategorikan berdasarkan apakah mereka digunakan untuk membaca atau menulis stream.Walaupun ini sudah cukup nyata, Anda diperbolehkan untuk membaca Pengenalan Pemrograman 2 1 J.E.N.I. dari input stream tapi tidak menulisnya. Di lain pihak, Anda diperbolehkan untuk menulis output streams tapi tidak membacanya. Class InputStream dan class Reader adalah superclass-superclass dari semua input stream. Class OutputStream dan class Writer adalah class-class root dari semua output stream. Input stream juga dikenal sebagai stream sumber (source stream) sejak kita memperoleh informasi dari stream ini. sementara itu output stream disebut juga stream hasil(sink stream). 12.2.3 Node dan Stream Filter Kini package java.io membedakan antara node dan stream filter. Sebuah stream node adalah sebuah stream dengan fungsi dasar berupa fungsi membaca atau menulis dari sebuah lokasi khusus seperti pada disk atau dari jaringan. Tipe-tipe dari stream node terdiri atas file, memory dan jalur data. Stream filter, di lain pihak, diletakkan pada layer stream node diantara threads atau proses untuk menyediakan fungsi tambahan yang tidak dapat ditemukan dalam stream node oleh stream node itu sendiri. Penambahan lapisan pada sebuah stream node disebut dengan stream chaining. Sesi ini berturut-turut mempunyai sebuah tujuan dari class-class stream yang berbeda. Untuk melengkapi daftar dari class-class ini, lihatlah pada dokumentasi Java's API. Pengenalan Pemrograman 2 2 J.E.N.I. 12.3 Class File Walaupun class File bukan merupakan class stream, ini sesuatu yag penting bahwa kita mempelajari ini sejak class-class stream merupakan file-file yang telah dimanipulasi. Class adalah sebuah perwakilan dari abstraksi dari file-file nyata dan nama path direktori. Untuk meng-instantiate sebuah object File, Anda dapat menggunakan constructor berikut ini: Sebuah Constructor File File(String pathname) Instantiate sebuah object File dengan nama path khusus sebagai nama filenya. Nama filenya mungkin salah satu menjadi penuh( sebagai contoh, isi dengan path yang lengkap) atau mungkin terdiri atas namafile itu sendiri dan diasumsikan menjadi diisi dalam direktori tersebut. Table 1.2a: Constructor File Class File menyediakan beberapa method untuk memanipulasi file dan direktori. Berikut ini beberapa dari method-method tersebut. Method-method File public String getName() Mengembalikan nilai nama file atau nama direktori dari object File ini. public boolean exists() Menguji apakah sebuah file atau sebuah direktori masih ada atau tidak public long length() Mengembalikan nilai ukuran dari file. public long lastModified() Mengembalikan nilai tanggal dalam milidetik ketika file terakhir kali dimodifikasi. public boolean canRead() Mengembalikan nilai true jika dijinkan untuk membaca dari file. Sebaliknya, nilai pengembaliannya bernilai false. public boolean canWrite() mengembalikan nilai true jika diijinkan untuk menulis ke sebuah file. Sebaliknya, nilai pengembaliannya bernilai false. public boolean isFile() Menguji apakah object ini berupa sebuah file, yaitu persepsi normal kita tentang apa itu sebuah file (bukan sebuah direktori) atau bukan. public boolean isDirectory() menguji apakah object ini adalah sebuah direktori atau bukan. public String[] list() Pengenalan Pemrograman 2 3 J.E.N.I. Method-method File Mengembalikan nilai daftar file dan subdirektori yang ada dalam object ini. Object ini haruslah berupa sebuah direktori. public void mkdir() Membuat sebuah direktori yang merupakan abstraksi nama path ini. public void delete() Membuang file atau direktori yang sebenarnya diwakili oleh object File tersebut. Table 1.2a: method-method File Mari kita melihat bagaimana method ini bekerja berdasarkan contoh berikut ini : import java.io.*; public class FileInfoClass { public static void main(String args[]) { String fileName = args[0]; File fn = new File(fileName); System.out.println("Name: " + fn.getName()); if (!fn.exists()) { System.out.println(fileName + " does not exists."); /* membuat sebuah temporary directory . */ System.out.println("Creating temp directory..."); fileName = "temp"; fn = new File(fileName); fn.mkdir(); System.out.println(fileName + (fn.exists()? "exists": "does not exist")); System.out.println("Deleting temp directory..."); fn.delete(); System.out.println(fileName + (fn.exists()? "exists": "does not exist")); return; } System.out.println(fileName + " is a " + (fn.isFile()? "file." :"directory.")); if (fn.isDirectory()) { String content[] = fn.list(); System.out.println("The content of this directory:"); for (int i = 0; i < content.length; i++) { System.out.println(content[i]); } } if (!fn.canRead()) { System.out.println(fileName + " is not readable."); return; } System.out.println(fileName + " is " + fn.length() + " bytes long."); System.out.println(fileName + " is " + fn.lastModified() + " bytes long."); if (!fn.canWrite()) { Pengenalan Pemrograman 2 4 J.E.N.I. System.out.println(fileName + " is not writable."); } } } 12.4 Class Reader Bagian ini menggambarkan stream karakter yang digunakan untuk membaca. 12.4.1 Method Reader Class Reader terdiri atas beberapa method untuk membaca karakter. berikut ini adalah beberapa method class : Method Reader public int read(-) throws IOException Sebuah method overload, yang mana memiliki tiga versi. Membaca karakter, segala karakter array atau sebuah porsi untuk sebuah karakter array. public int read() - membaca sebuah karakter tunggal. public int read(char[] cbuf)- Membaca karakter dan menyimpannya dalam karakter array cbuf. public abstract int read(char[] cbuf, int offset, int length)- Membaca karakter sejumlah panjang karakter tertentu dan menyimpannya dalam karakter cbuf dimulai pada tanda offset khusus yang telah ditentukan. public abstract void close() throws IOException Menutup Stream ini. Memanggil method Reader yang lain setelah menutup stream akan menyebabkan suatu IOException dijalankan. public void mark(int readAheadLimit) throws IOException Menandai posisi tertentu pada stream. Setelah menandai, panggil untuk melakukan reset() kemudian stream akan mencoba mengatur posisinya kembali pada titik ini. Tidak semua stream input karakter mendukung operasi ini. public boolean markSupported() mengindikasikan apakah sebuah stream mendukung operasi pemberian tanda (mark) atau tidak Tidak didukung oleh default. Seharusnya bersifat overid subclass. public void reset() throws IOException Reposisi stream ke posisi akhir stream yang telah ditandai 12.4.2 Class Node Reader Table 1.3.1: Method Reader Berikut ini adalah beberapa dasar class Reader: Pengenalan Pemrograman 2 5 J.E.N.I. Class-class Node Reader FileReader Untuk membaca file-file karakter. CharArrayReader Mengimplementasikan suatu karakter buffer yang dapat dibaca. StringReader Untuk membaca dari sebuah sumber string. PipedReader Digunakan untuk pasangan (dengan sebuah PipedWriter yang sesuai) oleh dua urutan yang ingin berkomunikasi. Salah satu dari urutan tersebut membaca karakter dari sumber tertentu. Table 1.3.2: Class-class Node Reader Classes 12.4.3 Class-Class Filter Reader Untuk menambah fungsi ke class-class dasar Reader, Anda dapat menggunakan class stream filter. Berikut ini adalah beberapa dari class-class tersebut : Class-Class Filter Reader BufferedReader mengizinkan penyimpanan sementara karakteryang bertujuan untuk menyediakan fasilitas pembacaan karakter, arrays, dan bais yang lebih efisien. FilterReader Untuk membaca stream karakter yang telah terfilter. InputStreamReader Menkonversi pembacaan byte ke bentuk karakter. LineNumberReader Sebuah subclass dari class BufferedReader yang dapat menjaga memori penyimpanan untuk nomor baris. PushbackReader Sebuah subclass dari class FilterReader yang memungkinkan karakter dikembalikan atau tidak terbaca oleh stream. Table 1.3.3: Class-class Filter Reader Pengenalan Pemrograman 2 6 J.E.N.I. 12.5 Class-Class Writer Pada pembahasan ini menjelaskan tentang stream karakter yang digunakan untuk menulis. 12.5.1 Writer Method Class Writer terdiri atas beberapa method untuk menulis karakter. Berikut ini adalah beberapa method class : Method Writer public void write(-) throws IOException Sebuah method overloading dalam lima versi: public void write(int c) – Menulis sebuah karakter tunggal yang diwakili oleh pemberian nilai integer. public void write(char[] cbuf) – Menulis isi dari karakter array cbuf. public abstract void write(char[] cbuf, int offset, int length) – Menulis sejumlah length karakter dari aaray cbuf, dimulai pada offset tertentu. public void write(String str) – Menulis string string. public void write(String str, int offset, int length) – Menulis sejumlah length karakter dari string str, dimulai pada offset tertentu. public abstract void close() throws IOException Menutup stream ini setelah flushing beberapa karaktr yang tidak tertulis. Invocation method lain setelah menutup stream ini akan menyebabkan terjadinya IOException. public abstract void flush() Mengganti stream(yaitu karakter yang disimpan dalam buffer dengan segera ditulis ke tujuan yang dimaksud). 12.5.2 Node Writer Classes Berikut ini beberapa dasar class Writer: Table 1.4.1: Method Writer Node Writer Classes FileWriter Untuk menulis karakter ke sebuah file. CharArrayWriter Menggunakan karakter penyangga yang dapat dituliskan juga. StringWriter Untuk menulis source string PipedWriter Pengenalan Pemrograman 2 7 J.E.N.I. Node Writer Classes Digunakan dengan berpasangan(dengan menghubungkan PipedReader) oleh dua thread yang ingin berkomunikasi. Satu dari thread ini menulis karakter ke stream ini. 12.5.3 Filter Writer Classes Table 1.4.2: Node Writer classes Untuk menambah fungsionalitas ke dasar class Writer, Anda dapat menggunakan class stream filter.Terdapat beberapa class-class: Filter Writer Classes BufferedWriter Menyediakan penyangga karakter bertujuan untuk menyediakan efisiensi penulisan karakter, array, dan garis. FilterWriter Untuk menulis stream karakter yang difilter. OutputStreamWriter Mengkodekan karakter yang ditulis ke dalam byte. PrintWriter Mencetak representasi yang diformat dari object ke dala stream text-output. Table 1.4.3: Filter Writer classes 12.6 Contoh Dasar Reader/Writer Contoh penggantian menggunakan class FileReader dan FileWriter. Dalam contoh ini, program membaca dari file yang khusus oleh user dan mengkopi isi dari file ke file lain. import java.io.*; class CopyFile { void copy(String input, String output) { FileReader reader; FileWriter writer; int data; try { reader = new FileReader(input); writer = new FileWriter(output); while ((data = reader.read()) != -1) { writer.write(data); } reader.close(); writer.close(); } catch (IOException ie) { ie.printStackTrace(); } Pengenalan Pemrograman 2 8 J.E.N.I. } public static void main(String args[]) { String inputFile = args[0]; String outputFile = args[1]; CopyFile cf = new CopyFile(); cf.copy(inputFile, outputFile); } } Cobalah program tersebut sendiri dan amatilah apa ang terjadi pada file yang dimanipulasi. 12.7 Merubah Contoh Reader/Writer Contoh pengganti hampir sama dengan contoh sebelumnya tetapi lebih efisien. Walaupun membaca dan menulis ke stream sekali saja, karakter membaca yang pertama disimpan dalam buffer sebelum penulisan karakter baris per baris. Program menggunakan teknik dari perangkaian stream dimana clas FileReader dan FileWriter didekorasi dengan class BufferedReader dan BufferedWriter, berurutan. import java.io.*; class CopyFile { void copy(String input, String output) { BufferedReader reader; BufferedWriter writer; String data; try { reader = new BufferedReader(new FileReader(input)); writer = new BufferedWriter(new FileWriter(output)); while ((data = reader.readLine()) != null) { writer.write(data, 0, data.length()); } reader.close(); writer.close(); } catch (IOException ie) { ie.printStackTrace(); } } public static void main(String args[]) { String inputFile = args[0]; String outputFile = args[1]; CopyFile cf = new CopyFile(); cf.copy(inputFile, outputFile); } } Bandingkan kode ini dengan sebelumnya. Apakah hasil dari menjalankan program ini? Pengenalan Pemrograman 2 9 J.E.N.I. 12.8 Class InputStream Bagian ini memberikan gambaran perbedaan stream byte yang digunakan membaca. 12.8.1 Method InputStream Class InputStream terdiri atas beberapa method untuk membaca byte. Beberapa method class: Method InputStream public int read(-) throws IOException Method overloaded, juga memiliki tiga versi seperti class Reader tersebut. public abstract int read() - Membaca byte selanjutnya dari data dari stream ini. public int read(byte[] bBuf)- Membaca sejumlah byte dan menyimpannya dalam byta array bBuf. public abstract int read(char[] cbuf, int offset, int length)- Membaca panjang sejumlah length byte dan menyimpannya dalam array byte bBuf dimulai dari offset tertentu. public abstract void close() throws IOException Menutup stream in. Memanggil method InputStream yang lain setelah menutup streamnya akan menyebabkan sebuah IOException dijalankan. public void mark(int readAheadLimit) throws IOException Menandai posisi tertentu dalam stream. Setelah menandainya, panggil untuk menjalankan fungsi reset() akan mencoba untuk mengatur posisi streamnya pada titik tertentu kembali. Tidak semua stream input-byte mendukung operasi ini. public boolean markSupported() Mengindikasikan apakah suatu stream mendukung operasi pemberian tanda (mark) dan reset. Yang tidak didukung secara default. Seharusnya diubah menjadi overide oleh subclass. public void reset() throws IOException Merubah posisi stream pada posisi akhir yang diberi tanda (mark) Table 1.7.1: Method InputStream 12.8.2 Class-Class Node InputStream Berikut ini merupakan beberapaclass-class dasar InputStream : Class-class Node InputStream FileInputStream Untuk membaca baris byte dari sebuah file BufferedArrayInputStream Pengenalan Pemrograman 2 10 J.E.N.I. Class-class Node InputStream Mengimplementasikan sebua penimpan sementara yang terdiri atas data byte, yang mungkin dpat dibaca dari streamnya. PipedInputStream Seharusnya terhubung ke sebuah PipedOutputStream. Stream ini secara khusus digunakan oleh dua urutan yang didalamnya satu dari urutan tersebut membaca data dari sumber ini sementara urutan yang lain menulis ke PipedOutputStream tujuan. Table 1.7.2: class-class Node InputStream 12.8.3 Class-class Filter InputStream Untuk menambah fungsi ke class dasar InputStream, Anda dapat menggunakan class stream filter. Berikut ini adalah beberapa dari class-class tersebut : Class-class Filter InputStream BufferedInputStream Sebuah subclass dari FilterInputStream yang memungkinkan penyimpanan input sementara untuk menyediakan pembacaan byte yang lebih efisien. FilterInputStream Untuk membaca byte stream yang telah terfilter, yang mungkin memindahkan source dasar dari data sepanjang proses dan menyediakan fungsi tambahan. ObjectInputStream Digunakan untuk serialisasi object. Deserialisasi object dan data primitif yang telah tertulis sebelumnya menggunakan sebuahObjectOutputStream. DataInputStream Sebuah subclass dari FilterInputStream yang memerintahkan sebuah aplikasi membaca data primitif Java dari sebuah input stream dasar dalam sebuah Mesin yang berjalan secara bebas(machine-independent way). LineNumberInputStream Sebuah subclass FilterInputStream yang memungkinkan pemeriksaan posisi dari nomor baris tertentu. PushbackInputStream Sebuah subclass dari class FilterInputStream yang memungkinkan byte diproses balik atau tidak dibaca ke bentuk sreamnya. Table 1.7.3: Class-class Filter InputStream Pengenalan Pemrograman 2 11 J.E.N.I. 12.9 Class-Class OutputStream Pada pembahasan ini memberikan sebuah pandangan tentang byte stream yang berbeda yang digunakan dalam proses penulisan. 12.9.1 Method OutputStream Class OutputStream terdiri atas beberapa method untuk menulis data byte. Berikut ini adalah beberapa dari class methodnya : Method OutputStream public void write(-) throws IOException Sebuah method overloaded untuk menulis bentuk byte ke bentuk stream. Ada tiga versi : public abstract void write(int b) – Menulis nilai byte khusus b ke bentuk output stream nya. public void write(byte[] bBuf) – Menulis isi dari array byte bBuf ke bentuk stream nya. public void write(byte[] bBuf, int offset, int length) – Menulis sejumlah length byte dari array bBuf ke bentuk streamnya, dimulai pada offset khusus ke streamnya. public abstract void close() throws IOException Menutup stream ini dan mengeluarkan beberapa sumber dari sistem digabungkan dengan streamnya. Penggunaan method lain setelah memanggil method ini akan menyebabkan sebuahIOException dijalankan. public abstract void flush() Mengganti stream (sebagai contoh, data byte tersimpan dalam buffer akan segera ditulis dalam tujuan yang diamksud). Table 1.8.1: Method OutputStream 12.9.2 Class-Class Node OutputStream Berikut ini adalah beberapa dari class dasar OutputStream : Clas-class Node OutputStream FileOutputStream Untuk menulis byte ke sebuah file. BufferedArrayOutputStream Mengimplementasikan sebuah penyimpan sementara berupa byte, yang mana mungkin akan dituliskan ke bentuk streamnya. PipedOutputStream Pengenalan Pemrograman 2 12 J.E.N.I. Clas-class Node OutputStream Seharusnya tersambung ke sebuah PipedInputStream. Stream ini secara khusus digunakan oleh dua urutan dimana didalamnya satu dari urutan tersebut menulis data ke bentuk streamnya sementara urutan yang lain membaca dari PipedInputStream tujuan. Table 1.8.2: Class-class Node OutputStream 12.9.3 Class-Class Filter OutputStream Untuk menambah fungsi ke class dasar OutputStream, Anda dapat menggunakan class stream filter.berikut ini beberapa dari class tersebut : Class-Class Filter OutputStream BufferedOutputStream Sebuah subclass dari FilterOutputStream yang memungkinkan penyimpanan output sementara untuk proses penulisan byte yang lebih efisien. Memungkinkan penulisan byte ke bentuk dasar output stream tanpa menyebabkan diperlukannya pemanggilan dasar sistem untuk setiap penulisan byte. FilterOutputStream Untuk menulis stream byte yang telah difilter, yang mana mungkin dipindahkan ke source dasar dari data sepanjang proses dan menyediakan fungsi tambahan. ObjectOutputStream Digunakan untuk serialisasi object. Serialisasi object dan data primitif untuk sebuah OutputStream. DataOutputStream Sebuah subclass dari FilterOutputStream yang menjalankan aplikasi penulisan data primitif ke output stream dasar ke dalam sebuah mesin yang bebas berjalan (machineindependent way). PrintStream Sebuah subclass dari FilterOutputStream yang menyediakan kemampuan untuk mencetak representasi dari nilai data yang bermacam-macam dengan tepat. Table 1.8.3: Class-Class Filter OutputStream Pengenalan Pemrograman 2 13 J.E.N.I. 12.10 Contoh Dasar InputStream/OutputStream Contoh berikut ini menggunakan class FileInputStream dan FileOutputStream untuk membaca dari sebuah file khusus dan mengcopy isi dari file ini ke file yang lain. import java.io.*; class CopyFile { void copy(String input, String output) { FileInputStream inputStr; FileOutputStream outputStr; int data; try { inputStr = new FileInputStream(input); outputStr = new FileOutputStream(output); while ((data = inputStr.read()) != -1) { outputStr.write(data); } inputStr.close(); outputStr.close(); } catch (IOException ie) { ie.printStackTrace(); } } public static void main(String args[]) { String inputFile = args[0]; String outputFile = args[1]; CopyFile cf = new CopyFile(); cf.copy(inputFile, outputFile); } } Pengenalan Pemrograman 2 14 J.E.N.I. 12.11 Contoh Modifikasi InputStream/OutputStream Contoh berikutnya menggunakan class PushbackInputStream yang memanfaatkan sebuah object FileInputStream dan class PrintStream. import java.io.*; class CopyFile { void copy(String input) { PushbackInputStream inputStr; PrintStream outputStr; int data; try { inputStr = new PushbackInputStream(new FileInputStream(input)); outputStr = new PrintStream(System.out); while ((data = inputStr.read()) != -1) { outputStr.println("read data: " + (char) data); inputStr.unread(data); data = inputStr.read(); outputStr.println("unread data: " + (char) data); } inputStr.close(); outputStr.close(); } catch (IOException ie) { ie.printStackTrace(); } } public static void main(String args[]) { String inputFile = args[0]; CopyFile cf = new CopyFile(); cf.copy(inputFile); } } Uji kode ini pada sebuah file yang mengandung sedikit baris atau karakter. Pengenalan Pemrograman 2 15 J.E.N.I. 12.12 Serialisasi Java Virtual Machine (JVM) mendukung kemampuan untuk membaca atau menulis sebuah object ke bentuk stream. kemampuan ini disebut dengan serialisasi, proses "flattening" sebuah object sehingga data tersebut dapat disimpan ke beberapa penyimpanan permanen atau dilewatkan ke object lain melalui class OutputStream. Ketika menulis sebuah object, ini merupakan hal yang penting bahwa keadaan tersebut sudah tertulis dan telah diserialisasi dari setiap objectnya dapat dibangun kembali sebagaimana dtaa tersebut dibaca. Menyimpan sebuah objectke beberapa tipe penyimpanan permanen yang dikenal sebagai persistence. Stream yang digunakan untuk deserialisasi dan serialisasi secara berurutan adalah class ObjectInputStream dan ObjectOutputStream . Untuk memungkinkan sebuah object diserialisasi (sebagai contoh dapat disimpan dan diurutkan), Class tersebut harus mengimplementasikan interface yang dapat diserialisasi. Class ini seharusnya juga menyediakan default constructor atau sebuah constructor tanpa argumen. Satu hal yang baik mengenai kemampuan untuk melakukan serialisasiyang dapat diturunkan, yang berarti kita tidak memiliki implementasi serialisasi pada setiap class. Ini berarti mengurangi pekrjaan untuk programmer. Anda hanya dapat mengimplementasikan serialisasi sekali sepanjang hirarki class. 12.12.1 Kata Kunci transient Ketika suatu object diserialisasi, tempat hanya disediakan untuk data object. Method dan Constructor bukan merupakan bagian dari stream serialisasi. Ada beberapa object yang tidak diserialisasi kaena data yang diwakilinya berubah secara konstan. Beberapa contoh dari setiap object adalah object FileInputStream dan Object Thread. Sebuah NotSerializableException dijalankan jika operasi serialisasi gagal karena beberapa alasan. Jangan berputus asa. Sebuah class yang mengandung object yang tidak diserialisasi dapat tetap diserialisasi jika penunjuk ke object non-serialisasi ditandai dengan katakunci transient. Pertimbangkan contoh berikut ini : class MyClass implements Serializable { transient Thread thread; //try removing transient int data; /* beberapa data yang lain*/ } Kata kunci transient mencagah data dari proses serialisasi. Object instantiasi dari class ini sekarang dapat ditulis ke sebuah OutputStream. 12.12.2 Serialisasi: Menulis Suatu Object Stream Untuk menulis object ke sebuah stream, Anda perlu menggunakan classObjectOutputStream class dan methodnya yaitu method writeObject. Method writeObject memiliki tanda sebagai berikut : public final void writeObject(Object obj) throws IOException dimana obj adalah object yang ditulis ke stream. Pengenalan Pemrograman 2 16 J.E.N.I. Contoh dibawah ini menuliskan sebuah object Boolean ke sebuah ObjectOutputStream. Class Boolean mengimplementasikan interface yang dapat di Serialisasi. Selanjutnya, Instantiasi object dari class ini dapat ditulis ke dan dibaca dari sebuah stream. import java.io.*; public class SerializeBoolean { SerializeBoolean() { Boolean booleanData = new Boolean("true"); try { FileOutputStream fos = new FileOutputStream("boolean.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(booleanData); oos.close(); } catch (IOException ie) { ie.printStackTrace(); } } public static void main(String args[]) { SerializeBoolean sb = new SerializeBoolean(); } } 12.12.3 Deserialisasi: Membaca Sebuah Object Stream Untuk membaca sebuah object dari sebuah stream, Anda perlu menggunakan class ObjectInputStream dan methodnya yaitu method readObject. Method readObject memiliki tanda sebagai berikut : public final Object readObject() throws IOException, ClassNotFoundException dimana obj adalah object yang dibaca dari stream. tipe Object dikembalikan harus melalui proses typecast ke nama class yang sesuai sebelum method pada class tersebut dapat dieksekusi. Contoh dibawah ini membaca sebuah object Boolean dari sebuah ObjectInputStream. Ini merupakan kesinambungan dari contoh sebelumnya pada serialisasi. import java.io.*; public class UnserializeBoolean { UnserializeBoolean() { Boolean booleanData = null; try { FileInputStream fis = new FileInputStream("boolean.ser"); ObjectInputStream ois = new ObjectInputStream(fis); booleanData = (Boolean) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); Pengenalan Pemrograman 2 17 J.E.N.I. } System.out.println("Unserialized Boolean from " + "boolean.ser"); System.out.println("Boolean data: " + booleanData); System.out.println("Compare data with true: " + booleanData.equals(new Boolean("true"))); } public static void main(String args[]) { UnserializeBoolean usb = new UnserializeBoolean(); } } 12.13 Latihan 12.13.1 Enkripsi Sederhana Baca dari sebuah file khusus oleh user dan encrypt isi file menggunakan teknik penggeseran yang sederhana. Juga, tanyakan pada user untuk menginput ukuran pergeseran. Output dari pesan yang telah di encrypt pada file yang lain yang memiliki nama yang juga dibuat oleh user sendiri. Sebagai contoh, Ukuran pergeseran: 1 Pesan yang dibaca dari file: Hello Pesan ter-encrypt: Ifmmp Pengenalan Pemrograman 2 18 J.E.N.I. 13.1 Tujuan BAB 13 Pengenalan Generics Release Java terbaru menyediakan langkah terbesar dalam pemrograman Java dibandingkan dengan versi-versi lain sebelumnya. Ini terdiri atas ekstensi yang cukup signifikan terhadap source language syntax. Bagian yang paling terlihat yaitu penambahan generic types. Modul ini mengenalkan Anda konsep dasar mengenai Java generic types. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Mengapresiasikan keuntungan dari generic types 2. Mendeklarasikan class generic 3. Menggunakan constrained generic 4. Mendeklarasikan method generic 13.2 Mengapa Generic? Satu dari penyebab adanya bugs yang paling signifikan dalam Bahasa pemrograman Java adalah keperluan akan pernyataan typecast atau downcast untuk lebih mengkhususkan tipe data dari tipe staticnya secara terus-menerus. Sebagai contoh, Sebuah object arraylist memungkinkan kita untuk menambahkan beberapa referensi tipe object pada list tapi ketika kita mendapatkan kembali elemet ini , kita perlu untuk typecast object ke tipe referensi khusus yang sesuai dengan keperluan kita. Downcasting adalah hotspot yang potensial untuk ClassCastException. Yang juga membuat kode kita menjadi lebih panjang, jadi, menjadi lebih sedikit dapat terbaca. Lebih dari itu, downcasting juga efektif merusak manfaat dari sebuah kekuatan bahasa yang diketikkan sejak dia menghapuskan keamanan yang disediakan perusahaan berupa pemeriksaan tipe(type checking). Tujuan utama dari penambahan generic pada Java adalah untuk memecahkan masalah ini. tipe Generic memungkinkan subuah single class untuk bekerja dengan pilihan tipe yang beraneka ragam. Ini adalah jalan yang alami untuk mengeliminasi keperluan untuk pemilihan (casting). Langkah awal mempertimbangkan sebuah object ArrayList dan lihatlah bagaimana type generic akan membantu dalam peningkatan kode kita. Seperti yang sudah Anda ketahui, sebuah object arraylist memiliki kemampuan untuk menyimpan elemen-elemen dari beberapa tipe referensi untuk list ini. Sebuah instance arraylist, bagaimanapun, selalu memaksa kita untuk men-downcast object-object kita membantu mendapatkan kembali dari list. Pertimbangkan pernyataan berikut : String myString = (String) myArrayList.get(0); Versi generic dari class ArrayList didesain untuk bekerja secara asli dengan beberapa Pengenalan Pemrograman 2 1 J.E.N.I. tipe class. Sama seperti, dia juga mempertahankan manfaat dari pengecekan tipe (type checking). Kita dapat melanjutkannya dengan keperluan memiliki typecast elemen yang kita dapatkan dari list dan memiliki pernyataan berikut terhadap pernyataan sebelumnya : String myString = myArrayList.get(0); Walaupun downcasting sudah terhapus, ini bukan berarti bahwa Anda dapat menandai segala sesuatu sebagai return value dari method get dan melanjutkannya dengan typecasting semuanya. Jika Anda menandai sesuatu yang lain disamping sebuah String untuk output dari method get, Anda akan menghadapi sebuah waktu mengcompile type tidak sesuai seperti pesan berikut ini : found: java.lang.String required: java.lang.Integer Integer data = myArrayList.get(0); Agar hanya memiliki ide bagaimana type-type generic digunakan sebelum materi ini dibahas lebih dalam, sebaiknya Anda pertimbangkan potongan kode berikut ini : ArrayList genArrList = new ArrayList (); genArrList.add("A generic string"); String myString = genArrList.get(0); JoptionPane.showMessageDialog(this, myString); Amatilah melalui pernyataan, anda mungkin mengamati kata segera terlihat setelah referensi tipe data arraylist. Anda dapat menerjemahkan pernyataan pertama sebagai instantiasi sebuah versi generic dari class ArrayList dan versi generic ini terdiri dari object-object dari tipe String. genArrList adalah batas dari tipe String. Oleh sebab itu, mengikat sebuah Integer atau beberapa tipe lain bukan String untuk hasil dari get function akan menjadi illegal. Pernyataan berikut ini adalah illegal. int myInt = genArrList.get(); 13.3 Mendeklarasikan sebuah Class Generic Untuk menjalankan potongan code sebelumnya, kita harus sudah mendefinisikan versi generic dari class ArrayList. Untungnya, versi java terbaru sudah menyediakan user dengan versi generic dari semua class-class Java Collection. Pada sesi ini, Anda akan mempelajari bagaimana untuk mendeklarasikan class generic anda sendiri. Dripada berdiskusi lebihpanjang lagi tentang bagaimana untuk mendeklarasikan sebuah class generic , anda akan diberikan sebuah contoh sederhana tentang class generic untuk dipelajari bentuknya. class BasicGeneric { private A data; public BasicGeneric(A data) { this.data = data; } public A getData() { return data; } } Pengenalan Pemrograman 2 2 J.E.N.I. public class GenSample { public String method(String input) { String data1 = input; BasicGeneric basicGeneric = new BasicGeneric (data1); String data2 = basicGeneric.getData(); return data2; } public Integer method(int input) { Integer data1 = new Integer(input); BasicGeneric basicGeneric = new BasicGeneric (data1); Integer data2 = basicGeneric.getData(); return data2; } public static void main(String args[]) { GenSample sample = new GenSample(); System.out.println(sample.method("Some generic data")); System.out.println(sample.method(1234)); } } Sekarang mari kita melalui bagian dari kode yang menggunakan syntax untuk type generic. Untuk deklarasi dari class BasicGeneric, class BasicGeneric nama class diikuti oleh sepasang kurung yang didalamnya terdapat huruf kapital A: . Ini disebut dengan sebuah parameter tipe. Penggunaan kurung ini mengindikasikan bahwa class yang dideklarasikan adalah class generic. Ini berarti bahwa class tidak bekerja dengan beberapa type referensi khusus. kemudian, amati bahwa sebuah field dari class dideklarasikan menjadi tipe A private A data; Deklarasi ini mengelompokkan bahwa field data adalah dari tipe generic, tergantung pada tipe data yang telah didesain untuk bekerja dengan object BasicGeneric. Ketika mendeklarasikan sebuah instance dari class, anda harus mengelompokkan tipe referensi dengan yang mana yang anda inginkan untuk bekerja sama. BasicGeneric basicGeneric = new BasicGeneric (data1); Syntax setelah mendeklarasi BasicGeneric mengelompokkan bahwa instance dari class ini akan bekerja dengan variabel-variabel bertipe String. Anda juga dapat bekerja denga variabel-variabel bertipe Integer atau referensi tipe yang lain. Untuk bekrja dengan Integer, potongan kode memiliki pernyataan berikut ini : BasicGeneric basicGeneric = new Pengenalan Pemrograman 2 3 J.E.N.I. BasicGeneric (data1); Anda mungkin dapat menerjemahkan sisa dari kode dengan pemahaman anda sendiri. Mempertimbangkan deklarasi dari method getData . public A getData() { return data; } Method getData mengembalikan sebuah nilai dari tipe A, Sebuah Tipe type. Ini bukan berarti bahwa method tidak akan memiliki tipe data runtime, atau even pada waktu meng-compile. Setelah Anda mendeklarasikan sebuah object yang bertipe BasicGeneric, A adalah pengikat ke sebuah tipe data yang spesifik. Instance ini akan berlaku sebagai jika ini dideklarasikan untuk memiliki tipe data spesifik ini dan tipe ini hanya dari bagian sangat awal. Pada kode yang diberikan, dua instances dari class BasicGeneric terbentuk. BasicGeneric basicGeneric = new BasicGeneric (data1); String data2 = basicGeneric.getData(); BasicGeneric basicGeneric = new BasicGeneric (data1); Integer data2 = basicGeneric.getData(); Perlu diperhatikan perhatian bahwa instantiasi dari class generic adalah hanya sama dengan instantiasi sebuah class normal kecuali bahwa tipe data khusus berada dalam <> menggantikan nama konstruktor. Informasi tambahan ini mengindikasikan tipe dari data anda akan bekerja dengan siapa untuk bagian instance ini dari class BasicGeneric.Setelah instantiasi, anda dapat mengakses anggota dari class melalui instance sekarang. Tidak ada yang lebih diperlukan untuk typecast nilai pengembalian dari method getData sejak diputuskan bahwa ini akan bekerja dengan sebuah referensi tipe data yang spesifik. 13.3.1 Pembatasan"Primitive" Sebuah pembatasan type generic dalam Java adalah mereka dibatasi oleh tipe referensi dan tidak akan bekerja dengan tipe data primitive. Sebagai contoh, pernyataan berikut akan menjadi illegal sejak int adalah sebuah tipe data primitive. BasicGeneric basicGeneric = new BasicGeneric (data1); Petama-tama Anda akan menyelesaikan type primitive sebelum menggunakan mereka sebagai arguments ke sebuah type generic. 13.3.2 Meng-compilasi Generic Untuk meng-compile source codes Java denagn type generic menggunakan JDK (v. Pengenalan Pemrograman 2 4 J.E.N.I. 1.5.0), gunakan syntax berikut ini : javac -version -source "1.5" -sourcepath src -d classes src/SwapClass.java Dimana src mengarah pada lokasi dari source code java sementara class mengarah pada lokasi dimana file class akan disimpan. Beriut ini sebuah contoh : javac -version -source "1.5" -sourcepath c:\temp -d c:\temp c:/temp/SwapClass.java 13.4 Constrained Generic Dalam contoh yang diberikan terdahulu, type parameter dari class BasicGeneric dapat memiliki beberapa referensi tipe data. Ada beberapa kasus, bagaimanapun, dimana anda ingin untuk membatasi tipe instantiasi yang potensial dari class generic. Java juga memungkinkan kita untuk membatasi set argument type yang mungkin untuk subtypes dari sebuah batas type yang diberikan. Sebagai contoh, kita mungkin ingin untuk mendefinisikan sebuah class generic ScrollPane yang merupakan sebuah template untuk sebuah Container asli yang telah dilengkapi dengan fungsi scrolling. Tipe runtime dari sebuah instance dari class ini akan sering menjadi sebuah subclass dari Container, tapi tipe static atau general adalah Container yang lebih sederhana. Untuk membatasi instantiasi tipe dari sebuah class, kita menggunakan kata kunci extends diikuti oleh class yang membatasi tipe generic sebagai bagian dari tipe parameter. Contoh berikut ini membatasi instantiasi tipe dari class ScrollPane ke subtipe dari class Container. class ScrollPane { ... } class TestScrollPane { public static void main(String args[]) { ScrollPane scrollPane1 = new ScrollPane (); // pernyataan berikutnya adalah illegal ScrollPane