2008 
 

Pocong Document 
http://pocong.wordpress.com/ 
     

echo.khannedy@gmail.com  http://pocong.wordpress.com/  8/27/2008 

J.E.N.I

Pengenalan Pemrograman 2

Versi 1.1 Juni 2007 Sumber JEDI

Pengenalan Pemrograman 2

J.E.N.I

Penulis Joyce Avestro Team Joyce Avestro Florence Balagtas Rommel Feria Reginald Hutcherson Rebecca Ong John Paul Petines Sang Shin Raghavan Srinivas Matthew Thompson Team Translator Frans Thamura Joko Pitono Eko Subiyantoro Cahya Kusuma Ratih Dwi Martha Sari Mir’atul Khusna Mufida Khansa Fitriannisa Sulistyaningtyas Allin Junikhah Bagus Chandra Rizzatama N.S Badar Agung Nugroho Kadek Surya Pranata

Persyaratan-persyaratan Untuk Latihan Laboratorium Sistem Operasi yang mendukung NetBeans IDE 5.5 berjalan pada sistem operasi yang mendukung Java VM. Dibawah ini merupakan daftar dari platform-platform yang digunakan:

• • • •

Microsoft Windows XP Professional SP2 atau yang terbaru Mac OS X 10.4.5 atau yang terbaru Red Hat Fedora Core 3 Sistem Operasi Solaris™ 10 Update 1 (SPARC® and x86/x64 Platform Edition)

NetBeans Enterprise Pack juga dapat digunakan pada platform-platform berikut ini:

• • •

Microsoft Windows 2000 Professional SP4 Solaris™ 8 OS (SPARC and x86/x64 Platform Edition) and Solaris 9 OS (SPARC and x86/x64 Platform Edition) Berbagai macam distribusi LINUX

Minimum konfigurasi Hardware Catatan: Minimum resolusi layar NetBeans IDE's adalah 1024x768 pixels.

Sistem Operasi Microsoft Windows: o Prosesor: 500 MHz Intel Pentium III workstation atau setaranya o Memori: 512 MB o Disk space: 850 MB dari free disk space Sistem operasi Linux: o Prosesor: 500 MHz Intel Pentium III workstation atau setaranya o Memori: 512 MB o Disk space: 450 MB dari free disk space Solaris OS (SPARC): o Prosesor: UltraSPARC II 450 MHz o Memori: 512 MB o Disk space: 450 MB of free disk space Solaris OS (x86/x64 Platform Edition): o Prosesor: AMD Opteron 100 Series 1.8 GHz o Memori: 512 MB o Disk space: 450 MB dari free disk space Sistem Operasi Macintosh OS X: o Prosesor: PowerPC G4 o Memori: 512 MB o Disk space: 450 MB dari free disk space

Pengenalan Pemrograman 2

dan Linux.I Konfigurasi Hardware yang direkomendasikan • Sistem Operasi Microsoft Windows: o Prosesor: 1.apple. Windows.4 GHz Intel Pentium III workstation atau setaranya o Memori: 1 GB o Disk space: 1 GB dari free disk space Sistem Operasi Linux: o Prosesor: 1.0/download.0 update 6. Sun Java System Application Server Platform Edisi 9 telah diuji dengan JDK 5.0.5 dapat diakses pada Java 2 Platform Standard Edition Development Kit 5. memerlukan Java 2 Platform Standard Edition (J2SE) 5.sun. dimana berisi Java Runtime Environment plus developer tools untuk meng-compile.5. and menjalankan aplikasi yang ditulis dengan bahasa Java. Anda dapat mendownload JDK untuk platform Anda pada • http://java.0_01 atau diatasnya). • Untuk Solaris. Anda dapat mendownload JDK dari Apple's Developer Connection site.E.0 Update 1 atau diatasnya (JDK 5.com/j2se/1. Pengenalan Pemrograman 2 .N.8 GHz Memori: 1 GB Disk space: 850 MB dari free disk space Sistem Operasi Macintosh OS X: o Prosesor: PowerPC G5 o Memori: 1 GB o Disk space: 850 MB dari free disk space Software yang diperlukan NetBeans Enterprise Pack 5.4 GHz Intel Pentium III atau setaranya o Memori: 1 GB o Disk space: 850 MB dari free disk space Solaris™ OS (SPARC®): o Prosesor: UltraSPARC IIIi 1 GHz o Memori: 1 GB o Disk space: 850 MB dari free disk space Solaris™ OS (x86/x64 platform edition): • • • • o o o Prosesor: AMD Opteron 100 Series 1.com/java (untuk mendownload JDK Anda harus melakukan register terlebih dahulu).J.0 Release 4.htm l Untuk Mac OS X. men-debug.5. versi 1. Pada: http://developer.

17 Kata Kunci Final 1.2 Kelas 1.3.5 Meng-instansiasi Sebuah Class 1.2.5 Method 1.3.11 Metode Overriding 1.3.3.4 Latihan 1.3.3.3.1 Tabel Perkalian 1.N.7 Package 1.2 Apa Itu Exception? Pengenalan Pemrograman 2 .I Daftar Isi 1 Review Konsep Dasar Dalam Java 1.1 Desain Berorientasi Object 1.2.2.6 Mengakses Anggota Object 1.9 Enkapsulasi 1.18 Inner Classes 1.4 Binatang 2 Exceptions dan Assertions 2.2 Mendeklarasikan Atribut 1.4.1 Tujuan 2.3.8 Acces Modifier 1.3 Shape 1.7 Package 1.2.1 Tujuan 1.2.3.4 Mendeklarasikan Sebuah Konstruktor 1.3.12 Interface 1.9 Abstraksi 1.3.3 Mendeklarasikan Method 1.2.3.4.10 Pewarisan 1.2.4.2.3 Struktur Program Java 1.15 Kata Kunci Super 1.2 Konsep Berorientasi Object 1.8 Enkapsulasi 1.3.6 Konstruktor 1.3.14 Kata Kunci This 1.13 Interface 1.3.2 Greatest Comman Factor(GCF) 1.11 Polimorfisme 1.2.3.10 Pewarisan 1.3.16 Kata Kunci Static 1.E.2.2.12 Kelas Abstract dan Method 1.2.3 Obyek 1.J.4.3.1 Mendeklarasikan Class Java 1.4 Atribut 1.

4.4.3.3 Sebuah Contoh 2.3.4 Latihan 3.4.6.2 Checked dan Unchecked Exceptions 2.1 User Defined Exceptions 2.4 Print n any Base :contoh yang lain 3.2 Method-method String 4.6 Assertions 2.1 Apa yang dimaksud dengan Abstrak Data Type? 3.2 Error dan Excetion Classes 2.5 Sequential representation dari Integer stack 3.7 Latihan 2.2 Menampilkan Sebuah Berlian 3 Teknik Pemrograman Lanjut 3.1 Apa yang dimaksud dengan Recursif? 3.3 Menangkap Exception 2.5.1 Keyword Throw 2.4.3.4.J.2.2 Class Math 4.6.3.2.3 Queues 3.1 Constructor String 4.3 Abstract Data Tipe 3.1 Tujuan 3.2 Sequential representation dari Integer Queues 3.E.3 User Defined Exceptions 2.5.4 Class-class Wrapper Pengenalan Pemrograman 2 .N.lang 4.2 Recursif vs Iterasi 3.1 Heksadesimal ke Desimal 2.1 Pendahuluan 2.4 Melempar Exception 2.3.3.I 2.6.5.3.3.3.2 Mengaktifkan dan Menonaktifkan Exceptions 2.2 Keyword Throws 2.4 Address Book 4 Tour dari Package java.3 Sintax Assertions 2.2 Keyword Finally 2.3 Linked representation dari Integer Queues 3.3.3 Factorials : contoh 3.1 Faktor Persekutuan Terbesar 3.8 Java Collections 3.1 Try-Catch 2.3 Class StringBuffer 4.2.2.5 Kategori Exception 2.4 Sequential dan Linked representation 3.1 Tujuan 4.2 Stacks 3.3 Class String dan StringBuffer 4.3.7.2.2.1 Exception Classes dan Hierarchy 2.3.3.2 Rekusif 3.2.4.7.7 Linked representation dari Integer stack 3.6 Linked list 3.

J.E.N.I

4.5 Class Process dan Runtime 4.5.1 Class Process 4.5.2 Class Runtime 4.5.3 Membuka Registry Editor 4.6 Class System 4.7 Latihan 4.7.1 Evaluasi Ekspresi 4.7.2 Palindrome 4.7.3 Notepad 5 Aplikasi Berbasis Text 5.1 Tujuan 5.2 Argument Command-Line dan System Properties 5.3 Membaca Standart Input 5.4 Menangani File 5.4.1 Membaca Sebuah File 5.4.2 Menulis Sebuah File 5.5 Latihan 5.5.1 Spasi manjadi Underscore (_) 6 Algoritma Sorting 6.1 Tujuan 6.2 Insertion sort 6.2.1 Algoritma 6.2.2 Sebuah Contoh 6.3 Selection sort 6.3.1 Algoritma 6.3.2 Sebuah Contoh 6.4 Merge Sort 6.4.1 Pola Devide and Conquer 6.4.2 Memahami Merge Sort 6.4.3 Algoritma 6.4.4 Sebuah Contoh 6.5 Quick Sort 6.5.1 Algoritma 6.5.2 Sebuah Contoh 6.6 Latihan 6.6.1 Insertion Sort 6.6.2 Selection Sort 6.6.3 Merge Sort 6.6.4 Quicksort 7 Abstract Windowing Toolkit dan Swing 7.1 Tujuan 7.2 Abstract Windowing Toolkit vs. SWING 7.3 Komponen GUI pada AWT 7.3.1 Window Classes Fundamental 7.3.2 Grafik 7.3.3 Beberapa Komponen AWT 7.4 Layout Manager 7.4.1 FlowLayout Manager 7.4.2 BorderLayout Manager

Pengenalan Pemrograman 2

J.E.N.I

7.4.3 GridLayout Manager 7.4.4 Panel dan Tampilan Kompleks 7.5 Komponen Swing 7.5.1 Setting up Top-Level Containers 7.5.2 Contoh Jframe 7.5.3 Contoh JOptionPane 7.6 Latihan 7.6.1 Tic-Tac-Toe 8 GUI Event Handling 8.1 Tujuan 8.2 Delegation Event Model 8.2.1 Registrasi Listeners 8.3 Class-class Event 8.4 Event Listeners 8.4.1 Method ActionListener 8.4.2 Method MouseListener 8.4.3 Method-method MouseMotionListener 8.4.4 Method-method WindowListener 8.4.5 Petunjuk Untuk Menciptakan Aplikasi Handling GUI Events 8.4.6 Contoh Mouse Events 8.4.7 Contoh Menutup Window 8.5 Adapter Classes 8.5.1 Close Window Example 8.6 Inner Class dan Anonymous Inner Class 8.6.1 Inner Class 8.6.2 Contoh Menutup Window 8.6.3 Anonymous Inner Class 8.6.4 Contoh Menutup Window 8.7 Latihan 8.7.1 Tic-Tac-Toe 9 Threads 9.1 Tujuan 9.2 Definisi dan dasar-dasar thread 9.2.1 Definisi Thread 9.2.2 State dari Thread 9.2.3 Prioritas 9.3 Class Thread 9.3.1 Constructor 9.3.2 Constant 9.3.3 Methods 9.3.4 Sebuah Control Thread 9.4 Membuat Threads 9.4.1 Menurunkan (extend) class thread 9.4.2 Mengimplementasikan interface Runnable 9.4.3 Extend vs Implement 9.4.4 Sebuah contoh Penggunaan method join 9.5 Sinkronisasi 9.5.1 Sebuah Contoh yang Tidak Disinkronisasi 9.5.2 Mengunci Object

Pengenalan Pemrograman 2

J.E.N.I

9.5.3 Contoh Synchronized Pertama 9.5.4 Contoh Synchronized Kedua 9.6 Komunikasi antar Thread(InterThread) 9.6.1 Contoh Produsen-Konsumen 9.7 Kemampuan Concurrency 9.7.1 Interface Executor 9.7.2 Interface Callable 9.8 Latihan 9.8.1 Banner 10 Jaringan 10.1 Konsep Dasar jaringan 10.1.1 IP Adress 10.1.2 Protokol 10.1.3 Port 10.1.4 Paradigma Client/Server 10.1.5 Sockets 10.2 The Java Networking Package 10.2.1 The ServerSocket dan The Socket Class 10.2.2 The MultiCastSocket dan DatagramPacket Class 10.3 Latihan 10.3.1 Trivia Server 11 Applet 11.1 Tujuan 11.2 Membentuk Applets 11.2.1 Hello World Applet 11.3 Method-method Applet 11.3.1 Siklus Applet (The Applet Life Cicle) 11.3.2 Method paint 11.3.3 Show Status Method 11.3.4 Memainkan Audio Clips 11.4 Applet HTML Tags 11.5 Latihan 11.5.1 Tic-Tac-toe Applet satu-player 12 Advanced IO Stream 12.1 Tujuan 12.2 Tipe-tipe Stream yang Umum Digunakan 12.2.1 Stream Karakter dan byte 12.2.2 Input dan Output Stream 12.2.3 Node dan Stream Filter 12.3 Class File 12.4 Class Reader 12.4.1 Method reader 12.4.2 Class Node Reader 12. Class-class Filter Reader 12.5 Class-class Writer 12.5.1 Writer Method 12.5.3 Filter Writer Classes 12.5.2 Node Writer Classes 12.7 Merubah contoh Reader/Writer

Pengenalan Pemrograman 2

6 Exercise 13.12.1 Swapping Pengenalan Pemrograman 2 .1 Pembatasan ”Primitive” 13.J.1 Method Input Stream 12.13.4 Constrained Generics 13.1 Method Ouput Stream 12.2 Class-class Node Output Stream 12.N.1 Kata Kunci Transient 12.12.12.3 Mendeklarasikan Sebuah Class Generic 13.3 Deserialisasi: Membaca Sebuah Object Stream 12.8.9 Class-class Ouput Stream 12.12 Serialisasi 12.3 Class-class Filter Output Stream 12.9.6.5 Mendeklarasikan sebuah Method Generic 13.8.3 Class-class Filter InputStream 12.10 Contoh Dasar Input Stream/Output Stream 12.3.2 Mengapa Generics? 13.3.1 Tujuan 13.2 Meng-Compilasi Generics 13.9.6 Contoh Dasar Reader/Writer 12.13 Latihan 12.11 Contoh Modifikasi Input Stream/Output Stream 12.8.E.9.2 Serialisasi : Menulis Suatu object Stream 12.8 Class InputStream 12.1 Enkripsi Sederhana 13 Pengenalan Generic 13.2 Class-class Node Input Stream 12.I 12.

Selain itu juga menyediakan manfaat akan kebebasan pengembangan. Membedakan antara method overloading dan method overridding 1. super. 1.E.1 Desain Berorientasi object Desain berorientasi object adalah sebuah teknik yang memusatkan desain pada object dan class berdasarkan pada skenario dunia nyata.      class object atribut method cnstructor 2.2 Class Pengenalan Pemrograman 2 1 . Hal ini menegaskan keadaan(state).J.1 Tujuan Sebelum melangkah pada fitur-fitur menarik yang ada pada Java. Mengetahui dengan jelas tentang konsep lanjutan berorientasi object dan menggunakannya dengan baik       package enkapsulasi abstraksi pewarisan polimorfisme interface 3.I. Mengetahui dengan jelas penggunaan kata kunci this. diharapkan pembaca dapat : 1. Mengetahui dan menggunakan konsep dasar beorientasi object. Pada akhir pembahasan. mempertinggi kemampuan dalam modifikasi dan meningkatkan penggunaan kembali software. mari kita melihat kembali beberapa hal yang telah Anda pelajari pada pelajaran pemograman pertama Anda. mempermudah pemeliharaan.2 Konsep Berorientasi object 1. BAB 1 Review Konsep Dasar dalam Java 1. behaviour dan interaksi dari object.N. meningkatkan kualitas.2. final dan static 4.2. Pembelajaran kali ini menyajikan diskusi tentang perbedaan konsep-konsep berorientasi object dalam Java.

Perhatikan pada hirarki berikut. 1. contoh dari sebuah object yaitu entiti Student.10 Pewarisan Pewarisan adalah hubungan antara class dimana dalam satu class ada superclass atau class induk dari class yang lain. 1. 1.2.2. Sebagai contoh.J. Ingat bahwa constructor bukan member (yaitu atribut.2. 1. Dikenal juga sebagai member data. 1. Ini juga dikenal sebagai instance.2.2. Inilah instance sebenarnya dari sebuah class.E.4 Atribut Atribut menunjuk pada elemen data dari sebuah object. Pengenalan Pemrograman 2 2 . dimana model dari object yang Anda buat berdasarkan pada tipe data baru ini. abstraksi mengabaikan aspek dari subyek yang tidak sesuai dengan tujuan yang ada supaya lebih banyak mengkonsentrasikan yang ada.N.2.9 Abstraksi Sementara enkapsulasi menyembunyikan detail.2. Ia dijalankan sebagai blueprint. Strukturnya dapat disamakan dengan direktorinya. method atau inner class dari sebuah object). properti atau sebuah field data. 1. Dalam sistem registrasi siswa. method yang mungkin tersedia untuk entiti siswa adalah method register. Atribut menyimpan informasi tentang object. Pewarisan menunjuk pada properti dan behaviour yang diterima dari nenek moyang dari class. Kembali lagi ke contoh sistem registrasi siswa.2.5 Method Sebuah method menjelaskan behaviour dari sebuah object. behaviour dan identitas yang yang tugasnya dirumuskan dalam suatu lingkup masalah dengan baik.6 Constructor Constructor adalah sebuah tipe khusus dari method yang digunakan untuk membuat dan menginisialisasi sebuah object baru.8 Enkapsulasi Enkapsulasi menunjuk pada prinsip dari menyembunyikan desain atau mengimplementasikan informasi yang tidak sesuai pada object yang ada. Ini dikenal juga sebagai hubungan “is-a”.I. Method juga dikenal sebagai fungsi atau prosedur. Instance dibuat sewaktu Anda meng-instantiate class menggunakan kata kunci new. 1. Class mengizinkan Anda dalam mendeklarasikan tipe data baru.7 Package Package menunjuk pada pengelompokkan class dan/atau subpackages. 1. atribut dari sebuah siswa adalah nomor siswa.3 Object Sebuah object adalah sebuah entiti yang memiliki keadaan. variabel instance.

3. 1.N. “poli” berarti banyak sementara “morph” berarti bentuk.11 Polimorfisme Polimorfisme adalah kemampuan dari sebuah object untuk membolehkan mengambil beberapa bentuk yang berbeda. yang mana boleh dikombinasikan dengan tipe yang lain dari modifier. Ketika sebuah class implements sebuah interface.1 Mendeklarasikan class Java <classDeclaration> ::= <modifier> class <name> { <attributeDeclaration>* <constructorDeclaration>* <methodDeclaration>* } dimana <modifier> adalah sebuah access modifier.I.2. Pengenalan Pemrograman 2 3 . 1.E. 1. Secara harfiah.J. Sebagaimana juga UnderwaterSuperHero “is-a” SuperHero 1. ini mengimplementasikan semua method yang dideklarasikan dalam interface. kita lihat bahwa object SuperHero dapat juga menjadi object FlyingSuperHero atau object UnderwaterSuperHero. Menunjuk pada contoh sebelumnya pada pewarisan. Catatan bahwa FlyingSuperHero “is-a” SuperHero. SuperHero FlyingSuperHero UnderwaterSuperHero Gambar 1.12 Interface Sebuah interface adalah sebuah contract dalam bentuk kumpulan method dan deklarasi konstanta.2.3 Struktur Program Java Pada bagian ini meringkaskan syntax dasar yang digunakan dalam pembuatan aplikasi Java.1: Contoh Pewarisan SuperHero adalah superclass dari class FlyingSuperHero dan UnderwaterSuperHero.

0f.2 Mendeklarasikan Atribut <attributeDeclaration> ::= <modifier> <type> <name> [= <default_value>].E.println(superPowers[i]). Class SuperHero { String superPowers[]. public class AttributeDemo { private String studNum.3 Mendeklarasikan Method <methodDeclaration> ::= <modifier> <returnType> <name>(<parameter>*) { <statement>* } <parameter> ::= <parameter_type> <parameter_name>[. i < superPowers.superPowers = superPowers.3.I. Petunjuk Penulisan Program: * = berarti bahwa boleh ada 0 atau lebih kejadian dari deret tersebut yang menggunakannya juga. public boolean graduating = false.N. void setSuperPowers(String superPowers[]) { this.out. Inilah contohnya.length.] Pengenalan Pemrograman 2 4 . <description> = menunjukkan bahwa Anda harus mengganti nilai sebenarnya untuk bagian ini daripada menguranginya penulisannya. Contoh berikut ini mendeklarasikan blueprint SuperHero. String college.J. protected float unitsTaken = 0. <type> ::= byte | short | int | long | char | float | double | boolean | <class> Petunjuk Penulisan Program: [] = Menunjukkan bahwa bagian ini hanya sebagai pilihan. } } } 1. } 1.3. } void printSuperPowers() { for (int i = 0. Ingat bahwa untuk class teratas. i++) { System. acces modifier yang valid hanyalah public dan package(yakni jika tidak ada acces modifier mengawali kata kunci class).

dan private. protected.4 Mendeklarasikan sebuah Constructor <constructorDeclaration> ::= <modifier> <className> (<parameter>*) { <statement>* } Jika tidak ada constructor yang disediakan secara jelas. constructor default secara otomatis membuatkannya untuk Anda. dengan sederhana kita gunakan kata kunci new diikuti dengan pemanggilan sebuah constructor. class ConstructObj { int data. } ConstructorDemo(int data) { this.J.3. int getData() { return data.5 Meng-instantiate sebuah class Untuk meng-instantiate sebuah class. } } 1.I. Perhatikan contoh berikut. Sebagai contoh: class MethodDemo { int data. Mari lihat langsung ke contohnya. } void setMaxData(int data1. Constructor default tidak membawa argumen dan tidak berisi pernyataan pada tubuh class. } void setData(int data) { this.3.data = data. public ConstructorDemo() { data = 100.E. Constructor tidak memiliki nilai return.N.data = data. <modifier> yang valid untuk constructor adalah public. class ConstructorDemo { private int data. ConstructObj() { /* menginisialisasi data */ } public static void main(String args[]) { Pengenalan Pemrograman 2 5 . Petunjuk Penulisan Program: Nama constructor harus sama dengan nama class. } } 1. int data2) { data = (data1>data2)? data1 : data2.

out.J. Pengenalan Pemrograman 2 6 . ConstructObj() { /* inisialisasi data */ } void setData(int data) { this.<member> Contoh selanjutnya berdasar pada sebelumnya dengan pernyataan tambahan untuk mengakses anggota dan method tambahan. Penggunaanya seperti berikut: <object>. Untuk mengimpor package lain.setData = 10. //access setData() System.I.data = data. kita gunakan syntax berikut: <importDeclaration> ::= import <packageName. } public static void main(String args[]) { ConstructObj obj = new ConstructObj(). class ConstructObj { int data. source code Anda harus memiliki format berikut: [<packageDeclaration>] <importDeclaration>* <classDeclaration>+ Petunjuk Penulisan Program: + menunjukkan bahwa boleh ada 1 atau lebih kejadian pada baris ini dalam pengaplikasiannya.elementAccessed>.N.3. //instantiation obj.data). kita gunakan syntax berikut: <packageDeclaration> ::= package <packageName>. //access data } } 1. ConstructObj obj = new ConstructObj().println(obj. } } //di-instantiate 1.6 Mengakses Anggota object Untuk mengakses anggota dari sebuah object.7 Package Untuk menunjukkan bahwa file asal termasuk package khusus. kita gunakan notasi “dot”.3.E. Dengan ini.

util.reports. import java.10 Pewarisan Pengenalan Pemrograman 2 7 . class Encapsulation { private int secret.2: Acces Modifier Yes default/package Yes Yes protected Yes Yes Yes public Yes Yes Yes Yes 1.processing. Catatan bahwa field ini tidak langsung diakses oleh program lain menggunakan method getter dan setter. Sebagai contoh.J. package registration.N. //field tersembunyi public boolean setSecret(int secret) { if (secret < 1 || secret > 100) { return false.*.lang. return true.E. private class yang sama package yang sama package yang berbeda (subclass) package yang berbeda (nonsubclass) Tabel 1.*. } public getSecret() { return secret. } this. Contoh berikut menyembunyikan field secret.9 Enkapsulasi Menyembunyikan elemen dari penggunaan sebuah class dapat dilakukan dengan pembuatan anggota yang ingin Anda sembunyikan secara private. } } 1. import registration.8 Acces Modifier Tabel berikut meringkas acces modifier dalam Java.I. //imported by default class MyClass { /* rincian dari MyClass */ 1.3.3.3.secret = secret.List. import java.

display(3). Untuk membuat class anak atau subclass berdasarkan class yang telah ada. int y. Signature mengikutkan tipe return. Sebuah class hanya dapat meng-extend satu class induk. Acces modifier untuk method yang dibutuhkan tidak harus sama.E. Inilah perbedaan dari method overloading.N.*. } class ColoredPoint extends Point { Color color.out. Superclass SuperObj = SubObj. class Point di bawah ini adalah superclass dari class ColoredPoint.11 Method Overriding Method subclass override terhadap method superclass ketika subclass mendeklarasikan method yang signaturenya serupa ke method dalam superclass. } } class Subclass extends Superclass { void display(int k) { //method overriding System. nama dan daftar parameter method tetapi itu tidak termasuk acces modifier dan tipe yang lain dari kata kunci seperti final dan static. Sebagai contoh.J. class Superclass { void display(int n) { System. Bagaimanapun. acces modifier Pengenalan Pemrograman 2 8 . ((Superclass)SubObj). class Point { int x.println("super: " + n). kita gunakan kata kunci extend dalam mendeklarasikan class. Signature dari method hanyalah informasi yang ditemukan dalam definisi method bagian atas.display(4). SubObj.println("sub: " + k). } } class OverrideDemo { public static void main(String args[]) { Subclass SubObj = new Subclass().out.awt. sub: 3 sub: 4 Pemanggilan method ditentukan oleh tipe data sebenarnya dari object yang diminta method. } } Ini akan menghasilkan keluaran sebagai berikut.I. } 1. import java. Method overloading secara singkat didiskusikan dalam sub bagian pada kata kunci this.3.

fields and methods */ } Kata kunci tidak dapat digunakan pada constructor atau method static. Sebuah class yang berisi method abstract harus dideklarasikan sebagai sebuah class abstract.I.). 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 .12 Class Abstract dan Method Bentuk umum dari sebuah method abstract adalah sebagai berikut: abstract <modifier> <returnType> <name>(<parameter>*).E. 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. dari method overridding mengharuskan salah satunya punya acces modifier yang sama seperti itu dari method overridden atau acces modifier yang kurang dibatasi.N.J. Jika tidak subclass sendiri dapat dideklarasikan sebagai abstract. Perhatikan contoh selanjutnya.abstract class <name> { /* constructors. Periksa yang mana dari method overridding berikut akan menyebabkan waktu meng-compile akan menyebabkan error. Class yang meng-extends sebuah class abstract harus mengimplementasikan semua method abstract. Ini juga penting untuk diingat bahwa class abstract tidak dapat di-instantiate.3. abstract <modifier> <returnType> <name>(<parameter>*).

. Seperti mendeklarasikan class teratas.E.out. Pengenalan Pemrograman 2 10 ..out."). Sebagai contoh: abstract class SuperHero { String superPowers[].. } class UnderwaterSuperHero extends SuperHero { void displayPower() { System. <interfaceDeclaration> ::= <modifier> interface <name> { <attributeDeclaration>* [<modifier> <returnType> <name>(<parameter>*).println("Fly. acces modifier yang valid hanyalah public package(yakni jika tidak ada acces modifier mengawali kata kunci class).out.println("Communicate with sea creatures. dan Class mengimplementasikan sebuah interface yang telah ada dengan menggunakan kata kunci implements.out.length.N. } void printSuperPowers() { for (int i = 0. Contoh berikut menunjukkan bagaimana mendeklarasikan dan menggunakan sebuah interface.J. } } class FlyingSuperHero extends SuperHero { void displayPower() { System. } } abstract void displayPower().. i < superPowers.3.. } } 1. Berikut syntax-nya.").println("Fast swimming ability.println(superPowers[i]). void setSuperPowers(String superPowers[]) { this. Sebuah class boleh mengimplementasikan lebih dari satu interface. Petunjuk Penulisan Program: Secara mutlak atribut adalah static dan final dan harus diinisialisasi dengan nilai konstanta.. System.superPowers = superPowers.]* } Anggotanya adalah public ketika interface dideklarasikan public.13 Interface Mendeklarasikan sebuah interface pada dasarnya mendeklarasikan sebuah class tetapi sebagai penggantinya menggunakan kata kunci class.I. Class ini dibuat untuk mengimplementasikan semua method interface."). kata kunci interface digunakan. i++) { System.

data = data. class ThisDemo1 { int data.3. /* this. mc2.N. perhatikan kode berikut dimana variabel data disediakan sebagai sebuah atribut dan parameter lokal pada saat yang sama.out.E.myMethod().Adanya ambigu pada atribut lokal dari variabel lokal 2."). } } 1.Menunjuk pada constructor lain.J. } void myMethod() { System. MyClass2 mc2 = new MyClass2(). void method(int data) { this.14 Kata kunci this Kata kunci this dapat digunakan untuk beberapa alasan berikut: 1.out.iMethod(). } } class MyClass2 implements MyInterface { public void iMethod() { System. } } class InterfaceDemo { public static void main(String args[]) { MyClass1 mc1 = new MyClass1(). mc1.Menunjuk pada object yang meminta method non-static 3.data menunjuk ke atribut sementara data menunjuk ke variabel lokal */ } } Contoh berikut menunjukkan bagaimana object this secara mutlak menunjuk ketika anggota nonPengenalan Pemrograman 2 11 . Sebagai contoh pada maksud pertama.println("Another method.").println("Another implementation.out. } class MyClass1 implements MyInterface { public void iMethod() { System. mc1.").I. interface MyInterface { void iMethod().iMethod().println("Interface method.

} ThisDemo3(int data) { this. class ThisDemo2 { int data.data = data.I. String sNum) { super(fname. Contoh selanjutnya memiliki constructor overloaded dan referensi this yang dapat digunakan untuk menunjuk versi lain dari constructor. } Sebelum melihat ke contoh yang lain.N. void method() { System.E.out. Constructor seperti juga method dapat juga menjadi overload. String lname) { firstName = fname. String lastName. //this.J. 1. class ThisDemo3 { int data.method(). Person(String fname. Student(String fname. mari pertama meninjau pengertian method overloading. } } class Student extends Person { String studNum. ThisDemo3() { this(100). Pengenalan Pemrograman 2 12 . Program berikut mendemonstrasikan bagaimana referensi super digunakan untuk memanggil constructor superclass. //this. lastName = lname.3.data } void method2() { method(). Method overloaded harus berbeda dalam nomor dan/atau tipe dari parameternya. Method yang berbeda dalam class dapat memberi nama yang sama asalkan list parameter juga berbeda. class Person { String firstName.println(data). Super digunakan untuk meminta constructor superclass.15 Kata kunci super Penggunaan kata kunci super berhubungan dengan pewarisan. static dipanggil. } } Petunjuk Penulisan Program: Memanggil this() harus ada pernyataan pertama dalam constructor. String lname. lname). Super juga dapat digunakan seperti kata kunci this untuk menunjuk pada anggota dari superclass.

void display_a(){ System. Ini harus berada pada pernyataan pertama dalam constructor superclass. void display_a(){ System. Subclass SubObj = new Subclass().E. SuperObj.set_super_a(3).display_super_a(). } } class Subclass extends Superclass { int a.println("a = " + a). Kata kunci dapat juga digunakan untuk menunjuk anggota superclass seperti yang ditunjukkan pada contoh berikut. } void display_super_a(){ super. System. } } Petunjuk Penulisan Program: super() menunjuk pada superclass dengan segera. SubObj.display_a(). studNum = sNum. SubObj. } } Program tersebut akan menampilkan hasil berikut.display_a(). SuperObj.N.J.a). SubObj. } } class SuperDemo { public static void main(String args[]){ Superclass SuperObj = new Superclass().out. class Superclass{ int a. SubObj.display_a().out.I. a = 1 a = 2 a = 3 2 Pengenalan Pemrograman 2 13 .a = n.out.println(SubObj.println("a = " + a).a = 2.a = 1. } void set_super_a(int n){ super.

Method class mungkin dapat diambil tanpa membuat sebuah object dari class tersebut.a+". Demo.out. method dan class.println("This is a static block.a). class Demo { static int a = 0. } static { //blok static System.println(d. Ditambahkan juga.a += 3. This is a static block. Sebagai contoh.out. " +e. System."). Ini artinya bahwa variabel dapat diakses oleh semua instance dari class.staticMethod(0). ingat bahwa itu secara mudah dibatasi apa yang kita dapat lakukan dengan variabel. 4 1.3. Kata kunci ini menyediakan static atau anggota class untuk diakses sama sebelum beberapa instance dari class dibuat.out. Kata kunci static dapat juga diaplikasikan pada blok.a).println(Demo. Variabel class bersifat seperti variabel umum. Ini dinamakan dengan blok static. mereka tidak dapat menunjuk this dan super.E. Pernyataan berikut akan menyebabkan terjadi compilation error: Pengenalan Pemrograman 2 14 . } } Keluaran dari source kode ditunjukkan di bawah ini.3. 1 5 1 0 1 4.17 Kata Kunci final Kata kunci final dapat diaplikasikan pada variabel.I. Untuk mengingat fungsi dari kata kunci.out. Blok ini dieksekusi hanya sekali. d.N.a). d. a += 1. ketika class diisi.println(Demo. Bagaimanapun.out. Nilai dari variabel final dapat tidak lama diubah sesudah nilainya telah diatur. 1.println(i). " +d. method dan class.J. Demo d = new Demo(). System.println(e.out. static void staticMethod(int i) { System.a).16 Kata Kunci static Kata kunci static dapat digunakan untuk anggota dari sebuah class. 4.a +". Demo e = new Demo(). final int data = 10.staticMethod(5). } } class StaticDemo { public static void main(String args[]) { System. mereka hanya dapat mengakses anggota static dari class. System. Hal ini biasanya digunakan untuk menginisialisasi variabel class.

kita butuh sebuah instance dari inner class. Method-method dari inner class dapat secara langsung mengakses anggota dari outer class. final void myMethod() { //in a parent class } myMethod tidak dapat lama di-override dalam class anak. InnerClass ic = oc.J. public WrongClass extends MyClass { } 1. class final tidak dapat diwariskan tidak seperti class yang biasanya. class InnerClass { int data2 = 10. } } Untuk mampu mengakses anggota dari inner class.println(data). Pengenalan Pemrograman 2 15 .18 Inner Classes Sebuah inner class secara mudah dideklarasikan dalam class lain. System. class OuterClass { int data = 5.data). ic.println(data2).out.E. System.method().N. } } public static void main(String args[]) { OuterClass oc = new OuterClass(). System. Method final tidak dapat di-override dalam class anak.out.3.out. Pernyataan ini akan menyebabkan kesalahan compilation terjadi karena MyClass dapat tidak lama di-extended. final public class MyClass { } Petunjuk Penulisan Program: Perintah penulisan kata kunci final dan public memungkinkan bertukar tempat.out. void method() { System.println(ic.I.new InnerClass().println(oc. data++.data2).

Size untuk tabel perkalian : 5 Tabel perkalian dari size 5: 1 1 2 3 4 5 1 2 3 4 5 4 6 8 10 9 12 15 16 20 25 2 3 4 5 1.1 Tabel Perkalian Tulis program yang mempunyai masukkan size dari user dan mencetak tabel perkalian dengan size yang ditetapkan. Sebagai contoh. Semua method ini tidak punya argumen atau nilai return. Method printShapeLength dan printShapeWidth yang mencetak panjang dan lebar object yang juga termasuk dalam class ini. Menggunakan pewarisan.4.4.E. Method ini hanya mengeluarkan bagaimana object Animal makan dan bergerak. class mempunyai method printShapeInfo.2 Greatest Common Factor(GCF) Tulis sebuah program yang mempunyai tiga integer dan menghitung nilai GCF dari tiga angka. 1. Input 1: 25 Input 2: 15 Input 3: 35 GCF: 5 Input 1: 1 Input 2: 2 Input 3: 3 GCF: 1 Input 1: 9 Input 2: 27 Input 3: 12 GCF: 3 1.I.J. class memiliki dua field String: name dan size.4. Juga memiliki method printShapeName dan printShapeSize. Anda juga harus meng-override printShapeInfo untuk mencetak keluaran field tambahan dalam subclass juga. Buat class Fish dan Bear yang menggunakan interface Animal.4. dimana mencetak nama dan size dari object.4 Latihan 1.3 Shape Buatlah class Shape. Class ini mempunyai dua tambahan field integer: length dan width. berturut-turut. Pengenalan Pemrograman 2 16 .4 Binatang Buatlah interface Animal yang mempunyai tiga method:eat dan move. dimana hanya mengeluarkan nilai name dan field size dari object Shape.N. GCF adalah angka terbesar yang secara rata dibagi ke semua angka yang diberikan. buat class Square dengan field yang sama dan method seperti itu dari class Shape. 1. seekor kelinci memakan wortel dan bergerak dengan melompat. Terserah kepada Anda bagaimana menggunakan method eat dan move.

Pengenalan Pemrograman 2 1 .1 Tujuan Dasar penanganan exception telah dikenalkan pada Anda di pelajaran pemrograman pertama. Membedakan penggunaan antara throw dengan throws 3. Menggunakan exception class yang berbeda – beda 4. Pada akhir pembahasan. dalam class ini terdapat dua kategori umum : Error class dan Exception class. Membuat exception class tersendiri 6.2. catch dan finally 2. Untuk menghindari pemborosan waktu pada proses error-checking.2 Error dan Exception Classes Seluruh exceptions adalah subclasses. Kesalahan (errors) yang terjadi saat runtime. 2.J. Menangani exception dengan menggunakan try. input yang tidak benar dan membuka file yang tidak ada. BAB 2 Exceptions dan Assertions 2. Terdapat beberapa tipe error yang dapat muncul. mengakses elemen di luar jangkauan sebuah array. Exception adalah singkatan dari Exceptional Events.2 Apa itu Exception? 2.N. dari sebuah root class Throwable. Menggunakan assertions 2. baik secara langsung maupun tidak langsung. Sebagai contoh adalah error pembagian 0. Umumnya hal tersebut disebabkan oleh beberapa kesalahan pada kode program. Menjelaskan keunggulan penggunaan assertions 7.E. Exception class menunjukkan kondisi yang dapat diterima oleh user program. Membedakan antara checked exceptions dan unchecked exceptions 5. Contoh dari exceptions adalah pembagian oleh 0 dan error di luar jangkauan array.2. diharapkan pembaca dapat : 1. menyebabkan gangguan pada alur eksekusi program. Java menyediakan mekanisme penanganan exception.1 Pendahuluan Bugs dan error dalam sebuah program sangat sering muncul meskipun program tersebut dibuat oleh programmer berkemampuan tinggi.I. Kemudian. Bab ini membahas secara lebih dalam mengenai exception dan sedikit menyinggung tentang assertion.

out.”).3 Sebuah Contoh Perhatikan contoh program berikut : class DivByZero { public static void main(String args[]) { System. Aksi tersebut pertama-tama akan menampilkan deskripsi exception yang terjadi. Jika tidak terdapat kode yang menangani exception yang terjadi.lang.I.J.java:3) Pesan tersebut menginformasikan tipe exception yang terjadi pada baris dimana exception itu berasal.E. Bagaimana jika Anda ingin melakukan penanganan atas exception dengan cara yang berbeda? Untungnya.N. } } Jika kode tersebut dijalankan. Error class digunakan oleh Java run-time untuk menangani error yang muncul pada saat dijalankan. 2.main(DivByZero. Secara umum hal ini di luar control user karena kemunculannya disebabkan oleh run-time environment.out. Sebagai contoh adalah out of memory dan harddisk crash.ArithmeticException: / by zero at DivByZero. yaitu try. Pada bagian akhir. bahasa pemrograman Java memiliki 3 keywords penting dalam penanganan exception.println(3/0). Inilah aksi default yang terjadi bila terjadi exception yang tidak tertangani. akan didapatkan pesan kesalahan sebagai berikut : Exception in thread "main" java. Pengenalan Pemrograman 2 2 . Kemudian akan ditampilkan stack trace yang mengindentifikasi method dimana exception terjadi. catch dan finally.println(“Cetak. System. aksi default tersebut akan menghentikan program secara paksa.2. aksi default akan bekerja otomatis.

”). kemudian membahas finally pada bagian akhir.out. } } Kesalahan pembagian dengan bilangan 0 adalah salah satu contoh dari ArithmethicException. } catch (<ExceptionTypeN> <ObjName>) { <handler if ExceptionTypeN occurs> } Petunjuk Penulisan Program : Blok catch dimulai setelah kurung kurawal dari kode try atau catch terkait.”). 2. Program tersebut menangani kesalahan yang terjadi dengan menampilkan deskripsi dari permasalahan. Tipe exception kemudian mengindikasikan klausa catch pada class ini.println(“Cetak. namun finally bersifat opsional.println(exc).out. Pengenalan Pemrograman 2 3 . catch dan finally digunakan dalam menangani bermacam tipe exception.3. 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.E.I.out.N. keyword try.J.3 Menangkap Exception 2.. Berikut ini adalah penulisan try-catch secara umum : try { <code to be monitored for exceptions> } catch (<ExceptionType1> <ObjName>) { <handler if ExceptionType1 occurs> } .println(3/0)..Catch Seperti yang telah dijelaskan sebelumnya. } catch (ArithmeticException exc) { //Reaksi atas kejadian System. } System. Akan lebih baik jika memfokuskan pada dua keyword pertama. System.1 Try . 3 Keyword tersebut digunakan bersama.println(“Setelah Exception.

out.println(“2 parameters are required!").”).println(“After exception.println(a/b).N. //baris 4 System. class NestedTryDemo { public static void main(String args[]){ try { int a = Integer. Berikut adalah contoh kode yang menangani lebih dari satu exception : class MultipleCatch { public static void main(String args[]) { try { int den = Integer. Output program saat eksekusi akan terlihat sebagai berikut : java. } } Pengenalan Pemrograman 2 4 .parseInt(args[0]).ArithmeticException: / by zero After exception.parseInt(args[1]). baris ke-4 akan menghasilkan kesalahan berupa ArrayIndexOutOfBoundsException bilamana seorang user alpa dalam memasukkan argument.”).I.out.out. } } Pada contoh ini. } } catch (ArrayIndexOutOfBoundsException) { System.println(3/den).out. 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. terjadinya bermacam tipe kesalahan dapat ditangani menggunakan beberapa blok catch.println(“Missing argument.out. Perlu dicatat bahwa blok try dapat hanya menyebabkan sebuah exception pada satu waktu. } catch (ArrayIndexOutOfBoundsException exc2) { System.lang. //baris 5 } catch (ArithmeticException exc) { System.println(“Divide by zero error!").parseInt(args[0]).”). } catch (ArithmeticException e) { System. try { int b = Integer.out. namun dapat pula menampikan tipe exception yang berbeda di lain waktu.E.J. System. sedang baris ke-5 akan menghasilkan kesalahan ArithmethicException jika pengguna memasukkan nilai 0 sebagai sebuah argument. } System.out.println(“Nilai Pembagi 0. Dalam hal ini. Bagian kode yang terdapat pada blok try dapat menyebabkan lebih dari satu tipe exception.

out. class NestedTryDemo2 { static void nestedTry(String args[]) { try { int a = Integer.2 Keyword Finally Saatnya Anda mengimplementasikan finally dalam blok try-cacth. } catch (ArithmeticException e) { System. } } public static void main(String args[]){ try { nestedTry(args). } catch (ArrayIndexOutOfBoundsException e) { System.println(a/b).parseInt(args[0]). Berikut ini cara penggunaan keyword tersebut : try { <kode monitor exception> } catch (<ExceptionType1> <ObjName>) { <penanganan jika ExceptionType1 terjadi> } .E.out.J.out.parseInt(args[1]).I. System. } finally { <kode yang akan dieksekusi saat blok try berakhir> } Pengenalan Pemrograman 2 5 . } 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.println("Divide by zero error!").N. int b = Integer.3.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.

} catch (Exception e){ System. Blok kode tersebut juga akan menghasilkan nilai true meskipun return. return. Blok kode ini selalu tereksekusi walaupun sebuah exception terjadi atau tidak pada blok try. throw new RuntimeException("demo case ketiga"). Penulisan dalam blok tersebut juga mengalami indentasi. Yang terakhir.out.out. } } public static void main(String args[]){ for (int i=1.println(e.out. } } } Pengenalan Pemrograman 2 6 . i++) { try { FinallyDemo. exception yang terjadi tidak terdefinisikan pada blok catch manapun. kode program memiliki spesifikasi tersendiri dalam blok catch terhadap exception yang terjadi. System.out.myMethod(i).println("case Kedua"). 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.getMessage()).I.getMessage()).N. continue ataupun break. throw new Exception("demo case keempat").println("case keempat"). } System. Dalam hal ini. kebalikan skenario ketiga. continue ataupun break tereksekusi. } } catch (RuntimeException e) { System.print("RuntimeException terjadi: "). Kedua. case 4: System. Penggunaan finally dimulai setelah kurung kurawal penutup blok catch terkait. i<=4. Blok finally mengandung kode penanganan setelah penggunaan try dan catch.println("try-block entered.println("case ketiga"). sebuah penyelesaian normal terjadi jika try-catch-finally tereksekusi secara normal tanpa terjadi error apapun. Petunjuk Penulisan Program : Sekali lagi. Ketiga. System.println(e. case 3: System. } finally { System.print("Exception terjadi: ").E.println(). ketentuan penulisan program juga mengatur penggunaan finally seperti halnya pada blok catch.out.J.").out. case 2: System. Terdapat 4 kemungkinan skenario yang berbeda dalam blok try-catch-finally.out. pemaksaan keluar program terjadi bila control program dipaksa untuk melewati blok try menggunakan return.out. Pertama.println("case pertama").out.

println("Exception caught here. } else { System.out. System. Aturan ini hanya berlaku pada checked exception.out."). RuntimeException.4. maka digunakan keyword throws. Java juga mengijinkan seorang user untuk melempar sebuah exception.E. } System.I. Sintaks pelemparan exception cukup sederhana. 2. “Kategori Exception”.out. namun hal itu dapat menghilangkan tipe Error. Anda akan mempelajari lebih lanjut tentang checked exception dan unchecked exception pada bagian selanjutnya. Berikut ini penulisan syntax menggunakan keyword throws : <type> <methodName> (<parameterList>) throws <exceptionList> { <methodBody> } Sebuah method perlu untuk menangkap ataupun mendaftar seluruh exceptions yang mungkin terjadi.4 Melempar Exception 2.out.2 Keyword Throws Jika sebuah method dapat menyebabkan sebuah exception namun tidak menangkapnya. try { if (input.println(e). } } } 2. throw <exception object>. /* Melempar exception jika terjadi kesalahan input */ class ThrowDemo { public static void main(String args[]){ String input = “invalid input”.J.N. } catch (RuntimeException e) { System.4.equals(“invalid input”)) { throw new RuntimeException("throw demo"). Pengenalan Pemrograman 2 7 .1 Keyword Throw Disamping menangkap exception. Perhatikan contoh berikut ini.println("After throwing").println(input). ataupun subclass-nya.

Yang disebutkan dibawah ini adalah exception class hierarki.println(e).4. Hirarki Exception Class Pengenalan Pemrograman 2 8 .1 Exception Classes dan Hierarki Seperti yang disebutkan sebelumnya. Contoh berikut ini menunjukkan bahwa method myMethod tidak menangani ClassNotFoundException.J.E. } catch (ClassNotFoundException e) { System.5 Kategori Exception 2.5. Seluruh exceptions ini terdefinisi pada package java.I. } } } 2. root class dari seluruh exception classes adalah Throwable class. class ThrowingClass { static void myMethod() throws ClassNotFoundException { throw new ClassNotFoundException ("just a demo").myMethod().out.N. } } class ThrowsDemo { public static void main(String args[]) { try { ThrowingClass. Tabel 1.lang.

println(e2). Dalam pembuatan tipe exception Anda sendiri.lang. } } Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception class adalah superclass dari ArrayIndexOutOfBoundsException class.ArrayIndexOutOfBoundsException has already been caught } catch (ArrayIndexOutOfBoundsException e2) { 2.out.println(e).lang namun tidak mencukupi untuk menampung seluruh kemungkinan tipe exception yang mungkin terjadi."). Compiler memeriksa keseluruhan program apakah menangkap atau mendaftar exception yang terjadi dalam sintax throws.5.N.E.5. MultipleCatchError. Apabila checked exception tidak didaftar ataupun ditangkap. maka compiler error akan ditampilkan. } catch (ArrayIndexOutOfBoundsException e2) { System.parseInt(args [0]).J. unchecked exceptions tidak berupa compile-time checking dalam penanganan exceptions.I. Selanjutnya tergantung pada Anda dalam memodifikasi class sesuai permasalahan yang akan diselesaikan. } catch (Exception e) { System. 2.println("After try-catch-catch. class MultipleCatchError { public static void main(String args[]){ try { int a = Integer. saatnya untuk mengenalkan aturan : catch lebih dari satu harus berurutan dari subclass ke superclass.out. Anda hanya perlu untuk membuat sebuah extended class terhadap RuntimeException class. maupun Exception class lain. Checked exceptions adalah exception yang diperiksa oleh Java compiler. Tidak seperti checked exceptions.out.println(a/b). Sehingga sangat mungkin bahwa Anda perlu untuk membuat tipe exception tersendiri.2 Checked dan Unchecked Exceptions Exception terdiri atas checked dan unchecked exceptions. Pengenalan Pemrograman 2 9 .parseInt(args [1]). Sekarang Anda sudah cukup familiar dengan beberapa exception classes. Members dan constructors dapat dimasukkan pada exception class milik Anda.3 User Defined Exceptions Meskipun beberapa exception classes terdapat pada package java. } System. int b = Integer. Pondasi dasar dari unchecked exception classes adalah Error. RuntimeException dan subclass-nya. System.out.java:9: exception java.

6.1 User Defined Exceptions Assertions mengijinkan programmer untuk menentukan asumsi yang dihadapi. } } } 2.out.2 Mengaktifkan dan Menonaktifkan Exceptions Penggunaan assertions tidak perlu melakukan import package java. Sebagai contoh.println("I hate this string: " + input + ". sebuah tanggal dengan area bulan tidak berada antara 1 hingga 12 dapat diputuskan bahwa data tersebut tidak valid."). Pada non-public methods. Namun.6. Menggunakan assertions lebih tepat ditujukan untuk memeriksa parameter dari nonpublic methods jika public methods dapat diakses oleh class lain. Sehingga Pengenalan Pemrograman 2 10 . Dalam hal ini program tidak dapat bekerja dengan baik."). menjalankan program tersebut akan memberitahu Anda tentang assertion yang dibuat benar atau salah. Dengan menggunakan assertions.equals("invalid input")) { throw new HateStringException(). } catch (HateStringException e) { System. Assertion dapat diartikan sebagai extensi atas komentar yang menginformasikan pembaca kode bahwa sebagian kondisi harus terpenuhi. namun sulit untuk dilakukan karena fitur assertion dapat tidak digunakan. try { if (input. } System. maka AssertionError akan terjadi.println("String accepted.6 Assertions 2.N. maka tidak perlu untuk membaca keseluruhan kode melalui setiap komentar untuk mencari asumsi yang dibuat dalam kode.I. Meskipun hal itu dimungkinkan untuk menggunakan contructor lain untuk mensimulasikan fungsi dari assertions.util. Hal itu mungkin terjadi bila penulis dari class lain tidak menyadari bahwa mereka dapat menonaktifkan assertions. Hal yang menarik dari assertions adalah seorang user memiliki pilihan untuk digunakan atau tidak pada saat runtime. hal tersebut tergunakan secara langsung oleh kode yang ditulis oleh programmer yang memiliki akses terhadap methods tersebut. 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". 2.J.out. Programmer dapat menentukan bulan harus berada diantara area tersebut.E. Jika assertion tersebut salah.assert.

java MyProgram Namun.4 MyProgram. assert(age>0). sebuah parameter perintah diperlukan seperti yang terlihat dibawah ini : javac –source 1. dimana <expression1> adalah kondisi dimana assertion bernilai true. age>0) */ if (age >= 18) { System. Anda perlu menggunakan parameter –enableassertions atau –ea.out.E.I. Bentuk yang lain menggunakan dua ekspresi.java tambahan Jika Anda ingin untuk menjalankan program tanpa menggunakan fitur assertions. /* jika masukan umur benar (misal.N. java –enableassertions MyProgram 2.J.3 Sintaks Assertions Penulisan assertions memiliki dua bentuk. class AgeAssert { public static void main(String args[]) { int age = Integer.6.parseInt(args[0]). jika Anda ingin mengaktifkan assertions. Bentuk yang paling sederhana terlihat sebagai berikut : assert <expression1>. berikut ini cara penulisannya : assert <expression1> : <expression2>. cukup jalankan program secara normal. dimana <expression1> adalah kondisi assertion bernilai true dan <expression2> adalah informasi yang membantu pemeriksaan mengapa program mengalami kesalahan. mereka menyadari bahwa saat menjalankannya.println(“Congrats! You're an adult! =)”). assertion harus dalam keadaan aktif. Untuk mengkompilasi file yang menggunakan assertions. } } } Pengenalan Pemrograman 2 11 .

7 Latihan 2.2 Menampilkan Sebuah Berlian Tentukan nilai integer positif sebagai input.J. 2.7. Tampilkan sebuah berlian menggunaakan karakter asterisk (*) sesuai angka yang diinput oleh user. Sebagai contoh.E.N. Tentukan exception class Anda sendiri dan lakukan penanganan jika input dari user bukan berupa bilangan heksadesimal. program Anda harus menampilkan sebuah berlian sesuai bentuk berikut : * *** ***** *** * Pengenalan Pemrograman 2 12 . 2.7. gunakan assertions untuk menanganinya.1 Heksadesimal ke Desimal Tentukan sebuah angka heksadesimal sebagai input. jika user memasukkan integer bernilai 3. Konversi angka tersebut menjadi bilangan desimal. Jika user memasukkan bilangan integer negatif.I.

J.E.N.I.

BAB 3 Teknik Pemrograman Lanjut
3.1 Tujuan
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

charAt(i)).concat(digits. Berikut ini merupakan solusi iterative untuk masalah diatas.out. int base) { int rem = 1. class DecToOthers { public static void main(String args[]) { int num = Integer. /* langkah interasi */ while (num!=0) { rem = num%base. } static void printBase(int num. printBase(num.N. Catatan: A=10. base). class DecToOthersRecur { static void printBase(int num.parseInt(args[0]).charAt(rem)+""). } } Pengenalan Pemrograman 2 4 . i >= 0.print(result. i--) { System. result = result. num = num/base. int base = Integer. printBase(num. 165 adalah sama dengan A5 base 16.parseInt(args[0]).charAt(num%base)).print(digits. base).out. String digits = "0123456789abcdef". } } } Berikut ini merupakan rekursif untuk masalah yang sama dengan solusi sebelumnya. int base) { String digits = "0123456789abcdef". /* Langkah Rekursif*/ if (num >= base) { printBase(num/base.parseInt(args[1]).I.J. int base = Integer. } /* Base case: num < base */ System.E. String result = "".length()-1. } public static void main(String args[]) { int num = Integer. base). } /* mencetak reverse dari result */ for(int i = result.parseInt(args[1]).

postfix dan prefix. Pengenalan Pemrograman 2 5 .3.I. 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. Stacks. Stacks berguna untuk bermacam-macam aplikasi seperti pattern recognition dan pengkonversian antar notasi infix. 3. pikirkan bagaimana Anda dapat menambah atau memindakan sebuah data dari tumpukan data. first out” (LIFO).J.2. Hal ini merupakan perintah pengumpulan data secara linier yang disebut “last in. Jika nilai teratas / top sama dengan -1.. 6 5 4 3 2 1 0 Jayz KC Jojo Toto Kyla DMX bottom top Tabel 1.N.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. Dalam bab ini.2 Stacks Stack adalah satu set atau urutan elemen data dimana manipulasi data dari elemenelemen hanya diperbolehkan pada tumpukan teratas dari stack. stack berarti kosong. Anda akan mempelajari tentang stacks dan queues. n-1 . 3.3 Tipe Data Abstract 3. dapat menyebabkan tumpukan stack akan terjatuh. Pikiran Anda akan memberitahu Anda untuk menambah atau memindahkan data hanya pada stack yang paling atas karena jika menggunakan cara lain.3. Dibawah ini merupakan ilustrasi bagaimana tampilan dari stacks.2: Ilustrasi Stack Stack akan berarti penuh jika jangkauan sel teratas disimbolkan dengan n-1.. queues dan pohon biner adalah tiga contoh dari ADT.E. Untuk memahami bagaimana cara kerja stacks.

3. yang membuatnya tidak fleksibel. Hal ini memudahkan untuk membuat sequential representation dengan menggunakan array. Dibandingkan dengan sequential representation. 3. masalah dengan menggunakan array adalah pembatasan size.E.5 Sequential Representation dari Integer Stack class SeqStack { int top = -1. Jika user hanya memasukkan 5 elemen. stack kosong*/ /* penyimpanan untuk integer */ /* ukuran dari memSpace */ 6 . first-out”. n-1 Queue akan kosong jika nilai end kurang dari front. linked representation lebih sedikit rumit tetapi lebih fleksibel. Enqueue dan dequeue merupakan operasi yang berhubungan dengan queues.3 Queues Queues adalah contoh lain dari ADT. 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. Pengenalan Pemrograman 2 /* pada permulaan. int limit. Orang ini mendapat kesempatan pertama untuk meninggalkan barisan. 3. jika user ingin memasukkan 51 elemen. topological sorting dan graph traversal. 0 1 2 Eve front 3 Jayz 4 KC 5 Jojo 6 Toto 7 Kyla 8 DMX end Insert Delete Tabel 1. int memSpace[].I. sering terjadi kekurangan atau kelebihan space memori. ingatlah arti khusus dari queue yaitu baris.. Sementara itu. Untuk mengingat bagaimana queue bekerja. Bagaimanapun juga.. Hubungkan hal tersebut dengan bagaimana queue bekerja.3. Berikut ini merupakan ilustrasi dari bagaimana tampilan dari queue. Disisi lain. Hal ini merupakan perintah pengumpulan data yang disebut “first-in. Aplikasi ini meliputi tugas penjadwalan dalam sistem operasi.4 Sequential and Linked Representation ADTs biasanya dapat diwakilkan menggunakan sequential dan linked representation. Penjelasan lebih lanjut pada linked representation akan didiskusikan pada bab berikutnya. Anda harus membuat sebuah array dan mendeklarasikannya agar mampu menyimpan 50 elemen. Dengan menggunakan array.J. Enqueue menunjuk pada memasukkan data pada akhir queue sedangkan dequeue berarti memindahkan elemen dari queue tersebut. Mempertimbangkan hal tersebut.3: Ilustrasi Queue 9 . Berikut ini bagaimana cara kerja queue. Linked representation menyesuaikan memori yang dibutuhkan oleh user.N. space yang telah disediakan didalam array tidak akan cukup. 3. maka 45 space pada memori akan sia-sia.2. akan penuh jika end sama dengan n-1.3.

} else { top--.push(4).3. } } 3. } int pop() { int temp = -1. kita akan menggunakan linked list. myStack. /* memeriksa apakah stack penuh */ if (top < limit) { memSpace[top] = value.I.println(myStack.pop()).E. SeqStack() { memSpace = new int[10]. myStack. } return true. System. } return temp.push(1). pertama mari kita pelajari bagaimana membuat linked representation.println(myStack. limit = 10.pop()). myStack. System.6 Linked Lists Sebelum mengimplementasikan linked representation dari stacks.println(myStack. Hal ini berarti linked list dapat tumbuh dan berkurang dalam ukuran yang bergantung pada kebutuhan user. myStack. } SeqStack(int size) { memSpace = new int[size]. Pengenalan Pemrograman 2 7 . System. Linked list digambarkan sebagai kumpulan dari nodes. Linked list merupakan struktur dinamis yang berlawanan dengan array. top--. } else { return -1.out.pop()). } public static void main(String args[]) { SeqStack myStack = new SeqStack(3). return false. limit = size. Yang masing-masing berisi data dan link atau pointer ke node berikutnya di dalam list.push(2).out.J. System. Dalam hal ini.out. /* memeriksa apakah stack kosong */ if (top >= 0) { temp = memSpace[top].push(3).println(myStack.out.N. } boolean push(int value) { top++. dimana merupakan struktur statis.pop()).

println(currNode.data).nextNode.nextNode. } } } Pengenalan Pemrograman 2 8 .N. head. currNode = currNode. Gambar 2. head. while (currNode != null) { System.I. Gambar 3.E. } /* integer data diisikan dalam node */ /* node selanjutnya dalam list */ class TestNode { public static void main(String args[]) { Node emptyList = null. /* null menandai akhir dari list */ head. Node nextNode. class Node { int data.6b: Non-empty linked list dengan tiga node Berikut ini bagaimana class node diimplementasikan.J. /* membuat list kosong */ /* head points untuk node pertama dalam list */ Node head = new Node(). Gambar dibawah ini menunjukkan tampilan dari node.6a: Sebuah node Berikut ini merupakan contoh dari non-empty linked list dengan 3 node.data = 5.nextNode = new Node(). Class ini dapat digunakan untuk membuat linked list.data = 10.out.nextNode.nextNode = null. /* inisialisasi node pertama dalam list */ head. /* mencetak elemen list */ Node currNode = head.

class IntStackNode { int data.I. } System. /* mencetak elemen dari stack */ IntStackNode currNode = myStack.data. while (currNode!=null) { System.next.println(myStack.N.top.println(myStack. class DynamicIntStack{ private IntStackNode top.3.J.out.out. } public static void main(String args[]) { DynamicIntStack myStack = new DynamicIntStack(). myStack. IntStackNode next. System.data). } } boolean isEmpty(){ return top == null.next = top. IntStackNode(int n) { data = n. next = null. Maka Anda telah siap untuk menerapkan apa yang telah Anda pelajari untuk implementasi linked representation dari stack. return n.pop()).E.pop()). myStack. } } /* head atau puncak dari stack */ /* class node */ void push(int n){ /* no need to check for overflow */ IntStackNode node = new IntStackNode(n). 3.push(5).push(10). top = node. top = top.7 Linked Representation dari Integer Stack Sekarang Anda telah mempelajari tentang linked list. currNode = currNode. /* may throw a user-defined exception */ } else { int n = top.next. node.out. } } Pengenalan Pemrograman 2 9 . } int pop() { if (isEmpty()) { return -1.println(currNode.

I. methods ini telah dimodifikasi untuk menampung generic types.3. Gambar 1. LinkedHashSet dan TreeSet suatu implementasi class dari interfaces Set. Java telah menyajikan classes dan interfaces Collection yang lain. SDK tidak menyediakan implementasi built-in yang lain dari interface ini tetapi mengarahkan subinterfaces.J. <root interface> Collection <interface> Set <implementing classes> HashSet LinkedHashSet TreeSet <interface> List <implementing classes> ArrayList LinkedList Vector Tabel 1.util package. queue interface telah tersedia. dimana semuanya dapat ditemukan di java. apa perbedaan dari kedua interface tersebut.4.N.2. stacks dan queue. Induk hirarki dari collection interfaces adalah interfaces Collection itu sendiri. HashSet dan TreeSet.1. Collection memperbolehkan penggandaan/salinan dan tidak membutuhkan pemesanan elemen secara spesifik. Pengenalan Pemrograman 2 10 . Class tersebut benar-benar implementasi dari collection interfaces yang berbeda.5. interfaces Set dan interfaces List diperbolehkan.1.8 Java Collections Saat ini Anda telah diperkenalkan kepada dasar tipe data abstract. Pada intinya.E. sebaiknya mempertimbangkan method ini terlebih dahulu.8a: Java collections Berikut ini adalah daftar dari beberapa methods Collections yang disediakan dalam Collection API dari Java 2 Platform SE v1.2. Dengan peluncuran dari J2SE 5. HashSet. ArrayList. sebagai ilmuwan komputer. Contoh dari classes Collection termasuk LinkedList. Set merupakan collection yang tidak dipesan dan tidak ada penggandaan di dalamnya. sangat penting untuk mengerti konsep dari tipe data abstract. Sebuah collection hanyalah sebuah grup dari object yang diketahui sebagai elemennya sendiri. Kepada kita. Dalam Java 2 Platform SE v. penjelasan terperinci masih disampaikan dalam bagian yang terdahulu.0. ArrayList. Oleh karena itu. Karena generic types masih belum selesai dibahas. Untuk detail pada class dan interface ini. Sementara itu. Berita baik bahwa tipe data abstract telah siap untuk diimplementasikan dan dimasukkan dalam Java.7: Implementasi linked dari stack 3. dapat dilihat pada dokumentasi Java API.0. LinkedList dan Vector suatu implementasi class dari List interfaces. Anda telah mempelajari tentang dasar dari linked lists. Sekarang. Bagaimanapun juga. Class Stack dan LinkedList diperbolehkan digunakan tanpa perlu pengertian yang lengkap dari konsep ini. list merupakan collection yang dipesan dari elemen-elemen dimana juga diperbolehkannya penggandaan.

Disarankan bahwa Anda mengacu pada Collection methods yang terbaru dimana Anda lebih mudah mengerti generic types. public int size() Mengembalikan jumlah dari elemen pada collection ini. Pada bagian sebelumnya. Saat ini kita akan melihat beberapa classes collection. Mengembalikan nilai true jika o telah ditemukan dan dihapus dari collection. Tabel 1. public boolean contains(Object o) Mengembalikan nilai true jika collection ini berisi Object o.8b: Methods dari class Collection Anda diharapkan mengacu pada dokumentasi API untuk mengetahui daftar lengkap dari methods dalam interface Collection. List dan Set.E. public boolean equals(Object o) Mengembalikan nilai true jika Object o sama dengan yang ada pada collection ini. jika hal tersebut telah diinputkan. queue atau ADT yang lain.2. public boolean isEmpty() Mengembalikan nilai true jika collection ini tidak berisi object atau elemen apapun. Anda telah melihat bagaimana mengimplementasikan linked list dengan cara Anda sendiri. Mengembalikan nilai true jika o telah sukses ditambahkan ke dalam collection. Class LinkedList berisi methods yang memperbolehkan linked list digunakan seperti stacks. public int hashCode() Mengembalikan nilai hash code (yaitu ID) untuk collection ini. public Iterator iterator() Mengembalikan sebuah iterator yang menunjukkan kita pada isi collection ini. Pengenalan Pemrograman 2 11 .J. Objects atau collections yang sama memiliki nilai hash code atau ID yang sama. public void clear() Menghapus semua elemen dari collection ini. Harap mengacu pada API untuk daftar dari methods yang dimasukkan ke dalam class ini.N.I. Collection Methods public boolean add(Object o) Memasukkan Object o ke dalam collection ini. Listing program berikut ini menunjukan bagaimana menggunakan class LinkedList. Java SDK juga telah menyediakan built-implementation dari linked list untuk kita. yang akan didiskusikan pada chapter berikutnya. public boolean remove(Object o) Menghapus single instance dari Object o pada collection ini.

class ArrayListDemo { public static void main(String args[]) { ArrayList al = new ArrayList(2). " + list.remove("U"). ListIterator li = al. Object a[] = al.out. size = " + al.println(list). import java. list.getLast()).out. al. list.size()).removeFirst(). list. list.listIterator().add(new Integer(3)). list.println(list. al.*. list.out.J.out.println(list + ".get(2) + ". System.println(li.get(3)).out.size()). list. list.out. size = " + list.remove(3). } } ArrayList merupakan versi fleksibel dari array biasa. System. System. } } Pengenalan Pemrograman 2 12 . size = " + al. i<a. System. " + list.add("U").println(list).println(list).set(2.E. "one").remove(new Integer(1)).length.println(al + ".out. class LinkedListDemo { public static void main(String args[]) { LinkedList list = new LinkedList(). list. System.add(new Integer(2)).add("O").out.hasNext()) System.out.out. System.out.addFirst(new Integer(0)). System.println(list). System. size = " + al. import java. while (li.toArray().removeLast(). al.println(a[i]).*.println(list.next()).add(new Integer(1)). Yang mengimplementasikan List interface.size()). Telitilah kode berikut ini. System.add(new Integer(1)).println(list).I. System. System.addLast(new Integer(4)).println(al + ". for (int i=0. list. i++) System.out.N.add("R"). list. al.out.util.getFirst() + ".util.println(al + ".size()).

util.out.8: Contoh TreeSet Pengenalan Pemrograman 2 13 .util.*. import java. yang menggunakan class HashSet. System. Class ini memastikan bahwa yang disortir akan diurutkan secara ascending.out.println(hs.println(hs. System.add("three").out. System. Teliti program ini.add("four"). ts. } } Gambar 1.println(hs.out. bagaimana class TreeSet telah digunakan dalam listing program berikut ini.out.out. System.println(hs.N. 0.I.add("one").add("one")).add("two"). System.add("five")).5f). Penggunaan suatu hash table lebih mudah dan cepat untuk melihat lebih detail elemen-elemen yang ada. ts. System.println(hs. System.add("one")). Tabel tersebut menggunakan suatu rumusan untuk menentukan dimana suatu objek disimpan.println(ts).2.add("two")). class TreeSetDemo { public static void main(String args[]) { TreeSet ts = new TreeSet(). ts. ts. Perhatikan.*.J.println(hs). System. import java.add("three")).out.add("four")).out.println(hs. } } TreeSet merupakan sebuah implementasi dari interface Set yang menggunakan tree. HashSet merupakan sebuah implementasi dari interface Set yang mempergunakan hash table.E. class HashSetDemo { public static void main(String args[]) { HashSet hs = new HashSet(5.

Pengenalan Pemrograman 2 14 . Setiap address berisi nama. 3.J.E.3 Linked Representation dari Integer Queue Dengan menggunakan ide dari linked list.4 Latihan 3. Return x. Pengisian data dimasukkan dengan cara queue tetapi penghapusan dilakukan dengan cara stack. 3. Sebagai masukkan integers x dan y. Contoh. Ulangi step dibawah ini while y != 0 a. alamat dan nomor telepon dari orang yang mengisinya.4 Address Book Dengan menggunakan Collection Java. kemudian modulus atau sisa pembagian membagi angka kedua dan seterusnya hingga sisa pembagian dari kedua angka tersebut sama dengan nol. 3. implementasikan sebuah integer queue seperti contoh pada sequential stack.1 Faktor Persekutuan Terbesar Faktor persekutuan terbesar (FPB) dari dua angka adalah angka yang terbesar selalu dibagi oleh angka yang satunya. y = x % y. y = x % y = 14 % 6 = 2 x=6 y=x%y=6%2=0 x = 2 (FPB) 3.2 Sequential Representation dari Integer Queue Dengan menggunakan array. x = Nilai lama y. Menggunakan metode Euclid.4. delete dan view address.N. b. Juga membuka terminal window untuk meng-compile dan mengeksekusi program Java Anda. Gunakan iterasi untuk kode program yang pertama dan rekursif untuk kode program berikutnya.4. 2. Dalam contoh ini. x = 14 dan y = 6.4. buatlah sebuah program yang memperbolehkan user untuk insert. buatlah dua kode untuk penghitungan dua angka.I. 3. implementasikan sebuah integer queue dinamis seperti integer stack dinamis yang diperkenalkan seperti contoh berikut. kita akan menggunakan text editor untuk mengedit program Java. Catatan pada algoritma Euclid : 1.4.

J.E.N.I.

BAB 4 Tour dari Package java.lang
4.1 Tujuan
Java datang dengan beberapa class built-in yang bermanfaat. Mari kita membahas classclass tersebut. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Menggunakan class-class Java yang telah ada
     

Math String StringBuffer Wrapper Process System

4.2 Class Math
Java juga menyediakan konstanta dan method untuk menunjukkan perbedaan operasi matematika seperti fungsi trigonometri dan logaritma. Selama method-method ini semua static, Anda dapat menggunakannya tanpa memerlukan sebuah objek Math. Untuk melengkapi daftar konstanta dan method-method ini, lihatlah acuan pada dokumentasi Java API. Dibawah ini beberapa method-method umum yang sering digunakan.

Method-Method Math public static double abs(double a) Menghasilkan nilai mutlak a. Sebuah method yang di-overload. Dapat juga menggunakan nilai float atau integer atau juga long integer sebagai parameter, dengan kondisi tipe kembaliannya juga menggunakan float atau integer atau long integer, secara berturut-turut. public static double random() Menghasilkan nilai positif bilangan acak (random) yang lebih besar atau sama dengan 0.0 tetapi kurang dari 1.0. public static double max(double a, double b) Menghasilkan nilai maksimum, diantara dua nilai double, a and b. Sebuah method yang di-overload. Dapat juga menggunakan nilai float atau integer atau juga long integer sebagai parameter, dengan kondisi tipe kembalinya juga menggunakan float atau integer atau long integer, secara berturut-turut. public static double min(double a, double b) Menghasilkan nilai minimum diantara dua nilai double, a and b. Sebuah method yang
Pengenalan Pemrograman 2 1

J.E.N.I.

di-overload. Dapat juga menggunakan nilai float atau integer atau juga long integer sebagai parameter, dengan kondisi tipe kembaliannya juga menggunakan float atau integer atau long integer, secara berturut-turut. public static double ceil(double a) Menghasilkan bilangan bulat terkecil yang lebih besar atau sama dengan a. public static double floor(double a) Menghasilkan bilangan bulat terbesar yang lebih kecil atau sama dengan a. public static double exp(double a) Menghasilkan angka Euler, e pangkat a. public static double log(double a) Menghasilkan logaritma natural dari a. public static double pow(double a, double b) Menghasilkan a pangkat b. public static long round(double a) Menghasilkan pembulatan ke atas ke long terdekat. Sebuah method yang di-overload. Dapat juga menggunakan float pada argument dan akan menghasilkan pembulatan ke atas ke int terdekat. public static double sqrt(double a) Menghasilkan akar kuadrat a. public static double sin(double a) Menghasilkan sinus sudut a dalam radian. public static double toDegrees(double angrad) Menghasilkan nilai derajat yang kira-kira setara dengan nilai radian yang diberikan. public static double toRadians(double angdeg) Menghasilkan nilai radian yang kira-kira setara dengan nilai derajat yang diberikan.
Tabel 1.1: Beberapa method dari class Math

Pengenalan Pemrograman 2

2

J.E.N.I.

Di bawah ini adalah program yang menunjukkan bagaimana method-method tersebut digunakan. class MathDemo { public static void main(String args[]) { System.out.println("absolute value of -5: " + Math.abs(-5)); System.out.println("absolute value of 5: " + Math.abs(-5)); System.out.println("random number(max value is 10): " + Math.random()*10); System.out.println("max of 3.5 and 1.2: " + Math.max(3.5, 1.2)); System.out.println("min of 3.5 and 1.2: " + Math.min(3.5, 1.2)); System.out.println("ceiling of 3.5: " + Math.ceil(3.5)); System.out.println("floor of 3.5: " + Math.floor(3.5)); System.out.println("e raised to 1: " + Math.exp(1)); System.out.println("log 10: " + Math.log(10)); System.out.println("10 raised to 3: " + Math.pow(10,3)); System.out.println("rounded off value of pi: " + Math.round(Math.PI)); System.out.println("square root of 5 = " + Math.sqrt(5)); System.out.println("10 radian = " + Math.toDegrees(10) + " degrees"); System.out.println("sin(90): " + Math.sin(Math.toRadians(90))); } } Ini adalah contoh output dari program yang dibuat. Coba jalankan program dan bereksperimenlah secara bebas dengan memberikan argument. absolute value of -5: 5 absolute value of 5: 5 random number(max value is 10): 4.0855332335477605 max of 3.5 and 1.2: 3.5 min of 3.5 and 1.2: 1.2 ceiling of 3.5: 4.0 floor of 3.5: 3.0 e raised to 1: 2.7182818284590455 log 10: 2.302585092994046 10 raised to 3: 1000.0 rounded off value of pi: 3 square root of 5 = 2.23606797749979 10 radian = 572.9577951308232 degrees sin(90): 1.0

Pengenalan Pemrograman 2

3

2 Method-method String Di bawah ini adalah daftar dari method-method String. Bernilai negatif jika objek yang dilewatkan (passed string) lebih besar.println(s2). 'l'. Tidak seperti bahasa pemrograman lainnya. System.3 Class String dan StringBuffer Class String disediakan oleh Java SDK dengan menggunakan kombinasi character literals. 1. 'l'. String s5 = new String(s2).out. System. Encarnacion.println(s5). String s2 = new String(chars).I.3. // s3 = "world" String s4 = new String(chars.println(s1). 'r'. System.1 Constructor String Class String mempunyai 11 constructor. bahwa sebuah objek String berbeda dari sebuah array dari character. dan bernilai positif jika objek string pemanggil (calling string) lebih besar. 'e'.N. 3). */ class StringConstructorsDemo { public static void main(String args[]) { String s1 = new String().out.println(s6). public int compareToIgnoreCase(String str) Serupa dengan compareTo tetapi case insensitivity. String s3 = new String(bytes). public boolean equals(Object anObject) Menghasilkan nilai true jika parameter tunggalnya tersusun dari karakter yang sama Pengenalan Pemrograman 2 4 . 'o'. System. 4. 'd' }. 0 jika kedua string sama. Method-Method String public char charAt(int index) Mengirim karakter di indeks yang ditentukan oleh parameter index. Sebagai catatan. 'l'.J. System. 4. Untuk melihat bagaimana constructorconstructor ini.out. seperti C atau C++. 'o'}.out. public int compareTo(String anotherString) Membandingkan dua String dan mengirim bilangan int yang menentukan apakah objek string pemanggil kurang dari atau sama dengan anotherString. byte bytes[] = { 'w'.println(s4). String s6 = s2. // membuat string kosong char chars[] = { 'h'. System. /* Contoh ini diambil dari catatan Dr. } } 4.out.out.3. // s2 = "hello". strings dapat digunakan menggunakan array dari character atau disederhanakan dengan menggunakan class String.E.println(s3). perhatikan contoh berikut.

char[] dst. Method-Method String dengan objek tempat Anda memanggil equals. /* character yang pertama nampak secara berurutan mempunyai nilai unicode lebih kecil */ System. public static String valueOf(-) Dapat menggunakan tipe data sederhana seperti boolean.println("name: " + name).println("Jonathan compared to jonathan: " + name. char newChar) Mengganti karakter. int endIndex) Mengirim substring dimulai dari indeks beginIndex yang ditentukan dan berakhir dengan indeks endIndex yang ditentukan.out. int srcEnd.E.out.println("Solomon compared to Jonathan: " + "Solomon".println("Jonathan compared to Solomon: " + name. System. Mengirim objek String yang merepresentasikan tipe tertentu yang dilewatkan sebagai parameter. integer atau character. atau juga menggunakan sebuah objek sebagai parameter.println("3rd character of name: " + name. System. public String substring(int beginIndex.charAt(2)). /* 'J' mempunyai nilai unicode yang lebih kecil dibanding 'j' */ System.N. public boolean equalsIgnoreCase(String anotherString) Serupa dengan equals tetapi case insensitivity. public void getChars(int srcBegin. int dstBegin) Mendapatkan characters dari string yang dimulai pada index srcBegin hingga index srcEnd dan menyalin karakter-karakter tersebut pada array dst dimulai pada index dstBegin. public String trim() Menghilangkan whitespace di awal dan akhir objek String. Tabel 1. public char[] toCharArray() Mengembalikan array karakter yang sama dengan string ini. public String replace(char oldChar.out. System. method akan dikembalikan dengan nilai false. class StringDemo { public static void main(String args[]) { String name = "Jonathan". Sedangkan jika parameter yang ditentukan bukan sebuah objek String atau jika tidak cocok dengan urutan simbol pada string. semua yang kemunculan oldChar diganti newChar.1: Beberapa method dari class String Perhatikan bagaimana method-method tersebut digunakan dalam program di bawah ini.compareTo("Jonathan")).compareTo("Solomon")).I.out.compareTo("jonathan")).out.J. public int length() Menghasilkan panjang String. Pengenalan Pemrograman 2 5 .2.

2. 3).out. System. tidak ada perubahan pada nama objek String meskipun setelah penggunaan semua method.length()).println("Is Jonathan equal to jonathan (ignore case)? " + name.out.equals("jonathan")).replace('a'.toCharArray(). /* Membutuhkan tambahan 1 untuk parameter endIndex dari substring*/ System.out.N.println("Length of name: " + name.out.equalsIgnoreCase("jonathan")). System.getChars(0.println("name: " + name).println("Is Jonathan equal to jonathan? " + name. System.out.out. 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 .trim() + "\""). System.println("Is Jonathan equal to Jonathan? " + name. System.print("getChars method: "). System. System. 'e')).println("Trim \" a b c d e f \": \"" + " a b c d e f ".println("Jonathan compared to jonathan (ignore case): " + name. /* Membutuhkan tambahan 1 untuk indeks endSrc dari getChars */ "Jonathan".substring(0.out. System.out.out. System.E. System.println("A substring of name: " + name.println("String representation of boolean expression 10>10: " + String. } } Ini adalah output dari program yang dibuat.equals("Jonathan")). */ System. /* Catatan. char charArr[] = "Hi XX".valueOf(10>10)).println("String representation of boolean expression 10<10: " + (10<10)). 2)).out.I.println(charArr).out.J. /* method toString secara implisit dipanggil method println */ System.out. charArr.compareToIgnoreCase("jonathan")).println("Replace a's with e's in name: " + name.out.

public StringBuffer delete(int start. Menggunakan parameter tunggal seperti tipe-tipe data berikut: boolean. char. Masih mempunyai versi yang di-overload lainnya. -) Menyisipkan beragam tipe data di offset tertentu di StringBuffer. objek String tidak bisa lagi dimodifikasi. Method-Method StringBuffer public int capacity() Mengirim jumlah memori yang dialokasikan untuk StringBuffer. Objek StringBuffer serupa dengan objek String. long. public char charAt(int index) Mengirim character di lokasi tertentu di StringBuffer yang ditentukan parameter index. String and StringBuffer. public String toString() Mengkonversi objek ke representasi string. Lihatlah acuan pada dokumentasi Java API.E. Tabel 1. float. int end. char []. sedangkan pada object String bersifat konstan. public String substring(int start. Object.3. char[] dst. Panjang dan isi dapat diubah hingga beberapa pemanggilan method. dimulai pada penentuan indeks start hingga indeks the end. public StringBuffer replace(int start. Tipe data yang mungkin digunakan: boolean. int srcEnd. Sebuah method yang di-overload. Masih mempunyai versi yang di-overload lainnya. Object and String.3 Class StringBuffer Ketika objek String diciptakan. int. dengan string str yang ditentukan. Ini adalah beberapa method pada class StringBuffer.N. double. public StringBuffer insert(int offset. kecuali kenyataan bahwa objek StringBuffer bersifat dapat berubah atau dapat dimodifikasi.2: Beberapa method dari class StringBuffer Pengenalan Pemrograman 2 7 . int end) Substring menyaring bagian tertentu dari string. seperti yang ditentukan oleh argumen kedua pertama. int end) Menghapus karakter-karakter pada range yang ditentukan. int. 4. char. public StringBuffer append(-) Appends merepresentasikan string dari argument untuk objek StringBuffer. long. char [].2. String str) Mengganti bagian dari objek. 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.J. public int length() Memperoleh panjang atau jumlah karakter di objek StringBuffer. public void getChars(int srcBegin. float.I. double.

println("Insert \'jo\' at the 3rd cell: " + sb.out.println("replace: " + sb.getChars(0.out.println("append \'O\' to sb: " + sb.I. " Ong")). System.N. System.print("getChars method: "). System. 3)).out.toCharArray().J.capacity()). Program di bawah ini menunjukkan bagaimana menggunakan method-method tersebut.insert(2.println("sb = " + sb).println("substring (1st two characters): " + sb.out. 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 .4)).out. 3).E.out. /* Need to add 1 to the endIndex parameter of substring*/ System. /* Need to add 1 to the endSrc index of getChars */ sb.charAt(2)).out.out. System.println("capacity of sb: " + sb. System. System.println("implicit toString(): " + sb).substring(0. Sekali lagi. System.out.println("3rd character of sb: " + sb. System. "jo")).replace(3.append("O")). System.println("sb = " + sb). 9.println("Delete \'jo\' at the 3rd cell: " + sb. System.println("length of sb: " + sb.out.length()). } } Ini adalah output dari program yang telah dibuat di atas. bereksperimen secara bebas dengan code-code merupakan cara terbaik mempelajari sintaks-sintaks yang ada.out. System.out. 2.out. /* initial capacity is 16 */ System. char charArr[] = "Hi XX".delete(2. charArr.println(charArr). class StringBufferDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("Jonathan").

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. Anda boleh menambahkan variabel tipe primitif pada objek Collection. Demikian daftar dari class wrapper.println("booleanVar = " + booleanVar). Class wrapper adalah representasi objek sederhana dari variabelvariabel non-objek yang sederhana. System. ketika Anda membutuhkan sebuah representasi objek untuk variabel-variabel tipe primitive dalam rangka menggunakan method-method Java built-in.out. Tipe Data Primitive Boolean Char Byte Short Int Long Float Double Class Wrapper yang Sesuai Boolean Character Byte Short Integer Long Float Double Tabel 1. bagaimanapun.N. } } Pengenalan Pemrograman 2 9 .println("booleanObj = " + booleanObj). yang dideklarasikan menjadi referensi tipe data. class BooleanWrapper { public static void main(String args[]) { boolean booleanVar = 1>2. bahwa class-class wrapper diawali dengan huruf besar dan versi yang ditunjukkan dari tipe data primitive. dapat juga menggunakan method valueOf */ Boolean booleanObj2 = new Boolean(booleanVar). tipe data primitive seperti int.equals(booleanObj2)). Sehingga. Dan juga sebagai catatan. 4. Boolean booleanObj = new Boolean("TRue"). System.4 Class-class Wrapper Sesungguhnya.I. Ada suatu keadaan. char and long bukanlah sebuah objek.booleanValue(). System.out.println("booleanObj2 = " + booleanObj2). variabel-variabel tipe data ini tidak dapat mengakses method-method dari class Object. Disinilah class wrapper masuk.println("booleanVar = " + booleanVar). /* objek ke primitif */ booleanVar = booleanObj. Sebagai contoh. Hanya objek-objek nyata. System.println("compare 2 wrapper objects: " + booleanObj. /* primitif ke objek.out.J.out.E. dapat mengakses method-method dari class Object. Di bawah ini contoh penggunaan class wrapper untuk boolean. System.out.

getRuntime().E.4. proc. class RuntimeDemo { public static void main(String args[]) { Runtime rt = Runtime.5 Class Process dan Runtime 4. try { proc = rt.2: Beberapa method dari class Runtime 4.").3 Membuka Registry Editor Berikut program untuk membuka registry editor tanpa harus mengetikkan perintah dari command prompt.J.exec("regedit"). seperti mematikan proses.5. Tabel 1.waitFor(). Process proc.2 Class Runtime Di sisi lain. Dua method penting pada class Runtime adalah method getRuntime dan exec. 4. Memperbolehkan Anda mengeksekusi proses baru.I.5.program yang berjalan. //cobalah menghapus baris ini } catch (Exception e) { System. Tabel 1.out.1 Class Process class Process menyediakan method-method untuk memanipulasi proses-proses.1: Beberapa method dari class Process 4. public abstract int waitFor() throws InterruptedException Tidak mengirim sampai proses yang dipanggil berakhir. } Pengenalan Pemrograman 2 10 .println("regedit is an unknown command. Di bawah ini beberapa method pada class Process. Class ini merepresentasikan program.4.5. class Runtime merepresentasikan lingkungan runtime. menjalankan proses dan mengecek status proses. Method-Method Runtime public static Runtime getRuntime() Mengirim objek runtime yang merepresentasikan berhubungan dengan aplikasi Java saat itu. Method-Method Process public abstract void destroy() Mengakhiri proses. lingkungan runtime yang public Process exec(String command) throws IOException Disebabkan command yang ditentukan untuk dieksekusi.N.

bahwa semua method-method class adalah static Method-Method System Public static void arraycopy(Object src.6 Class System Class System menyediakan beberapa field dan method bermanfaat. Di bawah ini beberapa method menarik dari class System. Sebagai catatan. Object dest.I. int srcPos. yang mereklamasi space memori tak terpakai untuk digunakan kembali. Lebih cepat daripada memprogram secara manual code untuk Anda sendiri.J.E. seperti standard input. } } Gambar 1. Waktu dalam ukuran milidetik. int destPos. int length) Mengkopi length elemen dari array src dimulai pada posisi srcPos ke dest yang dimulai pada indeks destPos.3: Membuka registry editor 4.out. Public static void setOut(PrintStream out) Mengubah stream yang berhubungan dengan System. Public static void gc() Menjalankan garbage collector. yang mana standart mengacu pada keyboard.in. Public static long currentTimeMillis() Waktu ditentukan dalam GMT (Greenwich Mean Time) serta merupakan jumlah milidetik yang telah dilewati sejak tengan malam 1 Januari 1970. Public static void exit(int status) Mematikan Java Virtual Machine (JVM) yang sedang berjalan.4. yang mana standart Pengenalan Pemrograman 2 11 . standard output dan sebuah method yang berguna untuk mempercepat penyalinan bagian sebuah array. Nilai bukan nol untuk status konvensi yang mengindikasikan keluar yang abnormal.N. Public static void setIn(InputStream in) Mengubah stream yang berhubungan dengan System.

length. //force garbage collector to work System. System.length).out.println("Time for manual copy: " + (endTimestartTime) + " ms.currentTimeMillis().*. i++) { arr1[i] = i + 1. System.println("Time for manual copy: " + (endTime-startTime) + " ms. endTime. i++) { arr2[i] = arr1[i].5: Beberapa method dari class System Ini adalah demo dari beberapa method-method tersebut. /* menggunakan utilitas copy yang disediakan oleh java – yaitu method arraycopy */ startTime = System.txt")). int arr2[] = new int[1050000].currentTimeMillis(). Tabel 1.currentTimeMillis().currentTimeMillis(). System. class SystemDemo { public static void main(String args[]) throws IOException { int arr1[] = new int[1050000]. long startTime. } /* mengkopi secara manual */ startTime = System.arraycopy(arr1."). System.J. endTime = System. 0. Method-Method System mengacu pada console. arr1.E.out.gc().io.I. } endTime = System. for (int i = 0.setIn(new FileInputStream("temp. i < arr1. i < arr1.").N.exit(0). System. 0. arr2. /* menginisialisasi arr1 */ for (int i = 0.length. import java. } } Pengenalan Pemrograman 2 12 .

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. Pengenalan Pemrograman 2 13 . Input: Output: Input: Output: 10 72.N. 4. x2 * cos(45derajat) + akar(e).7 Latihan 4.I.3 Notepad Menggunakan class Process and Runtime. 4.2 Palindrome Palindrome adalah sebuah string yang membaca sama ketika mengarah ke depan atau sebaliknya. Menggunakan String atau class StringBuffer.7. bukalah aplikasi notepad dari program java.J.E. Beberapa contoh dari palindrome : hannah. e adalah angka Euler. and bib. ana.35939938935488 11 87. buatlah sebuah program yang menggunakan satu string sebagai inputan dan tentukan jika ini sebuah palindrome atau bukan.7.20864179427238 4.7.

Class System menyediakan sebuah method untuk menentukan system properties yang digunakan.2 Argument Command-Line dan System Properties Seperti yang telah Anda ketahui pada pembahasan sebelumnya.N. Hal ini ditunjukkan pada Java dalam class Properties. data 1 disimpan pada variabel args[0]. Sehingga.J. Selain melewatkan argument menuju method utama. Pada akhir pembahasan. Sebagai contoh. begitu pula dengan data 2 yang disimpan pada args[1].1 Tujuan Pembahasan kali ini akan menitikberatkan pada bahasan penggunaan argument command-line. method getProperties yang menghasilkan sebuah object Properties. System properties hampir menyamai environment variables. Sebuah property secara sederhana berupa pemetaan antara property name dan value yang dimilikinya. anda dapat menuliskan baris berikut pada command prompt java Calculate 1 2 Pada contoh berikut ini. BAB 5 Aplikasi Berbasis Teks 5. Mengetahui cara untuk memanipulasi properties dari sistem 3. JAVA mengijinkan user untuk memasukkan data dari command-line. Anda akan mempelajari mengenai penggunaan streams untuk mendapatkan nilai input dari user pada saat runtime. diharapkan pembaca dapat : 1. namun tidak memiliki ketergantungan pada spesifikasi platform yang digunakan. Anda juga dapat memanipulasi system properties dari command-line. Selebihnya. Pengenalan Pemrograman 2 1 . Class yang sama juga menyediakan method getProperty yang memiliki dua buah bentuk. Membaca standart input 4.I. untuk meneruskan argument 1 dan 2 kepada program Java bernama Calculate. tujuan dari deklarasi String args[] sebagai sebuah parameter pada method utama menjadi jelas. Membaca dan menulis file 5. Mendapatkan input dari command-line 2.E. sekaligus dalam proses manipulasi file.

java -D<name>=value Sebagai contoh. Satu cara dalam melakukan hal ini adalah dengan menggunakan stream.E.home=philippines Untuk menampilkan daftar system properties yang tersedia pada sistem Anda. String def) Bentuk ini juga menghasilkan nilai String dari System Properties sesuai key yang ditentukan. consoles dan files. Byte streams digunakan pada data biner. Tabel 1. jika tidak terdapat property dengan key yang sesuai. sebuah nilai default.in dan System.out adalah dua contoh dari byte streams yang digunakan Pengenalan Pemrograman 2 2 .1: getProperty() method dari class System Kita tidak dapat cukup berhenti pada detail dari system properties.getProperties().home bernilai phillipines. untuk mengatur system property dengan nama user.list(System. byte streams dan character streams.I.3 Membaca Standard Input Dibandingkan dengan mendapatkan masukan user dari command-line. Anda dapat menelusuri dokumentasi API yang disediakan. System. Akan menghasilkan nilai def. Jika Anda tertarik mempelajari lebih lanjut tentang system properties. sebagian user lebih memilih untuk memasukkan data bilamana diminta oleh program pada saat eksekusi.N. Sebuah stream adalah abstraksi dari sebuah file atau sebuah perangkat yang mengijinkan beberapa set item untuk dibaca atau ditulis. sedangkan character streams digunakan pada karakter Unicode. public static String getProperty(String key.J. Terdapat dua bentuk umum dari streams. gunakan perintah berikut : java -Duser. Anda dapat menggunakan argument opsional –D pada perintah Java dalam command-line untuk menambahkan property baru. Jika hasil menunjukkan nilai null. berarti tidak terdapat property dengan key yang ditentukan. namun dilanjutkan dengan memanipulasi system properties yang digunakan. gunakan method getProperties seperti yang ditunjukkan sebagai berikut : System. 5. Streams terhubung dengan physical devices seperti keyboards.out). public static String getProperty(String key) Bentuk ini menghasilkan nilai String dari System Properties yang ditunjukkan oleh key yang ditentukan.

Contoh pertama mereferensikan pada keyboard. kemudian contoh kedua mereferensikan pada console. Untuk membaca karakter dari keyboard. System. ch=(int)br.out.println("Hi. Berikut ini sebuah program yang hampir menyerupai contoh sebelumnya.read().in)).io. Method read dari object BufferedReader selanjutnya digunakan untuk membaca nilai input dari perangkat input. dalam Java.E. namun membaca keseluruhan string. Pengenalan Pemrograman 2 3 . char favChar.out.*.in yang terdapat pada object BufferedReader.readLine(). class GreetUser { public static void main(String args[]) throws IOException { System.in)). } } Jika Anda lebih memilih untuk membaca keseluruhan baris daripada membaca satu karakter tiap waktu. //method read menghasilkan nilai integer Cobalah contoh kode berikut : import java.N.io. Anda dapat menggunakan byte stream System. bukan satu karakter. what's your name?").println("Hi. favChar = (char) br.J.out. class FavoriteCharacter { public static void main(String args[]) throws IOException { System.println(favChar + " is a good choice!"). gunakan method readLine : str = br. Baris berikut menunjukkan bagaimana untuk melakukan hal tersebut : BufferedReader br = new BufferedReader(new InputStreamReader(System.read(). import java.*.I. BufferedReader br = new BufferedReader(new InputStreamReader(System. what's your favorite character?"). String name.

System. terdapat beberapa cara jika Anda ingin menyimpan output dari program pada sebuah file. Pengenalan Pemrograman 2 4 .readLine(). Seperti yang terlihat pada aplikasi. output dalam hal ini dapat disimpan dalam sebuah file.io. Selanjutnya. masukan data disimpan pada sebuah file. Setelah membuat sebuah input stream. Method read menghasilkan sebuah nilai integer. } } Pada saat menggunakan streams. salah satu kemungkinan output dari sistem adalah informasi tentang mata pelajaran yang diikuti oleh siswa.4.*.println("Nice to meet you. Anda akan mempelajari tentang file input dan output pada bagian ini.in)).io seperti yang ditunjukkan dibawah ini : import java. 5. Pada sistem terkomputerisasi. Anda dapat menggunakan class FileInputStream. Kemudian. Jangan lupa untuk menangani exception tersebut menggunakan perintah try-catch atau dengan mengindikasikan exception pada klausa throws dalam method. BufferedReader br = new BufferedReader(new InputStreamReader(System. pembacaan dari streams dapat menyebabkan terjadinya exception. terdapat suatu kebutuhan untuk membaca dan menulis sebuah file. Exception berupa FileNotFoundException akan muncul jika file tidak ditemukan atau tidak dapat dibuka dan kemudian dibaca.E. dan akan menunjukkan nilai 1 jika telah mencapai batas akhir file.1 Membaca sebuah File Untuk membaca sebuah file. 5. name = br. 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. Sekali lagi. " + name + "! :)").J. Satu hal lagi yang perlu untuk diingat. jangan lupa untuk mengimport package java.4 Menangani File Pada beberapa kasus.out.N. data dari Siswa yang dapat digunakan sebagai input oleh sistem umumnya tersimpan pada sebuah file terpisah. Anda kemudian dapat menggunakannya untuk membaca sebuah file dengan menggunakan method read.I.

.println("Now reading from " + filename + ".out. if (temp != -1) { System.").out. class ReadFile { public static void main(String args[]) throws IOException { System.*. Berikut ini salah satu constructor yang dapat Anda gunakan."). String filename. } } while (temp != -1). } catch (IOException ex) { System.print(data). Anda dapat menggunakan class FileOutputStream.4. int temp. filename = br.readLine().read().println("Problem in reading from the file.."). } catch (FileNotFoundException ex) { System.I.out.J. do { temp = fis. Berikut ini contohnya : import java.println("File not found.E.N. BufferedReader br = new BufferedReader(new InputStreamReader(System. FileInputStream fis = null.in)).out. try { fis = new FileInputStream(filename).out. data = (char) temp.2 Menulis sebuah file Untuk menuliskan sebuah file. System.io. FileOutputStream(String filename) Pengenalan Pemrograman 2 5 . } try { char data. } } } 5.println("What is the name of the file to read from?").

").readLine()."). if ((char)data == 'q') { data = br.println("Type q$ to end.in)).println("What is the name of the file to be written to?"). Method tersebut menggunakan penandaan sebagai berikut : void write(int b) Parameter b mereferensikan data yang akan dituliskan pada file sesuai dengan hasil output stream. } catch (FileNotFoundException ex) { System. } try { boolean done = false.N.read(). String filename. } else { fos.I. filename = br.println("Enter data to write to " + filename + ".E. Contructor tersebut menyediakan jalur output stream terhadap sebuah file yang akan ditulis.read().out. class WriteFile { public static void main(String args[]) throws IOException { System.write(data).").out. } } while (!done). } catch (IOException ex) { System.println("Problem in reading from the file. Jika output stream telah dibuat. try { fos = new FileOutputStream(filename). fos. FileOutputStream fos = null..*.out. do { data = br."). System. } Pengenalan Pemrograman 2 6 . int data.io.out.write(data). Anda dapat menggunakannya untuk menulis file yang dituju menggunakan method write.out. System. Sebuah Exception berupa FileNotFoundException akan muncul jika file yang dimaksud tidak dapat dibuka untuk ditulis. Program berikut menunjukkan contoh penulisan terhadap file : import java.println("File cannot be opened for writing.J.write('q').. } } else { fos. if ((char)data == '$') { done = true. BufferedReader br = new BufferedReader(new InputStreamReader(System.

seluruh spasi yang ada (‘ ‘) diubah menjadi underscore (‘ _ ‘). Pengenalan Pemrograman 2 7 .E. baca file sumber dan tuliskan isi dari file tersebut terhadap file tujuan. Kemudian.5.J.5 Latihan 5.N. sumber dan nama file tujuan.1 Spasi menjadi Underscore ( _ ) Buatlah sebuah program yang memuat dua String sebagai argument.I. } } 5.

E. bandingkan dengan kartu yang berada pada meja kedua. Seluruh kartu diletakkan pada meja. meja kedua. pemahaman atas algoritma – algoritma yang ada sangatlah berguna. Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi dua bagian. diharapkan pembaca dapat : 1. Aplikasi tersebut mampu menampilkan daftar account yang aktif.I.N. Membuat implementasi pribadi menggunakan algoritma yang ada 6. Proses tersebut akan berlangsung hingga seluruh kartu pada meja pertama telah diletakkan berurutan pada meja kedua. Pengenalan Pemrograman 2 1 . 2. selection sort. Kita ambil contoh pada aplikasi perbankan. disusun dari kiri ke kanan dan atas ke bawah. sebutlah meja ini sebagai meja pertama. dimana kartu yang diurutkan akan diletakkan. Elemen pertama diambil dari bagian array yang belum diurutkan dan kemudian diletakkan sesuai posisinya pada bagian lain dari array yang telah diurutkan. Ambil kartu pertama yang terletak pada pojok kiri atas meja pertama dan letakkan pada meja kedua. kemudian letakkan pada urutan yang sesuai setelah perbandingan. Langkah ini dilakukan secara berulang hingga tidak ada lagi elemen yang tersisa pada bagian array yang belum diurutkan. merge sort dan quick sort. Penjelasan berikut ini menerangkan bagaimana algoritma insertion sort bekerja dalam pengurutan kartu. Beberapa macam algoritma sorting telah dibuat karena proses tersebut sangat mendasar dan sering digunakan. Kemudian kita mempunyai meja yang lain.J. Pada akhir pembahasan. Ambil kartu kedua dari meja pertama. Memahami dan menjelaskan algoritma dari insertion sort. Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling kecil hingga yang paling besar. Oleh karena itu. BAB 6 Algoritma Sorting 6.1 Tujuan Sorting adalah proses menyusun elemen – elemen dengan tata urut tertentu dan proses tersebut terimplementasi dalam bermacam aplikasi. Hampir seluruh pengguna pada sistem akan memilih tampilan daftar berurutan secara ascending demi kenyamanan dalam penelusuran data.2 Insertion Sort Salah satu algoritma sorting yang paling sederhana adalah insertion sort. yang belum diurutkan (meja pertama) dan yang sudah diurutkan (meja kedua). Ide dari algoritma ini dapat dianalogikan seperti mengurutkan kartu.

2.1. 6. Pada awalnya.compareTo(array[j])>0) { k = j. Mari kita kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket kartu. i < endIdx. Tukarkan kartu yang baru saja terpilih dengan kartu pada posisi kedua. Asumsikan bahwa kartu tersebut akan diurutkan secara ascending. kemudian tukarkan posisi kartu ini dengan kartu yang terletak pada pojok kiri atas meja. Ulangi langkah – langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan dapat digeser dengan kartu yang bernilai lebih rendah.2. 6. int startIdx. anda akan diminta untuk membuat implementasi bermacam algoritma sorting yang akan dibahas pada bagian ini. j < endIdx. Pilih nilai kartu yang paling rendah.I.2 Sebuah Contoh Data Mango Apple Peach Orange Banana 1st Pass Mango Apple Peach Orange Banana 2nd Pass Apple Mango Peach Orange Banana 3rd Pass Apple Mango Orange Peach Banana 4th Pass Apple Banana Mango Orange Peach Gambar 1. i++) { int k = i.J. dan dari atas ke bawah. kartu tersebut akan disusun secara linier pada sebuah meja dari kiri ke kanan. Lalu cari kartu dengan nilai paling rendah diantara sisa kartu yang tersedia. Pengenalan Pemrograman 2 2 . for (int j = i + 1.N. anda mungkin akan menemukan sebuah algoritma yang mirip dengan selection sort. algoritma ini sangat rapat dan mudah untuk diimplementasikan.1 Algoritma void insertionSort(Object array[]. int endIdx) { for (int i = startIdx. Layaknya insertion sort.2: Contoh insertion sort Pada akhir modul ini. } } 6.3 Selection Sort Jika Anda diminta untuk membuat algoritma sorting tersendiri. j++) { if (((Comparable) array[k]). } } swap(array[i].E.array[k]).

N. mari kita mengetahui garis besar dari konsep divide and conquer karena merge sort mengadaptasi pola tersebut. dimana n adalah jumlah total elemen dikurangi 1.3.2.I. array[i]).compareTo(array[j])>0) { min = j.4. } } swap(array[min]. for (int i = startIdx.E. i < endIdx. Ide utama dari algoritma selection sort adalah memilih elemen dengan nilai paling rendah dan menukar elemen yang terpilih dengan elemen ke-i.1 Pola Divide and Conquer Beberapa algoritma mengimplementasikan konsep rekursif untuk menyelesaikan permasalahan.2: Contoh selection sort 6. 6. j < endIdx. int endIdx) { int min. Permasalahan utama kemudian dipecah menjadi sub-masalah. int startIdx. Nilai dari i dimulai dari 1 ke n.4 Merge Sort Sebelum mendalami algoritma merge sort. for (int j = i + 1. j++) { if (((Comparable)array[min]). Pengenalan Pemrograman 2 3 . 6.3. i++) { min = i.2 Sebuah Contoh Data Maricar Vanessa Margaux Hannah Rowena 1st Pass Hannah Vanessa Margaux Maricar Rowena 2nd Pass Hannah Margaux Vanessa Maricar Rowena 3rd Pass Hannah Margaux Maricar Vanessa Rowena 4th Pass Hannah Margaux Maricar Rowena Vanessa Figure 1.J. } } 6.1 Algoritma void selectionSort(Object array[].

6. Hal ini terjadi bilamana bagian yang akan diurutkan menyisakan tepat satu elemen. Dengan hal ini deskripsi dari algoritma dirumuskan dalam 3 langkah berpola divide-and-conquer.length != 1) { //Membagi rangkaian data. 1.J.4. Sisa pengurutan satu elemen tersebut menandakan bahwa bagian tersebut telah terurut sesuai rangkaian. yang akan membimbing menuju penyelesaian atas permasalahan utama 6. Jika sub-masalah tersebut cukup ringkas dan sederhana. Pada setiap tingkatan rekursi.4. Divide Memilah masalah menjadi sub masalah 2. Kombinasi Mengkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan rangkaian data berurutan Proses rekursi berhenti jika mencapai elemen dasar.I. pola tersebut terdiri atas 3 langkah.E. mergeSort(rightArr. Merge sort menggunakan pola divide and conquer. midIdx+1. int startIdx. Berikut langkah kerja dari Merge sort: 1. Divide Memilah elemen – elemen dari rangkaian data menjadi dua bagian.N. } } Pengenalan Pemrograman 2 4 . endIdx). Conquer Selesaikan sub masalah tersebut secara rekursif. rightArr). Kombinasi Mengkombinasikan solusi dari sub-masalah. midIdx).3 Algoritma void mergeSort(Object array[]. 2. kemudian solusi dari sub-masalah akan membimbing menuju solusi permasalahan utama. startIdx. pendekatan penyelesaian secara langsung akan lebih efektif 3. Conquer Conquer setiap bagian dengan memanggil prosedur merge sort secara rekursif 3. combine(leftArr. int endIdx) { if (array. rightArr dan leftArr mergeSort(leftArr.2 Memahami Merge Sort Seperti yang telah dijelaskan sebelumnya.

A[q] disebut sebagai elemen pivot. Pengenalan Pemrograman 2 5 . Perhitungan pada elemen q merupakan salah satu bagian dari prosedur pemisahan. algoritma ini hanya mengikuti langkah – langkah sebagai berikut : 1.E.4.R Hoare. 6.N. 2 5 6 7 Gambar 1. algoritma ini juga berdasar pada pola divide-and-conquer.3.5 Quicksort Quicksort ditemukan oleh C.I.A.J.4 Sebuah Contoh Rangkaian data: 7 2 5 6 Membagi rangkaian menjadi dua bagian: LeftArr RightArr 7 2 5 6 Membagi LeftArr menjadi dua bagian: LeftArr RightArr 7 2 Mengkombinasikan 2 7 Membagi RightArr menjadi dua bagian: LeftArr RightArr Mengkombinasikan 5 6 Mengkombinasikan LeftArr dan RightArr. Berbeda dengan merge sort. Seperti pada merge sort. 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].4: Contoh merge sort 6.

langkah ”kombinasi” tidak di lakukan karena telah terjadi pengurutan elemen – elemen pada sub-array 6. int leftIdx.E. 3 1 4 1 5 9 2 6 5 3 5 8 Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen akhir. } } 6. rightIdx). Conquer Mengurutkan elemen pada sub-rangkaian secara rekursif Pada algoritma quicksort. 2. pivotIdx+1. rightIdx).5. leftIdx. quickSort(array. kiri 3 1 4 1 5 9 2 6 5 3 5 kanan 8 Geser elemen kiri kearah kanan sampai ditemukan nilai yang lebih besar dari elemen pivot tersebut.5. kiri 3 1 4 1 5 9 2 6 5 kanan 3 5 8 Tukarkan antara elemen kiri dan kanan kiri 3 1 3 1 5 9 2 6 5 kanan 4 5 8 Pengenalan Pemrograman 2 6 . leftIdx.2 Sebuah Contoh Rangkaian data: 3 1 4 1 5 9 2 6 5 3 5 8 Pilih sebuah elemen yang akan menjadi elemen pivot.I. Geser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen yang tidak lebih besar dari elemen tersebut. int rightIdx) { int pivotIdx.1 Algoritma void quickSort(Object array[].J.N. /* Kondisi Terminasi */ if (rightIdx > leftIdx) { pivotIdx = partition(array. quickSort(array. pivotIdx-1).

kiri 3 1 3 1 2 9 kanan 5 6 5 4 5 8 Geserkan kembali elemen kiri dan kanan. 6. pivot 2 1 3 1 3 9 5 6 5 4 5 8 Gambar 1. 6.E. Geserkan lagi elemen kiri dan kanan.6.6 Latihan 6. kanan 3 1 3 1 2 kiri 9 5 6 5 4 5 8 Terlihat bahwa titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen kanan < elemen kiri.2: Contoh quicksort Kemudian urutkan elemen sub-rangkaian pada setiap sisi dari elemen pivot.2 Selection Sort Pengenalan Pemrograman 2 7 .J.1 Insertion Sort Impelementasikan algoritma insertion sort dalam Java untuk mengurutkan serangkaian data integer.I. Dalam hal ini tukarkan elemen pivot dengan elemen kanan.6. Lakukan percobaan terhadap hasil implementasi anda terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command line.4.N. kiri 3 1 3 1 5 9 kanan 2 6 5 4 5 8 Tukarkan antar elemen kembali.

J.parseInt(args[i]).println(numArr[i]). } mergeSort(numArr. i++) { working[i] = array[startIdx+i]. 0.length. int endIdx) { if(startIdx == _____) { return. i < length. int mid = _____.length]. class MergeSort { static void mergeSort(int array[]. numArr. mergeSort(array.E. Impelementasikan algoritma selection sort dalam Java untuk mengurutkan serangkaian data integer. } } } 6.out. int m2 = mid-startIdx+1. } } else { array[i+startIdx] = _____. mid).4 Quicksort Pengenalan Pemrograman 2 8 . mergeSort(array. i < numArr.length-1). } int length = endIdx-startIdx+1.3 Merge Sort Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer. i++) { numArr[i] = Integer. i++) { if(m2 <= endIdx-startIdx) { if(m1 <= mid-startIdx) { if(working[m1] > working[m2]) { array[i+startIdx] = working[m2++]. for (int i = 0.6.N. int working[] = new int[length]. } } } public static void main(String args[]) { int numArr[] = new int[args. endIdx). for (int i = 0. } int m1 = 0. i++) { System. _____.6. } else { array[i+startIdx] = _____. i < args. i < length.length. _____. } } else { array[_____] = working[m1++].I. int startIdx. 6. for(int i = 0. Lakukan percobaan terhadap hasil implementasi anda terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command line. for(int i = 0.

int endIdx) { // startIdx adalah index bawah // endIdx is index atas // dari array yang akan diurutkan int i=startIdx. // rekursi if (startIdx<j) { quickSort(array. } } } Pengenalan Pemrograman 2 9 . array[i]=_____.E. Gunakan implementasi quicksort berikut ini terhadap serangkaian data integer. } if (i<endIdx) { quickSort(array. i < numArr. int startIdx. array[j]=_____. // memilah do { while (array[i]_____pivot) { i++. i < args. j=endIdx.I. for (int i = 0.parseInt(args[i]). } } while (i<=j). i++) { System. 0. i++.length. _____. class QuickSort { static void quickSort (int[] array. //pilih elemen pertama sebagai pivot int pivot=array[_____]. numArr.J. i++) { numArr[i] = Integer.length]. j). _____. } if (i<=j) { h=_____. } quickSort(numArr. h. for (int i = 0.length-1). j--.N.length. endIdx). } while (array[j]>_____) { j--.out. } } public static void main(String args[]) { int numArr[] = new int[args.println(numArr[i]).

2 Abstract Windowing Toolkit (AWT) vs. Semua itu membantu pengembang dalam mendesain dan mengimplementasikan aplikasi visual yang lebih baik. Menjelaskan tentang flow layout. border layout. Tidak seperti beberapa komponen AWT yang menggunakan native code. keseluruhan Swing ditulis menggunakan bahasa pemrograman Java. merupakan bagian penting dari Java SDK.E. Accessibility. JFC termasuk diantara 5 bagian utama dari API yaitu AWT dan Swing. Begitu juga dengan AWT menjamin tampilan look and feel pada aplikasi yang dijalankan pada dua mesin yang berbeda menjadi terlihat sama. Perbedaan antara komponen dan kontainer. Pada akhir pembahasan. Anda akan mempelajari applet pada bab berikutnya. dan grid layout dalam komponen GUI 6. yang termasuk dalam koleksi dari API dimana dapat mempermudah pengembangan aplikasi JAVA GUI. 3. Swing The Java Foundation Class (JFC). AWT dan Swing menyediakan komponen GUI yang dapat digunakan dalam membuat aplikasi Java dan Applet. program Anda akan kelihatan tidak menarik dan tidak nyaman digunakan bagi para user. Mendesain aplikasi GUI menggunakan AWT. 7. Java menyediakan banyak tool seperti Abstract Windowing Toolkit dan Swing untuk mengembangkan aplikasi GUI yang interaktif. Membuat tampilan yang komplek dalam mendesain aplikasi GUI. dan Drag dan Drop. 7.I. Swing API dibangun dari beberapa API yang mengimplementasikan beberapa jenis bagian dari AWT.J. 4.3 Komponen GUI pada AWT Pengenalan Pemrograman 2 1 . Anda masih tetap bisa membuat suatu program.N. diharapkan pembaca dapat : 1. BAB 7 Abstract Windowing Toolkit dan Swing 7. komponen AWT dapat digunakan bersama komponen Swing. Swing menyediakan implementasi platform-independent dimana aplikasi yang dikembangkan dengan platform yang berbeda dapat memiliki tampilan yang sama. Tetapi. Mendesain aplikasi GUI menggunakan Swing. Kesimpulannya. Memiliki GUI yang baik dapat memberi efek pada penggunaan aplikasi. Memahami persamaan dan perbedaan antara AWT dan Swing 2.1 Tujuan Tanpa mempelajari tentang grapichal user interface (GUI) API. 5. Tiga bagian yang lainnya dari API adalah Java2D.

//Coba hilangkan baris ini sf. Inilah syntax untuk method setVisible. menggunakan method setSize. Object Frame selalu digunakan.I. Default dari window adalah not visible atau tak tampak hingga Anda mengatur visibility menjadi true. komponen GUI seperti tombol atau textfield diletakkan di dalam kontainer.height berdasar pada spesifikasi Dimension d.*. public class SampleFrame extends Frame { public static void main(String args[]) { SampleFrame sf = new SampleFrame().setSize(100.E. 7. Turunan dari window class.J. Top level window. dua diantaranya memiliki penulisan seperti dibawah ini : Frame() Frame(String title) Kontainer Panel Window Frame Tabel 1.setVisible(true). Memiliki empat constructor . Sebuah komponen yang dapat menampung komponen yang lainnya. Superclass dari applet class. sf. void setVisible(boolean b) Dalam mendesain aplikasi GUI. int height) mengubah ukuran komponen ini dengan width dan height sebagai parameter. menubar tidak termasuk border.2. Abstract Subclass dari Component Class. Class AWT Komponen Deskripsi Abstract Class untuk object yang dapat ditampilkan pada console dan berinteraksi dengang user.awt. 100). dimana berarti tidak bisa dimasukkan dalam object yang lainnya. Turunan dari Container Class. border dan pengatur ukuran di pojok. import java. Dibawah ini adalah contoh bagaimana membuat sebuah aplikasi. Berikut ini adalah daftar dari beberapa class penting pada kontainer yang telah disediakan oleh AWT. Window dengan judul. Turunan dari Container class.1 Window Classes Fundamental Dalam mengembangkan aplikasi GUI. Sebuah frame atau window tanpa titlebar.3.1: Class kontainer AWT Untuk mengatur ukuran window. void setSize(Dimension d) mengubah ukuran dengan d.width dan d.Tidak memiliki border dan menubar. menubar. //Coba hilangkan baris ini Pengenalan Pemrograman 2 2 . Bagian utama dari semua class AWT.N. void setSize(int width.

0.1. 100. float g. Dibawah ini adalah daftar dari beberapa method. 7.Font. //red g. int g.2. } } perhatikan bahwa tombol tutup pada frame tidak akan bekerja karena tidak ada mekanisme event handling yang ditambahkan di dalam aplikasi. 100).setColor(new Color(0. //hijau g. Deskripsi Panjang nilai : 0 ke 224-1 (hitam ke putih). int b) Color(float r. dimana memiliki tiga constructor.N.fillRect(30.0)).3.0f. g.drawString("Hello GUI World!". Format Constructor Color(int r.I.0.16)).black). //Konstanta dalam class Color } public void paint(Graphics g) { g. Red: bits 16-23 Green: bits 8-15 Blue: bits 0-7 Dibawah ini adalah contoh program yang menggunakan beberapa method di dalam class Graphic.setFont(new Font("Helvetica". import java. Anda akan belajar tentang event handling pada modul selanjutnya. } public static void main(String args[]) { Frame f = new Frame("Testing Graphics Panel").awt. float b) Color(int rgbValue) Nilai integer 0 .255.E. drawLine() fillRect() drawRect() clearRect() drawPolyline() drawPolygon() fillPolygon() getColor() setColor() getFont() setFont() drawString() Tabel 1. public class GraphicPanel extends Panel { GraphicPanel() { setBackground(Color. 10). 30. Nilai float 0. g.2a: Beberapa metode dari kelas Graphics Hubungan dari class ini adalah class Color. 150.0 .setColor(new Color(1.*.J.255.PLAIN.2 Grafik Beberapa method grafik ditemukan dalam class Graphic.0)). Pengenalan Pemrograman 2 3 .

f. import java. fwc.add(list).add("Monica"). list.add(new Label("Labe")).J. 7. Kontrol adalah komponen seperti tombol atau textfield yang mengijinkan user untuk berinteraksi dengan aplikasi GUI. //akan dibahas lebih detail pada pembahasan berikutnya fwc. cbg. true)). false)). chooser. CheckboxGroup cbg = new CheckboxGroup().add(new Scrollbar()).add("Avril"). class FrameWControls extends Frame { public static void main(String args[]) { FrameWControls fwc = new FrameWControls().E.add(new Checkbox("chk1".add(gp). 300).3 Beberapa komponen AWT Berikut ini adalah daftar dari kontrol AWT.awt.*. GraphicPanel gp = new GraphicPanel().setSize(600.add(new Checkbox("chk2". cbg.3: Komponen AWT Berikut adalah aplikasi membuat sebuah frame dengan kontrol yang telah dimasukkan di dalamnya. f. false). fwc.I. fwc. Label TextField TextArea Button Checkbox CheckboxGroup Choice List Scrollbar Tabel 1. Pengenalan Pemrograman 2 4 .3. chooser.add("V").setSize(600.N.setVisible(true). Berikut ini semua subclass dari class Components. fwc.add(new Checkbox("chk3". 600). fwc. fwc.add(chooser).add(new TextField()). Choice chooser = new Choice(). cbg. list. fwc.add(new Button("Test Me!")). List list = new List(3. false)).add("Britney").2. chooser. f. fwc.setLayout(new FlowLayout()).add("MTV"). dia harus diletakkan didalam window yang dapat terlihat seperti sebuah frame. fwc. fwc. } } Agar panel dapat terlihat atau visible.

setVisible(true).N. Anda dapat mengisi null sebagai argumen untuk method ini. int width. int y. Anda akan memanggil method ini untuk setiap komponen.4 Layout Manager Posisi dan ukuran suatu komponen ditentukan oleh layout manager.CardLayout Layout manager dapat diatur menggunakan method setLayout dari class Container. termasuk class applet. FlowLayout Constructors FlowLayout() Membuat object baru FlowLayout dengan posisi di tengah dan lima unit horizontal dan vertikal gap dimasukkan pada komponen sebagai default. 1.E. dimana memiliki tiga constructor seperti daftar di bawah ini. Berikut ini beberapa layout manager yang terdapat di dalam Java. void setLayout(LayoutManager mgr) Jika Anda memilih untuk tidak menggunakan layout manager. 7. Layout manager mengatur tampilan dari komponen di dalam kontainer.GridLayout 4.1 FlowLayout Manager FlowLayout Manager adalah default manager untuk class Panel dan subclassnya. Cara meletakkan komponen dari FlowLayout Manager dimulai dari kiri ke kanan dan dari atas ke bawah.FlowLayout 2. Anda akan mengatur posisi elemen secara manual dengan menggunakan method setBounds dari class Components. int height) Method ini mengatur posisi berdasarkan pada argumen x dan y. Tetapi selanjutnya. Method ini dapat ditulis sebagai berikut.J. Hal ini akan cukup menyulitkan dan membosankan untuk aplikasi jika Anda memiliki beberapa objek komponen didalam object container. Pengenalan Pemrograman 2 5 . Berikut adalah bagaimana FlowLayout Manager bekerja. dan ukuran berdasarkan argumen width dan height.4. dimulai dari pojok kiri atas. fwc. Seperti pada saat Anda mengetik menggunakan editor kata pada umumnya.GridBagLayout 5.BorderLayout 3.I. } } 7. public void setBounds(int x. FlowLayout(int align) Membuat object baru FlowLayout dengan posisi spesifik dan lima unit horizontal dan vertikal gap dimasukkan pada komponen sebagai default.

setVisible(true).FlowLayout.add(new Button("THREE")).add(new Button("ONE")).FlowLayout.setLayout(new FlowLayout(FlowLayout.BorderLayout Manager BorderLayout membagi kontainer menjadi lima bagian diantaranya utara.3. FlowLayout Constructors FlowLayout(int align.setSize(100. 100).CENTER 3. Tabel 13. fld.RIGHT Bagaimanakah output dari program berikut? import java. int vgap) Membuat object baru FlowLayout dengan argumen pertama sebagai posisi pada komponen dan hgap untuk horizontal dan vgap untuk vertikal pada komponen Tabel 1.1: Constructor FlowLayout Gap dapat dikatakan sebagai jarak antara komponen dan biasanya diukur dengan satuan pixel. timur. Posisi argumen mengikuti penulisan sebagai berikut : 1. class FlowLayoutDemo extends Frame { public static void main(String args[]) { FlowLayoutDemo fld = new FlowLayoutDemo(). int hgap.RIGHT. fld. Pengenalan Pemrograman 2 6 .4.N. fld. fld. 10. selatan.LEFT 2.I.add(new Button("TWO")).FlowLayout. 10)).*. fld. fld.J.1: Contoh hasil dalam window 7.2.E.awt. } } Gambar berikut adalah contoh dari hasil yang berjalan pada platform Window.

dan tengah. Tampilan ini adalah bersifat default untuk object Window.add(new Button("NORTH"). 3.SOUTH). BorderLayout. BorderLayout.CENTER Berikut ini adalah contoh program yang menunjukkan bagaimana BorderLayout bekerja.E.awt. bld.N. Gambar kedua menunjukkan efek dari mengubah bentuk dari frame.add(new Button("CENTER"). BorderLayout. 10)).EAST). Dan region tengah berada pada perpotongan jalur horizontal dan vertikal. parameter hgap dan vgap disini juga menjelaskan jarak antara komponen dengan kontainer. barat.EAST BorderLayout. Pengenalan Pemrograman 2 7 .add(new Button("SOUTH"). BorderLayout. bld. //may remove bld. 2. bld. maka komponen yang terakhir ditambahkan yang akan ditampilkan. 5. bld. BorderLayout. int vgap) Membuat object BorderLayout baru dengan spasi unit hgap horizontal dan unit vgap vertikal yang diaplikasikan diantara komponen yang berbeda. Setiap komponen dimasukkan ke dalam region yang spesifik.3. gunakan method menambahkan dan melewatkan dua argumen yaitu : komponen yang ingin dimasukkan ke dalam region dan region mana yang ingin dipakai untuk meletakkan komponen. Constructor BorderLayout BorderLayout() Membuat object BorderLayout baru tanpa spasi yang diaplikasikan diantara komponen yang berbeda.J.WEST).SOUTH BorderLayout.add(new Button("WEST").I. Berikut ini adalah daftar dari kelima region.NORTH). termasuk object dari subclass Window yaitu tipe Frame dan Dialog. Region utara dan selatan membentuk jalur horizontal sedangkan region timur dan barat membentuk jalur vertikal.setVisible(true). class BorderLayoutDemo extends Frame { public static void main(String args[]) { BorderLayoutDemo bld = new BorderLayoutDemo().NORTH BorderLayout. 4.setSize(200. } } Berikut ini adalah hasil dari contoh program tersebut. import java. bld.setLayout(new BorderLayout(10. Untuk menambahkan komponen kedalam region yang spesifik. BorderLayout(int hgap. bld.CENTER).add(new Button("EAST"). 200). Menambahkan lebih dari satu komponen pada kontainer yang bersangkutan. Perlu diperhatikan bahwa hanya satu komponen yang dapat dimasukkan dalam satu region.2: Constructor BorderLayout Seperti pada FlowLayout Manager.WEST BorderLayout.*. Tabel 1. 1. BorderLayout. bld.

int hgap.3. gld. int cols.I. int vgap) Membuat object GridLayout baru dengan jumlah baris dan kolom yang ditentukan.3: Constructor GridLayout Cobalah program ini.4. class GridLayoutDemo extends Frame { public static void main(String args[]) { GridLayoutDemo gld = new GridLayoutDemo(). gld. Constructor GridLayout GridLayout() Membuat object GridLayout baru dengan satu baris dan satu kolom sebagai default GridLayout(int rows.N. import java. komponen juga diposisikan dari kiri ke kanan dan dari atas ke bawah seperti pada FlowLayout manager. Berikut ini adalah daftar dari constructor untuk class GridLayout. Unit spasi hgap horizontal dan vgap vertikal diaplikasikan ke dalam komponen.awt. Pengenalan Pemrograman 2 8 . gld.3. Hal tersebut tidak mempedulikan ukuran sebenarnya dari komponen. 4.*.add(new Button("TWO")).E. 3. 4)). Gambar 1. Tabel 1. int cols) Membuat object GridLayout baru dengan jumlah baris dan kolom sesuai dengan keinginan GridLayout(int rows. Semua region memiliki ukuran yang sama.setLayout(new GridLayout(2.J.2: hasil contoh program 7.3 GridLayout Manager Dengan GridLayout manager.add(new Button("ONE")). GridLayout manager membagi kontainer menjadi baris dan kolom.

} } Berikut ini adalah output dari program.J.N. gld.4 Panel dan Tampilan kompleks Untuk membuat tampilan yang lebih lengkap.add(new Button("FIVE")).E.4. gld. gld.awt. Pengenalan Pemrograman 2 9 . Anda dapat menggabungkan layout manager yang berbeda dengan menggunakan panel.*.I.add(new Button("FOUR")). Perhatikan teknik yang digunakan pada contoh berikut. Anda dapat memasukkan komponen ke dalam panel dan kemudian menambahkan panel ke dalam region yang Anda inginkan di dalam kontainer.3: hasil contoh program 7.add(new Button("THREE")). 200).3. Ingatlah bahwa panel adalah kontainer dan komponen pada saat yang sama.setSize(200. import java.setVisible(true). Gambar 1. gld. gld.

Panel panelNorth = new Panel().add(panelSouth.E.300). panelCenter. cl. /* Panel selatan */ panelSouth.add(new Button("TWO")). cl. BorderLayout.add(new TextField("4th")).setVisible(true). Panel panelCenter = new Panel(). } } Berikut ini adalah output dari program. BorderLayout.add(panelNorth. BorderLayout.add(new Checkbox("I'm here!").setLayout(new BorderLayout()). panelNorth. panelSouth. panelNorth.add(new TextField("2nd")).add(new TextField("3rd")).add(new TextField("1st")).I.add(new Checkbox("Choose me!"). panelCenter. class ComplexLayout extends Frame { public static void main(String args[]) { ComplexLayout cl = new ComplexLayout(). /* Panel tengah */ panelCenter.CENTER).N.add(new Checkbox("Pick me!").EAST). Pengenalan Pemrograman 2 10 .add(new Button("ONE")). panelSouth.WEST).add(panelCenter.add(new Button("THREE")).setSize(300.NORTH). panelCenter. /* Panel utara */ //Panel menggunakan FlowLayout sebagai default panelNorth.CENTER).J. BorderLayout. cl. BorderLayout. panelSouth. Panel panelSouth = new Panel(). /* Menambahkan panel pada container Frame*/ //Frame menggunakan BorderLayout sebagai default cl.4)). cl. BorderLayout. panelCenter.setLayout(new GridLayout(4.SOUTH).

Komponen Swing JComponent Penjelasan class induk untuk semua komponen Swing.4: Hasil dari contoh program 7. Berhubungan dengan class filechooser dalam package AWT JButton JCheckBox JFileChooser Pengenalan Pemrograman 2 11 . Pada dasarnya.5 Komponen Swing Seperti pada package AWT. program GUI ditulis menggunakan banyak class dari package Swing yang mempunyai tampilan look and feel yang sama meski dijalankan pada paltform yang berbeda. tidak termasuk top-level kontainer Tombol “push”.swing. Perbedaan utama antara keduanya adalah komponen Swing ditulis menyeluruh menggunakan Java. Berhubungan dengan class button dalam package AWT Item yang dapat dipilih atau tidak oleh pengguna. Perbedaan jelas terdapat pada penamaan komponen.I.3. Berikut adalah daftar dari komponen Swing. nama komponen Swing sama dengan nama komponen AWT tetapi dengan tambahan huruf J pada prefixnya. Gambar 1. Nama dari komponen GUI milik Swing hampir sama persis dengan komponen GUI milik AWT. nama komponen tersebut menjadi Jbutton class. Sedangkan pada Swing. Package tersebut dapat ditemukan di javax.N. Sebagai contoh. Berhubungan dengan class checkbox dalam package AWT Mengijinkan pengguna untuk memilih sebuah file. Lebih dari itu.E. Swing menyediakan komponen yang lebih menarik seperti color chooser dan option pane. satu komponen dalam AWT adalah button class. Kesimpulannya. package dari Swing menyediakan banyak class untuk membuat aplikasi GUI.J.

JPanel panel. Turunan Jcomponent.*.4: Beberapa komponen Swing JFrame JPanel JApplet JOptionPane JDialog JColorChooser Untuk daftar yang lengkap dari komponen Swing. import java. Untuk melakukan hal tersebut. Berhubungan dengan class panel dalam package AWT. Turunan dan Berhubungan dengan class frame dalam package AWT tetapi keduanya sedikit tidak cocok dalam kaitannya dengan menambahkan komponen pada kontainer.5. Pengenalan Pemrograman 2 12 . Juga sedikit tidak cocok dengan class applet dalam kaitannya dengan menambahkan komponen pada container Turunan Jcomponent. Turunan Jcomponent. Anda akan menggunakan method getContentPane dari container. Disediakan untuk mempermudah menampilkan popup kotak dialog. class SwingDemo { JFrame frame. Ini adalah syarat menambahkan komponen ke dalam kontainer. Jika Anda ingin menambahkan langsung sebuah komponen kedalam kontainer sebagai kontainer AWT. Komponen Swing JTextField Penjelasan Mengijinkan untuk mengedit text satu baris. Turunan dan Berhubungan dengan class Applet dalam package AWT. Class Container sederhana tetapi bukan top-level. JButton button. Turunan dan Berhubungan dengan class dialog dalam package AWT.1 Setting Up Top-Level Containers Seperti disebutkan diatas.2 Contoh Jframe import javax.E.awt.J. Perlu mendapatkan content pane yang terbaru sebelum menambah sebuah komponen. Container contentPane.I.swing. top-level containers seperti Jframe dan Japplet dalam Swing sangat tidak cocok dengan AWT. Tabel 1. 7. pertama-tama Anda telah mendapatkan content pane dari kontainer. 7.*. Berhubungan dengan class textfield dalam package AWT.N. JTextField textField.5. void launchFrame() { /* inisialisasi */ frame = new JFrame("My First Swing Application"). Memungkinkan pengguna untuk memilih warna yang diinginkan. Biasanya digunakan untuk menginformasikan sesuatu kepada pengguna atau prompt pengguna untuk input. Anda dapat melihatnya di dokumentasi API.

E. panel = new JPanel().5. dinisialisasikan dan penambahan semua komponen dilaksanakan di dalam method launchFrame.N. what's your name?"). button = new JButton("Click me!").3 Contoh JOptionPane import javax.PLAIN_MESSAGE). Berikut adalah keluaran dari program diatas. void launchFrame() { optionPane = new JOptionPane()..4.showInputDialog("Hi. Keuntungan penggunaan model ini akan lebih berguna ketika sampai pada event handling.I.pack(). Petunjuk penulisan program: Perhatikan penulisan kode yang digunakan pada contoh ini tampak berlawanan dengan contoh untuk AWT. /* menambahkan komponen-komponen contentPane– menggunakan BorderLayout */ contentPane.2: Hasil contoh program 7. " + name + ". class JOptionPaneDemo { JOptionPane optionPane. } public static void main(String args[]) { SwingDemo sd = new SwingDemo().J. String name = optionPane. contentPane = frame. textField = new JTextField("Default text"). optionPane.add(textField).getContentPane(). "Greeting. sd. Pengenalan Pemrograman 2 13 . Gambar 1. /* menambahkan komponen-komponen ke panel– menggunakan FlowLayout sebagai default */ panel.setVisible(true). Komponen dideklarasikan sebagai fields. BorderLayout.. method launchFrame ditentukan.".awt masih saja diimpor karena layout manager yang digunakan terdapat pada package tersebut. optionPane.launchFrame(). Kita tidak lagi meng-extend Frame class. panel.add(button).*.swing. frame.CENTER). } } Perlu diperhatikan pada package java.showMessageDialog(null.add(panel. memberi judul pada frame dan mengepack komponen di dalam frame dapat juga dilakukan untuk frame AWT. "Nice to meet you. Juga. //menyebabkan ukuran frame menjadi dasar pengaturan komponen frame.".

1 Tic-Tac-Toe Buatlah tampilan GUI untuk program tic-tac-toe. System.exit(0).E.I. Gambar 1.6. Jadi.5.6 Latihan 7. Ingatlah bahwa Anda akan menambahkan kode ini pada tahap akhir untuk mengatasi interaksi antar pengguna. } } Lihat. begitu mudahnya memasukkan input dari user. desainlah papan Anda dengan benar.N.4. } public static void main(String args[]) { new JOptionPaneDemo().J. keluarkan semua sisi artistik Anda.3: Hasil contoh program 7.1: papan Tic-Tac-Toe Pengenalan Pemrograman 2 14 . Anda dapat menggunakan AWT atau Swing untuk latihan ini. Papannya terdiri dari enam kotak. Pastikanlah Anda memilih komponen yang pantas untuk papan tersebut.launchFrame(). Berikut ini adalah hasil dari contoh program diatas Gambar 1.

Mengerti bagaimana delegation event model bekerja 3.2 Delegation Event Model Delegasi event model menguraikan bagaimana program Anda dapat merespon interaksi dari user. ketika user berinteraksi dengan komponen GUI). Ketika tombol ditekan. 1. Sebuah event object mempunyai tipe data mengenai salah satu dari class ini.I. 3. Pada akhir pembahasan. event source dalam hal ini adalah tombol. Mendiskusikan keuntungan-keuntungan dari menggunakan inner dan anonymous class 8. Untuk memahami model. Menciptakan aplikasi GUI yang berinteraksi dengan user 4. Anda akan belajar bagaimana mengendalikan events triggered ketika user berinteraksi dengan aplikasi GUI Anda. Menerangkan komponen-komponen delegation event model 2. 2. BAB 8 GUI Event Handling 8. diharapkan pembaca dapat : 1. pertama-tama mari kita pelajari melalui tiga komponen utamanya. Sebagai contoh. Event Listener/Handler Event listener menerima berita dari event-event dan proses-proses interaksi user. listener akan mengendalikan dengan menampilkan sebuah informasi yang berguna untuk user. Mendiskusikan manfaat dari class-class adapter 5. Pengenalan Pemrograman 2 1 . Ada beberapa class event untuk kategori yang berbeda dari user action. Event Object Ketika sebuah event terjadi (misal.E.N. Anda akan dapat mengembangkan aplikasi GUI yang dapat merespon interaksi user. Object berisi semua informasi yang perlu tentang event yang telah terjadi. sebuah object event diciptakan.1 Tujuan Pada modul ini. Setelah menyelesaikan modul ini.J. Event Source Event source mengacu pada komponen GUI yang meng-generate event. seperti ketika mouse telah di-klik. jika user menekan tombol. Informasi meliputi tipe dari event yang telah terjadi.

dia akan bekerja.J.I. sebuah listener seharusnya diregistrasikan dengan sebuah source sehingga dapat menerima informasi tentang event-event yang terjadi pada source tersebut. Gambar 8. Event kemudian ditembak oleh source pada listener yang teregistrasi.1: Delegation Event Model Pada awalnya. Di bawah ini adalah delegation event model.E. Pengenalan Pemrograman 2 2 . Saat listener menerima sebuah event object (pemberitahuan) dari source. Hanya listener yang sudah teregistrasi yang dapat menerima pemberitahuan event-event. sebuah event object akan menguraikan event yang diciptakan. Ketika telah teregistrasi.N. Menerjemahkan pemberitahuan dan memproses event yang terjadi. Ketika sesuatu terjadi dengan event source. sebuah listener hanya tinggal menunggu sampai event terjadi.

Extends ComponentEvent. Immediate subclass dari class EventObject adalah class AWTEvent.I.N. InputEvent ActionEvent ItemEvent KeyEvent MouseEvent Extends ComponentEvent. deiconified. Focus. Extends InputEvent. di-resize. Dijalankan ketika nilai dari text field atau text area dirubah.E. dilepas.util. Dijalankan ketika sebuah item dipilih atau dideselect oleh user. Dijalankan ketika sebuah tombol mouse ditekan. atau ketika focus ditransfer kedalam atau keluar window.2: Class-Class Event TextEvent WindowEvent Catatan. Mouse. melakukan double-klik daftar item. dilepas atau diketikkan. bahwa semua subclass-subclass AWTEvent mengikuti konvensi nama berikut ini: <Type>Event Pengenalan Pemrograman 2 3 . Action dan lainnya. ditutup. Itu merupakan akar dari semua AWTbased events. Dijalankan sebuah object Window dibuka. void remove<Type>Listener(<Type>Listener listenerObj) 8. Extends AWTEvent. Dijalankan ketika sebuah tombol ditekan. Tabel 1.awt. iconified.2.1 Registrasi Listeners Event source mendaftarkan sebuah listener melalui method add<Type>Listener. Extends AWTEvent. Class Event Deskripsi komponen ComponentEvent Extends AWTEvent. nonaktifkan. Extends AWTEvent. Listener yang telah teregistrasi dapat juga tidak diregistrasikan lagi menggunakan method remove<Type>Listener. atau ketika sebuah kursor mouse masuk atau keluar dari bagian visible dari komponen. Component. atau di-klik (tekan dan lepas). Dijalankan ketika sebuah key ditekan. Akar dari hirarki class event adalah class EventObject. Berikut ini beberapa dari class-class AWT event. diaktifkan. 8. seperti sebuah list atau checkbox. Extends InputEvent. dibuat visible atau hidden. Class AWTEvent didefinisikan pada paket java. Beberapa listeners dapat diregistrasi dengan satu event source untuk menerima pemberitahuan event. Abstrak root class event untuk semua komponen-level input class-class event. void add<Type>Listener(<Type>Listener listenerObj) <Type> tergantung pada tipe dari event source.3 Class-Class Event Sebuah event object mempunyai sebuah class event sebagai tipe data acuannya. Dijalankan ketika sebuah dipindahkan. Dapat berupa Key.J. atau memilih sebuah menu. yang dapat ditemukan pada paket java.

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.2 Method MouseListener Di bawah ini adalah method-method MouseListener yang seharusnya digunakan dalam penerapan class. public void mouseExited(MouseEvent e) Dipanggil pada saat kursor mouse meninggalkan area komponen.4.J.4. 8. public void mouseEntered(MouseEvent e) Dipanggil pada saat kursor mouse memasuki area komponen.N.1 Method ActionListener Interface ActionListener hanya terdiri dari satu method. Event Listeners ActionListener MouseListener MouseMotionListener Deskripsi Bereaksi atas perubahan mouse atau atau keyboard.seperti drag dan pemindahan mouse.E.I. Tabel 1. Menyediakan method-method yang akan memantau pergerakan mouse.1: Method ActionListener 8.3. Method ActionListener public void actionPerformed(ActionEvent e) Mengendalikan ActionEvent e yang terjadi. Tabel 1.3: Event Listeners WindowListener 8.4 Event Listeners Event listeners adalah class yang mengimplementasikan interfaces <Type>Listener. Tabel di bawah menunjukkan beberapa listener interfaces yang biasanya digunakan. Method-method MouseListener public void mouseClicked(MouseEvent e) Dipanggil pada saat tombol mouse di click (seperti tekan dan lepas).2: Method-Method MouseListener Pengenalan Pemrograman 2 4 .3. Bereaksi atas pergerakan mouse. Interface MouseMotionListener mendukung MouseListener. Bereaksi atas perubahan window.

Tabel 1. public void windowActivated(WindowEvent e) Dilibatkan ketika object Window adalah window yang aktif (window masih dipakai). release dari resource-resource yang digunakan oleh source) pada object. public void windowDeiconified(WindowEvent e) Dipanggil ketika object Window kembali setelah di-minimize ke keadaan normal. hanya memindahkan pointer mouse melalui object. Tabel 1.3.I.3.J.E.N. public void windowIconified(WindowEvent e) Dipanggil ketika object Window di-minimize.4: Method-Method WindowListener Pengenalan Pemrograman 2 5 . Method-method WindowListener public void windowOpened(WindowEvent e) Dipanggil pada saat object window dibuka (pertama kali window dibuat tampil). 8. Method-method MouseListener public void mouseDragged(MouseEvent e) Digunakan untuk memantau pergerakan mouse yang melintasi object pada saat tombol mouse ditekan.3: The MouseMotionListener methods 8. public void mouseMoved(MouseEvent e) Digunakan untuk memantau pergerakan mouse pada saat mouse melintasi area suatu object. public void windowClosing(WindowEvent e) Dipanggil pada saat user mencoba untuk menutup object Window dari menu sistem object. public void windowDeactivated(WindowEvent e) Dilibatkan ketika object Window tidak lagi merupakan window yang aktif.4.4. public void windowClosed(WindowEvent e) Dipanggil pada saat object Window ditutup setelah memanggil penempatan (misal.4 Method-Method WindowListener Di bawah ini method-method dari interface WindowListener.3 Method-Method MouseMotionListener MouseMotionListener mempunyai dua method untuk diimplementasikan. Tindakan ini persis sama dengan tindakan pada saat memindahkan sebuah window. Pada saat ini tidak ada mouse yang ditekan.

event. Buatlah sebuah class yang menguraikan dan membuat suatu tampilan dari aplikasi GUI Anda. 2.4.awt.*. tf = new TextField(60). import java.".N. Dalam menerapkan class. Daftarkan object listener. tf.setText(msg). BorderLayout. setSize(300.setText(msg).". } public void launchFrame() { /* Menambah komponen pada frame */ add(tf.". } public void mouseEntered(MouseEvent me) { String msg = "Mouse entered component. } public void mouseClicked(MouseEvent me) { String msg = "Mouse clicked.setText(msg).I. dengan source component menggunakan method add<Type>Listener. tf.4. Class ini boleh mengacu pada class yang sama seperti pada langkah awal. 8. tf. gunakan semua method-method dengan interface listener yang sesuai.setText(msg).E. tf. 4. MouseMotionListener { TextField tf.6 Contoh Mouse Events import java. public class MouseEventsDemo extends Frame implements MouseListener.*. 3.300).SOUTH). 1. addMouseListener(this).awt. } public void mouseReleased(MouseEvent me) { String msg = "Mouse released. 8. } public void mousePressed(MouseEvent me) { String msg = "Mouse pressed.setText(msg). instansiatiate dari class listener pada langkah 2. } public void mouseExited(MouseEvent me) { String msg = "Mouse exited component.J.". public MouseEventsDemo(String title){ super(title).".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. setVisible(true). Buatlah sebuah class yang menerapkan interface listener yang sesuai. Pengenalan Pemrograman 2 6 . Anda dapat memberikan implementasi kosong untuk method yang tidak ingin Anda gunakan. tf. Uraikan masing-masing method bagaimana Anda ingin mengendalikan event-event.

getY(). import java.exit(0).getX() + ". } public void mouseMoved(MouseEvent me) { String msg = "Mouse moved at " + me.300).getY().J. } } 8.getX() + ".setText(msg). } public static void main(String args[]) { MouseEventsDemo med = new MouseEventsDemo("Mouse Events Demo").event." + me.*. } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { setVisible(false). this. tf. System.setText(msg).")." + me. } void launchFrame() { setSize(300. tf.7 Contoh Menutup Window import java.E. class CloseFrame extends Frame implements WindowListener { Label label.*.addWindowListener(this).awt.launchFrame().I. } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } Pengenalan Pemrograman 2 7 . med.awt. } public void mouseDragged(MouseEvent me) { String msg = "Mouse dragged at " + me. CloseFrame(String title) { super(title). setVisible(true).N. label = new Label("Close the frame.4.

CFListener( CloseFrame ref ){ this. } } 8. this.*.launchFrame().1 Close Window Example import java. import java."). } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"). 8. } public void windowClosing(WindowEvent e) { ref. Anda terkadang lebih sering tertarik menerapkan hanya beberapa method dari interface saja. System. } } class CFListener extends WindowAdapter{ CloseFrame ref. Java menyediakan untuk kita classclass adapter yang menerapkan semua method dari masing-masing listener interface dengan lebih dari satu method.addWindowListener(w). cf.launchFrame(). public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example").awt.I. cf. setVisible(true). Untungnya. Di satu sisi.J. Implementasi dari method-method semuanya adalah kosong.5.dispose().*. CloseFrame(String title) { super(title). } void launchFrame() { setSize(300.300).ref = ref. class CloseFrame extends Frame{ Label label.exit(1). label = new Label("Close the frame.N.5 Class-class Adapter Class Menerapkan semua method dari interface yang semuanya akan membutuhkan banyak pekerjaan. } } Pengenalan Pemrograman 2 8 .awt.E.event. CFListener w = new CFListener(this).

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

memainkan animasi.2 Definisi dan dasar-dasar thread 9. Penggunaan sistem operasi modern saat ini telah mendukung kemampuan untuk menjalankan beberapa program. dalam waktu yang bersamaan Anda juga dapat mendengarkan musik. Sistem operasi yang telah terinstal dalam computer Anda itulah yang memperbolehkan Anda untuk menjalankan multitaskting.N. BAB 9 Threads 9. Menggunakan sinkronisasi pada thread yang bekerja bersama-sama dan saling bergantung satu dengan yang lainya 7. thread hadir untuk menjadi solusi dalam mengatasi permasalahan tersebut.I. Mengerti dan menggunakan kemampuan concurency 9.Oleh karena itu. Pada akhir pembahasan. Misalnya. Sebuah program sekuensial berarti sebuah program yang hanya memiliki satu aliran eksekusi. diharapkan pembaca dapat : 1. Sebuah contoh aplikasi adalah HotJava browser yang memperbolehkan Anda untuk browsing terhadap suatu page. Untuk lebih mudahnya. pasti dibutuhkan sesuatu yang dapat mengatur proses yang terjadi dan berjalan bersama-sama. misalnya gambar. Mengerti konsep prioritas dalam threads 4. pada saat Anda mengetik sebuah dokumen di komputer Anda dengan menggunakan text editor. Membuat sendiri sebuah thread 6.2. kemudian sebuah sekuen eksekusi. pasti hanya satu proses yang telah dieksekusi. Pengenalan Pemrograman 2 1 . di dunia nyata. ia memiliki sebuah titik awal eksekusi.J. bersamaan dengan mendownload object yang lain. Memungkinkan thread untuk dapat berkomunikasi dengan thread lain yang sedang berjalan 8.E. Setiap eksekusi. Mengetahui bagaimana menggunakan method didalam class Thread 5. dan kemudian berakhir. Mengerti perbedaan state dalam threads 3. ia juga dapat mengeksekusi beberapa proses secara bersama-sama(ibaratkan beberapa aplikasi berbeda yang bekerja pada PC Anda). Mendefiniskan threads 2.1 Tujuan Pada bab-bab sebelumnya Anda terbiasa untuk membuat program yang berururutan/sekuensial. Selama runtime. dan juga file audio pada saat yang bersamaan. Bagaimanapun juga. bayangkanlah thread sebagai sebuah proses yang akan dieksekusi didalam sebuah program tertentu.1 Definisi Thread Sebuah thread merupakan sebuah pengontrol aliran program. dan surfing lewat internet di PC Anda. Seperti itu juga sebuah program (ibaratkan di PC Anda).

3 Prioritas Untuk menentukan thread mana yang akan menerima control dari CPU dan akan dieksekusi pertama kali. Blocked Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu berjalan. setiap thread akan diberikan sebuah prioritas. sedangkan thread yang kedua memiliki prioritas 10. Ready to run Thread yang sudah siap untuk dieksekusi. 9.2. Gambar 1. 2.N. Thread pertama akan diberikan prioritas nomor 5. asumsikan bahwa ada dua buah thread yang berjalan bersama-sama. Anggaplah bahwa thread pertama telah berjalan pada saat thread kedua dijalankan.2 State dari Thread Sebuah thread memungkinkan untuk memiliki beberapa state: 1. Running Sebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari CPU.2. dimana semakin tinggi prioritas dari sebuah thread. karena ia akan menunggu sebuah resource tersedia atau sebuah event terjadi. state ini kemudian siap untuk dijalankan. Salah satu contoh dari skenario ini adalah context switch. 3.E. 4. Sebuah prioritas adalah sebuah nilai integer dari angka 1 sampai dengan 10. Sebuah context switch terjadi apabila sebagian dari thread telah dikontrol oleh CPU dari Pengenalan Pemrograman 2 2 . berarti semakin besar kesempatan dari thread tersebut untuk dieksekusi terlebih dahulu. 5. tetapi masih belum ada kesempatan untuk melakukannya. dan kemudian memperbolehkan CPU untuk menjalankan thread lain bekerja. Sebagai contoh. Resumed Setelah sebelumnya di block atau diberhentikan sementara.1: Thread 9. Suspended Sebuah thread yang berhenti sementara.J.I. Thread kedua akan menerima control dari CPU dan akan dieksekusi pada saat thread kedua tersebut memiliki prioritas yang lebih tinggi dibandingkan thread yang pada saat itu tengah berjalan.

Salah satu skenario adalah sebuah thread yang sedang berjalan memberikan kesempatan kepada CPU untuk mengontrol thread lain sehingga ia dapat berjalan.2. Thread(Runnable target.2 Constants Class Thread juga menyediakan beberapa constants sebagai nilai prioritas. Target menyatakan sebuah object dimana method run dipanggil. Thread(String name) Membuat sebuah object thread dengan memberikan penamaan yang spesifik.3 Class Thread 9. Hal ini juga mungkin dilakukan apabila lebih dari satu CPU tersedia.3. sangat bergantung kepada sistem operasi yang digunakan.3.I. thread yang lain. Sedangkan Solaris. prioritas tertinggi dari thread adalah thread yang siap untuk menerima kontrol dari CPU. Windows 95/98/NT menggunakan time-slicing dan round-robin untuk menangani kasus ini. Marilah kita lihat bersama beberapa constructor tersebut. Dalam kasus ini. Cara yang lain dari context switch adalah pada saat sebuah thread yang sedang berjalan diambil alih oleh thread yang memiliki prioritas tertinggi seperti yang telah dicontohkan sebelumnya.J. Untuk menentukan diantara dua thread yang memiliki prioritas sama untuk menerima kontrol dari CPU.1: Constructor dari Thread 9. ia akan membiarkan sebuah thread untuk dieksekusi sampai ia menyelesaikan tugasnya atau sampai ia secara suka rela membiarkan CPU untuk mengontrol thread yang lain. Setiap thread dengan prioritas yang sama akan diberikan sebuah jangka waktu tertentu untuk dieksekusi sebelum CPU mengontrol thread lain yang memiliki prioritas yang sama. Ada beberapa skenario mengenai bagaimana cara kerja dari context switch. Thread(Runnable target) Membuat sebuah object Thread yang baru berdasar pada object Runnable.1 Constructor Thread memiliki delapan constructor. String name) Membuat sebuah object Thread yang baru dengan nama yang spesifik dan berdasarkan pada object Runnable.E. Tabel berikut Pengenalan Pemrograman 2 3 . 9. Tabel 1. sehingga lebih dari satu prioritas thread yang siap untuk dijalankan.N. Constructor-constructor Thread Thread() Membuat sebuah object Thread yang baru.

public static void sleep(long millis) Menunda thread dalam InterruptedException. Hal ini dapat menyebabkan SecurityException. Hal ini dapat menyebabkan Pengenalan Pemrograman 2 4 . public final String getName() Mengembalikan nama dari thread. public void start() Menyebabkan eksekusi dari thread berlangsung dengan cara memanggil method run. public final static int NORM_PRIORITY Nilai default prioritas. atau sampai waktu yang telah ditentukan habis. Method-method Thread public static Thread currentThread() Mengembalikan sebuah reference kepada thread yang sedang berjalan. public final void setName(String name) Mengulang pemberian nama thread sesuai dengan argument name. ini adalah rangkuman dari class Thread.J.3. public final boolean isAlive() Menunjukkan bahwa thread tersebut sedang berjalan atau tidak.2:Konstanta dalam Thread 9.N. public final void join([long millis.I.3 Methods Method-method inilah yang disediakan dalam class Thread. Tabel 1. Sebuah thread yang sedang berjalan. 1. public void run() Eksekusi thread dimulai dari method ini.2. 10 public final static int MIN_PRIORITY Nilai prioritas minimum. Thread Constants public final static int MAX_PRIORITY Nilai prioritas maksimum. [int nanos]]) Sebuah overloading method.E. harus menunggu sampai thread tersebut selesai (jika tidak ada parameter-parameter spesifik). jangka waktu milis. 5. public final int getPriority() Mengembalikan nilai prioritas yang telah diberikan kepada thread tersebut.

").1 Menurunkan (extend) class Thread Contoh berikut ini adalah user akan mendefinisikan sebuah class Thread yang akan menuliskan nama dari sebuah object thread sebanyak 100 kali.*. class PrintNameThread extends Thread { Pengenalan Pemrograman 2 5 .EXIT_ON_CLOSE). i > 0. Thread.sleep(1000).setText("Count down complete.300). label. class CountDownGUI extends JFrame { JLabel label.4.2. } Thread.sleep(1000). 9. setDefaultCloseOperation(JFrame. setSize(300.3: Method-method dari Thread 9. import javax. getContentPane().swing. cdg. Tabel 1.3.startCount(). } } 9.*. BorderLayout.currentThread(). import java.add(label). } catch (InterruptedException ie) { } label. i--) { Thread.sleep(1000).toString()). setVisible(true).WEST). getContentPane().4 Sebuah contoh thread Contoh dari thread pertama Anda adalah sebuah counter yang sederhana.J. } void startCount() { try { for (int i = 10.E.setText(Thread.awt.4 Membuat Threads Sebuah thread dapat diciptakan dengan cara menurunkan (extend) class Thread atau dengan mengimplementasikan sebuah interface Runnable.I. label.add(new Panel(). label = new JLabel("Start count!").setText(i + ""). } public static void main(String args[]) { CountDownGUI cdg = new CountDownGUI("Count down GUI"). CountDownGUI(String title) { super(title).N.

Berikut ini adalah salah satu contoh dari output-nya. Program akan memberikan keluaran yang berbeda pada setiap eksekusi.out. PrintNameThread("D"). } } } class TestThread { public static void PrintNameThread PrintNameThread PrintNameThread PrintNameThread } } main(String args[]) { pnt1 = new PrintNameThread("A"). dan pnt4 hanya digunakan satu kali. Anda dapat mengganti body dari main tersebut dengan pernyataan berikut ini: new new new new PrintNameThread("A"). name). pnt2 = new PrintNameThread("B"). pnt3. variabel yang menunjuk pada tiap thread pada dasarnya tidak dibutuhkan.2 Mengimplementasikan interface Runnable Cara lain untuk membuat sendiri sebuah thread adalah dengan mengimplementasikan interface Runnable. Bayangkanlah bahwa method run adalah method utama dari thread yang Anda ciptakan. class PrintNameThread implements Runnable { Thread thread. Hanya satu method yang dibutuhkan oleh interface Runnable yaitu method run. PrintNameThread(String name) { super(name).I.print(name).E. PrintNameThread("C"). Contoh dibawah ini hampir sama dengan contoh terakhir yang telah Anda pelajari. // menjalankan thread dengan satu kali instantiate start(). PrintNameThread(String name) { thread = new Thread(this. for (int i = 0. pnt4 = new PrintNameThread("D"). PrintNameThread("B"). Untuk aplikasi ini.J.4. Pengenalan Pemrograman 2 6 . pnt2. i < 100. i++) { System. Perhatikan bahwa variable reference pnt1. } public void run() { String name = getName(). pnt3 = new PrintNameThread("C"). AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCDABCDABCDA BCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABC DABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDBC DBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBC DBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBC DBCDBCDBCDBCDBCDBCDBCD 9.N. tapi pada contoh ini Anda akan mengimplement interface Runnable.

out. thread. memilih salah satu dari kedua cara tersebut bukanlah sebuah permasalahan.getName(). } } } class TestThread { public static void main(String args[]) { new PrintNameThread("A"). Pengenalan Pemrograman 2 7 . new PrintNameThread("B"). i++) { System.4. } public void run() { String name = thread. Implement sebuah interface Runnable menyebabkan lebih banyak pekerjaan yang harus dilakukan karena kita harus mendeklarasikan sebuah object Thread dan memanggil method Thread dari object ini. } } 9. Sedangkan menurunkan (extend) sebuah class Thread.print(name). new PrintNameThread("D"). bagaimanapun menyebabkan class Anda tidak dapat menjadi turunan dari class yang lainnya karena Java tidak memperbolehkan adanya multiple inheritance. new PrintNameThread("C").I. i < 100.start(). Sebuah pilihan antara mudah tidaknya untuk diimplementasikan (implement) dan kemungkinan untuk membuat turunan (extend) adalah sesuatu yang harus Anda tentukan sendiri.E. Perhatikan mana yang lebih penting bagi Anda karena keputusan ada ditangan Anda.3 Extend vs Implement Dari dua cara untuk menciptakan thread seperti diatas.J.N. for (int i = 0.

//dicetak terakhir } } Cobalah untuk menjalankan program diatas.println("Threads killed. } } } class TestThread { public static void main(String args[]) { PrintNameThread pnt1 = new PrintNameThread("A"). PrintNameThread pnt2 = new PrintNameThread("B").join().getName(). kita memastikan bahwa pernyataan terakhir akan dieksekusi pada saatsaat terakhir. marilah kita lihat bagaimana method join bekerja. try { pnt1.4 Sebuah contoh penggunaan method join Sekarang.thread.out.print(name). Seperti yang dapat Anda lihat. thread. pnt2.")..println("Running threads. Contoh dibawah ini adalah salah satu contoh penggunaan method join tanpa argument. 9. PrintNameThread pnt4 = new PrintNameThread("D"). i++) { System. pnt4. Sekarang. for (int i = 0. bahwa method tersebut (yang dipanggil tanpa argumen) akan menyebabkan thread yang sedang bekerja saat ini menungggu sampai thread yang memanggil method ini selesai dieksekusi.4. } public void run() { String name = thread. Apa yang Anda dapat? Melalui pemanggilan method join.J.join(). name). class PrintNameThread implements Runnable { Thread thread..thread. System. i < 100.I. PrintNameThread(String name) { thread = new Thread(this. Apakah ada perbedaan pada keluarannya? Pengenalan Pemrograman 2 8 . } catch (InterruptedException ie) { } System.N. pada saat Anda telah mempelajari bagaimana membuat sebuah thread. pnt3.E.join().out. berilah comment dilua blok try-catch dimana join dipanggil.join().out.thread.start(). PrintNameThread pnt3 = new PrintNameThread("C").thread.").

String str1.print(str1).sleep(500). } catch (InterruptedException ie) { } System.out.J. } } class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ".E. Anda telah melihat contoh-contoh dari thread yang berjalan bersamasama tetapi tidak bergantung satu dengan yang lainnya. thread = new Thread(this). Kasus ini membutuhkan dua object utama.print(str1. } public void run() { TwoStrings. bagaimanapun sebuah thread yang berjalan bersamasama kadang-kadang membutuhkan resource atau method dari luar.str2 = str2."). Oleh karena itu. str2. yaitu produsen dan konsumen.1 Sebuah contoh yang tidak disinkronisasi Marilah kita perhatikan sebuah kode sederhana yang mencetak sebuah string dengan urutan tertentu. Berikut ini adalah listing program tersebut : class TwoStrings { static void print(String str1. "very much!"). Contohnya adalah pada permasalahan produsen-konsumen. Kewajiban yang dimiliki oleh produsen adalah untuk membangkitkan nilai atau stream data yang diinginkan oleh konsumen. "you?"). } } Program ini diharapkan dapat mencetak dua argument object Runnable secara Pengenalan Pemrograman 2 9 .str1 = str1.out. str2). 9. } } class PrintStringsThread implements Runnable { Thread thread. new PrintStringsThread("How are ".println(str2).N. new PrintStringsThread("Thank you ". PrintStringsThread(String str1. mereka butuh untuk berkomunikasi satu dengan yang lain sehingga dapat mengetahui status dan aktifitas mereka.I. String str2) { System. Thread tersebut adalah thread yang berjalan sendiri tanpa memperhatikan status dan aktifitas dari thread lain yang sedang berjalan. 9. thread.5. Pada contoh tersebut. setiap thread tidak membutuhkan resource atau method dari luar sehingga ia tidak membutuhkan komunikasi dengan thread lain. String str2) { this.start(). try { Thread.5 Sinkronisasi Sampai sejauh ini. this. Didalam situasi-situasi tertentu. "there.

class TwoStrings { synchronized static void print(String str1. ketiga thread telah mencetak argument string pertama mereka sebelum argument kedua dicetak. 9. berurutan. Berikut ini adalah contoh dari keluarannya. Permasalahannya adalah.E.print(str1). tidak menunjukkan permasalahan yang serius.5.3 Contoh Synchronized Pertama Dibawah ini adalah kode yang telah dimodifikasi dimana method print dari class TwoStrings saat ini sudah disinkronisasi.N.out. 9. Pada kasus ini dimana Anda tidak dapat memodifikasi source code dari method.sleep(500). Sehingga hasilnya adalah sebuah keluaran yang tidak jelas. Object tersebut akan menjalankan sebuah monitor implicit pada saat object dari method sinkronisasi dipanggil. object dari method tersebut hanya dapat dipanggil oleh satu thread pada satu waktu. you? very much! Pada saat berjalan. try { Thread. Untuk sinkronisasi method. monitor tersebut akan memastikan bahwa tidak ada thread yang akan mengakses object yang sama.J. Sekali object tersebut dimonitor. Sebagai konsekuensinya. hanya ada satu thread dalam satu waktu yang akan mengeksekusi method dari object tersebut. Sebenarnya. Anda dapat mensinkronisasi object dimana method tersebut menjadi anggota. Akan tetapi pada aplikasi yang lain hal ini dapat menimbulkan exception atau permasalahanpermasalahan tertentu.2 Mengunci Object Untuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam method tertentu. Java memperbolehkan penguncian terhadap sebuah object termasuk method-method-nya dengan menggunakan monitor. kata kunci yang dipakai adalah synchronized yang dapat menjadi header dari pendefinisian method. String str2) { System.I. Hello How are Thank you there. pendeklarasian method sleep akan menyebabkan thread yang lain akan dieksekusi walaupun thread yang pertama belum selesai dijalankan pada saat eksekusi method print dari class TwoStrings.5. pada contoh diatas. } catch (InterruptedException ie) { } Pengenalan Pemrograman 2 10 . Syntax untuk mensinkronisasi sebuah object adalah sebagai berikut: synchronized (<object>) { //statements yang akan disinkronisasikan } Dengan ini.

String str2) { this.sleep(500).ia juga diaplikasikan pada object-nya. Sekali lagi.println(str2)."). PrintStringsThread(String str1. String str2. method print dari class TwoStrings telah disinkronisasi.start(). PrintStringsThread(String str1. Akan tetapi selain synchronized keyword diimplementasikan pada method.out. "there. class TwoStrings { static void print(String str1. String str1. } public void run() { TwoStrings. } } class PrintStringsThread implements Runnable { Thread thread.N. "very much!").I. String str2) { System. System.print(str1. } catch (InterruptedException ie) { } System.out. TwoStrings ts) { Pengenalan Pemrograman 2 11 . } } class PrintStringsThread implements Runnable { Thread thread.str2 = str2. String str1. new PrintStringsThread("How are ".J.E. TwoStrings ts. "you?"). } } Program tersebut saat ini memberikan keluaran yang benar. Hello there. str2). str2.str1 = str1. this. } } class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ". str2. thread = new Thread(this).out. thread.4 Contoh Synchronized Kedua Dibawah ini adalah versi lain dari kode diatas. new PrintStringsThread("Thank you ".println(str2). try { Thread.5. How are you? Thank you very much! 9.print(str1).

thread = new Thread(this). seorang pelanggan belum Pengenalan Pemrograman 2 12 . ts). ts). Akan tetapi. } } Program ini juga memiliki keluaran pernyataan-pernyataan yang benar. perhatikanlah skenario pelayanpelanggan. ts). akan tetapi ia akan menunggu sampai pelanggan datang ke restoran tersebut.ts = ts.str1 = str1. Anda akan mempelajari mengenai method-method dasar yang digunakan thread untuk berkomunikasi dengan thread lain yang sedang berjalan.N. Hal ini dapat menyebabkan InterruptedException. this. str2). Tabel 1.str2 = str2. thread.6 Komunikasi antar thread (Interthread) Pada bagian ini. Atau juga dapat kita nyatakan bahwa pelanggan yang memasuki restaurant mengindikasikan (notify) bahwa pelayan dibutuhkan untuk memberikan pelayanan. seorang pelayan tidak akan menanyakan ke setiap orang apakah mereka akan memesan atau membutuhkan sesuatu. new PrintStringsThread("Hello ".print(str1. public final void notifyAll() Membangunkan semua thread yang telah memanggil method wait dari object yang sama.I. 9.dalam kondisi sepert ini. this. this.J. Pada saat seseorang datang.E. Method-method untuk komunikasi Interthread public final void wait() Menyebabkan thread ini menunggu sampai thread yang lain memanggil notify atau notifyAll method dari object ini. "very much!". } public void run() { synchronized (ts) { ts. } } } class TestThread { public static void main(String args[]) { TwoStrings ts = new TwoStrings().".5: Methods untuk komunikasi Interthread Untuk mendapatkan penjelasan dari method ini. new PrintStringsThread("How are ". public final void notify() Membangunkan thread yang telah memanggil method wait dari object yang sama.start(). "there. Pada skenario di sebuah restoran. new PrintStringsThread("Thank you ". hal ini mengindikasikan bahwa ia mempunyai keinginan untuk memesan makanan dari restaurant tersebut. "you?".

akan sangat mengganggu apabila ia terus menerus bertanya kepada pelayan.6.I. hanya akan berjalan sampai anggota yang lain memberi tanda yang memerintahkan untuk berjalan. pelanggan akan menunggu sampai pelayan memberikan tanda (notifies) dan kemudian menyajikan makanan. Oleh karena itu. setiap anggota yang menunggu.N.J. Sekali pelanggan sudah memesan.E. Akan sangat mengganggu apabila pelayan terus-menerus bertanya kepada pelanggan apakah ia telah siap untuk memesan atau tidak.1 Contoh Produsen-Konsumen Contoh dibawah ini adalah salah satu implementasi dari permasalahan produsenkonsumen. Pengenalan Pemrograman 2 13 . pelayan akan menunggu (wait) sampai pelanggan memberikan tanda (notifies) bahwa ia telah siap untuk memesan. Hal ini sama dengan yang terjadi pada thread. Normalnya. siap untuk memesan. Perhatikan pada skenario berikut.5: Skenario Pelayan-Pelanggan 9. apakah pesanannya sudah tersedia atau tidak. Gambar 1. Sebuah kelas yang menyediakan method untuk membangkitkan dan mengurangi nilai dari integer yang dipisahkan dari class Produsen dan Konsumen thread.

i < 10.println("Get " + data).sd = sd. } public void run() { for (int i = 0. data = value. "Producer"). new Consumer(sd). } } Dibawah ini adalah contoh dari keluaran program : Generate Generate Generate Generate Get 65 Generate Get 23 Generate 8 45 52 65 23 49 Pengenalan Pemrograman 2 14 . new Thread(this. } } class Producer implements Runnable { SharedData sd. synchronized void set(int value) { System.random()*100)).J. Consumer(SharedData sd) { this. "Consumer"). } } } class Consumer implements Runnable { SharedData sd.I. i++) { sd.get().out.start(). } } } class TestProducerConsumer { public static void main(String args[]) throws Exception { SharedData sd = new SharedData().sd = sd.E. new Producer(sd). class SharedData { int data. Producer(SharedData sd) { this.out.println("Generate " + value). i < 10 .start(). return data.set((int)(Math. new Thread(this. } public void run() { for (int i = 0. } synchronized int get() { System. i++) { sd.N.

Kita berharap bahwa setiap nilai yang diproduksi oleh produser dan juga kita akan mengansumsikan bahwa konsumen akan mendapatkan nilai tersebut. kita akan menggunakan method untuk komunikasi interthread.J. Implementasi dibawah ini adalah implementasi dari permasalahan produsen konsumen dengan menggunakan method untuk komunikasi interthread. data = value. Get 49 Generate Get 35 Generate Get 39 Generate Get 85 Get 85 Get 85 Generate Get 35 Get 35 35 39 85 35 Hasil tersebut bukanlah hasil yang kita harapkan.E. Dibawah ini adalah keluaran yang kita harapkan. } catch (InterruptedException ie) { } } System.N.I. Generate Get 76 Generate Get 25 Generate Get 34 Generate Get 84 Generate Get 48 Generate Get 29 Generate Get 26 Generate Get 86 Generate Get 65 Generate Get 38 Generate Get 46 76 25 34 84 48 29 26 86 65 38 46 Untuk memperbaiki kode diatas. boolean valueSet = false.println("Generate " + value). synchronized void set(int value) { if (valueSet) { //baru saja membangkitkan sebuah nilai try { wait(). class SharedData { int data.out. Pengenalan Pemrograman 2 15 .

i++) { sd. } public void run() { for (int i = 0. i < 10 . notify(). Producer(SharedData sd) { this. valueSet = true. Consumer(SharedData sd) { this.get().N.sd = sd.E. new Thread(this. } } } class TestProducerConsumer { public static void main(String args[]) throws Exception { SharedData sd = new SharedData().start(). } catch (InterruptedException ie) { } } System.I. return data. } public void run() { for (int i = 0. new Consumer(sd). i < 10.sd = sd.random()*100)). } } /* Bagian kode ini tidak ada yang berubah*/ class Producer implements Runnable { SharedData sd. } } Pengenalan Pemrograman 2 16 . } synchronized int get() { if (!valueSet) { //produsen belum men-set sebuah nilai try { wait().J. } } } class Consumer implements Runnable { SharedData sd. "Producer").start(). i++) { sd. valueSet = false. new Thread(this.println("Get " + data). notify(). "Consumer"). new Producer(sd).set((int)(Math.out.

execute(new <RunnableTask1>()). setelah ia selesai melaksanakan tugasnya. termasuk detail dari penggunaan thread. dimana object dari tipe ini akan mengeksekusi tugas-tugas dari Runnable. Lebih disarankan untuk membuat thread secara eksplisit daripada membuat thread dan menjalankannya lewat method start yang telah diset untuk setiap task. Fitur baru ini dapat ditemukan didalam package java. Permasalahan yang lain adalah kesulitan untuk membatalkan atau mematikan sebuah thread. sebuah thread tidak lagi berhenti sementara akan tetapi ia akan berada dalam antrian didalam sebuah pool.I. . Framework Executor merupakan salah satu solusi dari permasalahan ini dengan cara mechanic decoupling task submission mengenai bagaimana setiap tugas dijalankan. Tanpa penggunaan interface ini. Berikut ini adalah rangkuman dari beberapa factory methods: Pengenalan Pemrograman 2 17 . sehingga thread bisa saja sangat mahal.E. Didalam sub bab ini. Dengan kemampuan dari interface yang baru ini.util. pembangunan beberapa thread dapat mengakibatkan error pada memori. Salah satu solusi untuk mengatasi hal tersebut adalah dengan pooling thread. Kode dibawah ini mendemonstrasikan hal tersebut: new Thread(<aRunnableObject>). Untuk menciptakan sebuah object Executor. Interface ini termasuk didalam package java. dan sebagainya. ada dua jenis fitur concurrency yang akan dijelaskan.1 Interface Executor Salah satu penambahan fitur mutakhir yang telah dibangun dalam aplikasi multithread adalah framework Executor. Class ini juga tersedia didalam package yang sama seperti Executor interface. Sebagai hasilnya. Didalam sebuah pooling thread.execute(<aRunnableObject>). Class Executors juga menyediakan factory method untuk memanage thread pool sederhana..7 Kemampuan Concurrency Dengan dirilisnya J2SE 5. kita akan mengeksekusi tugas dari Runnable dengan cara menciptakan instance dari Thread dan memanggil method start dari object Thread.concurrent. Dikarenakan Executor adalah sebuah interface.N.execute(new <RunnableTask2>()). ia harus membuat sebuah class yang mengimplementasikan interface ini atau dengan menggunakan factory method yang telah disediakan class Executor. karena thread membutuhkan pengaturan dan penumpukan di suatu tempat. object Runnable yang telah diberikan akan dieksekusi menggunakan kode berikut ini: <anExecutorObject>. mengimplementasikan sebuah skema thread pooling dengan desain yang baik.0.concurrent. telah tersedia kontrol threading yang baru dan juga tambahan fitur yang disebut concurrency. <executorName>.start(). 9.util.. Oleh karena itu lebih disarankan untuk menggunakan potongan kode berikut ini: Executor <executorName> = <anExecutorObject>.J. Bagaimanapun. Framework Executor ini berguna untuk aplikasi multithread. ia tidak dapat di-instantiate. 9.7. penjadwalan. tidaklah mudah dilakukan. <executorName>.

apabila tersedia. atau untuk mengeksekusi secara periodic.1: Factory Method didalam class Executor Pada saat sebuah tugas dari Runnable telah dieksekusi dan diselesaikan dengan control sebuah interface Executor.E. Sebuah overloading method. Penulisan method tersebut ditunjukkan seperti berikut ini: public void run() Kelemahan-kelemahan dari menciptakan thread dengan cara tersebut adalah: 1. atau dieksekusi secara periodic. public static ScheduledExecutorService newSingleThreadScheduledExecutor() Menciptakan sebuah Executor thread yang akan menjadwalkan command untuk dijalankan setelah delay tertentu. Method run tidak dapat melakukan pengembalian hasil selama ia memiliki void sebagai nilai kembaliannya. kita harus melakukan suatu teknik untuk mendapatkan hasilnya. Sebuah overloading method. Method run mewajibkan Anda untuk mengecek setiap exception karena overriding method tidak dapat menggunakan klausa throws. Sebuah overloading method. Interface Callable pada dasarnya adalah sama dengan interface Runnable tanpa kelemahan-kelemahan yang telah disebutkan diatas. 2. atau ia akan menggunakan kembali thread yang telah dibangun sebelumnya.N. Sebuah overloading method. kita dapat dengan mudah memanggil method shutdown dari interface tersebut seperti berikut ini: executor.7. Teknik yang paling umum adalah dengan membuat Pengenalan Pemrograman 2 18 . Untuk memberhentikan thread ini. Kita dapat meng-extend sebuah class Thread atau meng-implement sebuah interface Runnable. juga akan menggunakan object ThreadFactory sebagai tambahan parameter Tabel 1. akan menggunakan object ThreadFactory sebagai tambahan parameter.2 Interface Callable Ingatlah kembali. Untuk mendapatkan hasil dari sebuah pekerjaan yang telah diselesaikan oleh Runnable.shutdown(). public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) Menciptakan sebuah pool thread yang akan menjadwalkan command yang akan berjalan setelah diberikan sebuah delay.I.J. public static ExecutorService newFixedThreadPool(int nThreads) Menciptakan sebuah pool thread yang dapat digunakan kembali untuk membetulkan sebuah thread yang berada didalam antrian yang tidak teratur. bahwa ada dua cara untuk menciptakan sebuah thread. Factory Method dari class Executor public static ExecutorService newCachedThreadPool() Menciptakan sebuah pool thread yang akan menciptakan thread sesuai yang dibutuhkan. kita akan melihat secara spesifik fungsi dari masing-masing teknik dengan cara meng-override method run. juga akan menggunakan object ThreadFactory sebagai tambahan parameter. public static ExecutorService newSingleThreadExecutor() Menciptakan sebuah Executor yang digunakan sebagai satu-satu-nya pelaksana dari sebuah antrian thread yang tidak teratur. 9. akan menggunakan object ThreadFactory sebagai tambahan parameter. Sebuah method overloading. juga akan menggunakan object ThreadFactory sebagai argument. Untuk menentukan teknik mana yang akan digunakan.

N. Lihatlah lagi didalam dokumentasi API untuk mendapatkan informasi lebih detail lagi mengenai fitur-fitur yang lain. } } Tulislah interface Callable.. } /* Hasil dari attribute ini dijaga dari segala sesuatu perubahan yang dilakukan oleh kode-kode lain yang mengakses class ini */ public int getResult() { return result.*.util.8 Latihan 9.concurrent..io. Kode berikut ini akan menunjukkan bagaimana hal tersebut dilakukan.8. public class MyCallable implements Callable { public Integer call() throws java. public MyRunnable implements Runnable { private int result = 0.. return someValue.IOException { .I.. import java. Masih ada lagi fitur-fitur concurrency dalam J2SE 5. buatlah sebuah banner sederhana yang akan Pengenalan Pemrograman 2 19 . 9. } } Method call memiliki penulisan seperti berikut ini: V call throws Exception V adalah sebuah tipe generic yang berarti nilai pengembalian dari pemanggilan method tersebut adalah tipe data reference apapun. Anda akan mempelajari tentang tipe data generic di bab selanjutnya.0. public void run() { . sebuah instance variable untuk menyimpan hasilnya.J. kemudian dapatkanlah hasil sesederhana yang ditampilkan pada contoh dibawah ini.E. result = someValue.1 Banner Dengan menggunakan AWT atau Swing.

J.6. Gambar 1.N. Berikut ini adalah sebuah contoh dimana Anda menuliskan ”Your name here!”. Untuk memastikan bahwa proses perpindahannya tidak terlalu cepat. mencetak string yang dituliskan oleh user. String ini akan ditampilkan secara terus menerus dan program Anda harus memberikan ilustrasi bahwa string tersebut bergerak dari kiri ke kanan.E.I.1: Contoh pergerakan string Pengenalan Pemrograman 2 20 . Anda sebaiknya menggunakan method sleep dari class Thread.

1 adalah contoh dari sebuah alamat IP. seiring dengan bagaimana dan kapan itu dikirim. hal tersebut sangatlah bagus bahwa internet masih dapat berfungsi. Mereka juga bisa ditulis dengan bentuk simbol seperti docs. Walaupun terdapat perbedaan dalam software dan hardware yang tersambung bersama-sama.Mengerti konsep dasar jaringan  IP address  protokol  ports  paradigma client/server  socket 2.ru.E. Mengingat sudah beberapa kali Anda telah menggunakan jenis percakapan ini : Pengenalan Pemrograman 2 1 .rinet.1. Sebelum mempelajari tentang jaringan dalam Java. Pada akhir pembahasan.Membuat aplikasi menggunakan package jaringan Java  ServerSocket  Socket  MulticastSocket  DatagramPacket 10.J.1. diharapkan pembaca dapat : 1.I. bahwa internet adalah jaringan global dengan berbagai jenis komputer yang berbeda yang tersambung dalam berbagai cara. Setiap jenis komunikasi membutuhkan protokol yang spesifik dan unik. di sana harus terdapat suatu jumlah yang sama untuk mekanisme penangangan komunikasi. 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.2 Protokol Karena terdapat jenis komunikasi yang berbeda-beda yang mungkin terjadi pada internet. 10. Standar ini menjamin kesesuaian dan kekuatan komunikasi diantara luasnya sistem pada internet.1 IP Address Pada setiap komputer yang tersambung dengan internet memiliki alamat IP yang unik. Hal tersebut menjelaskan format data yang dikirim lewat internet.1. Konsep dari protokol tentunya tidak terlalu asing untuk kita. BAB 10 Jaringan Java memperbolehkan Anda dalam mempermudah pengembangan aplikasi yang mengerjakan berbagai pekerjaan melalui jaringan.N. Hal ini memungkinkan karena standar komunikasi memiliki ketetapan dan juga keselarasan. 10. Protokol mengatur peraturan dan standar yang menetapkan jenis komunikasi internet yang khusus. Pertama-tama Anda akan diperkenalkan kepada beberapa konsep dasar jaringan. Ini adalah suatu cita-cita pembuatan Java yang menjadi salah satu kekuatan Java sejak dapat dibuat untuk ditampilkan melalui internet. Alamat tersebut diwakilkan dalam 32-bit nomor yang digunakan sebagai pengenal yang bersifat unik dari setiap komputer yang tersambung dengan internet. 192. Mari kita pelajari beberapa standar yang berlaku.1.1 Konsep Dasar Jaringan Jika sebelumnya Anda telah mengetahui.

Bolehkah saya berbicara dengan Joan?" "Okay. 10. Digunakan untuk mentransfer dokumen HTML pada Web. Jenis protokol tipe ini memberikan kita kepercayaan untuk mengetahui apa yang harus dilakukan dalam situasi tersebut.4 Paradigma client/server Paradigma client/server adalah dasar untuk framework jaringan Java. Selamat siang. Java juga mendukung kedua protokol tersebut. Kemudian. Client adalah mesin yang membutuhkan beberapa jenis informasi sedangkan server adalah mesin yang menyimpan informasi dan menunggu untuk menyampaikannya pada client.I. bagaimanapun juga. Pengenalan Pemrograman 2 2 . penetapan ini terdiri dari dua elemen besar." "terima kasih. yaitu client dan server. Port dihubungkan dengan nomor dan beberapa nomor bersifat spesifik yang berhubungan dengan jenis layanan khusus." . Anda harus mencari nilai lain yang tidak digunakan. Setiap komputer pada internet dapat menyediakan berbagai jenis layanan melalui berbagai jenis protokol yang mendukung. Kemudian server mengingat permintaan dan mengembalikan informasi yang tersedia kepada client. Anda perlu terhubung dengan port 21 pada komputer Anda. layanan FTP terletak pada port 21 sedangkan layanan HTTP terletak pada port 80. Jika terdapat kasus dimana port dengan nilai diatas 1024 telah digunakan oleh beberapa komunikasi custom. kita harus mengetahui jenis layanan sebelum sebuah informasi dapat ditransfer. Ini adalah protokol sosial yang digunakan ketika dalam pembicaraan melalui telepon. client terhubung dengan sever dan meminta informasi. protokol HTTP digunakan ketika Anda menyediakan isi Web melalui layanan HTTP. Mari kita lihat beberapa protokol penting yang digunakan pada internet. Hypertext Transfer Protocol (HTTP) adalah salah satu protokol yang sering digunakan. Anda perlu menyambungkan pada port yang sesuai. Sebagai contoh. Masalahnya. Kedua protokol tersebut memiliki peraturan masing-masing dan standar dalam pengiriman data. Paradigma ini menjelaskan sebuah skenario sederhana. Sebagai contoh. Untuk itulah port digunakan." "Hallo. mohon tunggu sebentar. Jika Anda ingin menggunakan file transfer FTP.. Tentunya. ada juga File Transfer Protocol (FTP) dimana lebih umum dibandingkan dengan HTTP dan memperbolehkan Anda untuk mentransfer file biner lewat intenet. protokol hanya bisa dipertimbangkan jika digunakan dalam konteks suatu jasa.1. Port dengan layanan pekerjaan tertentu disebut port standar. Tentunya. Port adalah 16-bit nomor dimana mengenal setiap layanan yang ditawarkan oleh server jaringan..N. Sekarang.3 Port Sekarang. Untuk menggunakan layanan khusus dan oleh karena itu. "Hallo.E.1.J. jalur komunikasi yang melewati protokol tertentu. port dengan nilai diatas 1024 disediakan untuk komunikasi custom. semua standar layanan tertentu diberikan nilai port dibawah 1024. 10.

J.1. 10. Untuk daftar lengkap dari class jaringan dan interface.N. Singkatnya. 10. Tabel berikut menjelaskan dua dari empat constructor pada class ServerSocket: Pengenalan Pemrograman 2 3 .1.net menyediakan banyak class yang berguna untuk pengembangan aplikasi jaringan.2. Pembelajaran akan difokuskan pada empat class yaitu : class ServerSocket. Kebanyakan pemrograman Java network menggunakan jenis khusus dari komunikasi jaringan yang diketahui sebagai sockets. Socket. socket adalah point terakhir untuk komunikasi antara dua mesin.4: Model Client/Server 10. Socket digunakan oleh Java untuk mengatasi komunikasi pada jaringan level rendah. Jalur komunikasi ini memungkinkan untuk mentransfer data melalui port khusus.E.I.1 Class ServerSocket dan Socket Class ServerSocket menyediakan fungsi-fungsi dasar dari sebuah server.5 sockets Konsep umum jaringan yang terakhir sebelum kita membahas lebih dalam tentang Java networking adalah dengan memperhatikan sockets. dapat dilihat pada dokumentasi API. dan DatagramPacket. MulticastSocket. Socket adalah software abstrak untuk media input atau output komunikasi.2 The Java Networking Package Package dari java. Gambar1.

Pengenalan Pemrograman 2 4 . public void close() Menutup socket server. ServerSocket(int port.2. panjang antrian maksimum untuk koneksi yang akan datang berdasarkan pada parameter backlog. sebuah port 0 menugaskan sebuah server kepada port bebas manapun. try { server = new ServerSocket(1234). Tabel 1.io.E. kemudian menerimanya.N.1b: Method ServerSocket Contoh yang berhasil melakukan implementasi sebuah server sederhana.2.net.I. 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. int backlog) Ketika sebuah server menetapkan suatu port tertentu. Constructor ServerSocket ServerSocket(int port) Ketika sebuah server menetapkan suatu port tertentu. public class EchoingServer { public static void main(String [] args) { ServerSocket server = null.J. Panjang antrian maksimum untuk koneksi yang akan datang diatur sebanyak 50 sebagai defaultnya.*.*. import java.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. dimana sebuah informasi sederhana dikirim oleh client dapat dilihat pada listing program berikut ini : import java. Socket client.

Langsung saja kita lihat dua constructor tersebut. PrintWriter pw = new PrintWriter(clientOut. Socket(InetAddress address. public OutputStream getOutputStream() Menerima kembali output stream yang berhubungan dengan socket ini. //1234 nomor port yang belum digunakan } catch (IOException ie) { System.exit(1). System.2. InputStream clientIn = client. BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)).println("Cannot open socket.out.readLine()).println(br.accept().J.1c: Constructor Socket Berikut adalah beberapa dari method class pada Socket : Method Socket public void close() Menutup socket client public InputStream getInputStream() Menerima kembali input stream yang berhubungan dengan socket ini.N. public InetAddress getInetAddress() Pengenalan Pemrograman 2 5 .I. } catch (IOException ie) { } } } } Ketika class ServerSocket mengimplementasikan server socket. int port) Membuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada host tertentu. Class Socket mengimplementasikan socket client. } while(true) { try { client = server. OutputStream clientOut = client. Tabel 1."). int port) Membuat sebuah socket client dimana dihubungkan dengan diberikannya nomor port pada alamat IP tertentu. dua diantaranya siap dipanggil. pw.getInputStream(). true). Constructor Socket Socket(String host.E. Class Socket memiliki delapan constructor.getOutputStream().

out. client.*. alamat 224. Pengenalan Pemrograman 2 6 .").I. Class ini memiliki tiga constructor tetapi yang akan dibahas hanya salah satu dari ketiga constructor ini. } catch (IOException ie) { System. dimana mengirim data kepada server dapat dilihat pada listing program dibawah ini : import java.J.0."). } catch (ConnectException ce) { System.0.E.net.0 hingga 239. InputStream clientIn = client.out.N. br. BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)). pw.println("Server message: ").*.255.2.getLocalHost().getOutputStream().close().255. public boolean isClosed() Mendeteksi apakah socket telah tertutup atau tidak Tabel 1.io. PrintWriter pw = new PrintWriter(clientOut.out.println("I/O Error. public class MyClient { public static void main(String args[]) { try { //Socket client = new Socket("133. System. public int getPort() Mengembalikan remote port kepada socket ini pada saat masih terhubung.readLine()). BufferedReader stdIn = new BufferedReader(new InputStreamReader(System. true). 1234). Alamat IP untuk kelompok multicast berkisar antara 224. import java.0.in)). Method Socket Mengembalikan alamat IP kepada socket ini pada saat masih terhubung.getInputStream().0 telah dipesan dan seharusnya tidak digunakan. System.1d: Method Socket Contoh yang berhasil melakukan implementasi sebuah client sederhana.1". pw.close(). 1234).0.println("Type a message for the server: ").println(br.2. } } } 10.println(stdIn.out. Socket client = new Socket(InetAddress.255.2 Class MulticastSocket dan DatagramPacket Class MulticastSocket sangat berguna untuk aplikasi yang mengimplementasikan komunikasi secara berkelompok.0. Meskipun begitu.close().readLine()). System.out.println("Cannot connect to the server. OutputStream clientOut = client.0.

Class DatagramPacket digunakan untuk mengirim data melalui protokol connectionless seperti multicast. Constructor MulticastSocket MulticastSocket(int port) Membuat multicast socket dibatasi dengan pemberian nomor port Tabel 1. Jika Anda telah selesai berbicara dengan kelompok.2. dibutuhkan parameter yaitu object DatagramPacket. Tabel 1.J.2a: Constructor MulticastSocket Tabel berikutnya memberikan penjelasan beberapa method MulticastSocket. Seharusnya kurang dari atau sama dengan ukuran dari buffer buf. Masalah yang ditimbulkan bahwa pengiriman packet tidak terjamin. int length) Constructor dari datagramPacket untuk menerima paket dengan panjang length.E.I.2b:Method MulticastSocket Sebelum seseorang dapat mengirim pesan kepada suatu kelompok. int length.N.2. 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. InetAddress address. Mari kita perhatikan dua dari enam constructor.2c: Constructor DatagramPacket Pengenalan Pemrograman 2 7 . pertama kali yang harus dilakukan oleh orang tersebut adalah harus menjadi anggota dari multicast kelompok dengan menggunakan method joinGroup. kita harus mengerti object jenis ini sebelum menggunakan method send. DatagramPacket(byte[] buf. Tabel 1. int port) Constructor dari datagramPacket untuk mengirim paket dengan panjang length dengan nomor port tertentu dan host tertentu. Constructor DatagramPacket DatagramPacket(byte[] buf. Anda dapat menggunakan method leaveGroup untuk melepaskan keanggotaan Anda. Sehingga. Sekarang seorang anggota dapat mengirim pesan melalui method send. Perhatikan bahwa dalam method send dari class multiSocket. Sebelum melihat contoh dalam menggunakan class multicastSocket. pertama-tama mari kita lihat pada class DatagramPacket.2. Mengirim p dari socket ini.

getByName("234.*.*. server dan client.receive(data).close(). public class ChatClient { public static void main(String args[]) throws Exception { MulticastSocket chat = new MulticastSocket(1234).2. Server menerima pesan dari client dan mencetak pesan tersebut.println(msg). buf.trim().net. boolean infinite = true. String msg = new String(data. import java. Berikut adalah class server import java. Berikut adalah beberapa method dari class DatagramPacket.joinGroup(group).*.7").length).E. server.out.I. Pengenalan Pemrograman 2 8 .getData()).2d: Method DatagramPacket Contoh multicast kita juga mengandung dua class. 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.N. System. InetAddress group = InetAddress. DatagramPacket data = new DatagramPacket(buf. //getByName – Mengembalikan alamat IP yang diberikan oleh Host server. } server. public class ChatServer { public static void main(String args[]) throws Exception { MulticastSocket server = new MulticastSocket(1234).5.net. } } Berikut adalah class client import java.J. /* Server terus-menerus menerima data dan mencetaknya*/ while(infinite) { byte buf[] = new byte[1024].6.io.

out. BufferedReader br = new BufferedReader(new InputStreamReader(System. System. DatagramPacket data = new DatagramPacket(msg.. InetAddress group = InetAddress.5. Client mengirim pesan “permintaan”.readLine(). Ketika menerima pesan “permintaan”. Berikut adalah contoh skenario : Client: "permintaan" Server: "3#Siapa pembuat Java?" Client: "jawaban" Server: "Berikan jawabanmu dengan format: <nomor pertanyaanr>#<jawaban Anda>" Client: "3#James Gosling" Server: Kerja yang bagus! . Jawaban itu harus dalam format <no pertanyaan>#<jawaban Anda>. client mengirim pesan “jawaban”. msg. Untuk jawaban dari sebuah pertanyaan. group.N. chat. 0.getBytes(). Pengenalan Pemrograman 2 9 .3. msg = br..in)). String msg = "". Ketika server menerima pesan “jawaban” dari client. } } 10. akan ada sekitar 5-10 pertanyaan.7").send(data). secara acak server akan memilih satu pertanyaan dari koleksi yang ada.3 Latihan 10. Dia mengirimkan pertanyaan yang dipilih sesuai dengan nomor yang bersangkutan kepada client.getByName("234. Secara sederhana.I. chat.1 Trivia Server Buatlah sebuah server yang berisi satu set pertanyaan yang mudah.E. Client yang terhubung ke server mengirim sebuah permintaan untuk sebuah pertanyaan atau jawaban sebuah pertanyaan.6. dia menginformasikan user bahwa user perlu mengirimkan jawaban sesuai dengan nomor pertanyaan kepada server. 1234). chat.J.close().length().println("Type a message for the server:").joinGroup(group).

Mengetahui siklus yang terdapat pada applet     init start stop destroy 4. Cara terbaik untuk memahami bagaimana membuat applet adalah dengan contoh.*.awt. Menggunakan method applet yang lain    paint showStatus Method untuk memainkan sebuah audio clip 5. atau Microsoft Internet Explorer. Pengenalan Pemrograman 2 1 .2.N. berikut ini adalah contoh applet sederhana yang menampilkan "Hello world!".1 Hello World Applet Class Applet adalah sebuah subclass dari class Panel yang didefinisikan dalam AWT.E.1 Tujuan Applet adalah satu fitur yang paling menarik dalam java. Bagaimanapun juga. Mendefinisikan apa yang dimaksud dengan applet 2. Mozilla. Memahami tag html pada applet 11.J. Applet merupakan program yang Anda jalankan melalui web browser. jika dibandingkan dengan aplikasi Java yang normal. import java. Secara khusus berjalan pada suatu web browser seperti Netscape Navigator.2 Membentuk Applet Sebuah applet adalah tipe yang spesial dari program java yang dieksekusi melalui internet. 11. BAB 11 Applet 11. tidak diperbolehkan mengakses applet pada komputer yang dijalankan untuk alasan keamanan. import java. Applet ini cukup terbatas jika dibandingkan dengan aplikasi Java. Pada pembelajaran ini Anda akan belajar tentang membuat sebuah applet.I. Anda akan mempelajari tentang membuat applet menggunakan AWT.*. Jadi. Pada module ini. Pada akhir pembahasan.applet. Membuat applet sendiri 3. diharapkan pembaca dapat : 1.

Sebagaimana yang disebutkan sebelumnya. classnya dapat ditemukan dalam package java. method drawString menggambar string "Hello world!" pada posisi pixel (80. Untuk lebih mudahnya ikuti syntax berikut ini: appletviewer <java filename> Untuk menjalankan contoh applet yang dijalankan . diperlukan suatu aksi untuk import package java.I. 80. Apa yang terjadi? Ingat bahwa applet adalah aplikasi java yang spesial.applet.java Tag HTML pada contoh yang diberikan mengindikasikan bahwa sebuah applet dibuat dengan lebar 300 pixel dan tinggi 100 pixel. Mereka tidak dieksekusi menggunakan perintah java.1. 25). diharuskan meng-extend class Applet. Cara lain untuk menjalankan sebuah applet adalah melalui perintah appletviewer.N. telah disebutkan sebelumnya bahwa class Applet adalah subclass dari class Panel. usahakan menjalankan contoh ini menggunakan perintah java. /* masukkan bagian ini dalam kode html <applet code="AppletDemo" width=300 height=100> </applet> */ public class AppletDemo extends Applet { public void paint(Graphics g) { g. Untuk mengakses method atau field dalam class Panel atau class-class induk. } } Setelah proses kompilasi.awt .applet merupakan suatu keharusan.J. Bahkan applet berjalan pada web browser atau menggunakan applet viewer. Kemudian. Hal ini mengimplikasikan bahwa beberapa method dari class applet ditemukan dalam class Panel.1: Contoh Applet Ketika membuat sebuah applet. mengimport package java. menggunakan: appletviewer AppletDemo.drawString("Hello world!".25) menghitung kebawah dari bagian kanan. Juga. Oleh karena itu.E. Untuk membuka applet melalui sebuah web browser. Gambar 1. Pengenalan Pemrograman 2 2 . secara sederhana buka dokumen HTML dimana applet terintegrasi ke dalamnya menggunakan applet HTML tag (Perintah mengeluarkan kode pada contoh Hello World).

3 Method-Method Applet Bagian ini membahas manfaat-manfaat method applet.N.I. stop() Ketika web browser meninggalkan dokumen HTML applet. mulai dengan method yang dipangil selanjutnya. browser atau applet viewer berhubungan dengan applet melalui method-method berikut: 1. init() init adalah method yang dipanggil pertama kali. Eksekusi ringkasan dengan method ini dilakukan ketika applet ditampilkan kembali.3.method ini dipanggil untuk menginformasikan applet bahwa dia harus menghentikan proses eksekusinya. 11. start() Setelah meminta method init. 3. method ini meminta dokumen HTML yang ditampilkan applet setiap waktu. Pengenalan Pemrograman 2 3 . Method stop selalu dipanggil sebelum method ini diminta untuk dijalankan. 11.1 Siklus Applet (The Applet Life Cycle) Bahkan untuk memulai eksekusi pada method main seperti dalam aplikasi khas Java.J. 2. destroy() Method ini dipanggil ketika applet perlu dihapus dari memory.E. 4. Yang sebenarnya berisi permintaan pertama ketika applet di load.

N. ". public void init() { msg += "initializing.. repaint().J. contoh applet berikut meng-override method berikut.. Ketika membuat applet.. repaint(). } public void start() { msg += "starting. import java. import java. } public void stop() { msg += "stopping. } public void paint(Graphics g) { g. /* <applet code="LifeCycleDemo" width=300 height=100> </applet> */ class LifeCycleDemo extends Applet { String msg =""... 15..drawString(msg. 15). } } Contoh dokumen html berikut tergabung dalam applet LifeCycleDemo ..". <HTML> <TITLE>Life Cycle Demo</TITLE> <applet code="LifeCycleDemo" width=300 height=100> </applet> </HTML> Pengenalan Pemrograman 2 4 .awt..*.applet. repaint().I. sedikitnya beberapa dari method ini telah meng-override. ".*. repaint().E. } public void destroy() { msg += "preparing for unloading. ".

Jika Anda ingin memberi output ke window status.applet.").3. 11. import java.*. } } Berikut ini adalah contoh hasil outputnya: Gambar 1.I. showStatus("This is an important information. 80. /* <applet code="AppletDemo" width=300 height=100> </applet> */ public class AppletDemo extends Applet { public void paint(Graphics g) { g.J. import java.drawString("Hello world!".2. applet memiliki string "Hello world!"pada background setelah menolak method paint. yang meminta output applet setiap waktu yang diperlukan untuk dapat digambar kembali.3.N.E. 11.3 Method ShowStatus Applet memiliki window status. Pada contoh Hello World. Contoh berikut ini sama seperti contoh Hello World tapi dengan pernyataan tambahan yang memodifikasi isi dari window status.awt. Method ini selalu menolak ketika Anda ingin membuat bagaimana applet yang Anda buat harus terlihat seperti yag Anda inginkan. Sebagai contoh dari setiap instance adalah ketika sebuah applet tersembunyi oleh window lain dapat dibuat terlihat lagi. yang mana class Applet menurunkannya dari class induknya yaitu class Component. secara sederhana memanggil method showStatus. 25).3: contoh showStatus() Pengenalan Pemrograman 2 5 . dimana memberi informasi kepada Anda tentang apa yang sebenarnya dilakukan applet.2 Method paint Method lain yang tidak kalah penting adalah method paint.*.

} } public void stop() { ac.drawString("Playing space music!".N.au").out. "spaceMusic.*.J.3. public void init() { try { /*audio clip tersimpan dalam direktori yang sama seperti kode javanya*/ /* spaceMusic telah terdownload dari java. } public void paint(Graphics g) { g.sun. 80.stop(). 11.println(e). } catch (Exception e) { System.I. /* <applet code="AudioApplet" width=300 height=100> </applet> */ public class AudioApplet extends Applet { AudioClip ac.awt. 2.*.E.loop().4 Memainkan Klip Audio Applet juga menyediakan layanan melalui adanya suatu method yang memungkinkan Anda untuk memainkan file audio.com */ ac = getAudioClip(getCodeBase(). Memainkan audio clips dalam sebuah applet melibatkan dua langkah dasar : 1. play memungkinkan Anda untuk memainkan audio satu kali mengingat loop berulang pada audio clip dan berhenti hanya ketika method stop dipanggil. menggunakan method play atau loop pada object audio clip. ac. Contoh berikutnya memainkan file audio secara terus-menerus hingga method stop applet dipanggil. } } Pengenalan Pemrograman 2 6 . 25). import java. Dapatkan audio clip menggunakan method getAudioClip.applet. import java. Untuk memainkan audio clip.

Mungkin terjadi jika Javanya disabled. HEIGHT Width dan height dari window applet..J. 11.N. Digunakan untuk memungkinkan applet yang lain untuk berkomunikasi dengan applet ini dengan menunjukkan suatu applet berdasarkan namanya. Anda sudah melihat bagaimana tag-tag applet HTML digunakan dalam dokumen HTML atau source code java.E.. CODE Nama file yang berisi kode applet. Untuk dokumen HTML. NAME Nama dari applet. [<PARAM NAME = parameterNamen VALUE = parameterValuen>] [HTML that will be dsiplayed in the absence of Java] </APPLET> Kata kunci Applet HTML Tag CODEBASE Direktori dimana class applet diletakkan. direktori URL sesuai dengan setting awalnya/defaultnya. Anda akan dikenalkan pada versi tag-tag applet HTML yang lebih lengkap.4 Tag-tag Applet HTML Pada contoh sebelum-sebelumnya. WIDTH. ALIGN Pengenalan Pemrograman 2 7 . Dinyatakan dalam pixel. Sekarang. ALT Text ditampilkan jika browser mengerti applet tags tapi applet tidak dapat dieksekusi secara langsung. <APPLET [CODEBASE = codebaseURL] CODE = appletFile [ATL = alternateText] [NAME = appletInstanceName] WIDTH = widthInPixels HEIGHT = heightInPixels [ALIGN = alignment] [VSPACE = vspaceInPixels] [HSPACE = hspaceInPixels] > [<PARAM NAME = parameterName1 VALUE = parameterValue1>] [<PARAM NAME = parameterName2 VALUE = parameterValue2>] .java atau .class .I. Dengan atau tanpa nama ekstensi .

*. "texttop". Table 1. "absmiddle". /* <applet code="ParamDemo" width=300 height=100> <param name="myParam" value="Hello world!"> </applet> */ public class ParamDemo extends Applet { public void paint(Graphics g) { g. Kata kunci Applet HTML Tag Alignment atau pengaturan posisi dari applet.I. Pengenalan Pemrograman 2 8 . atau "absbottom". import java.applet. "middle". PARAM NAME. "baseline".. "top" – posisi atas dari applet diratakan dengan item tertinggi dalam baris yang ada. "bottom". "top".N. applet dapat meminta method getParameter(String paramName).awt. Satu diantara "left". "middle" – tengah dari applet diratakan dengan bawah dari content yang lain dalam baris yang sama. VALUE Untuk mengelompokkan parameter yang dapat menampilkan applet. Peletakan posisi secara Default tergantung pada lingkungan. VSPACE.E. import java. HSPACE Spasi diatas dan dibawah (VSPACE) dan pada sisi (HSPACE) dari applet.3: Applet HTML Tags Contoh dibawah ini mendemokan bagaimana untuk mengakses parameter tertentu pada HTML tag. baseline – posisi bawah dari applet diratakan dengan bawah dari content lain dalam baris yang sama. 25). "absmiddle" – tengah dari applet diratakan dengan vertical middle dari content lain pada baris yang sama.drawString(getParameter("myParam"). "texttop" – posisi atas dari applet diratakan dengan posisi atas dari applet diratakan dengan posisi tertinggi dari posisi atas pada baris yang sama. "right". } } Output dari program ini sama seperti applet Hello World. "absbottom" – posisi bawah dari applet diratakan dengan posisi bawah dari content lain dalam baris yang sama.*. "bottom".J. 80.

Untuk setiap giliran. vertical atau diagonal memenangkan game ini. pemain yang berhasil mengatasi 3 kotak membentuk baris horizontal. kotak tersebut ditandai oleh symbol pemain (O dan X yang selalu digunakan sebagai simbol). Game ini berakhir ketika pemain menang atau ketika semua kotak sudah berhasil dibentuk. pemain harus menggeser kotak dari papan.5 Latihan 11. Sekali sebuah kotak terpilih. Pengenalan Pemrograman 2 9 .I.J. Desain dan gerakan komputer seakan-akan user akan memenangkan pertandingan melawan komputer. 11. User memainkannya melawan komputer.5.E.1 Tic-Tac-Toe Applet satu-player Buat game satu-player Tic-Tac-Toe.N.

Anda diperbolehkan untuk membaca Pengenalan Pemrograman 2 1 . Memahami penggunaan dari kata kunci transient 7.2. Stream byte adalah abstraksi file atau alat untuk data biner sedangkan stream karakter adalah untuk karakter Unicode.1 Tujuan Dalam module sebelumnya. diharapkan pembaca dapat : 1.I.N. Memahami konsep dari stream chaining 5. Anda telah mempelajari bagaimana untuk mendapatkan input user dan memanipulasi file-file menggunakan strea.Walaupun ini sudah cukup nyata.2.E. Untuk stream karakter. 12.2 Input dan Output Stream Stream juga dikategorikan berdasarkan apakah mereka digunakan untuk membaca atau menulis stream. Menulis dan membaca dari sebuah object stream 12. Tahu tipe-tipe stream yang umum digunakan 2. Class InputStream adalah abstraksi class root untuk semua input stream byte sedangkan class OutputStream adalah class root abstraksi dari semua output stream byte. Menggunakan class File dan methodnya  Karakter dan Stream byte  Input dan Output Streams  Node dan Filter Streams 3. Kita hanya mengulang perbedaan mendasar antara keduanya.J. yaitu stream karakter dan byte. Pada akhir pembahasan. BAB 12 Stream I/O Lanjut 12. Menggunakan class-class Input/Output yang berbeda  Reader  Writer  InputStream  OutputStream 4.2 Tipe-Tipe Stream yang Umum Digunakan 12. Kedua class-class ini adalah abstraksi class-class untuk membaca dan menulis stream karakter. secara umum ada dua tipe dari stream. superclasss yang sesuai dari semua class-class secara berturut-turut adalah class Reader dan the Writer. Mendefinisikan serialisasi 6. Kini Anda akan mempelajari lebih banyak tentang stream dan class-class stream yang lain.1 Stream Karakter dan Byte Seperti yang telah disebutkan sebelumnya.

Stream filter.io membedakan antara node dan stream filter. Pengenalan Pemrograman 2 2 . Tipe-tipe dari stream node terdiri atas file. dari input stream tapi tidak menulisnya. di lain pihak. Untuk melengkapi daftar dari class-class ini.N. Sebuah stream node adalah sebuah stream dengan fungsi dasar berupa fungsi membaca atau menulis dari sebuah lokasi khusus seperti pada disk atau dari jaringan. 12. sementara itu output stream disebut juga stream hasil(sink stream).J. memory dan jalur data. Sesi ini berturut-turut mempunyai sebuah tujuan dari class-class stream yang berbeda. Penambahan lapisan pada sebuah stream node disebut dengan stream chaining. 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. Di lain pihak. Input stream juga dikenal sebagai stream sumber (source stream) sejak kita memperoleh informasi dari stream ini.I.2.3 Node dan Stream Filter Kini package java. lihatlah pada dokumentasi Java's API. 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.E.

I. Sebaliknya. public String[] list() Pengenalan Pemrograman 2 3 . public boolean canWrite() mengembalikan nilai true jika diijinkan untuk menulis ke sebuah file. Table 1. yaitu persepsi normal kita tentang apa itu sebuah file (bukan sebuah direktori) atau bukan. isi dengan path yang lengkap) atau mungkin terdiri atas namafile itu sendiri dan diasumsikan menjadi diisi dalam direktori tersebut.N. nilai pengembaliannya bernilai false. public boolean exists() Menguji apakah sebuah file atau sebuah direktori masih ada atau tidak public long length() Mengembalikan nilai ukuran dari file. Nama filenya mungkin salah satu menjadi penuh( sebagai contoh. Method-method File public String getName() Mengembalikan nilai nama file atau nama direktori dari object File ini. ini sesuatu yag penting bahwa kita mempelajari ini sejak class-class stream merupakan file-file yang telah dimanipulasi. nilai pengembaliannya bernilai false. Class adalah sebuah perwakilan dari abstraksi dari file-file nyata dan nama path direktori. public boolean canRead() Mengembalikan nilai true jika dijinkan untuk membaca dari file. Berikut ini beberapa dari method-method tersebut.3 Class File Walaupun class File bukan merupakan class stream. public long lastModified() Mengembalikan nilai tanggal dalam milidetik ketika file terakhir kali dimodifikasi. public boolean isFile() Menguji apakah object ini berupa sebuah file. Sebaliknya.J. Untuk meng-instantiate sebuah object File.E.2a: Constructor File Class File menyediakan beberapa method untuk memanipulasi file dan direktori. 12. Anda dapat menggunakan constructor berikut ini: Sebuah Constructor File File(String pathname) Instantiate sebuah object File dengan nama path khusus sebagai nama filenya. public boolean isDirectory() menguji apakah object ini adalah sebuah direktori atau bukan.

length.out. System. return.mkdir().out.println(fileName + (fn. fileName = "temp".."). public void delete() Membuang file atau direktori yang sebenarnya diwakili oleh object File tersebut..println(fileName + " does not exists. System.out.I. i++) { System. Table 1.out.io.length() + " bytes long. File fn = new File(fileName).getName()).list().").println(content[i]).lastModified() + " bytes long. System.out.canRead()) { System. return.println(fileName + " is a " + (fn."). System.out.delete(). } System. if (!fn. public class FileInfoClass { public static void main(String args[]) { String fileName = args[0].. for (int i = 0.2a: method-method File Mari kita melihat bagaimana method ini bekerja berdasarkan contoh berikut ini : import java.out. */ System.println("The content of this directory:").println(fileName + (fn.canWrite()) { Pengenalan Pemrograman 2 4 .out. if (!fn.isDirectory()) { String content[] = fn.out."). fn. fn = new File(fileName). System.out.")). fn. if (fn.println(fileName + " is not readable. } } if (!fn.E..exists()? "exists": "does not exist"))." :"directory.out. Method-method File Mengembalikan nilai daftar file dan subdirektori yang ada dalam object ini.println("Creating temp directory."). } System.").println(fileName + " is " + fn.exists()) { System.J.println(fileName + " is " + fn. i < content. System.N. /* membuat sebuah temporary directory . public void mkdir() Membuat sebuah direktori yang merupakan abstraksi nama path ini.out.println("Name: " + fn.isFile()? "file. Object ini haruslah berupa sebuah direktori.exists()? "exists": "does not exist")).println("Deleting temp directory.*.

3. yang mana memiliki tiga versi.out.2 Class Node Reader Berikut ini adalah beberapa dasar class Reader: Pengenalan Pemrograman 2 5 .membaca sebuah karakter tunggal.4. int length).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. public abstract void close() throws IOException Menutup Stream ini. } } } 12. 12.4 Class Reader Bagian ini menggambarkan stream karakter yang digunakan untuk membaca. public boolean markSupported() mengindikasikan apakah sebuah stream mendukung operasi pemberian tanda (mark) atau tidak Tidak didukung oleh default. Seharusnya bersifat overid subclass. public void mark(int readAheadLimit) throws IOException Menandai posisi tertentu pada stream.Membaca karakter sejumlah panjang karakter tertentu dan menyimpannya dalam karakter cbuf dimulai pada tanda offset khusus yang telah ditentukan.1: Method Reader 12. public void reset() throws IOException Reposisi stream ke posisi akhir stream yang telah ditandai Table 1. Setelah menandai. Memanggil method Reader yang lain setelah menutup stream akan menyebabkan suatu IOException dijalankan.N.println(fileName + " is not writable. segala karakter array atau sebuah porsi untuk sebuah karakter array.Membaca karakter dan menyimpannya dalam public abstract int read(char[] cbuf.I. Membaca karakter. public int read(char[] karakter array cbuf. System.J. cbuf). int offset.E. Tidak semua stream input karakter mendukung operasi ini. public int read() . panggil untuk melakukan reset() kemudian stream akan mencoba mengatur posisinya kembali pada titik ini.4.

LineNumberReader Sebuah subclass dari class BufferedReader yang dapat menjaga memori penyimpanan untuk nomor baris. CharArrayReader Mengimplementasikan suatu karakter buffer yang dapat dibaca. PipedReader Digunakan untuk pasangan (dengan sebuah PipedWriter yang sesuai) oleh dua urutan yang ingin berkomunikasi.2: Class-class Node Reader Classes 12. Class-class Node Reader FileReader Untuk membaca file-file karakter. 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.3. arrays. Salah satu dari urutan tersebut membaca karakter dari sumber tertentu. Table 1. FilterReader Untuk membaca stream karakter yang telah terfilter. InputStreamReader Menkonversi pembacaan byte ke bentuk karakter.3.3 Class-Class Filter Reader Untuk menambah fungsi ke class-class dasar Reader. PushbackReader Sebuah subclass dari class FilterReader yang memungkinkan karakter dikembalikan atau tidak terbaca oleh stream.4. Table 1.E.3: Class-class Filter Reader Pengenalan Pemrograman 2 6 .J.I. dan bais yang lebih efisien.N. StringReader Untuk membaca dari sebuah sumber string.

Table 1. StringWriter Untuk menulis source string PipedWriter Pengenalan Pemrograman 2 7 . 12. public void write(char[] cbuf) – Menulis isi dari karakter array cbuf.E. public void write(String str. 12. dimulai pada offset tertentu. 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. int offset.5.4. CharArrayWriter Menggunakan karakter penyangga yang dapat dituliskan juga.J.5.N.2 Node Writer Classes Berikut ini beberapa dasar class Writer: Node Writer Classes FileWriter Untuk menulis karakter ke sebuah file.5 Class-Class Writer Pada pembahasan ini menjelaskan tentang stream karakter yang digunakan untuk menulis.I. int length) – Menulis sejumlah length karakter dari aaray cbuf. public abstract void flush() Mengganti stream(yaitu karakter yang disimpan dalam buffer dengan segera ditulis ke tujuan yang dimaksud). dimulai pada offset tertentu. int length) – Menulis sejumlah length karakter dari string str.1 Writer Method Class Writer terdiri atas beberapa method untuk menulis karakter.1: Method Writer 12. public abstract void close() throws IOException Menutup stream ini setelah flushing beberapa karaktr yang tidak tertulis. public abstract void write(char[] cbuf. public void write(String str) – Menulis string string. Invocation method lain setelah menutup stream ini akan menyebabkan terjadinya IOException. int offset.

2: Node Writer classes 12. String output) { FileReader reader. writer = new FileWriter(output). array. writer.I. Table 1.3: Filter Writer classes 12. Satu dari thread ini menulis karakter ke stream ini. PrintWriter Mencetak representasi yang diformat dari object ke dala stream text-output.*. } reader. program membaca dari file yang khusus oleh user dan mengkopi isi dari file ke file lain. } catch (IOException ie) { ie.E. Node Writer Classes Digunakan dengan berpasangan(dengan menghubungkan PipedReader) oleh dua thread yang ingin berkomunikasi. import java.printStackTrace().close().4.6 Contoh Dasar Reader/Writer Contoh penggantian menggunakan class FileReader dan FileWriter. FileWriter writer.J.5. Anda dapat menggunakan class stream filter. while ((data = reader.N. Table 1.3 Filter Writer Classes Untuk menambah fungsionalitas ke dasar class Writer.Terdapat beberapa class-class: Filter Writer Classes BufferedWriter Menyediakan penyangga karakter bertujuan untuk menyediakan efisiensi penulisan karakter. int data.io. FilterWriter Untuk menulis stream karakter yang difilter. Dalam contoh ini. OutputStreamWriter Mengkodekan karakter yang ditulis ke dalam byte. class CopyFile { void copy(String input.4. dan garis.close().read()) != -1) { writer. try { reader = new FileReader(input).write(data). } Pengenalan Pemrograman 2 8 .

io. Walaupun membaca dan menulis ke stream sekali saja. try { reader = new BufferedReader(new FileReader(input)).printStackTrace(). class CopyFile { void copy(String input. String outputFile = args[1].readLine()) != null) { writer. String data.*. Program menggunakan teknik dari perangkaian stream dimana clas FileReader dan FileWriter didekorasi dengan class BufferedReader dan BufferedWriter.E. } reader.length()). } catch (IOException ie) { ie.N. cf. outputFile). cf. karakter membaca yang pertama disimpan dalam buffer sebelum penulisan karakter baris per baris. writer.I. BufferedWriter writer. } public static void main(String args[]) { String inputFile = args[0].7 Merubah Contoh Reader/Writer Contoh pengganti hampir sama dengan contoh sebelumnya tetapi lebih efisien. data. } } Bandingkan kode ini dengan sebelumnya.close(). outputFile). String outputFile = args[1]. 0. import java. CopyFile cf = new CopyFile().copy(inputFile. 12. } } Cobalah program tersebut sendiri dan amatilah apa ang terjadi pada file yang dimanipulasi. CopyFile cf = new CopyFile(). writer = new BufferedWriter(new FileWriter(output)). Apakah hasil dari menjalankan program ini? Pengenalan Pemrograman 2 9 . while ((data = reader. } } public static void main(String args[]) { String inputFile = args[0].write(data. berurutan.copy(inputFile. String output) { BufferedReader reader.close().J.

Membaca panjang sejumlah length byte dan menyimpannya dalam array byte bBuf dimulai dari offset tertentu. public abstract void close() throws IOException Menutup stream in. Seharusnya diubah menjadi overide oleh subclass.7. Memanggil method InputStream yang lain setelah menutup streamnya akan menyebabkan sebuah IOException dijalankan.I.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 . public void mark(int readAheadLimit) throws IOException Menandai posisi tertentu dalam stream. 12. Beberapa method class: Method InputStream public int read(-) throws IOException Method overloaded.Membaca sejumlah byte dan menyimpannya dalam byta array bBuf.E. Yang tidak didukung secara default.1 Method InputStream Class InputStream terdiri atas beberapa method untuk membaca byte.Membaca byte selanjutnya dari data dari stream ini. public abstract int read() . int offset. 12. int length). Setelah menandainya.8.N. Tidak semua stream input-byte mendukung operasi ini.8.1: Method InputStream 12. juga memiliki tiga versi seperti class Reader tersebut. public abstract int read(char[] cbuf.8 Class InputStream Bagian ini memberikan gambaran perbedaan stream byte yang digunakan membaca.J. public boolean markSupported() Mengindikasikan apakah suatu stream mendukung operasi pemberian tanda (mark) dan reset. panggil untuk menjalankan fungsi reset() akan mencoba untuk mengatur posisi streamnya pada titik tertentu kembali. public void reset() throws IOException Merubah posisi stream pada posisi akhir yang diberi tanda (mark) Table 1. public int read(byte[] bBuf).

E. 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.N.7. ObjectInputStream Digunakan untuk serialisasi object.3: Class-class Filter InputStream Pengenalan Pemrograman 2 11 . LineNumberInputStream Sebuah subclass FilterInputStream yang memungkinkan pemeriksaan posisi dari nomor baris tertentu. Table 1. 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. Class-class Node InputStream Mengimplementasikan sebua penimpan sementara yang terdiri atas data byte.I. 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). Table 1. Deserialisasi object dan data primitif yang telah tertulis sebelumnya menggunakan sebuahObjectOutputStream.8. PushbackInputStream Sebuah subclass dari class FilterInputStream yang memungkinkan byte diproses balik atau tidak dibaca ke bentuk sreamnya. yang mungkin memindahkan source dasar dari data sepanjang proses dan menyediakan fungsi tambahan. Anda dapat menggunakan class stream filter.3 Class-class Filter InputStream Untuk menambah fungsi ke class dasar InputStream.J. FilterInputStream Untuk membaca byte stream yang telah terfilter.2: class-class Node InputStream 12.7. yang mungkin dpat dibaca dari streamnya.

yang mana mungkin akan dituliskan ke bentuk streamnya.N.9. public abstract void close() throws IOException Menutup stream ini dan mengeluarkan beberapa sumber dari sistem digabungkan dengan streamnya.I. public void write(byte[] bBuf) – Menulis isi dari array byte bBuf ke bentuk stream nya.J. int length) – Menulis sejumlah length byte dari array bBuf ke bentuk streamnya. PipedOutputStream Pengenalan Pemrograman 2 12 . public void write(byte[] bBuf. 12. BufferedArrayOutputStream Mengimplementasikan sebuah penyimpan sementara berupa byte.8.9 Class-Class OutputStream Pada pembahasan ini memberikan sebuah pandangan tentang byte stream yang berbeda yang digunakan dalam proses penulisan. data byte tersimpan dalam buffer akan segera ditulis dalam tujuan yang diamksud). int offset. Penggunaan method lain setelah memanggil method ini akan menyebabkan sebuahIOException dijalankan.E. public abstract void flush() Mengganti stream (sebagai contoh. dimulai pada offset khusus ke streamnya.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. Berikut ini adalah beberapa dari class methodnya : Method OutputStream public void write(-) throws IOException Sebuah method overloaded untuk menulis bentuk byte ke bentuk stream. 12. Ada tiga versi : public abstract void write(int b) – Menulis nilai byte khusus b ke bentuk output stream nya. Table 1.1 Method OutputStream Class OutputStream terdiri atas beberapa method untuk menulis data byte.1: Method OutputStream 12.

8.E.2: Class-class Node OutputStream 12.3: Class-Class Filter OutputStream Pengenalan Pemrograman 2 13 .3 Class-Class Filter OutputStream Untuk menambah fungsi ke class dasar OutputStream. PrintStream Sebuah subclass dari FilterOutputStream yang menyediakan kemampuan untuk mencetak representasi dari nilai data yang bermacam-macam dengan tepat.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. Table 1.9. FilterOutputStream Untuk menulis stream byte yang telah difilter.J. Clas-class Node OutputStream Seharusnya tersambung ke sebuah PipedInputStream.N. Table 1. yang mana mungkin dipindahkan ke source dasar dari data sepanjang proses dan menyediakan fungsi tambahan. DataOutputStream Sebuah subclass dari FilterOutputStream yang menjalankan aplikasi penulisan data primitif ke output stream dasar ke dalam sebuah mesin yang bebas berjalan (machineindependent way).8. Anda dapat menggunakan class stream filter. 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. Memungkinkan penulisan byte ke bentuk dasar output stream tanpa menyebabkan diperlukannya pemanggilan dasar sistem untuk setiap penulisan byte. ObjectOutputStream Digunakan untuk serialisasi object. Serialisasi object dan data primitif untuk sebuah OutputStream.I.

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. String outputFile = args[1].*.write(data). String output) { FileInputStream inputStr.J.N. CopyFile cf = new CopyFile().printStackTrace(). outputFile). } } public static void main(String args[]) { String inputFile = args[0]. } inputStr. class CopyFile { void copy(String input.E. cf. outputStr = new FileOutputStream(output).copy(inputFile. } catch (IOException ie) { ie.close().I.close(). while ((data = inputStr. } } Pengenalan Pemrograman 2 14 .io. try { inputStr = new FileInputStream(input).read()) != -1) { outputStr. outputStr. FileOutputStream outputStr. int data. 12. import java.

println("read data: " + (char) data). data = inputStr. PrintStream outputStr. try { inputStr = new PushbackInputStream(new FileInputStream(input)). while ((data = inputStr.unread(data). outputStr.close().read().printStackTrace().*.J.println("unread data: " + (char) data).read()) != -1) { outputStr. inputStr.copy(inputFile).out). 12. } } Uji kode ini pada sebuah file yang mengandung sedikit baris atau karakter. class CopyFile { void copy(String input) { PushbackInputStream inputStr. CopyFile cf = new CopyFile().I. cf. } catch (IOException ie) { ie.N.E. outputStr. int data.close(). } inputStr. outputStr = new PrintStream(System. import java. Pengenalan Pemrograman 2 15 . } } public static void main(String args[]) { String inputFile = args[0].io.11 Contoh Modifikasi InputStream/OutputStream Contoh berikutnya menggunakan class PushbackInputStream yang memanfaatkan sebuah object FileInputStream dan class PrintStream.

yang berarti kita tidak memiliki implementasi serialisasi pada setiap class.12.E. ini merupakan hal yang penting bahwa keadaan tersebut sudah tertulis dan telah diserialisasi dari setiap objectnya dapat dibangun kembali sebagaimana dtaa tersebut dibaca.J. Menyimpan sebuah objectke beberapa tipe penyimpanan permanen yang dikenal sebagai persistence. Ini berarti mengurangi pekrjaan untuk programmer. Ada beberapa object yang tidak diserialisasi kaena data yang diwakilinya berubah secara konstan. Class tersebut harus mengimplementasikan interface yang dapat diserialisasi. Pengenalan Pemrograman 2 16 .2 Serialisasi: Menulis Suatu Object Stream Untuk menulis object ke sebuah stream. kemampuan ini disebut dengan serialisasi. 12. Ketika menulis sebuah object. Satu hal yang baik mengenai kemampuan untuk melakukan serialisasiyang dapat diturunkan. Class ini seharusnya juga menyediakan default constructor atau sebuah constructor tanpa argumen. Anda perlu menggunakan classObjectOutputStream class dan methodnya yaitu method writeObject. Jangan berputus asa. Stream yang digunakan untuk deserialisasi dan serialisasi secara berurutan adalah class ObjectInputStream dan ObjectOutputStream . Object instantiasi dari class ini sekarang dapat ditulis ke sebuah OutputStream.12 Serialisasi Java Virtual Machine (JVM) mendukung kemampuan untuk membaca atau menulis sebuah object ke bentuk stream. //try removing transient int data.1 Kata Kunci transient Ketika suatu object diserialisasi. 12. 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. Anda hanya dapat mengimplementasikan serialisasi sekali sepanjang hirarki class.I. Method dan Constructor bukan merupakan bagian dari stream serialisasi. Beberapa contoh dari setiap object adalah object FileInputStream dan Object Thread.N. Untuk memungkinkan sebuah object diserialisasi (sebagai contoh dapat disimpan dan diurutkan).12. Method writeObject memiliki tanda sebagai berikut : public final void writeObject(Object obj) throws IOException dimana obj adalah object yang ditulis ke stream. Sebuah NotSerializableException dijalankan jika operasi serialisasi gagal karena beberapa alasan. tempat hanya disediakan untuk data object. /* beberapa data yang lain*/ } Kata kunci transient mencagah data dari proses serialisasi. proses "flattening" sebuah object sehingga data tersebut dapat disimpan ke beberapa penyimpanan permanen atau dilewatkan ke object lain melalui class OutputStream. 12.

*.12. oos. booleanData = (Boolean) ois. Method readObject memiliki tanda sebagai berikut : public final Object readObject() throws IOException. oos.N. import java. public class UnserializeBoolean { UnserializeBoolean() { Boolean booleanData = null. ois. Anda perlu menggunakan class ObjectInputStream dan methodnya yaitu method readObject. Class Boolean mengimplementasikan interface yang dapat di Serialisasi.io. public class SerializeBoolean { SerializeBoolean() { Boolean booleanData = new Boolean("true"). } catch (IOException ie) { ie.ser"). } } public static void main(String args[]) { SerializeBoolean sb = new SerializeBoolean().io. } catch (Exception e) { e.printStackTrace().close(). Contoh dibawah ini menuliskan sebuah object Boolean ke sebuah ObjectOutputStream.printStackTrace(). ObjectInputStream ois = new ObjectInputStream(fis). Contoh dibawah ini membaca sebuah object Boolean dari sebuah ObjectInputStream.close(). try { FileOutputStream fos = new FileOutputStream("boolean.*.I. try { FileInputStream fis = new FileInputStream("boolean. Pengenalan Pemrograman 2 17 .3 Deserialisasi: Membaca Sebuah Object Stream Untuk membaca sebuah object dari sebuah stream. Instantiasi object dari class ini dapat ditulis ke dan dibaca dari sebuah stream. } } 12. Selanjutnya.readObject(). import java.E.writeObject(booleanData). tipe Object dikembalikan harus melalui proses typecast ke nama class yang sesuai sebelum method pada class tersebut dapat dieksekusi. ObjectOutputStream oos = new ObjectOutputStream(fos). ClassNotFoundException dimana obj adalah object yang dibaca dari stream.J. Ini merupakan kesinambungan dari contoh sebelumnya pada serialisasi.ser").

I. Juga.E. Sebagai contoh.ser"). System.N. } } 12.out.equals(new Boolean("true"))).println("Compare data with true: " + booleanData.out.out. } System.J.println("Unserialized Boolean from " + "boolean.println("Boolean data: " + booleanData). Ukuran pergeseran: 1 Pesan yang dibaca dari file: Hello Pesan ter-encrypt: Ifmmp Pengenalan Pemrograman 2 18 .13. Output dari pesan yang telah di encrypt pada file yang lain yang memiliki nama yang juga dibuat oleh user sendiri. } public static void main(String args[]) { UnserializeBoolean usb = new UnserializeBoolean(). tanyakan pada user untuk menginput ukuran pergeseran.1 Enkripsi Sederhana Baca dari sebuah file khusus oleh user dan encrypt isi file menggunakan teknik penggeseran yang sederhana.13 Latihan 12. System.

2. diharapkan pembaca dapat : 1. Sebagai contoh.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. selalu memaksa kita untuk men-downcast object-object kita membantu mendapatkan kembali dari list. Ini adalah jalan yang alami untuk mengeliminasi keperluan untuk pemilihan (casting). Modul ini mengenalkan Anda konsep dasar mengenai Java generic types. Pada akhir pembahasan. kita perlu untuk typecast object ke tipe referensi khusus yang sesuai dengan keperluan kita.E. Downcasting adalah hotspot yang potensial untuk ClassCastException. Yang juga membuat kode kita menjadi lebih panjang. 3. Tujuan utama dari penambahan generic pada Java adalah untuk memecahkan masalah ini. Langkah awal mempertimbangkan sebuah object ArrayList dan lihatlah bagaimana type generic akan membantu dalam peningkatan kode kita. Versi generic dari class ArrayList didesain untuk bekerja secara asli dengan beberapa Pengenalan Pemrograman 2 1 . 4. Lebih dari itu.get(0). Seperti yang sudah Anda ketahui.J. downcasting juga efektif merusak manfaat dari sebuah kekuatan bahasa yang diketikkan sejak dia menghapuskan keamanan yang disediakan perusahaan berupa pemeriksaan tipe(type checking). tipe Generic memungkinkan subuah single class untuk bekerja dengan pilihan tipe yang beraneka ragam. BAB 13 Pengenalan Generics 13. Bagian yang paling terlihat yaitu penambahan generic types. Sebuah instance arraylist.I.1 Tujuan Release Java terbaru menyediakan langkah terbesar dalam pemrograman Java dibandingkan dengan versi-versi lain sebelumnya.N. Sebuah object arraylist memungkinkan kita untuk menambahkan beberapa referensi tipe object pada list tapi ketika kita mendapatkan kembali elemet ini . sebuah object arraylist memiliki kemampuan untuk menyimpan elemen-elemen dari beberapa tipe referensi untuk list ini. menjadi lebih sedikit dapat terbaca. Mengapresiasikan keuntungan dari generic types Mendeklarasikan class generic Menggunakan constrained generic Mendeklarasikan method generic 13. bagaimanapun. jadi. Pertimbangkan pernyataan berikut : String myString = (String) myArrayList. Ini terdiri atas ekstensi yang cukup signifikan terhadap source language syntax.

Oleh sebab itu.Integer Integer data = myArrayList. Dripada berdiskusi lebihpanjang lagi tentang bagaimana untuk mendeklarasikan sebuah class generic . Walaupun downcasting sudah terhapus. } public A getData() { return data. Agar hanya memiliki ide bagaimana type-type generic digunakan sebelum materi ini dibahas lebih dalam. versi java terbaru sudah menyediakan user dengan versi generic dari semua class-class Java Collection. Kita dapat melanjutkannya dengan keperluan memiliki typecast elemen yang kita dapatkan dari list dan memiliki pernyataan berikut terhadap pernyataan sebelumnya : String myString = myArrayList. Anda dapat menerjemahkan pernyataan pertama sebagai instantiasi sebuah versi generic dari class ArrayList dan versi generic ini terdiri dari object-object dari tipe String.lang. 13. } } Pengenalan Pemrograman 2 2 . int myInt = genArrList.lang. Sama seperti.J. Amatilah melalui pernyataan.E. ini bukan berarti bahwa Anda dapat menandai segala sesuatu sebagai return value dari method get dan melanjutkannya dengan typecasting semuanya. anda akan diberikan sebuah contoh sederhana tentang class generic untuk dipelajari bentuknya.data = data. Anda akan menghadapi sebuah waktu mengcompile type tidak sesuai seperti pesan berikut ini : found: java.add("A generic string"). sebaiknya Anda pertimbangkan potongan kode berikut ini : ArrayList <String> genArrList = new ArrayList <String>().get(0). genArrList adalah batas dari tipe String. Anda akan mempelajari bagaimana untuk mendeklarasikan class generic anda sendiri. String myString = genArrList. genArrList. anda mungkin mengamati kata <String> segera terlihat setelah referensi tipe data arraylist.get(0). myString). Untungnya. Pada sesi ini. public BasicGeneric(A data) { this. Pernyataan berikut ini adalah illegal.showMessageDialog(this. tipe class.get().String required: java.N. kita harus sudah mendefinisikan versi generic dari class ArrayList.I. mengikat sebuah Integer atau beberapa tipe lain bukan String untuk hasil dari get function akan menjadi illegal. class BasicGeneric <A> { private A data. dia juga mempertahankan manfaat dari pengecekan tipe (type checking). Jika Anda menandai sesuatu yang lain disamping sebuah String untuk output dari method get.3 Mendeklarasikan sebuah Class Generic Untuk menjalankan potongan code sebelumnya.get(0). JoptionPane.

method(1234)).out.getData(). Ini berarti bahwa class tidak bekerja dengan beberapa type referensi khusus. public class GenSample { public String method(String input) { String data1 = input. tergantung pada tipe data yang telah didesain untuk bekerja dengan object BasicGeneric. Anda juga dapat bekerja denga variabel-variabel bertipe Integer atau referensi tipe yang lain. return data2.out.J.E. class BasicGeneric <A> nama class diikuti oleh sepasang kurung yang didalamnya terdapat huruf kapital A: <A>. } } Sekarang mari kita melalui bagian dari kode yang menggunakan syntax untuk type generic. anda harus mengelompokkan tipe referensi dengan yang mana yang anda inginkan untuk bekerja sama.getData().println(sample. potongan kode memiliki pernyataan berikut ini : BasicGeneric <Integer> basicGeneric = new Pengenalan Pemrograman 2 3 . amati bahwa sebuah field dari class dideklarasikan menjadi tipe A private A data. BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1). System. Untuk deklarasi dari class BasicGeneric.method("Some generic data")).I. return data2. Deklarasi ini mengelompokkan bahwa field data adalah dari tipe generic. } public Integer method(int input) { Integer data1 = new Integer(input).println(sample. System. String data2 = basicGeneric. BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1). kemudian. Syntax <String> setelah mendeklarasi BasicGeneric mengelompokkan bahwa instance dari class ini akan bekerja dengan variabel-variabel bertipe String. BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1).N. Integer data2 = basicGeneric. Untuk bekrja dengan Integer. Ketika mendeklarasikan sebuah instance dari class. Ini disebut dengan sebuah parameter tipe. Penggunaan kurung ini mengindikasikan bahwa class yang dideklarasikan adalah class generic. } public static void main(String args[]) { GenSample sample = new GenSample().

Instance ini akan berlaku sebagai jika ini dideklarasikan untuk memiliki tipe data spesifik ini dan tipe ini hanya dari bagian sangat awal. 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. dua instances dari class BasicGeneric terbentuk. Ini bukan berarti bahwa method tidak akan memiliki tipe data runtime. Integer data2 = basicGeneric. Sebagai contoh.E. Pada kode yang diberikan. pernyataan berikut akan menjadi illegal sejak int adalah sebuah tipe data primitive. public A getData() { return data. BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1). 13. Pengenalan Pemrograman 2 4 .3.Setelah instantiasi. Anda mungkin dapat menerjemahkan sisa dari kode dengan pemahaman anda sendiri. anda dapat mengakses anggota dari class melalui instance sekarang. BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1). Mempertimbangkan deklarasi dari method getData .N.getData(). Setelah Anda mendeklarasikan sebuah object yang bertipe BasicGeneric. Informasi tambahan ini mengindikasikan tipe dari data anda akan bekerja dengan siapa untuk bagian instance ini dari class BasicGeneric. A adalah pengikat ke sebuah tipe data yang spesifik. BasicGeneric <Integer>(data1). 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. atau even pada waktu meng-compile. BasicGeneric <int> basicGeneric = new BasicGeneric <int>(data1).2 Meng-compilasi Generic Untuk meng-compile source codes Java denagn type generic menggunakan JDK (v.3. String data2 = basicGeneric. Petama-tama Anda akan menyelesaikan type primitive sebelum menggunakan mereka sebagai arguments ke sebuah type generic. } Method getData mengembalikan sebuah nilai dari tipe A. 13.I.1 Pembatasan"Primitive" Sebuah pembatasan type generic dalam Java adalah mereka dibatasi oleh tipe referensi dan tidak akan bekerja dengan tipe data primitive.getData(). Sebuah Tipe type.J.

E. Untuk membatasi instantiasi tipe dari sebuah class.N.J. menggunakan generic constrained yang dapat memberikan kita penambahan 5 Pengenalan Pemrograman 2 . // pernyataan berikutnya adalah illegal ScrollPane <Button> scrollPane2 = new ScrollPane <Button>(). tapi tipe static atau general adalah Container yang lebih sederhana. 1.0). kita menggunakan kata kunci extends diikuti oleh class yang membatasi tipe generic sebagai bagian dari tipe parameter.5" -sourcepath src -d classes src/SwapClass.I. class ScrollPane <MyPane extends Container> { . Ada beberapa kasus. Tipe runtime dari sebuah instance dari class ini akan sering menjadi sebuah subclass dari Container. dimana anda ingin untuk membatasi tipe instantiasi yang potensial dari class generic. Sebagai contoh. Java juga memungkinkan kita untuk membatasi set argument type yang mungkin untuk subtypes dari sebuah batas type yang diberikan. gunakan syntax berikut ini : javac -version -source "1.. } class TestScrollPane { public static void main(String args[]) { ScrollPane <Panel> scrollPane1 = new ScrollPane <Panel>()..java Dimana src mengarah pada lokasi dari source code java sementara class mengarah pada lokasi dimana file class akan disimpan. bagaimanapun.java 13. type parameter dari class BasicGeneric dapat memiliki beberapa referensi tipe data.5" -sourcepath c:\temp -d c:\temp c:/temp/SwapClass. } } Instantiasi dari scrollPane1 bernilai valid sejak Panel menjadi sebuah subclass dari class Container sedangkan kreasi dari scrollPane2 akan menyebabkan munculnya compile time error sejak Button bukan merupakan sebuah subclass dari Container. kita mungkin ingin untuk mendefinisikan sebuah class generic ScrollPane yang merupakan sebuah template untuk sebuah Container asli yang telah dilengkapi dengan fungsi scrolling.5.4 Constrained Generic Dalam contoh yang diberikan terdahulu. Beriut ini sebuah contoh : javac -version -source "1. Contoh berikut ini membatasi instantiasi tipe dari class ScrollPane ke subtipe dari class Container.

Untuk mendeklarasikan tipe generic pada level method. Java juga memberi kita perlakuan khusus untuk mendeklarasikan sebuah method generic. kita akan menjamin bahwa setiap instantiasi dari tipe generic yang melekat pada batas yang kita miliki. Untuk membangun sebuah instance baru dari ArrayList<Integer>. Untuk membuat generic ArrayList kita. Andaikata kita menginginkan untuk menambahkan sebuah method make untuk sebuah class ArrayList. Ini berarti bahwa kita tidak dapat menjalankan method pada sebuah instance dari batas yang tidak ditampilkan dalam class Object.E. default batas adalah Object. tapi generic sebenarnya tidak mempercayakan pada beberapa tipe level class informasi dan akan merubah dari method call ke method call.I. } } Java juga menggunakan sebuah mekanisme type-inference untuk secara otomatis menyimpulkan tipe method polymorphic berdasarkan pada tipe-tipe argumennya. yang mana akan menjadi satu-satunya elemen dari object ArrayList. Sejak kita yakin bahwa setiap tipe instantiasi adalah sebuah subclass dari batas yang dimiliki. sebagai penampung beberapa tipe elemen. pengecekan tipe static. Ini mengurangi panjang dan kompleksitas dari sebuah alur untuk menjalankan suatu method. Sebagai sebuah hasil. 13. argumen tunggal dalam method make harus memiliki sebuah tipe generic sebagai sebuah argumen dan sebagai sebuah tipe nilai kembalian. yang mana didefinisikan menjadi method yang diberi nilai parameter berupa tipe. Method static ini akan diambil dalam sebuah argument tunggal.J. Sebagai contoh.5 Mendeklarasikan sebuah Method Generic Disamping mendeklarasikan sebuah class generic. kita dapat memanggil beberapa method secara aman yang ditemukan dalam objek static tipe. ini disebut dengan method polymorphic.make(Integer(0)). Jika kita belum menempatkan beberapa batas eksplisit pada parameternya. kita mempunyai cara yang cukup sederhana yaitu pernyataan berikut : Utilities. method parameterisasi sangat membantu kita kita ingin untuk menampilkan tugas dimana ketergantungan tipe antara argument dan nilai pengembalian aslinya merupakan generic. Pengenalan Pemrograman 2 6 .N. pertimbangkan contoh berikut ini : class Utilities { /* T secara implisit extends terhadap Object */ public static <T> ArrayList<T> make(T first) { return new ArrayList<T>(first).

Mencetak nilai dari argument dalam method lain tidak akan bekerja karena Java melewatkan object ke method melalui suatu nilai.E. Catatan bahwa pencetakan harus dilakukan pada method ini. 13. Method ini menukar secara sederhana nilai dari parameternya secara lokal dan mencetak nilainya.J.6 Latihan 13. object String dan object ArrayList. Pengenalan Pemrograman 2 7 .1 Swapping Membentuk sebuah class dengan sebuah versi generic dari method printSwapped. Uji method ini pada object Integer.I.N.6.

Sign up to vote on this title
UsefulNot useful