P. 1
pemrograman java untuk advanced

pemrograman java untuk advanced

|Views: 4,992|Likes:

More info:

Published by: Eko Kurniawan Khannedy on Aug 27, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

07/05/2013

pdf

text

original

Sections

     

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

J.E.N.I

Konfigurasi Hardware yang direkomendasikan

Sistem Operasi Microsoft Windows: o Prosesor: 1.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.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.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.5 dapat diakses pada Java 2 Platform Standard Edition Development Kit 5.0 Update 1 atau diatasnya (JDK 5.0, versi 1.5.0_01 atau diatasnya), dimana berisi Java Runtime Environment plus developer tools untuk meng-compile, men-debug, and menjalankan aplikasi yang ditulis dengan bahasa Java. Sun Java System Application Server Platform Edisi 9 telah diuji dengan JDK 5.0 update 6.

Untuk Solaris, Windows, dan Linux, Anda dapat mendownload JDK untuk platform Anda pada

http://java.sun.com/j2se/1.5.0/download.htm l
Untuk Mac OS X, memerlukan Java 2 Platform Standard Edition (J2SE) 5.0 Release 4. Anda dapat mendownload JDK dari Apple's Developer Connection site. Pada:

http://developer.apple.com/java (untuk
mendownload JDK Anda harus melakukan register terlebih dahulu).

Pengenalan Pemrograman 2

J.E.N.I

Daftar Isi
1 Review Konsep Dasar Dalam Java 1.1 Tujuan 1.2 Konsep Berorientasi Object 1.2.1 Desain Berorientasi Object 1.2.2 Kelas 1.2.3 Obyek 1.2.4 Atribut 1.2.5 Method 1.2.6 Konstruktor 1.2.7 Package 1.2.8 Enkapsulasi 1.2.9 Abstraksi 1.2.10 Pewarisan 1.2.11 Polimorfisme 1.2.12 Interface 1.3 Struktur Program Java 1.3.1 Mendeklarasikan Class Java 1.3.2 Mendeklarasikan Atribut 1.3.3 Mendeklarasikan Method 1.3.4 Mendeklarasikan Sebuah Konstruktor 1.3.5 Meng-instansiasi Sebuah Class 1.3.6 Mengakses Anggota Object 1.3.7 Package 1.3.8 Acces Modifier 1.3.9 Enkapsulasi 1.3.10 Pewarisan 1.3.11 Metode Overriding 1.3.12 Kelas Abstract dan Method 1.3.13 Interface 1.3.14 Kata Kunci This 1.3.15 Kata Kunci Super 1.3.16 Kata Kunci Static 1.3.17 Kata Kunci Final 1.3.18 Inner Classes 1.4 Latihan 1.4.1 Tabel Perkalian 1.4.2 Greatest Comman Factor(GCF) 1.4.3 Shape 1.4.4 Binatang 2 Exceptions dan Assertions 2.1 Tujuan 2.2 Apa Itu Exception?

Pengenalan Pemrograman 2

J.E.N.I

2.2.1 Pendahuluan 2.2.2 Error dan Excetion Classes 2.2.3 Sebuah Contoh 2.3 Menangkap Exception 2.3.1 Try-Catch 2.3.2 Keyword Finally 2.4 Melempar Exception 2.4.1 Keyword Throw 2.4.2 Keyword Throws 2.5 Kategori Exception 2.5.1 Exception Classes dan Hierarchy 2.5.2 Checked dan Unchecked Exceptions 2.5.3 User Defined Exceptions 2.6 Assertions 2.6.1 User Defined Exceptions 2.6.2 Mengaktifkan dan Menonaktifkan Exceptions 2.6.3 Sintax Assertions 2.7 Latihan 2.7.1 Heksadesimal ke Desimal 2.7.2 Menampilkan Sebuah Berlian 3 Teknik Pemrograman Lanjut 3.1 Tujuan 3.2 Rekusif 3.2.1 Apa yang dimaksud dengan Recursif? 3.2.2 Recursif vs Iterasi 3.2.3 Factorials : contoh 3.2.4 Print n any Base :contoh yang lain 3.3 Abstract Data Tipe 3.3.1 Apa yang dimaksud dengan Abstrak Data Type? 3.3.2 Stacks 3.3.3 Queues 3.3.4 Sequential dan Linked representation 3.3.5 Sequential representation dari Integer stack 3.3.6 Linked list 3.3.7 Linked representation dari Integer stack 3.3.8 Java Collections 3.4 Latihan 3.4.1 Faktor Persekutuan Terbesar 3.4.2 Sequential representation dari Integer Queues 3.4.3 Linked representation dari Integer Queues 3.4.4 Address Book 4 Tour dari Package java.lang 4.1 Tujuan 4.2 Class Math 4.3 Class String dan StringBuffer 4.3.1 Constructor String 4.3.2 Method-method String 4.3.3 Class StringBuffer 4.4 Class-class Wrapper

Pengenalan Pemrograman 2

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

J.E.N.I

12.6 Contoh Dasar Reader/Writer 12.8 Class InputStream 12.8.1 Method Input Stream 12.8.2 Class-class Node Input Stream 12.8.3 Class-class Filter InputStream 12.9 Class-class Ouput Stream 12.9.1 Method Ouput Stream 12.9.2 Class-class Node Output Stream 12.9.3 Class-class Filter Output Stream 12.10 Contoh Dasar Input Stream/Output Stream 12.11 Contoh Modifikasi Input Stream/Output Stream 12.12 Serialisasi 12.12.1 Kata Kunci Transient 12.12.2 Serialisasi : Menulis Suatu object Stream 12.12.3 Deserialisasi: Membaca Sebuah Object Stream 12.13 Latihan 12.13.1 Enkripsi Sederhana 13 Pengenalan Generic 13.1 Tujuan 13.2 Mengapa Generics? 13.3 Mendeklarasikan Sebuah Class Generic 13.3.1 Pembatasan ”Primitive” 13.3.2 Meng-Compilasi Generics 13.4 Constrained Generics 13.5 Mendeklarasikan sebuah Method Generic 13.6 Exercise 13.6.1 Swapping

Pengenalan Pemrograman 2

J.E.N.I.

BAB 1 Review Konsep Dasar dalam Java
1.1 Tujuan
Sebelum melangkah pada fitur-fitur menarik yang ada pada Java, mari kita melihat kembali beberapa hal yang telah Anda pelajari pada pelajaran pemograman pertama Anda. Pembelajaran kali ini menyajikan diskusi tentang perbedaan konsep-konsep berorientasi object dalam Java. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Mengetahui dan menggunakan konsep dasar beorientasi object.
    

class object atribut method cnstructor

2. Mengetahui dengan jelas tentang konsep lanjutan berorientasi object dan menggunakannya dengan baik
     

package enkapsulasi abstraksi pewarisan polimorfisme interface

3. Mengetahui dengan jelas penggunaan kata kunci this, super, final dan static 4. Membedakan antara method overloading dan method overridding

1.2 Konsep Berorientasi object
1.2.1 Desain Berorientasi object
Desain berorientasi object adalah sebuah teknik yang memusatkan desain pada object dan class berdasarkan pada skenario dunia nyata. Hal ini menegaskan keadaan(state), behaviour dan interaksi dari object. Selain itu juga menyediakan manfaat akan kebebasan pengembangan, meningkatkan kualitas, mempermudah pemeliharaan, mempertinggi kemampuan dalam modifikasi dan meningkatkan penggunaan kembali software.

1.2.2 Class
Pengenalan Pemrograman 2 1

J.E.N.I.

Class mengizinkan Anda dalam mendeklarasikan tipe data baru. Ia dijalankan sebagai blueprint, dimana model dari object yang Anda buat berdasarkan pada tipe data baru ini.

1.2.3 Object
Sebuah object adalah sebuah entiti yang memiliki keadaan, behaviour dan identitas yang yang tugasnya dirumuskan dalam suatu lingkup masalah dengan baik. Inilah instance sebenarnya dari sebuah class. Ini juga dikenal sebagai instance. Instance dibuat sewaktu Anda meng-instantiate class menggunakan kata kunci new. Dalam sistem registrasi siswa, contoh dari sebuah object yaitu entiti Student.

1.2.4 Atribut
Atribut menunjuk pada elemen data dari sebuah object. Atribut menyimpan informasi tentang object. Dikenal juga sebagai member data, variabel instance, properti atau sebuah field data. Kembali lagi ke contoh sistem registrasi siswa, atribut dari sebuah siswa adalah nomor siswa.

1.2.5 Method
Sebuah method menjelaskan behaviour dari sebuah object. Method juga dikenal sebagai fungsi atau prosedur. Sebagai contoh, method yang mungkin tersedia untuk entiti siswa adalah method register.

1.2.6 Constructor
Constructor adalah sebuah tipe khusus dari method yang digunakan untuk membuat dan menginisialisasi sebuah object baru. Ingat bahwa constructor bukan member (yaitu atribut, method atau inner class dari sebuah object).

1.2.7 Package
Package menunjuk pada pengelompokkan class dan/atau subpackages. Strukturnya dapat disamakan dengan direktorinya.

1.2.8 Enkapsulasi
Enkapsulasi menunjuk pada prinsip dari menyembunyikan desain atau mengimplementasikan informasi yang tidak sesuai pada object yang ada.

1.2.9 Abstraksi
Sementara enkapsulasi menyembunyikan detail, abstraksi mengabaikan aspek dari subyek yang tidak sesuai dengan tujuan yang ada supaya lebih banyak mengkonsentrasikan yang ada.

1.2.10 Pewarisan
Pewarisan adalah hubungan antara class dimana dalam satu class ada superclass atau class induk dari class yang lain. Pewarisan menunjuk pada properti dan behaviour yang diterima dari nenek moyang dari class. Ini dikenal juga sebagai hubungan “is-a”. Perhatikan pada hirarki berikut.
Pengenalan Pemrograman 2 2

J.E.N.I.

SuperHero

FlyingSuperHero

UnderwaterSuperHero
Gambar 1.1: Contoh Pewarisan

SuperHero adalah superclass dari class FlyingSuperHero dan UnderwaterSuperHero. Catatan bahwa FlyingSuperHero “is-a” SuperHero. Sebagaimana juga UnderwaterSuperHero “is-a” SuperHero

1.2.11 Polimorfisme
Polimorfisme adalah kemampuan dari sebuah object untuk membolehkan mengambil beberapa bentuk yang berbeda. Secara harfiah, “poli” berarti banyak sementara “morph” berarti bentuk. Menunjuk pada contoh sebelumnya pada pewarisan, kita lihat bahwa object SuperHero dapat juga menjadi object FlyingSuperHero atau object UnderwaterSuperHero.

1.2.12 Interface
Sebuah interface adalah sebuah contract dalam bentuk kumpulan method dan deklarasi konstanta. Ketika sebuah class implements sebuah interface, ini mengimplementasikan semua method yang dideklarasikan dalam interface.

1.3 Struktur Program Java
Pada bagian ini meringkaskan syntax dasar yang digunakan dalam pembuatan aplikasi Java.

1.3.1 Mendeklarasikan class Java
<classDeclaration> ::= <modifier> class <name> { <attributeDeclaration>* <constructorDeclaration>* <methodDeclaration>* } dimana <modifier> adalah sebuah access modifier, yang mana boleh dikombinasikan dengan tipe yang lain dari modifier.

Pengenalan Pemrograman 2

3

J.E.N.I.

Petunjuk Penulisan Program: * = berarti bahwa boleh ada 0 atau lebih kejadian dari deret tersebut yang menggunakannya juga. <description> = menunjukkan bahwa Anda harus mengganti nilai sebenarnya untuk bagian ini daripada menguranginya penulisannya. Ingat bahwa untuk class teratas, acces modifier yang valid hanyalah public dan package(yakni jika tidak ada acces modifier mengawali kata kunci class). Contoh berikut ini mendeklarasikan blueprint SuperHero. Class SuperHero { String superPowers[]; void setSuperPowers(String superPowers[]) { this.superPowers = superPowers; } void printSuperPowers() { for (int i = 0; i < superPowers.length; i++) { System.out.println(superPowers[i]); } } }

1.3.2 Mendeklarasikan Atribut
<attributeDeclaration> ::= <modifier> <type> <name> [= <default_value>]; <type> ::= byte | short | int | long | char | float | double | boolean | <class>

Petunjuk Penulisan Program: [] = Menunjukkan bahwa bagian ini hanya sebagai pilihan.
Inilah contohnya. public class AttributeDemo { private String studNum; public boolean graduating = false; protected float unitsTaken = 0.0f; String college; }

1.3.3 Mendeklarasikan Method
<methodDeclaration> ::= <modifier> <returnType> <name>(<parameter>*) { <statement>* } <parameter> ::= <parameter_type> <parameter_name>[,]

Pengenalan Pemrograman 2

4

J.E.N.I.

Sebagai contoh: class MethodDemo { int data; int getData() { return data; } void setData(int data) { this.data = data; } void setMaxData(int data1, int data2) { data = (data1>data2)? data1 : data2; } }

1.3.4 Mendeklarasikan sebuah Constructor
<constructorDeclaration> ::= <modifier> <className> (<parameter>*) { <statement>* } Jika tidak ada constructor yang disediakan secara jelas, constructor default secara otomatis membuatkannya untuk Anda. Constructor default tidak membawa argumen dan tidak berisi pernyataan pada tubuh class. Petunjuk Penulisan Program: Nama constructor harus sama dengan nama class. <modifier> yang valid untuk constructor adalah public, protected, dan private. Constructor tidak memiliki nilai return. Perhatikan contoh berikut. class ConstructorDemo { private int data; public ConstructorDemo() { data = 100; } ConstructorDemo(int data) { this.data = data; } }

1.3.5 Meng-instantiate sebuah class
Untuk meng-instantiate sebuah class, dengan sederhana kita gunakan kata kunci new diikuti dengan pemanggilan sebuah constructor. Mari lihat langsung ke contohnya. class ConstructObj { int data; ConstructObj() { /* menginisialisasi data */ } public static void main(String args[]) {
Pengenalan Pemrograman 2 5

J.E.N.I.

ConstructObj obj = new ConstructObj(); } }

//di-instantiate

1.3.6 Mengakses Anggota object
Untuk mengakses anggota dari sebuah object, kita gunakan notasi “dot”. Penggunaanya seperti berikut: <object>.<member> Contoh selanjutnya berdasar pada sebelumnya dengan pernyataan tambahan untuk mengakses anggota dan method tambahan. class ConstructObj { int data; ConstructObj() { /* inisialisasi data */ } void setData(int data) { this.data = data; } public static void main(String args[]) { ConstructObj obj = new ConstructObj(); //instantiation obj.setData = 10; //access setData() System.out.println(obj.data); //access data } }

1.3.7 Package
Untuk menunjukkan bahwa file asal termasuk package khusus, kita gunakan syntax berikut: <packageDeclaration> ::= package <packageName>; Untuk mengimpor package lain, kita gunakan syntax berikut: <importDeclaration> ::= import <packageName.elementAccessed>;

Dengan ini, 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.

Pengenalan Pemrograman 2

6

J.E.N.I.

Sebagai contoh. package registration.reports; import registration.processing.*; import java.util.List; import java.lang.*; //imported by default class MyClass { /* rincian dari MyClass */

1.3.8 Acces Modifier
Tabel berikut meringkas acces modifier dalam Java. private class yang sama package yang sama package yang berbeda (subclass) package yang berbeda (nonsubclass) Tabel 1.2: Acces Modifier Yes default/package Yes Yes protected Yes Yes Yes public Yes Yes Yes Yes

1.3.9 Enkapsulasi
Menyembunyikan elemen dari penggunaan sebuah class dapat dilakukan dengan pembuatan anggota yang ingin Anda sembunyikan secara private. Contoh berikut menyembunyikan field secret. Catatan bahwa field ini tidak langsung diakses oleh program lain menggunakan method getter dan setter. class Encapsulation { private int secret; //field tersembunyi public boolean setSecret(int secret) { if (secret < 1 || secret > 100) { return false; } this.secret = secret; return true; } public getSecret() { return secret; } }

1.3.10 Pewarisan
Pengenalan Pemrograman 2 7

J.E.N.I.

Untuk membuat class anak atau subclass berdasarkan class yang telah ada, kita gunakan kata kunci extend dalam mendeklarasikan class. Sebuah class hanya dapat meng-extend satu class induk. Sebagai contoh, class Point di bawah ini adalah superclass dari class ColoredPoint. import java.awt.*; class Point { int x; int y; } class ColoredPoint extends Point { Color color; }

1.3.11 Method Overriding
Method subclass override terhadap method superclass ketika subclass mendeklarasikan method yang signaturenya serupa ke method dalam superclass. Signature dari method hanyalah informasi yang ditemukan dalam definisi method bagian atas. Signature mengikutkan tipe return, nama dan daftar parameter method tetapi itu tidak termasuk acces modifier dan tipe yang lain dari kata kunci seperti final dan static. Inilah perbedaan dari method overloading. Method overloading secara singkat didiskusikan dalam sub bagian pada kata kunci this. class Superclass { void display(int n) { System.out.println("super: " + n); } } class Subclass extends Superclass { void display(int k) { //method overriding System.out.println("sub: " + k); } } class OverrideDemo { public static void main(String args[]) { Subclass SubObj = new Subclass(); Superclass SuperObj = SubObj; SubObj.display(3); ((Superclass)SubObj).display(4); } } Ini akan menghasilkan keluaran sebagai berikut. sub: 3 sub: 4 Pemanggilan method ditentukan oleh tipe data sebenarnya dari object yang diminta method.

Acces modifier untuk method yang dibutuhkan tidak harus sama. Bagaimanapun, acces modifier
Pengenalan Pemrograman 2 8

J.E.N.I.

dari method overridding mengharuskan salah satunya punya acces modifier yang sama seperti itu dari method overridden atau acces modifier yang kurang dibatasi. Perhatikan contoh selanjutnya. Periksa yang mana dari method overridding berikut akan menyebabkan waktu meng-compile akan menyebabkan error. class Superclass { void overriddenMethod() { } } class Subclass1 extends Superclass { public void overriddenMethod() { } } class Subclass2 extends Superclass { void overriddenMethod() { } } class Subclass3 extends Superclass { protected void overriddenMethod() { } } class Subclass4 extends Superclass { private void overriddenMethod() { } }

1.3.12 Class Abstract dan Method
Bentuk umum dari sebuah method abstract adalah sebagai berikut: abstract <modifier> <returnType> <name>(<parameter>*); Sebuah class yang berisi method abstract harus dideklarasikan sebagai sebuah class abstract. abstract <modifier> <returnType> <name>(<parameter>*);abstract class <name> { /* constructors, fields and methods */ } Kata kunci tidak dapat digunakan pada constructor atau method static. Ini juga penting untuk diingat bahwa class abstract tidak dapat di-instantiate. Class yang meng-extends sebuah class abstract harus mengimplementasikan semua method abstract. Jika tidak subclass sendiri dapat dideklarasikan sebagai abstract. Petunjuk Penulisan Program: catatan bahwa mendeklarasikan sebuah method abstract hampir mirip dalam mendeklarasikan class normal kecuali itu suatu method abstract yang tidak memiliki tubuh dan kepala sehingga dengan segera diakhiri dengan semicolon(;).

Pengenalan Pemrograman 2

9

J.E.N.I.

Sebagai contoh: abstract class SuperHero { String superPowers[]; void setSuperPowers(String superPowers[]) { this.superPowers = superPowers; } void printSuperPowers() { for (int i = 0; i < superPowers.length; i++) { System.out.println(superPowers[i]); } } abstract void displayPower(); } class UnderwaterSuperHero extends SuperHero { void displayPower() { System.out.println("Communicate with sea creatures..."); System.out.println("Fast swimming ability..."); } } class FlyingSuperHero extends SuperHero { void displayPower() { System.out.println("Fly..."); } }

1.3.13 Interface
Mendeklarasikan sebuah interface pada dasarnya mendeklarasikan sebuah class tetapi sebagai penggantinya menggunakan kata kunci class, kata kunci interface digunakan. Berikut syntax-nya. <interfaceDeclaration> ::= <modifier> interface <name> { <attributeDeclaration>* [<modifier> <returnType> <name>(<parameter>*);]* }

Anggotanya adalah public ketika interface dideklarasikan public.
Petunjuk Penulisan Program: Secara mutlak atribut adalah static dan final dan harus diinisialisasi dengan nilai konstanta. Seperti mendeklarasikan class teratas, acces modifier yang valid hanyalah public package(yakni jika tidak ada acces modifier mengawali kata kunci class).

dan

Class mengimplementasikan sebuah interface yang telah ada dengan menggunakan kata kunci implements. Class ini dibuat untuk mengimplementasikan semua method interface. Sebuah class boleh mengimplementasikan lebih dari satu interface.

Contoh berikut menunjukkan bagaimana mendeklarasikan dan menggunakan sebuah interface.
Pengenalan Pemrograman 2 10

J.E.N.I.

interface MyInterface { void iMethod(); } class MyClass1 implements MyInterface { public void iMethod() { System.out.println("Interface method."); } void myMethod() { System.out.println("Another method."); } } class MyClass2 implements MyInterface { public void iMethod() { System.out.println("Another implementation."); } } class InterfaceDemo { public static void main(String args[]) { MyClass1 mc1 = new MyClass1(); MyClass2 mc2 = new MyClass2(); mc1.iMethod(); mc1.myMethod(); mc2.iMethod(); } }

1.3.14 Kata kunci this
Kata kunci this dapat digunakan untuk beberapa alasan berikut: 1.Adanya ambigu pada atribut lokal dari variabel lokal 2.Menunjuk pada object yang meminta method non-static 3.Menunjuk pada constructor lain. Sebagai contoh pada maksud pertama, perhatikan kode berikut dimana variabel data disediakan sebagai sebuah atribut dan parameter lokal pada saat yang sama. class ThisDemo1 { int data; void method(int data) { this.data = data; /* this.data menunjuk ke atribut sementara data menunjuk ke variabel lokal */ } }

Contoh berikut menunjukkan bagaimana object this secara mutlak menunjuk ketika anggota nonPengenalan Pemrograman 2 11

J.E.N.I.

static dipanggil. class ThisDemo2 { int data; void method() { System.out.println(data); //this.data } void method2() { method(); //this.method(); }

Sebelum melihat ke contoh yang lain, mari pertama meninjau pengertian method overloading. Constructor seperti juga method dapat juga menjadi overload. Method yang berbeda dalam class dapat memberi nama yang sama asalkan list parameter juga berbeda. Method overloaded harus berbeda dalam nomor dan/atau tipe dari parameternya. Contoh selanjutnya memiliki constructor overloaded dan referensi this yang dapat digunakan untuk menunjuk versi lain dari constructor. class ThisDemo3 { int data; ThisDemo3() { this(100); } ThisDemo3(int data) { this.data = data; } } Petunjuk Penulisan Program: Memanggil this() harus ada pernyataan pertama dalam constructor.

1.3.15 Kata kunci super
Penggunaan kata kunci super berhubungan dengan pewarisan. Super digunakan untuk meminta constructor superclass. Super juga dapat digunakan seperti kata kunci this untuk menunjuk pada anggota dari superclass. Program berikut mendemonstrasikan bagaimana referensi super digunakan untuk memanggil constructor superclass.

class Person { String firstName; String lastName; Person(String fname, String lname) { firstName = fname; lastName = lname; } } class Student extends Person { String studNum; Student(String fname, String lname, String sNum) { super(fname, lname);
Pengenalan Pemrograman 2 12

J.E.N.I.

studNum = sNum; } }

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

Pengenalan Pemrograman 2

13

J.E.N.I.

1.3.16 Kata Kunci static
Kata kunci static dapat digunakan untuk anggota dari sebuah class. Kata kunci ini menyediakan static atau anggota class untuk diakses sama sebelum beberapa instance dari class dibuat. Variabel class bersifat seperti variabel umum. Ini artinya bahwa variabel dapat diakses oleh semua instance dari class. Method class mungkin dapat diambil tanpa membuat sebuah object dari class tersebut. Bagaimanapun, mereka hanya dapat mengakses anggota static dari class. Ditambahkan juga, mereka tidak dapat menunjuk this dan super. Kata kunci static dapat juga diaplikasikan pada blok. Ini dinamakan dengan blok static. Blok ini dieksekusi hanya sekali, ketika class diisi. Hal ini biasanya digunakan untuk menginisialisasi variabel class.
class Demo { static int a = 0; static void staticMethod(int i) { System.out.println(i); } static { //blok static System.out.println("This is a static block."); a += 1; } } class StaticDemo { public static void main(String args[]) { System.out.println(Demo.a); Demo.staticMethod(5); Demo d = new Demo(); System.out.println(d.a); d.staticMethod(0); Demo e = new Demo(); System.out.println(e.a); d.a += 3; System.out.println(Demo.a+", " +d.a +", " +e.a); } }

Keluaran dari source kode ditunjukkan di bawah ini.
This is a static block. 1 5 1 0 1 4, 4, 4

1.3.17 Kata Kunci final
Kata kunci final dapat diaplikasikan pada variabel, method dan class. Untuk mengingat fungsi dari kata kunci, ingat bahwa itu secara mudah dibatasi apa yang kita dapat lakukan dengan variabel, method dan class. Nilai dari variabel final dapat tidak lama diubah sesudah nilainya telah diatur. Sebagai contoh, final int data = 10; Pernyataan berikut akan menyebabkan terjadi compilation error:
Pengenalan Pemrograman 2 14

J.E.N.I.

data++; Method final tidak dapat di-override dalam class anak. final void myMethod() { //in a parent class } myMethod tidak dapat lama di-override dalam class anak. class final tidak dapat diwariskan tidak seperti class yang biasanya. final public class MyClass { } Petunjuk Penulisan Program: Perintah penulisan kata kunci final dan public memungkinkan bertukar tempat. Pernyataan ini akan menyebabkan kesalahan compilation terjadi karena MyClass dapat tidak lama di-extended. public WrongClass extends MyClass { }

1.3.18 Inner Classes
Sebuah inner class secara mudah dideklarasikan dalam class lain. class OuterClass { int data = 5; class InnerClass { int data2 = 10; void method() { System.out.println(data); System.out.println(data2); } } public static void main(String args[]) { OuterClass oc = new OuterClass(); InnerClass ic = oc.new InnerClass(); System.out.println(oc.data); System.out.println(ic.data2); ic.method(); } } Untuk mampu mengakses anggota dari inner class, kita butuh sebuah instance dari inner class. Method-method dari inner class dapat secara langsung mengakses anggota dari outer class.

Pengenalan Pemrograman 2

15

J.E.N.I.

1.4 Latihan
1.4.1 Tabel Perkalian
Tulis program yang mempunyai masukkan size dari user dan mencetak tabel perkalian dengan size yang ditetapkan. Size untuk tabel perkalian : 5 Tabel perkalian dari size 5: 1 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.4.2 Greatest Common Factor(GCF)
Tulis sebuah program yang mempunyai tiga integer dan menghitung nilai GCF dari tiga angka. GCF adalah angka terbesar yang secara rata dibagi ke semua angka yang diberikan. Input 1: 25 Input 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.4.3 Shape
Buatlah class Shape. class memiliki dua field String: name dan size. class mempunyai method printShapeInfo, dimana hanya mengeluarkan nilai name dan field size dari object Shape. Juga memiliki method printShapeName dan printShapeSize, dimana mencetak nama dan size dari object, berturut-turut. Menggunakan pewarisan, buat class Square dengan field yang sama dan method seperti itu dari class Shape. Class ini mempunyai dua tambahan field integer: length dan width. Method printShapeLength dan printShapeWidth yang mencetak panjang dan lebar object yang juga termasuk dalam class ini. Anda juga harus meng-override printShapeInfo untuk mencetak keluaran field tambahan dalam subclass juga.

1.4.4 Binatang
Buatlah interface Animal yang mempunyai tiga method:eat dan move. Semua method ini tidak punya argumen atau nilai return. Method ini hanya mengeluarkan bagaimana object Animal makan dan bergerak. Sebagai contoh, seekor kelinci memakan wortel dan bergerak dengan melompat. Buat class Fish dan Bear yang menggunakan interface Animal. Terserah kepada Anda bagaimana menggunakan method eat dan move.
Pengenalan Pemrograman 2 16

J.E.N.I.

BAB 2 Exceptions dan Assertions
2.1 Tujuan
Dasar penanganan exception telah dikenalkan pada Anda di pelajaran pemrograman pertama. Bab ini membahas secara lebih dalam mengenai exception dan sedikit menyinggung tentang assertion. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Menangani exception dengan menggunakan try, catch dan finally 2. Membedakan penggunaan antara throw dengan throws 3. Menggunakan exception class yang berbeda – beda 4. Membedakan antara checked exceptions dan unchecked exceptions 5. Membuat exception class tersendiri 6. Menjelaskan keunggulan penggunaan assertions 7. Menggunakan assertions

2.2 Apa itu Exception?
2.2.1 Pendahuluan
Bugs dan error dalam sebuah program sangat sering muncul meskipun program tersebut dibuat oleh programmer berkemampuan tinggi. Untuk menghindari pemborosan waktu pada proses error-checking, Java menyediakan mekanisme penanganan exception. Exception adalah singkatan dari Exceptional Events. Kesalahan (errors) yang terjadi saat runtime, menyebabkan gangguan pada alur eksekusi program. Terdapat beberapa tipe error yang dapat muncul. Sebagai contoh adalah error pembagian 0, mengakses elemen di luar jangkauan sebuah array, input yang tidak benar dan membuka file yang tidak ada.

2.2.2 Error dan Exception Classes
Seluruh exceptions adalah subclasses, baik secara langsung maupun tidak langsung, dari sebuah root class Throwable. Kemudian, dalam class ini terdapat dua kategori umum : Error class dan Exception class. Exception class menunjukkan kondisi yang dapat diterima oleh user program. Umumnya hal tersebut disebabkan oleh beberapa kesalahan pada kode program. Contoh dari exceptions adalah pembagian oleh 0 dan error di luar jangkauan array.

Pengenalan Pemrograman 2

1

J.E.N.I.

Error class digunakan oleh Java run-time untuk menangani error yang muncul pada saat dijalankan. Secara umum hal ini di luar control user karena kemunculannya disebabkan oleh run-time environment. Sebagai contoh adalah out of memory dan harddisk crash.

2.2.3 Sebuah Contoh
Perhatikan contoh program berikut :
class DivByZero { public static void main(String args[]) { System.out.println(3/0); System.out.println(“Cetak.”); } }

Jika kode tersebut dijalankan, akan didapatkan pesan kesalahan sebagai berikut :
Exception in thread "main" java.lang.ArithmeticException: / by zero at DivByZero.main(DivByZero.java:3)

Pesan tersebut menginformasikan tipe exception yang terjadi pada baris dimana exception itu berasal. Inilah aksi default yang terjadi bila terjadi exception yang tidak tertangani. Jika tidak terdapat kode yang menangani exception yang terjadi, aksi default akan bekerja otomatis. Aksi tersebut pertama-tama akan menampilkan deskripsi exception yang terjadi. Kemudian akan ditampilkan stack trace yang mengindentifikasi method dimana exception terjadi. Pada bagian akhir, aksi default tersebut akan menghentikan program secara paksa. Bagaimana jika Anda ingin melakukan penanganan atas exception dengan cara yang berbeda? Untungnya, bahasa pemrograman Java memiliki 3 keywords penting dalam penanganan exception, yaitu try, catch dan finally.

Pengenalan Pemrograman 2

2

J.E.N.I.

2.3 Menangkap Exception
2.3.1 Try - Catch
Seperti yang telah dijelaskan sebelumnya, keyword try, catch dan finally digunakan dalam menangani bermacam tipe exception. 3 Keyword tersebut digunakan bersama, namun finally bersifat opsional. Akan lebih baik jika memfokuskan pada dua keyword pertama, kemudian membahas finally pada bagian akhir. Berikut ini adalah penulisan try-catch secara umum :

try { <code to be monitored for exceptions> } catch (<ExceptionType1> <ObjName>) { <handler if ExceptionType1 occurs> } ... } catch (<ExceptionTypeN> <ObjName>) { <handler if ExceptionTypeN occurs> }

Petunjuk Penulisan Program : Blok catch dimulai setelah kurung kurawal dari kode try atau catch terkait. Penulisan kode dalam blok yang dimasukkan

Gunakan contoh kode tersebut pada program DivByZero yang telah dibuat sebelumnya :
class DivByZero { public static void main(String args[]) { try { System.out.println(3/0); System.out.println(“Cetak.”); } catch (ArithmeticException exc) { //Reaksi atas kejadian System.out.println(exc); } System.out.println(“Setelah Exception.”); } }

Kesalahan pembagian dengan bilangan 0 adalah salah satu contoh dari ArithmethicException. Tipe exception kemudian mengindikasikan klausa catch pada class ini. Program tersebut menangani kesalahan yang terjadi dengan menampilkan deskripsi dari permasalahan.

Pengenalan Pemrograman 2

3

J.E.N.I.

Output program saat eksekusi akan terlihat sebagai berikut :
java.lang.ArithmeticException: / by zero After exception.

Bagian kode yang terdapat pada blok try dapat menyebabkan lebih dari satu tipe exception. Dalam hal ini, terjadinya bermacam tipe kesalahan dapat ditangani menggunakan beberapa blok catch. Perlu dicatat bahwa blok try dapat hanya menyebabkan sebuah exception pada satu waktu, namun dapat pula menampikan tipe exception yang berbeda di lain waktu. Berikut adalah contoh kode yang menangani lebih dari satu exception :
class MultipleCatch { public static void main(String args[]) { try { int den = Integer.parseInt(args[0]); //baris 4 System.out.println(3/den); //baris 5 } catch (ArithmeticException exc) { System.out.println(“Nilai Pembagi 0.”); } catch (ArrayIndexOutOfBoundsException exc2) { System.out.println(“Missing argument.”); } System.out.println(“After exception.”); } }

Pada contoh ini, baris ke-4 akan menghasilkan kesalahan berupa ArrayIndexOutOfBoundsException bilamana seorang user alpa dalam memasukkan argument, sedang baris ke-5 akan menghasilkan kesalahan ArithmethicException jika pengguna memasukkan nilai 0 sebagai sebuah argument. Pelajari apakah yang akan terjadi terhadap program bila argumen – argumen berikut dimasukkan oleh user : a) Tidak ada argument b) 1 c) 0 Penggunaan try bersarang diperbolehkan dalam pemrograman Java.
class NestedTryDemo { public static void main(String args[]){ try { int a = Integer.parseInt(args[0]); try { int b = Integer.parseInt(args[1]); System.out.println(a/b); } catch (ArithmeticException e) { System.out.println(“Divide by zero error!"); } } catch (ArrayIndexOutOfBoundsException) { System.out.println(“2 parameters are required!"); } }

Pengenalan Pemrograman 2

4

J.E.N.I.

} Pelajari apa yang akan terjadi pada program jika argument – argument berikut dimasukkan : a) Tidak ada argumen b) 15 c) 15 3 d) 15 0

Kode berikut menggunakan try bersarang tergabung dengan penggunaan method. class NestedTryDemo2 { static void nestedTry(String args[]) { try { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); System.out.println(a/b); } catch (ArithmeticException e) { System.out.println("Divide by zero error!"); } } public static void main(String args[]){ try { nestedTry(args); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("2 parameters are required!"); } } }

Bagaimana output program tersebut jika diimplementasikan terhadap argument – argument berikut : a) Tidak ada argumen b) 15 c) 15 3 d) 15 0

2.3.2 Keyword Finally
Saatnya Anda mengimplementasikan finally dalam blok try-cacth. Berikut ini cara penggunaan keyword tersebut :
try { <kode monitor exception> } catch (<ExceptionType1> <ObjName>) { <penanganan jika ExceptionType1 terjadi> } ... } finally { <kode yang akan dieksekusi saat blok try berakhir> }

Pengenalan Pemrograman 2

5

J.E.N.I.

Petunjuk Penulisan Program : Sekali lagi, ketentuan penulisan program juga mengatur penggunaan finally seperti halnya pada blok catch. Penggunaan finally dimulai setelah kurung kurawal penutup blok catch terkait. Penulisan dalam blok tersebut juga mengalami indentasi.

Blok finally mengandung kode penanganan setelah penggunaan try dan catch. Blok kode ini selalu tereksekusi walaupun sebuah exception terjadi atau tidak pada blok try. Blok kode tersebut juga akan menghasilkan nilai true meskipun return, continue ataupun break tereksekusi. Terdapat 4 kemungkinan skenario yang berbeda dalam blok try-catch-finally. Pertama, pemaksaan keluar program terjadi bila control program dipaksa untuk melewati blok try menggunakan return, continue ataupun break. Kedua, sebuah penyelesaian normal terjadi jika try-catch-finally tereksekusi secara normal tanpa terjadi error apapun. Ketiga, kode program memiliki spesifikasi tersendiri dalam blok catch terhadap exception yang terjadi. Yang terakhir, kebalikan skenario ketiga. Dalam hal ini, exception yang terjadi tidak terdefinisikan pada blok catch manapun. Contoh dari skenario – skenario tersebut terlihat pada kode berikut ini :
class FinallyDemo { static void myMethod(int n) throws Exception{ try { switch(n) { case 1: System.out.println("case pertama"); return; case 3: System.out.println("case ketiga"); throw new RuntimeException("demo case ketiga"); case 4: System.out.println("case keempat"); throw new Exception("demo case keempat"); case 2: System.out.println("case Kedua"); } } catch (RuntimeException e) { System.out.print("RuntimeException terjadi: "); System.out.println(e.getMessage()); } finally { System.out.println("try-block entered."); } } public static void main(String args[]){ for (int i=1; i<=4; i++) { try { FinallyDemo.myMethod(i); } catch (Exception e){ System.out.print("Exception terjadi: "); System.out.println(e.getMessage()); } System.out.println(); } } }

Pengenalan Pemrograman 2

6

J.E.N.I.

2.4 Melempar Exception
2.4.1 Keyword Throw
Disamping menangkap exception, Java juga mengijinkan seorang user untuk melempar sebuah exception. Sintaks pelemparan exception cukup sederhana.

throw <exception object>; Perhatikan contoh berikut ini.
/* Melempar exception jika terjadi kesalahan input */ class ThrowDemo { public static void main(String args[]){ String input = “invalid input”; try { if (input.equals(“invalid input”)) { throw new RuntimeException("throw demo"); } else { System.out.println(input); } System.out.println("After throwing"); } catch (RuntimeException e) { System.out.println("Exception caught here."); System.out.println(e); } } }

2.4.2 Keyword Throws
Jika sebuah method dapat menyebabkan sebuah exception namun tidak menangkapnya, maka digunakan keyword throws. Aturan ini hanya berlaku pada checked exception. Anda akan mempelajari lebih lanjut tentang checked exception dan unchecked exception pada bagian selanjutnya, “Kategori Exception”. Berikut ini penulisan syntax menggunakan keyword throws :
<type> <methodName> (<parameterList>) throws <exceptionList> { <methodBody> }

Sebuah method perlu untuk menangkap ataupun mendaftar seluruh exceptions yang mungkin terjadi, namun hal itu dapat menghilangkan tipe Error, RuntimeException, ataupun subclass-nya.

Pengenalan Pemrograman 2

7

J.E.N.I.

Contoh berikut ini menunjukkan bahwa method myMethod tidak menangani ClassNotFoundException.
class ThrowingClass { static void myMethod() throws ClassNotFoundException { throw new ClassNotFoundException ("just a demo"); } } class ThrowsDemo { public static void main(String args[]) { try { ThrowingClass.myMethod(); } catch (ClassNotFoundException e) { System.out.println(e); } } }

2.5 Kategori Exception
2.5.1 Exception Classes dan Hierarki
Seperti yang disebutkan sebelumnya, root class dari seluruh exception classes adalah Throwable class. Yang disebutkan dibawah ini adalah exception class hierarki. Seluruh exceptions ini terdefinisi pada package java.lang.

Tabel 1.4. Hirarki Exception Class

Pengenalan Pemrograman 2

8

J.E.N.I.

Sekarang Anda sudah cukup familiar dengan beberapa exception classes, saatnya untuk mengenalkan aturan : catch lebih dari satu harus berurutan dari subclass ke superclass.

class MultipleCatchError { public static void main(String args[]){ try { int a = Integer.parseInt(args [0]); int b = Integer.parseInt(args [1]); System.out.println(a/b); } catch (Exception e) { System.out.println(e); } catch (ArrayIndexOutOfBoundsException e2) { System.out.println(e2); } System.out.println("After try-catch-catch."); } }

Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception class adalah superclass dari ArrayIndexOutOfBoundsException class.
MultipleCatchError.java:9: exception java.lang.ArrayIndexOutOfBoundsException has already been caught } catch (ArrayIndexOutOfBoundsException e2) {

2.5.2 Checked dan Unchecked Exceptions
Exception terdiri atas checked dan unchecked exceptions. Checked exceptions adalah exception yang diperiksa oleh Java compiler. Compiler memeriksa keseluruhan program apakah menangkap atau mendaftar exception yang terjadi dalam sintax throws. Apabila checked exception tidak didaftar ataupun ditangkap, maka compiler error akan ditampilkan. Tidak seperti checked exceptions, unchecked exceptions tidak berupa compile-time checking dalam penanganan exceptions. Pondasi dasar dari unchecked exception classes adalah Error, RuntimeException dan subclass-nya.

2.5.3 User Defined Exceptions
Meskipun beberapa exception classes terdapat pada package java.lang namun tidak mencukupi untuk menampung seluruh kemungkinan tipe exception yang mungkin terjadi. Sehingga sangat mungkin bahwa Anda perlu untuk membuat tipe exception tersendiri. Dalam pembuatan tipe exception Anda sendiri, Anda hanya perlu untuk membuat sebuah extended class terhadap RuntimeException class, maupun Exception class lain. Selanjutnya tergantung pada Anda dalam memodifikasi class sesuai permasalahan yang akan diselesaikan. Members dan constructors dapat dimasukkan pada exception class milik Anda.

Pengenalan Pemrograman 2

9

J.E.N.I.

Berikut ini contohnya :
class HateStringException extends RuntimeException{ /* Tidak perlu memasukkan member ataupun construktor */ } class TestHateString { public static void main(String args[]) { String input = "invalid input"; try { if (input.equals("invalid input")) { throw new HateStringException(); } System.out.println("String accepted."); } catch (HateStringException e) { System.out.println("I hate this string: " + input + "."); } } }

2.6 Assertions
2.6.1 User Defined Exceptions
Assertions mengijinkan programmer untuk menentukan asumsi yang dihadapi. Sebagai contoh, sebuah tanggal dengan area bulan tidak berada antara 1 hingga 12 dapat diputuskan bahwa data tersebut tidak valid. Programmer dapat menentukan bulan harus berada diantara area tersebut. Meskipun hal itu dimungkinkan untuk menggunakan contructor lain untuk mensimulasikan fungsi dari assertions, namun sulit untuk dilakukan karena fitur assertion dapat tidak digunakan. Hal yang menarik dari assertions adalah seorang user memiliki pilihan untuk digunakan atau tidak pada saat runtime. Assertion dapat diartikan sebagai extensi atas komentar yang menginformasikan pembaca kode bahwa sebagian kondisi harus terpenuhi. Dengan menggunakan assertions, maka tidak perlu untuk membaca keseluruhan kode melalui setiap komentar untuk mencari asumsi yang dibuat dalam kode. Namun, menjalankan program tersebut akan memberitahu Anda tentang assertion yang dibuat benar atau salah. Jika assertion tersebut salah, maka AssertionError akan terjadi.

2.6.2 Mengaktifkan dan Menonaktifkan Exceptions
Penggunaan assertions tidak perlu melakukan import package java.util.assert. Menggunakan assertions lebih tepat ditujukan untuk memeriksa parameter dari nonpublic methods jika public methods dapat diakses oleh class lain. Hal itu mungkin terjadi bila penulis dari class lain tidak menyadari bahwa mereka dapat menonaktifkan assertions. Dalam hal ini program tidak dapat bekerja dengan baik. Pada non-public methods, hal tersebut tergunakan secara langsung oleh kode yang ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga

Pengenalan Pemrograman 2

10

J.E.N.I.

mereka menyadari bahwa saat menjalankannya, assertion harus dalam keadaan aktif.

Untuk mengkompilasi file yang menggunakan assertions, sebuah parameter perintah diperlukan seperti yang terlihat dibawah ini : javac –source 1.4 MyProgram.java

tambahan

Jika Anda ingin untuk menjalankan program tanpa menggunakan fitur assertions, cukup jalankan program secara normal.

java MyProgram Namun, jika Anda ingin mengaktifkan assertions, Anda perlu menggunakan parameter –enableassertions atau –ea.

java –enableassertions MyProgram

2.6.3 Sintaks Assertions
Penulisan assertions memiliki dua bentuk. Bentuk yang paling sederhana terlihat sebagai berikut : assert <expression1>; dimana <expression1> adalah kondisi dimana assertion bernilai true. Bentuk yang lain menggunakan dua ekspresi, berikut ini cara penulisannya : assert <expression1> : <expression2>; dimana <expression1> adalah kondisi assertion bernilai true dan <expression2> adalah informasi yang membantu pemeriksaan mengapa program mengalami kesalahan.

class AgeAssert { public static void main(String args[]) { int age = Integer.parseInt(args[0]); assert(age>0); /* jika masukan umur benar (misal, age>0) */ if (age >= 18) { System.out.println(“Congrats! You're an adult! =)”); } } }

Pengenalan Pemrograman 2

11

J.E.N.I.

2.7 Latihan
2.7.1 Heksadesimal ke Desimal
Tentukan sebuah angka heksadesimal sebagai input. Konversi angka tersebut menjadi bilangan desimal. Tentukan exception class Anda sendiri dan lakukan penanganan jika input dari user bukan berupa bilangan heksadesimal.

2.7.2 Menampilkan Sebuah Berlian
Tentukan nilai integer positif sebagai input. Tampilkan sebuah berlian menggunaakan karakter asterisk (*) sesuai angka yang diinput oleh user. Jika user memasukkan bilangan integer negatif, gunakan assertions untuk menanganinya. Sebagai contoh, jika user memasukkan integer bernilai 3, program Anda harus menampilkan sebuah berlian sesuai bentuk berikut :

* *** ***** *** *

Pengenalan Pemrograman 2

12

J.E.N.I.

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

J.E.N.I.

165 adalah sama dengan A5 base 16. Catatan: A=10.

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

Pengenalan Pemrograman 2

4

J.E.N.I.

3.3 Tipe Data Abstract
3.3.1 Apa yang Dimaksud dengan Tipe Data Abstract?
Abstract Data Type (ADT) adalah kumpulan dari elemen-elemen data yang disajikan dengan satu set operasi yang digambarkan pada elemen-elemen data tersebut. Stacks, queues dan pohon biner adalah tiga contoh dari ADT. Dalam bab ini, Anda akan mempelajari tentang stacks dan queues.

3.3.2 Stacks
Stack adalah satu set atau urutan elemen data dimana manipulasi data dari elemenelemen hanya diperbolehkan pada tumpukan teratas dari stack. Hal ini merupakan perintah pengumpulan data secara linier yang disebut “last in, first out” (LIFO). Stacks berguna untuk bermacam-macam aplikasi seperti pattern recognition dan pengkonversian antar notasi infix, postfix dan prefix. Dua operasi yang dihubungkan dengan stacks adalah operasi push dan pop. Push berarti memasukkan data ke dalam stacks yang paling atas dimana pop sebagai penunjuk/pointer untuk memindahkan elemen ke atas stacks. Untuk memahami bagaimana cara kerja stacks, pikirkan bagaimana Anda dapat menambah atau memindakan sebuah data dari tumpukan data. Pikiran Anda akan memberitahu Anda untuk menambah atau memindahkan data hanya pada stack yang paling atas karena jika menggunakan cara lain, dapat menyebabkan tumpukan stack akan terjatuh. Dibawah ini merupakan ilustrasi bagaimana tampilan dari stacks.

n-1 ... 6 5 4 3 2 1 0 Jayz KC Jojo Toto Kyla DMX bottom top

Tabel 1.2.2: Ilustrasi Stack

Stack akan berarti penuh jika jangkauan sel teratas disimbolkan dengan n-1. Jika nilai teratas / top sama dengan -1, stack berarti kosong.

Pengenalan Pemrograman 2

5

J.E.N.I.

3.3.3 Queues
Queues adalah contoh lain dari ADT. Hal ini merupakan perintah pengumpulan data yang disebut “first-in, first-out”. Aplikasi ini meliputi tugas penjadwalan dalam sistem operasi, topological sorting dan graph traversal. Enqueue dan dequeue merupakan operasi yang berhubungan dengan queues. Enqueue menunjuk pada memasukkan data pada akhir queue sedangkan dequeue berarti memindahkan elemen dari queue tersebut. Untuk mengingat bagaimana queue bekerja, ingatlah arti khusus dari queue yaitu baris. Berikut ini bagaimana cara kerja queue. Siapa yang akan mendapatkan kesempatan pertama untuk bertemu bintang idolanya dari mereka yang sedang menunggu dalam sebuah barisan? Seharusnya orang pertama yang berada pada barisan tersebut. Orang ini mendapat kesempatan pertama untuk meninggalkan barisan. Hubungkan hal tersebut dengan bagaimana queue bekerja. Berikut ini merupakan ilustrasi dari bagaimana tampilan dari queue. 0 1 2 Eve front 3 Jayz 4 KC 5 Jojo 6 Toto 7 Kyla 8 DMX end Insert Delete
Tabel 1.2.3: Ilustrasi Queue

9

...

n-1

Queue akan kosong jika nilai end kurang dari front. Sementara itu, akan penuh jika end sama dengan n-1.

3.3.4 Sequential and Linked Representation
ADTs biasanya dapat diwakilkan menggunakan sequential dan linked representation. Hal ini memudahkan untuk membuat sequential representation dengan menggunakan array. Bagaimanapun juga, masalah dengan menggunakan array adalah pembatasan size, yang membuatnya tidak fleksibel. Dengan menggunakan array, sering terjadi kekurangan atau kelebihan space memori. Mempertimbangkan hal tersebut, Anda harus membuat sebuah array dan mendeklarasikannya agar mampu menyimpan 50 elemen. Jika user hanya memasukkan 5 elemen, maka 45 space pada memori akan sia-sia. Disisi lain, jika user ingin memasukkan 51 elemen, space yang telah disediakan didalam array tidak akan cukup. Dibandingkan dengan sequential representation, linked representation lebih sedikit rumit tetapi lebih fleksibel. Linked representation menyesuaikan memori yang dibutuhkan oleh user. Penjelasan lebih lanjut pada linked representation akan didiskusikan pada bab berikutnya.

3.3.5 Sequential Representation dari Integer Stack
class SeqStack { int top = -1; int memSpace[]; int limit;
Pengenalan Pemrograman 2

/* pada permulaan, stack kosong*/ /* penyimpanan untuk integer */ /* ukuran dari memSpace */
6

J.E.N.I.

SeqStack() { memSpace = new int[10]; limit = 10; } SeqStack(int size) { memSpace = new int[size]; limit = size; } boolean push(int value) { top++; /* memeriksa apakah stack penuh */ if (top < limit) { memSpace[top] = value; } else { top--; return false; } return true; } int pop() { int temp = -1; /* memeriksa apakah stack kosong */ if (top >= 0) { temp = memSpace[top]; top--; } else { return -1; } return temp; } public static void main(String args[]) { SeqStack myStack = new SeqStack(3); myStack.push(1); myStack.push(2); myStack.push(3); myStack.push(4); System.out.println(myStack.pop()); System.out.println(myStack.pop()); System.out.println(myStack.pop()); System.out.println(myStack.pop()); } }

3.3.6 Linked Lists
Sebelum mengimplementasikan linked representation dari stacks, pertama mari kita pelajari bagaimana membuat linked representation. Dalam hal ini, kita akan menggunakan linked list. Linked list merupakan struktur dinamis yang berlawanan dengan array, dimana merupakan struktur statis. Hal ini berarti linked list dapat tumbuh dan berkurang dalam ukuran yang bergantung pada kebutuhan user. Linked list digambarkan sebagai kumpulan dari nodes, Yang masing-masing berisi data dan link atau pointer ke node berikutnya di dalam list.

Pengenalan Pemrograman 2

7

J.E.N.I.

Gambar dibawah ini menunjukkan tampilan dari node.

Gambar 2.6a: Sebuah node

Berikut ini merupakan contoh dari non-empty linked list dengan 3 node.

Gambar 3.6b: Non-empty linked list dengan tiga node

Berikut ini bagaimana class node diimplementasikan. Class ini dapat digunakan untuk membuat linked list. class Node { int data; Node nextNode; } /* integer data diisikan dalam node */ /* node selanjutnya dalam list */

class TestNode { public static void main(String args[]) { Node emptyList = null; /* membuat list kosong */ /* head points untuk node pertama dalam list */ Node head = new Node(); /* inisialisasi node pertama dalam list */ head.data = 5; head.nextNode = new Node(); head.nextNode.data = 10; /* null menandai akhir dari list */ head.nextNode.nextNode = null; /* mencetak elemen list */ Node currNode = head; while (currNode != null) { System.out.println(currNode.data); currNode = currNode.nextNode; } } }

Pengenalan Pemrograman 2

8

J.E.N.I.

3.3.7 Linked Representation dari Integer Stack
Sekarang Anda telah mempelajari tentang linked list. Maka Anda telah siap untuk menerapkan apa yang telah Anda pelajari untuk implementasi linked representation dari stack. class DynamicIntStack{ private IntStackNode top; class IntStackNode { int data; IntStackNode next; IntStackNode(int n) { data = n; next = null; } }

/* head atau puncak dari stack */ /* class node */

void push(int n){ /* no need to check for overflow */ IntStackNode node = new IntStackNode(n); node.next = top; top = node; } int pop() { if (isEmpty()) { return -1; /* may throw a user-defined exception */ } else { int n = top.data; top = top.next; return n; } } boolean isEmpty(){ return top == null; } public static void main(String args[]) { DynamicIntStack myStack = new DynamicIntStack(); myStack.push(5); myStack.push(10); /* mencetak elemen dari stack */ IntStackNode currNode = myStack.top; while (currNode!=null) { System.out.println(currNode.data); currNode = currNode.next; } System.out.println(myStack.pop()); System.out.println(myStack.pop()); } }

Pengenalan Pemrograman 2

9

J.E.N.I.

Gambar 1.2.7: Implementasi linked dari stack

3.3.8 Java Collections
Saat ini Anda telah diperkenalkan kepada dasar tipe data abstract. Pada intinya, Anda telah mempelajari tentang dasar dari linked lists, stacks dan queue. Berita baik bahwa tipe data abstract telah siap untuk diimplementasikan dan dimasukkan dalam Java. Class Stack dan LinkedList diperbolehkan digunakan tanpa perlu pengertian yang lengkap dari konsep ini. Bagaimanapun juga, sebagai ilmuwan komputer, sangat penting untuk mengerti konsep dari tipe data abstract. Oleh karena itu, penjelasan terperinci masih disampaikan dalam bagian yang terdahulu. Dengan peluncuran dari J2SE 5.0, queue interface telah tersedia. Untuk detail pada class dan interface ini, dapat dilihat pada dokumentasi Java API. Kepada kita, Java telah menyajikan classes dan interfaces Collection yang lain, dimana semuanya dapat ditemukan di java.util package. Contoh dari classes Collection termasuk LinkedList, ArrayList, HashSet dan TreeSet. Class tersebut benar-benar implementasi dari collection interfaces yang berbeda. Induk hirarki dari collection interfaces adalah interfaces Collection itu sendiri. Sebuah collection hanyalah sebuah grup dari object yang diketahui sebagai elemennya sendiri. Collection memperbolehkan penggandaan/salinan dan tidak membutuhkan pemesanan elemen secara spesifik. SDK tidak menyediakan implementasi built-in yang lain dari interface ini tetapi mengarahkan subinterfaces, interfaces Set dan interfaces List diperbolehkan. Sekarang, apa perbedaan dari kedua interface tersebut. Set merupakan collection yang tidak dipesan dan tidak ada penggandaan di dalamnya. Sementara itu, list merupakan collection yang dipesan dari elemen-elemen dimana juga diperbolehkannya penggandaan. HashSet, LinkedHashSet dan TreeSet suatu implementasi class dari interfaces Set. ArrayList, LinkedList dan Vector suatu implementasi class dari List interfaces.

<root interface> Collection <interface> Set <implementing classes> HashSet LinkedHashSet TreeSet <interface> List <implementing classes> ArrayList LinkedList Vector

Tabel 1.2.8a: Java collections

Berikut ini adalah daftar dari beberapa methods Collections yang disediakan dalam Collection API dari Java 2 Platform SE v1.4.1. Dalam Java 2 Platform SE v.1.5.0, methods ini telah dimodifikasi untuk menampung generic types. Karena generic types masih belum selesai dibahas, sebaiknya mempertimbangkan method ini terlebih dahulu.
Pengenalan Pemrograman 2 10

J.E.N.I.

Disarankan bahwa Anda mengacu pada Collection methods yang terbaru dimana Anda lebih mudah mengerti generic types, yang akan didiskusikan pada chapter berikutnya. Collection Methods public boolean add(Object o) Memasukkan Object o ke dalam collection ini. Mengembalikan nilai true jika o telah sukses ditambahkan ke dalam collection. public void clear() Menghapus semua elemen dari collection ini. public boolean remove(Object o) Menghapus single instance dari Object o pada collection ini, jika hal tersebut telah diinputkan. Mengembalikan nilai true jika o telah ditemukan dan dihapus dari collection. public boolean contains(Object o) Mengembalikan nilai true jika collection ini berisi Object o. public boolean isEmpty() Mengembalikan nilai true jika collection ini tidak berisi object atau elemen apapun. public int size() Mengembalikan jumlah dari elemen pada collection ini. public Iterator iterator() Mengembalikan sebuah iterator yang menunjukkan kita pada isi collection ini. public boolean equals(Object o) Mengembalikan nilai true jika Object o sama dengan yang ada pada collection ini. public int hashCode() Mengembalikan nilai hash code (yaitu ID) untuk collection ini. Objects atau collections yang sama memiliki nilai hash code atau ID yang sama.
Tabel 1.2.8b: Methods dari class Collection

Anda diharapkan mengacu pada dokumentasi API untuk mengetahui daftar lengkap dari methods dalam interface Collection, List dan Set. Saat ini kita akan melihat beberapa classes collection. Harap mengacu pada API untuk daftar dari methods yang dimasukkan ke dalam class ini. Pada bagian sebelumnya, Anda telah melihat bagaimana mengimplementasikan linked list dengan cara Anda sendiri. Java SDK juga telah menyediakan built-implementation dari linked list untuk kita. Class LinkedList berisi methods yang memperbolehkan linked list digunakan seperti stacks, queue atau ADT yang lain. Listing program berikut ini menunjukan bagaimana menggunakan class LinkedList.

Pengenalan Pemrograman 2

11

J.E.N.I.

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

Pengenalan Pemrograman 2

12

J.E.N.I.

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

Gambar 1.2.8: Contoh TreeSet

Pengenalan Pemrograman 2

13

J.E.N.I.

3.4 Latihan
3.4.1 Faktor Persekutuan Terbesar
Faktor persekutuan terbesar (FPB) dari dua angka adalah angka yang terbesar selalu dibagi oleh angka yang satunya, kemudian modulus atau sisa pembagian membagi angka kedua dan seterusnya hingga sisa pembagian dari kedua angka tersebut sama dengan nol. Menggunakan metode Euclid, buatlah dua kode untuk penghitungan dua angka. Gunakan iterasi untuk kode program yang pertama dan rekursif untuk kode program berikutnya. Catatan pada algoritma Euclid : 1. Sebagai masukkan integers x dan y. 2. Ulangi step dibawah ini while y != 0 a. y = x % y; b. x = Nilai lama y; 3. Return x. Contoh, x = 14 dan y = 6. y = x % y = 14 % 6 = 2 x=6 y=x%y=6%2=0 x = 2 (FPB)

3.4.2 Sequential Representation dari Integer Queue
Dengan menggunakan array, implementasikan sebuah integer queue seperti contoh pada sequential stack.

3.4.3 Linked Representation dari Integer Queue
Dengan menggunakan ide dari linked list, implementasikan sebuah integer queue dinamis seperti integer stack dinamis yang diperkenalkan seperti contoh berikut.

3.4.4 Address Book
Dengan menggunakan Collection Java, buatlah sebuah program yang memperbolehkan user untuk insert, delete dan view address. Setiap address berisi nama, alamat dan nomor telepon dari orang yang mengisinya. Pengisian data dimasukkan dengan cara queue tetapi penghapusan dilakukan dengan cara stack. Dalam contoh ini, kita akan menggunakan text editor untuk mengedit program Java. Juga membuka terminal window untuk meng-compile dan mengeksekusi program Java Anda.

Pengenalan Pemrograman 2

14

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

J.E.N.I.

4.3 Class String dan StringBuffer
Class String disediakan oleh Java SDK dengan menggunakan kombinasi character literals. Tidak seperti bahasa pemrograman lainnya, seperti C atau C++, strings dapat digunakan menggunakan array dari character atau disederhanakan dengan menggunakan class String. Sebagai catatan, bahwa sebuah objek String berbeda dari sebuah array dari character.

4.3.1

Constructor String

Class String mempunyai 11 constructor. Untuk melihat bagaimana constructorconstructor ini, perhatikan contoh berikut. /* Contoh ini diambil dari catatan Dr. Encarnacion. */ class StringConstructorsDemo { public static void main(String args[]) { String s1 = new String(); // membuat string kosong char chars[] = { 'h', 'e', 'l', 'l', 'o'}; String s2 = new String(chars); // s2 = "hello"; byte bytes[] = { 'w', 'o', 'r', 'l', 'd' }; String s3 = new String(bytes); // s3 = "world" String s4 = new String(chars, 1, 3); String s5 = new String(s2); String s6 = s2; System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4); System.out.println(s5); System.out.println(s6); } }

4.3.2

Method-method String

Di bawah ini adalah daftar dari method-method String. Method-Method String public char charAt(int index) Mengirim karakter di indeks yang ditentukan oleh parameter index. public int compareTo(String anotherString) Membandingkan dua String dan mengirim bilangan int yang menentukan apakah objek string pemanggil kurang dari atau sama dengan anotherString. Bernilai negatif jika objek yang dilewatkan (passed string) lebih besar, 0 jika kedua string sama, dan bernilai positif jika objek string pemanggil (calling string) lebih besar. public int compareToIgnoreCase(String str) Serupa dengan compareTo tetapi case insensitivity. public boolean equals(Object anObject) Menghasilkan nilai true jika parameter tunggalnya tersusun dari karakter yang sama
Pengenalan Pemrograman 2 4

J.E.N.I.

Method-Method String dengan objek tempat Anda memanggil equals. Sedangkan jika parameter yang ditentukan bukan sebuah objek String atau jika tidak cocok dengan urutan simbol pada string, method akan dikembalikan dengan nilai false. public boolean equalsIgnoreCase(String anotherString) Serupa dengan equals tetapi case insensitivity. public void getChars(int srcBegin, int srcEnd, char[] dst, 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 int length() Menghasilkan panjang String. public String replace(char oldChar, char newChar) Mengganti karakter, semua yang kemunculan oldChar diganti newChar. public String substring(int beginIndex, int endIndex) Mengirim substring dimulai dari indeks beginIndex yang ditentukan dan berakhir dengan indeks endIndex yang ditentukan. public char[] toCharArray() Mengembalikan array karakter yang sama dengan string ini. public String trim() Menghilangkan whitespace di awal dan akhir objek String. public static String valueOf(-) Dapat menggunakan tipe data sederhana seperti boolean, integer atau character, atau juga menggunakan sebuah objek sebagai parameter. Mengirim objek String yang merepresentasikan tipe tertentu yang dilewatkan sebagai parameter.
Tabel 1.2.1: Beberapa method dari class String

Perhatikan bagaimana method-method tersebut digunakan dalam program di bawah ini. class StringDemo { public static void main(String args[]) { String name = "Jonathan"; System.out.println("name: " + name); System.out.println("3rd character of name: " + name.charAt(2)); /* character yang pertama nampak secara berurutan mempunyai nilai unicode lebih kecil */ System.out.println("Jonathan compared to Solomon: " + name.compareTo("Solomon")); System.out.println("Solomon compared to Jonathan: " + "Solomon".compareTo("Jonathan")); /* 'J' mempunyai nilai unicode yang lebih kecil dibanding 'j' */ System.out.println("Jonathan compared to jonathan: " + name.compareTo("jonathan"));
Pengenalan Pemrograman 2 5

J.E.N.I.

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

Pengenalan Pemrograman 2

6

J.E.N.I.

4.3.3

Class StringBuffer

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

Pengenalan Pemrograman 2

7

J.E.N.I.

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

Pengenalan Pemrograman 2

8

J.E.N.I.

4.4 Class-class Wrapper
Sesungguhnya, tipe data primitive seperti int, char and long bukanlah sebuah objek. Sehingga, variabel-variabel tipe data ini tidak dapat mengakses method-method dari class Object. Hanya objek-objek nyata, yang dideklarasikan menjadi referensi tipe data, dapat mengakses method-method dari class Object. Ada suatu keadaan, bagaimanapun, ketika Anda membutuhkan sebuah representasi objek untuk variabel-variabel tipe primitive dalam rangka menggunakan method-method Java built-in. Sebagai contoh, Anda boleh menambahkan variabel tipe primitif pada objek Collection. Disinilah class wrapper masuk. Class wrapper adalah representasi objek sederhana dari variabelvariabel non-objek yang sederhana. Demikian daftar dari class wrapper.

Tipe Data Primitive Boolean Char Byte Short Int Long Float Double

Class Wrapper yang Sesuai Boolean Character Byte Short Integer Long Float Double

Tabel 1.3: Tipe data primitif dan class wrappernya yang sesuai

Nama-nama class wrapper cukup mudah untuk diingat selama nama-nama itu sama dengan tipe data primitive. Dan juga sebagai catatan, bahwa class-class wrapper diawali dengan huruf besar dan versi yang ditunjukkan dari tipe data primitive. Di bawah ini contoh penggunaan class wrapper untuk boolean. class BooleanWrapper { public static void main(String args[]) { boolean booleanVar = 1>2; Boolean booleanObj = new Boolean("TRue"); /* primitif ke objek; dapat juga menggunakan method valueOf */ Boolean booleanObj2 = new Boolean(booleanVar); System.out.println("booleanVar = " + booleanVar); System.out.println("booleanObj = " + booleanObj); System.out.println("booleanObj2 = " + booleanObj2); System.out.println("compare 2 wrapper objects: " + booleanObj.equals(booleanObj2)); /* objek ke primitif */ booleanVar = booleanObj.booleanValue(); System.out.println("booleanVar = " + booleanVar); } }

Pengenalan Pemrograman 2

9

J.E.N.I.

4.5 Class Process dan Runtime
4.5.1 Class Process
class Process menyediakan method-method untuk memanipulasi proses-proses, seperti mematikan proses, menjalankan proses dan mengecek status proses. Class ini merepresentasikan program- program yang berjalan. Di bawah ini beberapa method pada class Process. Method-Method Process public abstract void destroy() Mengakhiri proses. public abstract int waitFor() throws InterruptedException Tidak mengirim sampai proses yang dipanggil berakhir.
Tabel 1.4.1: Beberapa method dari class Process

4.5.2

Class Runtime

Di sisi lain, class Runtime merepresentasikan lingkungan runtime. Dua method penting pada class Runtime adalah method getRuntime dan exec. Method-Method Runtime public static Runtime getRuntime() Mengirim objek runtime yang merepresentasikan berhubungan dengan aplikasi Java saat itu. lingkungan runtime yang

public Process exec(String command) throws IOException Disebabkan command yang ditentukan untuk dieksekusi. Memperbolehkan Anda mengeksekusi proses baru.
Tabel 1.4.2: Beberapa method dari class Runtime

4.5.3

Membuka Registry Editor

Berikut program untuk membuka registry editor tanpa harus mengetikkan perintah dari command prompt. class RuntimeDemo { public static void main(String args[]) { Runtime rt = Runtime.getRuntime(); Process proc; try { proc = rt.exec("regedit"); proc.waitFor(); //cobalah menghapus baris ini } catch (Exception e) { System.out.println("regedit is an unknown command."); }
Pengenalan Pemrograman 2 10

J.E.N.I.

} }

Gambar 1.4.3: Membuka registry editor

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

J.E.N.I.

Method-Method System mengacu pada console.
Tabel 1.5: Beberapa method dari class System

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

Pengenalan Pemrograman 2

12

J.E.N.I.

4.7 Latihan
4.7.1 Evaluasi Ekspresi
Menggunakan method-method class built-in Math, buatlah sebuah program yang menggunakan nilai double x sebagai inputan dan evaluasilah nilai mutlak dari ekspresi yang mengikuti. x2 * cos(45derajat) + akar(e), e adalah angka Euler. Input: Output: Input: Output: 10 72.35939938935488 11 87.20864179427238

4.7.2

Palindrome

Palindrome adalah sebuah string yang membaca sama ketika mengarah ke depan atau sebaliknya. Beberapa contoh dari palindrome : hannah, ana, and bib. Menggunakan String atau class StringBuffer, buatlah sebuah program yang menggunakan satu string sebagai inputan dan tentukan jika ini sebuah palindrome atau bukan.

4.7.3

Notepad

Menggunakan class Process and Runtime, bukalah aplikasi notepad dari program java.

Pengenalan Pemrograman 2

13

J.E.N.I.

BAB 5 Aplikasi Berbasis Teks
5.1 Tujuan
Pembahasan kali ini akan menitikberatkan pada bahasan penggunaan argument command-line. Selebihnya, Anda akan mempelajari mengenai penggunaan streams untuk mendapatkan nilai input dari user pada saat runtime, sekaligus dalam proses manipulasi file. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Mendapatkan input dari command-line 2. Mengetahui cara untuk memanipulasi properties dari sistem 3. Membaca standart input 4. Membaca dan menulis file

5.2 Argument Command-Line dan System Properties
Seperti yang telah Anda ketahui pada pembahasan sebelumnya, JAVA mengijinkan user untuk memasukkan data dari command-line. Sebagai contoh, untuk meneruskan argument 1 dan 2 kepada program Java bernama Calculate, anda dapat menuliskan baris berikut pada command prompt java Calculate 1 2 Pada contoh berikut ini, data 1 disimpan pada variabel args[0], begitu pula dengan data 2 yang disimpan pada args[1]. Sehingga, tujuan dari deklarasi String args[] sebagai sebuah parameter pada method utama menjadi jelas. Selain melewatkan argument menuju method utama, Anda juga dapat memanipulasi system properties dari command-line. System properties hampir menyamai environment variables, namun tidak memiliki ketergantungan pada spesifikasi platform yang digunakan. Sebuah property secara sederhana berupa pemetaan antara property name dan value yang dimilikinya. Hal ini ditunjukkan pada Java dalam class Properties. Class System menyediakan sebuah method untuk menentukan system properties yang digunakan, method getProperties yang menghasilkan sebuah object Properties. Class yang sama juga menyediakan method getProperty yang memiliki dua buah bentuk.

Pengenalan Pemrograman 2

1

J.E.N.I.

public static String getProperty(String key) Bentuk ini menghasilkan nilai String dari System Properties yang ditunjukkan oleh key yang ditentukan. Jika hasil menunjukkan nilai null, berarti tidak terdapat property dengan key yang ditentukan. public static String getProperty(String key, String def) Bentuk ini juga menghasilkan nilai String dari System Properties sesuai key yang ditentukan. Akan menghasilkan nilai def, sebuah nilai default, jika tidak terdapat property dengan key yang sesuai.

Tabel 1.1: getProperty() method dari class System

Kita tidak dapat cukup berhenti pada detail dari system properties, namun dilanjutkan dengan memanipulasi system properties yang digunakan. Jika Anda tertarik mempelajari lebih lanjut tentang system properties, Anda dapat menelusuri dokumentasi API yang disediakan. Anda dapat menggunakan argument opsional –D pada perintah Java dalam command-line untuk menambahkan property baru. java -D<name>=value Sebagai contoh, untuk mengatur system property dengan nama user.home bernilai phillipines, gunakan perintah berikut : java -Duser.home=philippines Untuk menampilkan daftar system properties yang tersedia pada sistem Anda, gunakan method getProperties seperti yang ditunjukkan sebagai berikut : System.getProperties().list(System.out);

5.3 Membaca Standard Input
Dibandingkan dengan mendapatkan masukan user dari command-line, sebagian user lebih memilih untuk memasukkan data bilamana diminta oleh program pada saat eksekusi. Satu cara dalam melakukan hal ini adalah dengan menggunakan stream. Sebuah stream adalah abstraksi dari sebuah file atau sebuah perangkat yang mengijinkan beberapa set item untuk dibaca atau ditulis. Streams terhubung dengan physical devices seperti keyboards, consoles dan files. Terdapat dua bentuk umum dari streams, byte streams dan character streams. Byte streams digunakan pada data biner, sedangkan character streams digunakan pada karakter Unicode. System.in dan System.out adalah dua contoh dari byte streams yang digunakan

Pengenalan Pemrograman 2

2

J.E.N.I.

dalam Java. Contoh pertama mereferensikan pada keyboard, kemudian contoh kedua mereferensikan pada console. Untuk membaca karakter dari keyboard, Anda dapat menggunakan byte stream System.in yang terdapat pada object BufferedReader. Baris berikut menunjukkan bagaimana untuk melakukan hal tersebut :

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

Method read dari object BufferedReader selanjutnya digunakan untuk membaca nilai input dari perangkat input.
ch=(int)br.read(); //method read menghasilkan nilai integer

Cobalah contoh kode berikut :

import java.io.*; class FavoriteCharacter { public static void main(String args[]) throws IOException { System.out.println("Hi, what's your favorite character?"); char favChar; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); favChar = (char) br.read(); System.out.println(favChar + " is a good choice!"); } }

Jika Anda lebih memilih untuk membaca keseluruhan baris daripada membaca satu karakter tiap waktu, gunakan method readLine : str = br.readLine();

Berikut ini sebuah program yang hampir menyerupai contoh sebelumnya, namun membaca keseluruhan string, bukan satu karakter.

import java.io.*; class GreetUser { public static void main(String args[]) throws IOException { System.out.println("Hi, what's your name?"); String name;

Pengenalan Pemrograman 2

3

J.E.N.I.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); name = br.readLine(); System.out.println("Nice to meet you, " + name + "! :)"); } }

Pada saat menggunakan streams, jangan lupa untuk mengimport package java.io seperti yang ditunjukkan dibawah ini : import java.io.*; Satu hal lagi yang perlu untuk diingat, pembacaan dari streams dapat menyebabkan terjadinya exception. Jangan lupa untuk menangani exception tersebut menggunakan perintah try-catch atau dengan mengindikasikan exception pada klausa throws dalam method.

5.4 Menangani File
Pada beberapa kasus, masukan data disimpan pada sebuah file. Selanjutnya, terdapat beberapa cara jika Anda ingin menyimpan output dari program pada sebuah file. Pada sistem terkomputerisasi, data dari Siswa yang dapat digunakan sebagai input oleh sistem umumnya tersimpan pada sebuah file terpisah. Kemudian, salah satu kemungkinan output dari sistem adalah informasi tentang mata pelajaran yang diikuti oleh siswa. Sekali lagi, output dalam hal ini dapat disimpan dalam sebuah file. Seperti yang terlihat pada aplikasi, terdapat suatu kebutuhan untuk membaca dan menulis sebuah file. Anda akan mempelajari tentang file input dan output pada bagian ini.

5.4.1 Membaca sebuah File
Untuk membaca sebuah file, Anda dapat menggunakan class FileInputStream. Berikut ini adalah salah satu constructor dari class tersebut : FileInputStream(String filename)

Constructor tersebut membuat sebuah koneksi terhadap file dimana nama dari file tersebut ditunjukkan sebagai sebuah argument. Exception berupa FileNotFoundException akan muncul jika file tidak ditemukan atau tidak dapat dibuka dan kemudian dibaca. Setelah membuat sebuah input stream, Anda kemudian dapat menggunakannya untuk membaca sebuah file dengan menggunakan method read. Method read menghasilkan sebuah nilai integer, dan akan menunjukkan nilai 1 jika telah mencapai batas akhir file.

Pengenalan Pemrograman 2

4

J.E.N.I.

Berikut ini contohnya : import java.io.*; class ReadFile { public static void main(String args[]) throws IOException { System.out.println("What is the name of the file to read from?"); String filename; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); filename = br.readLine(); System.out.println("Now reading from " + filename + "..."); FileInputStream fis = null; try { fis = new FileInputStream(filename); } catch (FileNotFoundException ex) { System.out.println("File not found."); } try { char data; int temp; do { temp = fis.read(); data = (char) temp; if (temp != -1) { System.out.print(data); } } while (temp != -1); } catch (IOException ex) { System.out.println("Problem in reading from the file."); } } }

5.4.2 Menulis sebuah file
Untuk menuliskan sebuah file, Anda dapat menggunakan class FileOutputStream. Berikut ini salah satu constructor yang dapat Anda gunakan. FileOutputStream(String filename)

Pengenalan Pemrograman 2

5

J.E.N.I.

Contructor tersebut menyediakan jalur output stream terhadap sebuah file yang akan ditulis. Sebuah Exception berupa FileNotFoundException akan muncul jika file yang dimaksud tidak dapat dibuka untuk ditulis.

Jika output stream telah dibuat, Anda dapat menggunakannya untuk menulis file yang dituju menggunakan method write. Method tersebut menggunakan penandaan sebagai berikut : void write(int b) Parameter b mereferensikan data yang akan dituliskan pada file sesuai dengan hasil output stream.

Program berikut menunjukkan contoh penulisan terhadap file :

import java.io.*; class WriteFile { public static void main(String args[]) throws IOException { System.out.println("What is the name of the file to be written to?"); String filename; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); filename = br.readLine(); System.out.println("Enter data to write to " + filename + "..."); System.out.println("Type q$ to end."); FileOutputStream fos = null; try { fos = new FileOutputStream(filename); } catch (FileNotFoundException ex) { System.out.println("File cannot be opened for writing."); } try { boolean done = false; int data; do { data = br.read(); if ((char)data == 'q') { data = br.read(); if ((char)data == '$') { done = true; } else { fos.write('q'); fos.write(data); } } else { fos.write(data); } } while (!done); } catch (IOException ex) { System.out.println("Problem in reading from the file."); }

Pengenalan Pemrograman 2

6

J.E.N.I.

} }

5.5 Latihan
5.5.1 Spasi menjadi Underscore ( _ )
Buatlah sebuah program yang memuat dua String sebagai argument, sumber dan nama file tujuan. Kemudian, baca file sumber dan tuliskan isi dari file tersebut terhadap file tujuan, seluruh spasi yang ada (‘ ‘) diubah menjadi underscore (‘ _ ‘).

Pengenalan Pemrograman 2

7

J.E.N.I.

BAB 6 Algoritma Sorting
6.1 Tujuan
Sorting adalah proses menyusun elemen – elemen dengan tata urut tertentu dan proses tersebut terimplementasi dalam bermacam aplikasi. Kita ambil contoh pada aplikasi perbankan. Aplikasi tersebut mampu menampilkan daftar account yang aktif. Hampir seluruh pengguna pada sistem akan memilih tampilan daftar berurutan secara ascending demi kenyamanan dalam penelusuran data. Beberapa macam algoritma sorting telah dibuat karena proses tersebut sangat mendasar dan sering digunakan. Oleh karena itu, pemahaman atas algoritma – algoritma yang ada sangatlah berguna. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Memahami dan menjelaskan algoritma dari insertion sort, selection sort, merge sort dan quick sort. 2. Membuat implementasi pribadi menggunakan algoritma yang ada

6.2 Insertion Sort
Salah satu algoritma sorting yang paling sederhana adalah insertion sort. Ide dari algoritma ini dapat dianalogikan seperti mengurutkan kartu. Penjelasan berikut ini menerangkan bagaimana algoritma insertion sort bekerja dalam pengurutan kartu. Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling kecil hingga yang paling besar. Seluruh kartu diletakkan pada meja, sebutlah meja ini sebagai meja pertama, disusun dari kiri ke kanan dan atas ke bawah. Kemudian kita mempunyai meja yang lain, meja kedua, dimana kartu yang diurutkan akan diletakkan. Ambil kartu pertama yang terletak pada pojok kiri atas meja pertama dan letakkan pada meja kedua. Ambil kartu kedua dari meja pertama, bandingkan dengan kartu yang berada pada meja kedua, kemudian letakkan pada urutan yang sesuai setelah perbandingan. Proses tersebut akan berlangsung hingga seluruh kartu pada meja pertama telah diletakkan berurutan pada meja kedua. Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi dua bagian, yang belum diurutkan (meja pertama) dan yang sudah diurutkan (meja kedua). Elemen pertama diambil dari bagian array yang belum diurutkan dan kemudian diletakkan sesuai posisinya pada bagian lain dari array yang telah diurutkan. Langkah ini dilakukan secara berulang hingga tidak ada lagi elemen yang tersisa pada bagian array yang belum diurutkan.

Pengenalan Pemrograman 2

1

J.E.N.I.

6.2.1 Algoritma
void insertionSort(Object array[], int startIdx, int endIdx) { for (int i = startIdx; i < endIdx; i++) { int k = i; for (int j = i + 1; j < endIdx; j++) { if (((Comparable) array[k]).compareTo(array[j])>0) { k = j; } } swap(array[i],array[k]); } }

6.2.2 Sebuah Contoh
Data 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.1.2: Contoh insertion sort

Pada akhir modul ini, anda akan diminta untuk membuat implementasi bermacam algoritma sorting yang akan dibahas pada bagian ini.

6.3 Selection Sort
Jika Anda diminta untuk membuat algoritma sorting tersendiri, anda mungkin akan menemukan sebuah algoritma yang mirip dengan selection sort. Layaknya insertion sort, algoritma ini sangat rapat dan mudah untuk diimplementasikan. Mari kita kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket kartu. Asumsikan bahwa kartu tersebut akan diurutkan secara ascending. Pada awalnya, kartu tersebut akan disusun secara linier pada sebuah meja dari kiri ke kanan, dan dari atas ke bawah. Pilih nilai kartu yang paling rendah, kemudian tukarkan posisi kartu ini dengan kartu yang terletak pada pojok kiri atas meja. Lalu cari kartu dengan nilai paling rendah diantara sisa kartu yang tersedia. Tukarkan kartu yang baru saja terpilih dengan kartu pada posisi kedua. Ulangi langkah – langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan dapat digeser dengan kartu yang bernilai lebih rendah.

Pengenalan Pemrograman 2

2

J.E.N.I.

Ide utama dari algoritma selection sort adalah memilih elemen dengan nilai paling rendah dan menukar elemen yang terpilih dengan elemen ke-i. Nilai dari i dimulai dari 1 ke n, dimana n adalah jumlah total elemen dikurangi 1.

6.3.1 Algoritma
void selectionSort(Object array[], int startIdx, int endIdx) { int min; for (int i = startIdx; i < endIdx; i++) { min = i; for (int j = i + 1; j < endIdx; j++) { if (((Comparable)array[min]).compareTo(array[j])>0) { min = j; } } swap(array[min], array[i]); } }

6.3.2 Sebuah Contoh
Data 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.2.2: Contoh selection sort

6.4 Merge Sort
Sebelum mendalami algoritma merge sort, mari kita mengetahui garis besar dari konsep divide and conquer karena merge sort mengadaptasi pola tersebut.

6.4.1 Pola Divide and Conquer
Beberapa algoritma mengimplementasikan konsep rekursif untuk menyelesaikan permasalahan. Permasalahan utama kemudian dipecah menjadi sub-masalah,

Pengenalan Pemrograman 2

3

J.E.N.I.

kemudian solusi dari sub-masalah akan membimbing menuju solusi permasalahan utama. Pada setiap tingkatan rekursi, pola tersebut terdiri atas 3 langkah. 1. Divide Memilah masalah menjadi sub masalah 2. Conquer Selesaikan sub masalah tersebut secara rekursif. Jika sub-masalah tersebut cukup ringkas dan sederhana, pendekatan penyelesaian secara langsung akan lebih efektif 3. Kombinasi Mengkombinasikan solusi dari sub-masalah, yang akan membimbing menuju penyelesaian atas permasalahan utama

6.4.2 Memahami Merge Sort
Seperti yang telah dijelaskan sebelumnya, Merge sort menggunakan pola divide and conquer. Dengan hal ini deskripsi dari algoritma dirumuskan dalam 3 langkah berpola divide-and-conquer. Berikut langkah kerja dari Merge sort: 1. Divide Memilah elemen – elemen dari rangkaian data menjadi dua bagian. 2. Conquer Conquer setiap bagian dengan memanggil prosedur merge sort secara rekursif 3. Kombinasi Mengkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan rangkaian data berurutan Proses rekursi berhenti jika mencapai elemen dasar. Hal ini terjadi bilamana bagian yang akan diurutkan menyisakan tepat satu elemen. Sisa pengurutan satu elemen tersebut menandakan bahwa bagian tersebut telah terurut sesuai rangkaian.

6.4.3 Algoritma
void mergeSort(Object array[], int startIdx, int endIdx) { if (array.length != 1) { //Membagi rangkaian data, rightArr dan leftArr mergeSort(leftArr, startIdx, midIdx); mergeSort(rightArr, midIdx+1, endIdx); combine(leftArr, rightArr); } }

Pengenalan Pemrograman 2

4

J.E.N.I.

6.4.4 Sebuah Contoh
Rangkaian data: 7 2 5 6

Membagi rangkaian menjadi dua bagian: LeftArr RightArr

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. 2 5 6 7
Gambar 1.3.4: Contoh merge sort

6.5 Quicksort
Quicksort ditemukan oleh C.A.R Hoare. Seperti pada merge sort, algoritma ini juga berdasar pada pola divide-and-conquer. Berbeda dengan merge sort, algoritma ini hanya mengikuti langkah – langkah sebagai berikut : 1. Divide Memilah rangkaian data menjadi dua sub-rangkaian A[p…q-1] dan A[q+1…r] dimana setiap elemen A[p…q-1] adalah kurang dari atau sama dengan A[q] dan setiap elemen pada A[q+1…r] adalah lebih besar atau sama dengan elemen pada A[q]. A[q] disebut sebagai elemen pivot. Perhitungan pada elemen q merupakan salah satu bagian dari prosedur pemisahan.

Pengenalan Pemrograman 2

5

J.E.N.I.

2. Conquer Mengurutkan elemen pada sub-rangkaian secara rekursif

Pada algoritma quicksort, langkah ”kombinasi” tidak di lakukan karena telah terjadi pengurutan elemen – elemen pada sub-array

6.5.1 Algoritma
void quickSort(Object array[], int leftIdx, int rightIdx) { int pivotIdx; /* Kondisi Terminasi */ if (rightIdx > leftIdx) { pivotIdx = partition(array, leftIdx, rightIdx); quickSort(array, leftIdx, pivotIdx-1); quickSort(array, pivotIdx+1, rightIdx); } }

6.5.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. 3 1 4 1 5 9 2 6 5 3 5 8

Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen akhir. kiri 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. Geser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen yang tidak lebih besar dari elemen tersebut. 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

J.E.N.I.

Geserkan lagi elemen kiri dan kanan. kiri 3 1 3 1 5 9 kanan 2 6 5 4 5 8

Tukarkan antar elemen kembali. kiri 3 1 3 1 2 9 kanan 5 6 5 4 5 8

Geserkan kembali elemen kiri dan kanan. 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. Dalam hal ini tukarkan elemen pivot dengan elemen kanan. pivot 2 1 3 1 3 9 5 6 5 4 5 8

Gambar 1.4.2: Contoh quicksort

Kemudian urutkan elemen sub-rangkaian pada setiap sisi dari elemen pivot.

6.6 Latihan
6.6.1 Insertion Sort
Impelementasikan algoritma insertion sort dalam Java untuk mengurutkan serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command line.

6.6.2 Selection Sort

Pengenalan Pemrograman 2

7

J.E.N.I.

Impelementasikan algoritma selection sort dalam Java untuk mengurutkan serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command line.

6.6.3 Merge Sort
Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.

class MergeSort { static void mergeSort(int array[], int startIdx, int endIdx) { if(startIdx == _____) { return; } int length = endIdx-startIdx+1; int mid = _____; mergeSort(array, _____, mid); mergeSort(array, _____, endIdx); int working[] = new int[length]; for(int i = 0; i < length; i++) { working[i] = array[startIdx+i]; } int m1 = 0; int m2 = mid-startIdx+1; for(int i = 0; i < length; i++) { if(m2 <= endIdx-startIdx) { if(m1 <= mid-startIdx) { if(working[m1] > working[m2]) { array[i+startIdx] = working[m2++]; } else { array[i+startIdx] = _____; } } else { array[i+startIdx] = _____; } } else { array[_____] = working[m1++]; } } } public static void main(String args[]) { int numArr[] = new int[args.length]; for (int i = 0; i < args.length; i++) { numArr[i] = Integer.parseInt(args[i]); } mergeSort(numArr, 0, numArr.length-1); for (int i = 0; i < numArr.length; i++) { System.out.println(numArr[i]); } } }

6.6.4 Quicksort

Pengenalan Pemrograman 2

8

J.E.N.I.

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

Pengenalan Pemrograman 2

9

J.E.N.I.

BAB 7 Abstract Windowing Toolkit dan Swing
7.1 Tujuan
Tanpa mempelajari tentang grapichal user interface (GUI) API, Anda masih tetap bisa membuat suatu program. Tetapi, program Anda akan kelihatan tidak menarik dan tidak nyaman digunakan bagi para user. Memiliki GUI yang baik dapat memberi efek pada penggunaan aplikasi. Java menyediakan banyak tool seperti Abstract Windowing Toolkit dan Swing untuk mengembangkan aplikasi GUI yang interaktif. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Memahami persamaan dan perbedaan antara AWT dan Swing 2. Perbedaan antara komponen dan kontainer. 3. Mendesain aplikasi GUI menggunakan AWT. 4. Mendesain aplikasi GUI menggunakan Swing. 5. Menjelaskan tentang flow layout, border layout, dan grid layout dalam komponen GUI 6. Membuat tampilan yang komplek dalam mendesain aplikasi GUI.

7.2 Abstract Windowing Toolkit (AWT) vs. Swing
The Java Foundation Class (JFC), merupakan bagian penting dari Java SDK, yang termasuk dalam koleksi dari API dimana dapat mempermudah pengembangan aplikasi JAVA GUI. JFC termasuk diantara 5 bagian utama dari API yaitu AWT dan Swing. Tiga bagian yang lainnya dari API adalah Java2D, Accessibility, dan Drag dan Drop. Semua itu membantu pengembang dalam mendesain dan mengimplementasikan aplikasi visual yang lebih baik. AWT dan Swing menyediakan komponen GUI yang dapat digunakan dalam membuat aplikasi Java dan Applet. Anda akan mempelajari applet pada bab berikutnya. Tidak seperti beberapa komponen AWT yang menggunakan native code, keseluruhan Swing ditulis menggunakan bahasa pemrograman Java. Swing menyediakan implementasi platform-independent dimana aplikasi yang dikembangkan dengan platform yang berbeda dapat memiliki tampilan yang sama. Begitu juga dengan AWT menjamin tampilan look and feel pada aplikasi yang dijalankan pada dua mesin yang berbeda menjadi terlihat sama. Swing API dibangun dari beberapa API yang mengimplementasikan beberapa jenis bagian dari AWT. Kesimpulannya, komponen AWT dapat digunakan bersama komponen Swing.

7.3 Komponen GUI pada AWT

Pengenalan Pemrograman 2

1

J.E.N.I.

7.3.1 Window Classes Fundamental
Dalam mengembangkan aplikasi GUI, komponen GUI seperti tombol atau textfield diletakkan di dalam kontainer. Berikut ini adalah daftar dari beberapa class penting pada kontainer yang telah disediakan oleh AWT.

Class AWT
Komponen

Deskripsi
Abstract Class untuk object yang dapat ditampilkan pada console dan berinteraksi dengang user. Bagian utama dari semua class AWT. Abstract Subclass dari Component Class. Sebuah komponen yang dapat menampung komponen yang lainnya. Turunan dari Container Class. Sebuah frame atau window tanpa titlebar, menubar tidak termasuk border. Superclass dari applet class. Turunan dari Container class. Top level window, dimana berarti tidak bisa dimasukkan dalam object yang lainnya.Tidak memiliki border dan menubar. Turunan dari window class. Window dengan judul, menubar, border dan pengatur ukuran di pojok. Memiliki empat constructor , dua diantaranya memiliki penulisan seperti dibawah ini : Frame() Frame(String title)

Kontainer

Panel

Window

Frame

Tabel 1.2.1: Class kontainer AWT

Untuk mengatur ukuran window, menggunakan method setSize. void setSize(int width, int height) mengubah ukuran komponen ini dengan width dan height sebagai parameter. void setSize(Dimension d) mengubah ukuran dengan d.width dan d.height berdasar pada spesifikasi Dimension d. Default dari window adalah not visible atau tak tampak hingga Anda mengatur visibility menjadi true. Inilah syntax untuk method setVisible. void setVisible(boolean b) Dalam mendesain aplikasi GUI, Object Frame selalu digunakan. Dibawah ini adalah contoh bagaimana membuat sebuah aplikasi. import java.awt.*; public class SampleFrame extends Frame { public static void main(String args[]) { SampleFrame sf = new SampleFrame(); sf.setSize(100, 100); //Coba hilangkan baris ini sf.setVisible(true); //Coba hilangkan baris ini

Pengenalan Pemrograman 2

2

J.E.N.I.

} } perhatikan bahwa tombol tutup pada frame tidak akan bekerja karena tidak ada mekanisme event handling yang ditambahkan di dalam aplikasi. Anda akan belajar tentang event handling pada modul selanjutnya.

7.3.2 Grafik
Beberapa method grafik ditemukan dalam class Graphic. Dibawah ini adalah daftar dari beberapa method. drawLine() fillRect() drawRect() clearRect() drawPolyline() drawPolygon() fillPolygon() getColor() setColor() getFont() setFont() drawString()

Tabel 1.2.2a: Beberapa metode dari kelas Graphics

Hubungan dari class ini adalah class Color, dimana memiliki tiga constructor.

Format Constructor
Color(int r, int g, int b) Color(float r, float g, float b) Color(int rgbValue) Nilai integer 0 - 255. Nilai float 0.0 - 1.0.

Deskripsi

Panjang nilai : 0 ke 224-1 (hitam ke putih). 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. import java.awt.*; public class GraphicPanel extends Panel { GraphicPanel() { setBackground(Color.black); //Konstanta dalam class Color } public void paint(Graphics g) { g.setColor(new Color(0,255,0)); //hijau g.setFont(new Font("Helvetica",Font.PLAIN,16)); g.drawString("Hello GUI World!", 30, 100); g.setColor(new Color(1.0f,0,0)); //red g.fillRect(30, 100, 150, 10); } public static void main(String args[]) { Frame f = new Frame("Testing Graphics Panel");

Pengenalan Pemrograman 2

3

J.E.N.I.

GraphicPanel gp = new GraphicPanel(); f.add(gp); f.setSize(600, 300); f.setVisible(true); } } Agar panel dapat terlihat atau visible, dia harus diletakkan didalam window yang dapat terlihat seperti sebuah frame.

7.3.3 Beberapa komponen AWT
Berikut ini adalah daftar dari kontrol AWT. Kontrol adalah komponen seperti tombol atau textfield yang mengijinkan user untuk berinteraksi dengan aplikasi GUI. Berikut ini semua subclass dari class Components. Label TextField TextArea Button Checkbox CheckboxGroup Choice List Scrollbar

Tabel 1.2.3: Komponen AWT

Berikut adalah aplikasi membuat sebuah frame dengan kontrol yang telah dimasukkan di dalamnya. import java.awt.*; class FrameWControls extends Frame { public static void main(String args[]) { FrameWControls fwc = new FrameWControls(); fwc.setLayout(new FlowLayout()); //akan dibahas lebih detail pada pembahasan berikutnya fwc.setSize(600, 600); fwc.add(new Button("Test Me!")); fwc.add(new Label("Labe")); fwc.add(new TextField()); CheckboxGroup cbg = new CheckboxGroup(); fwc.add(new Checkbox("chk1", cbg, true)); fwc.add(new Checkbox("chk2", cbg, false)); fwc.add(new Checkbox("chk3", cbg, false)); List list = new List(3, false); list.add("MTV"); list.add("V"); fwc.add(list); Choice chooser = new Choice(); chooser.add("Avril"); chooser.add("Monica"); chooser.add("Britney"); fwc.add(chooser); fwc.add(new Scrollbar());

Pengenalan Pemrograman 2

4

J.E.N.I.

fwc.setVisible(true); } }

7.4 Layout Manager
Posisi dan ukuran suatu komponen ditentukan oleh layout manager. Layout manager mengatur tampilan dari komponen di dalam kontainer. Berikut ini beberapa layout manager yang terdapat di dalam Java. 1.FlowLayout 2.BorderLayout 3.GridLayout 4.GridBagLayout 5.CardLayout Layout manager dapat diatur menggunakan method setLayout dari class Container. Method ini dapat ditulis sebagai berikut. void setLayout(LayoutManager mgr) Jika Anda memilih untuk tidak menggunakan layout manager, Anda dapat mengisi null sebagai argumen untuk method ini. Tetapi selanjutnya, Anda akan mengatur posisi elemen secara manual dengan menggunakan method setBounds dari class Components. public void setBounds(int x, int y, int width, int height) Method ini mengatur posisi berdasarkan pada argumen x dan y, dan ukuran berdasarkan argumen width dan height. Hal ini akan cukup menyulitkan dan membosankan untuk aplikasi jika Anda memiliki beberapa objek komponen didalam object container. Anda akan memanggil method ini untuk setiap komponen.

7.4.1 FlowLayout Manager
FlowLayout Manager adalah default manager untuk class Panel dan subclassnya, termasuk class applet. Cara meletakkan komponen dari FlowLayout Manager dimulai dari kiri ke kanan dan dari atas ke bawah, dimulai dari pojok kiri atas. Seperti pada saat Anda mengetik menggunakan editor kata pada umumnya. Berikut adalah bagaimana FlowLayout Manager bekerja, dimana memiliki tiga constructor seperti daftar di bawah ini. FlowLayout Constructors FlowLayout() Membuat object baru FlowLayout dengan posisi di tengah dan lima unit horizontal dan vertikal gap dimasukkan pada komponen sebagai default. FlowLayout(int align) Membuat object baru FlowLayout dengan posisi spesifik dan lima unit horizontal dan vertikal gap dimasukkan pada komponen sebagai default.

Pengenalan Pemrograman 2

5

J.E.N.I.

FlowLayout Constructors FlowLayout(int align, int hgap, 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.3.1: Constructor FlowLayout

Gap dapat dikatakan sebagai jarak antara komponen dan biasanya diukur dengan satuan pixel. Posisi argumen mengikuti penulisan sebagai berikut :

1.FlowLayout.LEFT 2.FlowLayout.CENTER 3.FlowLayout.RIGHT

Bagaimanakah output dari program berikut? import java.awt.*; class FlowLayoutDemo extends Frame { public static void main(String args[]) { FlowLayoutDemo fld = new FlowLayoutDemo(); fld.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10)); fld.add(new Button("ONE")); fld.add(new Button("TWO")); fld.add(new Button("THREE")); fld.setSize(100, 100); fld.setVisible(true); } } Gambar berikut adalah contoh dari hasil yang berjalan pada platform Window.

Tabel 13.1: Contoh hasil dalam window

7.4.2.BorderLayout Manager
BorderLayout membagi kontainer menjadi lima bagian diantaranya utara, selatan, timur,
Pengenalan Pemrograman 2 6

J.E.N.I.

barat, dan tengah. Setiap komponen dimasukkan ke dalam region yang spesifik. Region utara dan selatan membentuk jalur horizontal sedangkan region timur dan barat membentuk jalur vertikal. Dan region tengah berada pada perpotongan jalur horizontal dan vertikal. Tampilan ini adalah bersifat default untuk object Window, termasuk object dari subclass Window yaitu tipe Frame dan Dialog.

Constructor BorderLayout BorderLayout() Membuat object BorderLayout baru tanpa spasi yang diaplikasikan diantara komponen yang berbeda. BorderLayout(int hgap, int vgap) Membuat object BorderLayout baru dengan spasi unit hgap horizontal dan unit vgap vertikal yang diaplikasikan diantara komponen yang berbeda.

Tabel 1.3.2: Constructor BorderLayout

Seperti pada FlowLayout Manager, parameter hgap dan vgap disini juga menjelaskan jarak antara komponen dengan kontainer.

Untuk menambahkan komponen kedalam region yang spesifik, gunakan method menambahkan dan melewatkan dua argumen yaitu : komponen yang ingin dimasukkan ke dalam region dan region mana yang ingin dipakai untuk meletakkan komponen. Perlu diperhatikan bahwa hanya satu komponen yang dapat dimasukkan dalam satu region. Menambahkan lebih dari satu komponen pada kontainer yang bersangkutan, maka komponen yang terakhir ditambahkan yang akan ditampilkan. Berikut ini adalah daftar dari kelima region. 1. 2. 3. 4. 5. BorderLayout.NORTH BorderLayout.SOUTH BorderLayout.EAST BorderLayout.WEST BorderLayout.CENTER

Berikut ini adalah contoh program yang menunjukkan bagaimana BorderLayout bekerja. import java.awt.*; class BorderLayoutDemo extends Frame { public static void main(String args[]) { BorderLayoutDemo bld = new BorderLayoutDemo(); bld.setLayout(new BorderLayout(10, 10)); //may remove bld.add(new Button("NORTH"), BorderLayout.NORTH); bld.add(new Button("SOUTH"), BorderLayout.SOUTH); bld.add(new Button("EAST"), BorderLayout.EAST); bld.add(new Button("WEST"), BorderLayout.WEST); bld.add(new Button("CENTER"), BorderLayout.CENTER); bld.setSize(200, 200); bld.setVisible(true); } } Berikut ini adalah hasil dari contoh program tersebut. Gambar kedua menunjukkan efek dari mengubah bentuk dari frame.
Pengenalan Pemrograman 2 7

J.E.N.I.

Gambar 1.3.2: hasil contoh program

7.4.3 GridLayout Manager
Dengan GridLayout manager, komponen juga diposisikan dari kiri ke kanan dan dari atas ke bawah seperti pada FlowLayout manager. GridLayout manager membagi kontainer menjadi baris dan kolom. Semua region memiliki ukuran yang sama. Hal tersebut tidak mempedulikan ukuran sebenarnya dari komponen.

Berikut ini adalah daftar dari constructor untuk class GridLayout. Constructor GridLayout GridLayout() Membuat object GridLayout baru dengan satu baris dan satu kolom sebagai default GridLayout(int rows, int cols) Membuat object GridLayout baru dengan jumlah baris dan kolom sesuai dengan keinginan GridLayout(int rows, int cols, int hgap, int vgap) Membuat object GridLayout baru dengan jumlah baris dan kolom yang ditentukan. Unit spasi hgap horizontal dan vgap vertikal diaplikasikan ke dalam komponen.
Tabel 1.3.3: Constructor GridLayout

Cobalah program ini. import java.awt.*; class GridLayoutDemo extends Frame { public static void main(String args[]) { GridLayoutDemo gld = new GridLayoutDemo(); gld.setLayout(new GridLayout(2, 3, 4, 4)); gld.add(new Button("ONE")); gld.add(new Button("TWO"));
Pengenalan Pemrograman 2 8

J.E.N.I.

gld.add(new Button("THREE")); gld.add(new Button("FOUR")); gld.add(new Button("FIVE")); gld.setSize(200, 200); gld.setVisible(true); } } Berikut ini adalah output dari program.

Gambar 1.3.3: hasil contoh program

7.4.4 Panel dan Tampilan kompleks
Untuk membuat tampilan yang lebih lengkap, Anda dapat menggabungkan layout manager yang berbeda dengan menggunakan panel. Ingatlah bahwa panel adalah kontainer dan komponen pada saat yang sama. Anda dapat memasukkan komponen ke dalam panel dan kemudian menambahkan panel ke dalam region yang Anda inginkan di dalam kontainer.

Perhatikan teknik yang digunakan pada contoh berikut. import java.awt.*;

Pengenalan Pemrograman 2

9

J.E.N.I.

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

Berikut ini adalah output dari program.

Pengenalan Pemrograman 2

10

J.E.N.I.

Gambar 1.3.4: Hasil dari contoh program

7.5 Komponen Swing
Seperti pada package AWT, package dari Swing menyediakan banyak class untuk membuat aplikasi GUI. Package tersebut dapat ditemukan di javax.swing. Perbedaan utama antara keduanya adalah komponen Swing ditulis menyeluruh menggunakan Java. Kesimpulannya, program GUI ditulis menggunakan banyak class dari package Swing yang mempunyai tampilan look and feel yang sama meski dijalankan pada paltform yang berbeda. Lebih dari itu, Swing menyediakan komponen yang lebih menarik seperti color chooser dan option pane. Nama dari komponen GUI milik Swing hampir sama persis dengan komponen GUI milik AWT. Perbedaan jelas terdapat pada penamaan komponen. Pada dasarnya, nama komponen Swing sama dengan nama komponen AWT tetapi dengan tambahan huruf J pada prefixnya. Sebagai contoh, satu komponen dalam AWT adalah button class. Sedangkan pada Swing, nama komponen tersebut menjadi Jbutton class. Berikut adalah daftar dari komponen Swing.

Komponen Swing
JComponent

Penjelasan
class induk untuk semua komponen Swing, tidak termasuk top-level kontainer Tombol “push”. Berhubungan dengan class button dalam package AWT Item yang dapat dipilih atau tidak oleh pengguna. Berhubungan dengan class checkbox dalam package AWT Mengijinkan pengguna untuk memilih sebuah file. Berhubungan dengan class filechooser dalam package AWT

JButton JCheckBox

JFileChooser

Pengenalan Pemrograman 2

11

J.E.N.I.

Komponen Swing
JTextField

Penjelasan
Mengijinkan untuk mengedit text satu baris. Berhubungan dengan class textfield dalam package AWT. Turunan dan Berhubungan dengan class frame dalam package AWT tetapi keduanya sedikit tidak cocok dalam kaitannya dengan menambahkan komponen pada kontainer. Perlu mendapatkan content pane yang terbaru sebelum menambah sebuah komponen. Turunan Jcomponent. Class Container sederhana tetapi bukan top-level. Berhubungan dengan class panel dalam package AWT. Turunan dan Berhubungan dengan class Applet dalam package AWT. Juga sedikit tidak cocok dengan class applet dalam kaitannya dengan menambahkan komponen pada container Turunan Jcomponent. Disediakan untuk mempermudah menampilkan popup kotak dialog. Turunan dan Berhubungan dengan class dialog dalam package AWT. Biasanya digunakan untuk menginformasikan sesuatu kepada pengguna atau prompt pengguna untuk input. Turunan Jcomponent. Memungkinkan pengguna untuk memilih warna yang diinginkan.
Tabel 1.4: Beberapa komponen Swing

JFrame

JPanel

JApplet

JOptionPane

JDialog

JColorChooser

Untuk daftar yang lengkap dari komponen Swing, Anda dapat melihatnya di dokumentasi API.

7.5.1 Setting Up Top-Level Containers
Seperti disebutkan diatas, top-level containers seperti Jframe dan Japplet dalam Swing sangat tidak cocok dengan AWT. Ini adalah syarat menambahkan komponen ke dalam kontainer. Jika Anda ingin menambahkan langsung sebuah komponen kedalam kontainer sebagai kontainer AWT, pertama-tama Anda telah mendapatkan content pane dari kontainer. Untuk melakukan hal tersebut, Anda akan menggunakan method getContentPane dari container.

7.5.2 Contoh Jframe
import javax.swing.*; import java.awt.*; class SwingDemo { JFrame frame; JPanel panel; JTextField textField; JButton button; Container contentPane; void launchFrame() { /* inisialisasi */ frame = new JFrame("My First Swing Application");

Pengenalan Pemrograman 2

12

J.E.N.I.

panel = new JPanel(); textField = new JTextField("Default text"); button = new JButton("Click me!"); contentPane = frame.getContentPane(); /* menambahkan komponen-komponen ke panel– menggunakan FlowLayout sebagai default */ panel.add(textField); panel.add(button); /* menambahkan komponen-komponen contentPane– menggunakan BorderLayout */ contentPane.add(panel, BorderLayout.CENTER); frame.pack(); //menyebabkan ukuran frame menjadi dasar pengaturan komponen frame.setVisible(true); } public static void main(String args[]) { SwingDemo sd = new SwingDemo(); sd.launchFrame(); } } Perlu diperhatikan pada package java.awt masih saja diimpor karena layout manager yang digunakan terdapat pada package tersebut. Juga, memberi judul pada frame dan mengepack komponen di dalam frame dapat juga dilakukan untuk frame AWT.

Petunjuk penulisan program:
Perhatikan penulisan kode yang digunakan pada contoh ini tampak berlawanan dengan contoh untuk AWT. Komponen dideklarasikan sebagai fields, method launchFrame ditentukan, dinisialisasikan dan penambahan semua komponen dilaksanakan di dalam method launchFrame. Kita tidak lagi meng-extend Frame class. Keuntungan penggunaan model ini akan lebih berguna ketika sampai pada event handling. Berikut adalah keluaran dari program diatas.

Gambar 1.4.2: Hasil contoh program

7.5.3 Contoh JOptionPane
import javax.swing.*; class JOptionPaneDemo { JOptionPane optionPane; void launchFrame() { optionPane = new JOptionPane(); String name = optionPane.showInputDialog("Hi, what's your name?"); optionPane.showMessageDialog(null, "Nice to meet you, " + name + ".", "Greeting...", optionPane.PLAIN_MESSAGE);

Pengenalan Pemrograman 2

13

J.E.N.I.

System.exit(0); } public static void main(String args[]) { new JOptionPaneDemo().launchFrame(); } }

Lihat, begitu mudahnya memasukkan input dari user. Berikut ini adalah hasil dari contoh program diatas

Gambar 1.4.3: Hasil contoh program

7.6 Latihan
7.6.1 Tic-Tac-Toe
Buatlah tampilan GUI untuk program tic-tac-toe. Papannya terdiri dari enam kotak. Ingatlah bahwa Anda akan menambahkan kode ini pada tahap akhir untuk mengatasi interaksi antar pengguna. Jadi, desainlah papan Anda dengan benar. Pastikanlah Anda memilih komponen yang pantas untuk papan tersebut. keluarkan semua sisi artistik Anda. Anda dapat menggunakan AWT atau Swing untuk latihan ini.

Gambar 1.5.1: papan Tic-Tac-Toe

Pengenalan Pemrograman 2

14

J.E.N.I.

BAB 8 GUI Event Handling
8.1 Tujuan
Pada modul ini, Anda akan belajar bagaimana mengendalikan events triggered ketika user berinteraksi dengan aplikasi GUI Anda. Setelah menyelesaikan modul ini, Anda akan dapat mengembangkan aplikasi GUI yang dapat merespon interaksi user. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Menerangkan komponen-komponen delegation event model 2. Mengerti bagaimana delegation event model bekerja 3. Menciptakan aplikasi GUI yang berinteraksi dengan user 4. Mendiskusikan manfaat dari class-class adapter 5. Mendiskusikan keuntungan-keuntungan dari menggunakan inner dan anonymous class

8.2 Delegation Event Model
Delegasi event model menguraikan bagaimana program Anda dapat merespon interaksi dari user. Untuk memahami model, pertama-tama mari kita pelajari melalui tiga komponen utamanya. 1. Event Source Event source mengacu pada komponen GUI yang meng-generate event. Sebagai contoh, jika user menekan tombol, event source dalam hal ini adalah tombol. 2. Event Listener/Handler Event listener menerima berita dari event-event dan proses-proses interaksi user. Ketika tombol ditekan, listener akan mengendalikan dengan menampilkan sebuah informasi yang berguna untuk user. 3. Event Object Ketika sebuah event terjadi (misal, ketika user berinteraksi dengan komponen GUI), sebuah object event diciptakan. Object berisi semua informasi yang perlu tentang event yang telah terjadi. Informasi meliputi tipe dari event yang telah terjadi, seperti ketika mouse telah di-klik. Ada beberapa class event untuk kategori yang berbeda dari user action. Sebuah event object mempunyai tipe data mengenai salah satu dari class ini.

Pengenalan Pemrograman 2

1

J.E.N.I.

Di bawah ini adalah delegation event model.

Gambar 8.1: Delegation Event Model

Pada awalnya, sebuah listener seharusnya diregistrasikan dengan sebuah source sehingga dapat menerima informasi tentang event-event yang terjadi pada source tersebut. Hanya listener yang sudah teregistrasi yang dapat menerima pemberitahuan event-event. Ketika telah teregistrasi, sebuah listener hanya tinggal menunggu sampai event terjadi. Ketika sesuatu terjadi dengan event source, sebuah event object akan menguraikan event yang diciptakan. Event kemudian ditembak oleh source pada listener yang teregistrasi. Saat listener menerima sebuah event object (pemberitahuan) dari source, dia akan bekerja. Menerjemahkan pemberitahuan dan memproses event yang terjadi.

Pengenalan Pemrograman 2

2

J.E.N.I.

8.2.1 Registrasi Listeners
Event source mendaftarkan sebuah listener melalui method add<Type>Listener. void add<Type>Listener(<Type>Listener listenerObj) <Type> tergantung pada tipe dari event source. Dapat berupa Key, Mouse, Focus, Component, Action dan lainnya. Beberapa listeners dapat diregistrasi dengan satu event source untuk menerima pemberitahuan event. Listener yang telah teregistrasi dapat juga tidak diregistrasikan lagi menggunakan method remove<Type>Listener. void remove<Type>Listener(<Type>Listener listenerObj)

8.3 Class-Class Event
Sebuah event object mempunyai sebuah class event sebagai tipe data acuannya. Akar dari hirarki class event adalah class EventObject, yang dapat ditemukan pada paket java.util. Immediate subclass dari class EventObject adalah class AWTEvent. Class AWTEvent didefinisikan pada paket java.awt. Itu merupakan akar dari semua AWTbased events. Berikut ini beberapa dari class-class AWT event.

Class Event

Deskripsi komponen

ComponentEvent Extends AWTEvent. Dijalankan ketika sebuah dipindahkan, di-resize, dibuat visible atau hidden. InputEvent ActionEvent ItemEvent KeyEvent MouseEvent

Extends ComponentEvent. Abstrak root class event untuk semua komponen-level input class-class event. Extends AWTEvent. Dijalankan ketika sebuah tombol ditekan, melakukan double-klik daftar item, atau memilih sebuah menu. Extends AWTEvent. Dijalankan ketika sebuah item dipilih atau dideselect oleh user, seperti sebuah list atau checkbox. Extends InputEvent. Dijalankan ketika sebuah key ditekan, dilepas atau diketikkan. Extends InputEvent. Dijalankan ketika sebuah tombol mouse ditekan, dilepas, atau di-klik (tekan dan lepas), atau ketika sebuah kursor mouse masuk atau keluar dari bagian visible dari komponen. Extends AWTEvent. Dijalankan ketika nilai dari text field atau text area dirubah. Extends ComponentEvent. Dijalankan sebuah object Window dibuka, ditutup, diaktifkan, nonaktifkan, iconified, deiconified, atau ketika focus ditransfer kedalam atau keluar window.
Tabel 1.2: Class-Class Event

TextEvent WindowEvent

Catatan, bahwa semua subclass-subclass AWTEvent mengikuti konvensi nama berikut ini: <Type>Event
Pengenalan Pemrograman 2 3

J.E.N.I.

8.4 Event Listeners
Event listeners adalah class yang mengimplementasikan interfaces <Type>Listener. Tabel di bawah menunjukkan beberapa listener interfaces yang biasanya digunakan. Event Listeners ActionListener MouseListener MouseMotionListener Deskripsi Bereaksi atas perubahan mouse atau atau keyboard. Bereaksi atas pergerakan mouse. Interface MouseMotionListener mendukung MouseListener. Menyediakan method-method yang akan memantau pergerakan mouse,seperti drag dan pemindahan mouse. Bereaksi atas perubahan window.
Tabel 1.3: Event Listeners

WindowListener

8.4.1 Method ActionListener
Interface ActionListener hanya terdiri dari satu method. Method ActionListener public void actionPerformed(ActionEvent e) Mengendalikan ActionEvent e yang terjadi.
Tabel 1.3.1: Method ActionListener

8.4.2 Method MouseListener
Di bawah ini adalah method-method MouseListener yang seharusnya digunakan dalam penerapan class. Method-method MouseListener public void mouseClicked(MouseEvent e) Dipanggil pada saat tombol mouse di click (seperti tekan dan lepas). public void mouseEntered(MouseEvent e) Dipanggil pada saat kursor mouse memasuki area komponen. public void mouseExited(MouseEvent e) Dipanggil pada saat kursor mouse meninggalkan area komponen. public void mousePressed(MouseEvent e) Dipanggil pada saat tombol mouse ditekan di atas komponen public void mouseReleased(MouseEvent e) Dipanggil pada saat tombol mouse dilepas di atas komponen
Tabel 1.3.2: Method-Method MouseListener

Pengenalan Pemrograman 2

4

J.E.N.I.

8.4.3 Method-Method MouseMotionListener
MouseMotionListener mempunyai dua method untuk diimplementasikan. Method-method MouseListener public void mouseDragged(MouseEvent e) Digunakan untuk memantau pergerakan mouse yang melintasi object pada saat tombol mouse ditekan. Tindakan ini persis sama dengan tindakan pada saat memindahkan sebuah window. public void mouseMoved(MouseEvent e) Digunakan untuk memantau pergerakan mouse pada saat mouse melintasi area suatu object. Pada saat ini tidak ada mouse yang ditekan, hanya memindahkan pointer mouse melalui object.
Tabel 1.3.3: The MouseMotionListener methods

8.4.4 Method-Method WindowListener
Di bawah ini method-method dari interface WindowListener. Method-method WindowListener public void windowOpened(WindowEvent e) Dipanggil pada saat object window dibuka (pertama kali window dibuat tampil). public void windowClosing(WindowEvent e) Dipanggil pada saat user mencoba untuk menutup object Window dari menu sistem object. public void windowClosed(WindowEvent e) Dipanggil pada saat object Window ditutup setelah memanggil penempatan (misal, release dari resource-resource yang digunakan oleh source) pada object. public void windowActivated(WindowEvent e) Dilibatkan ketika object Window adalah window yang aktif (window masih dipakai). public void windowDeactivated(WindowEvent e) Dilibatkan ketika object Window tidak lagi merupakan window yang aktif. public void windowIconified(WindowEvent e) Dipanggil ketika object Window di-minimize. public void windowDeiconified(WindowEvent e) Dipanggil ketika object Window kembali setelah di-minimize ke keadaan normal.
Tabel 1.3.4: Method-Method WindowListener

Pengenalan Pemrograman 2

5

J.E.N.I.

8.4.5 Petunjuk untuk Menciptakan Aplikasi Handling GUI Events
Berikut ini langkah-langkah yang Anda butuhkan untuk mengingat ketika ingin membuat aplikasi GUI dengan event handling. 1. Buatlah sebuah class yang menguraikan dan membuat suatu tampilan dari aplikasi GUI Anda. 2. Buatlah sebuah class yang menerapkan interface listener yang sesuai. Class ini boleh mengacu pada class yang sama seperti pada langkah awal. 3. Dalam menerapkan class, gunakan semua method-method dengan interface listener yang sesuai. Uraikan masing-masing method bagaimana Anda ingin mengendalikan event-event. Anda dapat memberikan implementasi kosong untuk method yang tidak ingin Anda gunakan. 4. Daftarkan object listener, instansiatiate dari class listener pada langkah 2, dengan source component menggunakan method add<Type>Listener.

8.4.6 Contoh Mouse Events
import java.awt.*; import java.awt.event.*; public class MouseEventsDemo extends Frame implements MouseListener, MouseMotionListener { TextField tf; public MouseEventsDemo(String title){ super(title); tf = new TextField(60); addMouseListener(this); } public void launchFrame() { /* Menambah komponen pada frame */ add(tf, BorderLayout.SOUTH); setSize(300,300); setVisible(true); } public void mouseClicked(MouseEvent me) { String msg = "Mouse clicked."; tf.setText(msg); } public void mouseEntered(MouseEvent me) { String msg = "Mouse entered component."; tf.setText(msg); } public void mouseExited(MouseEvent me) { String msg = "Mouse exited component."; tf.setText(msg); } public void mousePressed(MouseEvent me) { String msg = "Mouse pressed."; tf.setText(msg); } public void mouseReleased(MouseEvent me) { String msg = "Mouse released."; tf.setText(msg);
Pengenalan Pemrograman 2 6

J.E.N.I.

} public void mouseDragged(MouseEvent me) { String msg = "Mouse dragged at " + me.getX() + "," + me.getY(); tf.setText(msg); } public void mouseMoved(MouseEvent me) { String msg = "Mouse moved at " + me.getX() + "," + me.getY(); tf.setText(msg); } public static void main(String args[]) { MouseEventsDemo med = new MouseEventsDemo("Mouse Events Demo"); med.launchFrame(); } }

8.4.7 Contoh Menutup Window
import java.awt.*; import java.awt.event.*;

class CloseFrame extends Frame implements WindowListener { Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(this); } void launchFrame() { setSize(300,300); setVisible(true); } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { }

Pengenalan Pemrograman 2

7

J.E.N.I.

public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } }

8.5 Class-class Adapter Class
Menerapkan semua method dari interface yang semuanya akan membutuhkan banyak pekerjaan. Di satu sisi, Anda terkadang lebih sering tertarik menerapkan hanya beberapa method dari interface saja. Untungnya, Java menyediakan untuk kita classclass adapter yang menerapkan semua method dari masing-masing listener interface dengan lebih dari satu method. Implementasi dari method-method semuanya adalah kosong.

8.5.1 Close Window Example
import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CFListener w = new CFListener(this); CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(w); } void launchFrame() { setSize(300,300); setVisible(true); } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } }

class CFListener extends WindowAdapter{ CloseFrame ref; CFListener( CloseFrame ref ){ this.ref = ref; } public void windowClosing(WindowEvent e) { ref.dispose(); System.exit(1); } }

Pengenalan Pemrograman 2

8

J.E.N.I.

8.6 Inner Class dan Anonymous Inner Class
Bagian ini memberi Anda tinjauan ulang atas konsep yang sudah Anda pelajari di pelajaran pemrograman pertama. Inner class dan anonymous inner class sangatlah bermanfaat untuk GUI event handling.

8.6.1 Inner Class
Inner class, seperti namanya, adalah sebuah class yang dideklarasikan di dalam class lain. Kegunaan inner classes akan dapat membantu Anda menyederhanakan program, terutama dalam event handling seperti yang ditunjukkan pada contoh.

8.6.2 Contoh Menutup Window
import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(new CFListener()); } void launchFrame() { setSize(300,300); setVisible(true); } class CFListener extends WindowAdapter { public void windowClosing(WindowEvent e) { dispose(); System.exit(1); } } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } }

Pengenalan Pemrograman 2

9

J.E.N.I.

8.6.3 Anonymous Inner Class
Anonymous inner class adalah inner class tanpa nama. Kegunaan dari anonymous inner class akan menyederhanakan kode-kode Anda lebih lanjut. Di bawah ini merupakan modifikasi dari contoh bagian sebelumnya.

8.6.4 Contoh Menutup Window
import java.awt.*; import java.awt.event.*; class CloseFrame extends Frame{ Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ dispose(); System.exit(1); } }); } void launchFrame() { setSize(300,300); setVisible(true); } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); } }

Pengenalan Pemrograman 2

10

J.E.N.I.

8.7 Latihan
8.7.1 Tic-Tac-Toe
Extend program papan Tic-Tac-Toe yang telah Anda kembangkan sebelumnya dan tambahkan event handlers ke kode tersebut untuk membuat program berfungsi penuh. Permainan Tic-Tac-Toe dimainkan dengan dua pemain. Pemain mengambil giliran mengubah. Setiap giliran, pemain dapat memilih kotak pada papan. Ketika kotak dipilih, kotak ditandai oleh simbol pemain (O dan X biasanya digunakan sebagai simbol). Pemain yang sukses menaklukkan 3 kotak membentuk garis horisontal, vertikal, atau diagonal, memenangkan permainan. Permainan akan berakhir ketika pemain menang atau ketika semua kotak telah terisi.

Gambar 8.2 : Program Tic-Tac-Toe

Pengenalan Pemrograman 2

11

J.E.N.I.

BAB 9 Threads
9.1 Tujuan
Pada bab-bab sebelumnya Anda terbiasa untuk membuat program yang berururutan/sekuensial. Sebuah program sekuensial berarti sebuah program yang hanya memiliki satu aliran eksekusi. Setiap eksekusi, ia memiliki sebuah titik awal eksekusi, kemudian sebuah sekuen eksekusi, dan kemudian berakhir. Selama runtime, pasti hanya satu proses yang telah dieksekusi. Bagaimanapun juga, di dunia nyata, pasti dibutuhkan sesuatu yang dapat mengatur proses yang terjadi dan berjalan bersama-sama.Oleh karena itu, thread hadir untuk menjadi solusi dalam mengatasi permasalahan tersebut. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Mendefiniskan threads 2. Mengerti perbedaan state dalam threads 3. Mengerti konsep prioritas dalam threads 4. Mengetahui bagaimana menggunakan method didalam class Thread 5. Membuat sendiri sebuah thread 6. Menggunakan sinkronisasi pada thread yang bekerja bersama-sama dan saling bergantung satu dengan yang lainya 7. Memungkinkan thread untuk dapat berkomunikasi dengan thread lain yang sedang berjalan 8. Mengerti dan menggunakan kemampuan concurency

9.2 Definisi dan dasar-dasar thread
9.2.1 Definisi Thread
Sebuah thread merupakan sebuah pengontrol aliran program. Untuk lebih mudahnya, bayangkanlah thread sebagai sebuah proses yang akan dieksekusi didalam sebuah program tertentu. Penggunaan sistem operasi modern saat ini telah mendukung kemampuan untuk menjalankan beberapa program. Misalnya, pada saat Anda mengetik sebuah dokumen di komputer Anda dengan menggunakan text editor, dalam waktu yang bersamaan Anda juga dapat mendengarkan musik, dan surfing lewat internet di PC Anda. Sistem operasi yang telah terinstal dalam computer Anda itulah yang memperbolehkan Anda untuk menjalankan multitaskting. Seperti itu juga sebuah program (ibaratkan di PC Anda), ia juga dapat mengeksekusi beberapa proses secara bersama-sama(ibaratkan beberapa aplikasi berbeda yang bekerja pada PC Anda). Sebuah contoh aplikasi adalah HotJava browser yang memperbolehkan Anda untuk browsing terhadap suatu page, bersamaan dengan mendownload object yang lain, misalnya gambar, memainkan animasi, dan juga file audio pada saat yang bersamaan.

Pengenalan Pemrograman 2

1

J.E.N.I.

Gambar 1.1: Thread

9.2.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. Ready to run Thread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk melakukannya. 3. Resumed Setelah sebelumnya di block atau diberhentikan sementara, state ini kemudian siap untuk dijalankan. 4. Suspended Sebuah thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk menjalankan thread lain bekerja. 5. Blocked Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu berjalan, karena ia akan menunggu sebuah resource tersedia atau sebuah event terjadi.

9.2.3 Prioritas
Untuk menentukan thread mana yang akan menerima control dari CPU dan akan dieksekusi pertama kali, setiap thread akan diberikan sebuah prioritas. Sebuah prioritas adalah sebuah nilai integer dari angka 1 sampai dengan 10, dimana semakin tinggi prioritas dari sebuah thread, berarti semakin besar kesempatan dari thread tersebut untuk dieksekusi terlebih dahulu. Sebagai contoh, asumsikan bahwa ada dua buah thread yang berjalan bersama-sama. Thread pertama akan diberikan prioritas nomor 5, sedangkan thread yang kedua memiliki prioritas 10. Anggaplah bahwa thread pertama telah berjalan pada saat thread kedua dijalankan. 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 contoh dari skenario ini adalah context switch. Sebuah context switch terjadi apabila sebagian dari thread telah dikontrol oleh CPU dari

Pengenalan Pemrograman 2

2

J.E.N.I.

thread yang lain. Ada beberapa skenario mengenai bagaimana cara kerja dari context switch. Salah satu skenario adalah sebuah thread yang sedang berjalan memberikan kesempatan kepada CPU untuk mengontrol thread lain sehingga ia dapat berjalan. Dalam kasus ini, prioritas tertinggi dari thread adalah thread yang siap untuk menerima kontrol dari CPU. 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. Hal ini juga mungkin dilakukan apabila lebih dari satu CPU tersedia, sehingga lebih dari satu prioritas thread yang siap untuk dijalankan. Untuk menentukan diantara dua thread yang memiliki prioritas sama untuk menerima kontrol dari CPU, sangat bergantung kepada sistem operasi yang digunakan. Windows 95/98/NT menggunakan time-slicing dan round-robin untuk menangani kasus ini. Setiap thread dengan prioritas yang sama akan diberikan sebuah jangka waktu tertentu untuk dieksekusi sebelum CPU mengontrol thread lain yang memiliki prioritas yang sama. Sedangkan Solaris, ia akan membiarkan sebuah thread untuk dieksekusi sampai ia menyelesaikan tugasnya atau sampai ia secara suka rela membiarkan CPU untuk mengontrol thread yang lain.

9.3 Class Thread
9.3.1 Constructor
Thread memiliki delapan constructor. Marilah kita lihat bersama beberapa constructor tersebut. Constructor-constructor Thread Thread() Membuat sebuah object Thread yang baru. Thread(String name) Membuat sebuah object thread dengan memberikan penamaan yang spesifik. Thread(Runnable target) Membuat sebuah object Thread yang baru berdasar pada object Runnable. Target menyatakan sebuah object dimana method run dipanggil. Thread(Runnable target, String name) Membuat sebuah object Thread yang baru dengan nama yang spesifik dan berdasarkan pada object Runnable.
Tabel 1.2.1: Constructor dari Thread

9.3.2 Constants
Class Thread juga menyediakan beberapa constants sebagai nilai prioritas. Tabel berikut
Pengenalan Pemrograman 2 3

J.E.N.I.

ini adalah rangkuman dari class Thread. Thread Constants public final static int MAX_PRIORITY Nilai prioritas maksimum, 10 public final static int MIN_PRIORITY Nilai prioritas minimum, 1. public final static int NORM_PRIORITY Nilai default prioritas, 5.
Tabel 1.2.2:Konstanta dalam Thread

9.3.3 Methods
Method-method inilah yang disediakan dalam class Thread. Method-method Thread public static Thread currentThread() Mengembalikan sebuah reference kepada thread yang sedang berjalan. public final String getName() Mengembalikan nama dari thread. public final void setName(String name) Mengulang pemberian nama thread sesuai dengan argument name. Hal ini dapat menyebabkan SecurityException. public final int getPriority() Mengembalikan nilai prioritas yang telah diberikan kepada thread tersebut. public final boolean isAlive() Menunjukkan bahwa thread tersebut sedang berjalan atau tidak. public final void join([long millis, [int nanos]]) Sebuah overloading method. Sebuah thread yang sedang berjalan, harus menunggu sampai thread tersebut selesai (jika tidak ada parameter-parameter spesifik), atau sampai waktu yang telah ditentukan habis. public static void sleep(long millis) Menunda thread dalam InterruptedException. public void run() Eksekusi thread dimulai dari method ini. public void start() Menyebabkan eksekusi dari thread berlangsung dengan cara memanggil method run. jangka waktu milis. Hal ini dapat menyebabkan

Pengenalan Pemrograman 2

4

J.E.N.I.

Tabel 1.2.3: Method-method dari Thread

9.3.4 Sebuah contoh thread
Contoh dari thread pertama Anda adalah sebuah counter yang sederhana. import javax.swing.*; import java.awt.*; class CountDownGUI extends JFrame { JLabel label; CountDownGUI(String title) { super(title); label = new JLabel("Start count!"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().add(new Panel(), BorderLayout.WEST); getContentPane().add(label); setSize(300,300); setVisible(true); } void startCount() { try { for (int i = 10; i > 0; i--) { Thread.sleep(1000); label.setText(i + ""); } Thread.sleep(1000); label.setText("Count down complete."); Thread.sleep(1000); } catch (InterruptedException ie) { } label.setText(Thread.currentThread().toString()); } public static void main(String args[]) { CountDownGUI cdg = new CountDownGUI("Count down GUI"); cdg.startCount(); } }

9.4 Membuat Threads
Sebuah thread dapat diciptakan dengan cara menurunkan (extend) class Thread atau dengan mengimplementasikan sebuah interface Runnable.

9.4.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

J.E.N.I.

PrintNameThread(String name) { super(name); // menjalankan thread dengan satu kali instantiate start(); } public void run() { String name = getName(); for (int i = 0; i < 100; i++) { System.out.print(name); } } } class TestThread { public static void PrintNameThread PrintNameThread PrintNameThread PrintNameThread } }

main(String args[]) { pnt1 = new PrintNameThread("A"); pnt2 = new PrintNameThread("B"); pnt3 = new PrintNameThread("C"); pnt4 = new PrintNameThread("D");

Perhatikan bahwa variable reference pnt1, pnt2, pnt3, dan pnt4 hanya digunakan satu kali. Untuk aplikasi ini, variabel yang menunjuk pada tiap thread pada dasarnya tidak dibutuhkan. Anda dapat mengganti body dari main tersebut dengan pernyataan berikut ini: new new new new PrintNameThread("A"); PrintNameThread("B"); PrintNameThread("C"); PrintNameThread("D");

Program akan memberikan keluaran yang berbeda pada setiap eksekusi. Berikut ini adalah salah satu contoh dari output-nya. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCDABCDABCDA BCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABC DABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDBC DBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBC DBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBC DBCDBCDBCDBCDBCDBCDBCD

9.4.2 Mengimplementasikan interface Runnable
Cara lain untuk membuat sendiri sebuah thread adalah dengan mengimplementasikan interface Runnable. Hanya satu method yang dibutuhkan oleh interface Runnable yaitu method run. Bayangkanlah bahwa method run adalah method utama dari thread yang Anda ciptakan. Contoh dibawah ini hampir sama dengan contoh terakhir yang telah Anda pelajari, tapi pada contoh ini Anda akan mengimplement interface Runnable. class PrintNameThread implements Runnable { Thread thread; PrintNameThread(String name) { thread = new Thread(this, name);
Pengenalan Pemrograman 2 6

J.E.N.I.

thread.start(); } public void run() { String name = thread.getName(); for (int i = 0; i < 100; i++) { System.out.print(name); } } } class TestThread { public static void main(String args[]) { new PrintNameThread("A"); new PrintNameThread("B"); new PrintNameThread("C"); new PrintNameThread("D"); } }

9.4.3 Extend vs Implement
Dari dua cara untuk menciptakan thread seperti diatas, memilih salah satu dari kedua cara tersebut bukanlah sebuah permasalahan. 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. Sedangkan menurunkan (extend) sebuah class Thread, bagaimanapun menyebabkan class Anda tidak dapat menjadi turunan dari class yang lainnya karena Java tidak memperbolehkan adanya multiple inheritance. Sebuah pilihan antara mudah tidaknya untuk diimplementasikan (implement) dan kemungkinan untuk membuat turunan (extend) adalah sesuatu yang harus Anda tentukan sendiri. Perhatikan mana yang lebih penting bagi Anda karena keputusan ada ditangan Anda.

Pengenalan Pemrograman 2

7

J.E.N.I.

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

Pengenalan Pemrograman 2

8

J.E.N.I.

9.5 Sinkronisasi
Sampai sejauh ini, Anda telah melihat contoh-contoh dari thread yang berjalan bersamasama tetapi tidak bergantung satu dengan yang lainnya. Thread tersebut adalah thread yang berjalan sendiri tanpa memperhatikan status dan aktifitas dari thread lain yang sedang berjalan. Pada contoh tersebut, setiap thread tidak membutuhkan resource atau method dari luar sehingga ia tidak membutuhkan komunikasi dengan thread lain. Didalam situasi-situasi tertentu, bagaimanapun sebuah thread yang berjalan bersamasama kadang-kadang membutuhkan resource atau method dari luar. Oleh karena itu, mereka butuh untuk berkomunikasi satu dengan yang lain sehingga dapat mengetahui status dan aktifitas mereka. Contohnya adalah pada permasalahan produsen-konsumen. Kasus ini membutuhkan dua object utama, yaitu produsen dan konsumen. Kewajiban yang dimiliki oleh produsen adalah untuk membangkitkan nilai atau stream data yang diinginkan oleh konsumen.

9.5.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, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { } System.out.println(str2); } } class PrintStringsThread implements Runnable { Thread thread; String str1, str2; PrintStringsThread(String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run() { TwoStrings.print(str1, str2); } } class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); } } Program ini diharapkan dapat mencetak dua argument object Runnable secara

Pengenalan Pemrograman 2

9

J.E.N.I.

berurutan. Permasalahannya adalah, 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. Berikut ini adalah contoh dari keluarannya. Hello How are Thank you there. you? very much! Pada saat berjalan, ketiga thread telah mencetak argument string pertama mereka sebelum argument kedua dicetak. Sehingga hasilnya adalah sebuah keluaran yang tidak jelas. Sebenarnya, pada contoh diatas, tidak menunjukkan permasalahan yang serius. Akan tetapi pada aplikasi yang lain hal ini dapat menimbulkan exception atau permasalahanpermasalahan tertentu.

9.5.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. Object tersebut akan menjalankan sebuah monitor implicit pada saat object dari method sinkronisasi dipanggil. Sekali object tersebut dimonitor, monitor tersebut akan memastikan bahwa tidak ada thread yang akan mengakses object yang sama. Sebagai konsekuensinya, hanya ada satu thread dalam satu waktu yang akan mengeksekusi method dari object tersebut. Untuk sinkronisasi method, kata kunci yang dipakai adalah synchronized yang dapat menjadi header dari pendefinisian method. Pada kasus ini dimana Anda tidak dapat memodifikasi source code dari method, Anda dapat mensinkronisasi object dimana method tersebut menjadi anggota. Syntax untuk mensinkronisasi sebuah object adalah sebagai berikut: synchronized (<object>) { //statements yang akan disinkronisasikan } Dengan ini, object dari method tersebut hanya dapat dipanggil oleh satu thread pada satu waktu.

9.5.3 Contoh Synchronized Pertama
Dibawah ini adalah kode yang telah dimodifikasi dimana method print dari class TwoStrings saat ini sudah disinkronisasi. class TwoStrings { synchronized static void print(String str1, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { }

Pengenalan Pemrograman 2

10

J.E.N.I.

System.out.println(str2); } } class PrintStringsThread implements Runnable { Thread thread; String str1, str2; PrintStringsThread(String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run() { TwoStrings.print(str1, str2); } } class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); } } Program tersebut saat ini memberikan keluaran yang benar. Hello there. How are you? Thank you very much!

9.5.4 Contoh Synchronized Kedua
Dibawah ini adalah versi lain dari kode diatas. Sekali lagi, method print dari class TwoStrings telah disinkronisasi. Akan tetapi selain synchronized keyword diimplementasikan pada method,ia juga diaplikasikan pada object-nya. class TwoStrings { static void print(String str1, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { } System.out.println(str2); } } class PrintStringsThread implements Runnable { Thread thread; String str1, str2; TwoStrings ts; PrintStringsThread(String str1, String str2, TwoStrings ts) {

Pengenalan Pemrograman 2

11

J.E.N.I.

this.str1 = str1; this.str2 = str2; this.ts = ts; thread = new Thread(this); thread.start(); } public void run() { synchronized (ts) { ts.print(str1, str2); } } } class TestThread { public static void main(String args[]) { TwoStrings ts = new TwoStrings(); new PrintStringsThread("Hello ", "there.", ts); new PrintStringsThread("How are ", "you?", ts); new PrintStringsThread("Thank you ", "very much!", ts); } } Program ini juga memiliki keluaran pernyataan-pernyataan yang benar.

9.6 Komunikasi antar thread (Interthread)
Pada bagian ini, Anda akan mempelajari mengenai method-method dasar yang digunakan thread untuk berkomunikasi dengan thread lain yang sedang berjalan. 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. Hal ini dapat menyebabkan InterruptedException. public final void notify() Membangunkan thread yang telah memanggil method wait dari object yang sama. public final void notifyAll() Membangunkan semua thread yang telah memanggil method wait dari object yang sama.
Tabel 1.5: Methods untuk komunikasi Interthread

Untuk mendapatkan penjelasan dari method ini, perhatikanlah skenario pelayanpelanggan. Pada skenario di sebuah restoran, seorang pelayan tidak akan menanyakan ke setiap orang apakah mereka akan memesan atau membutuhkan sesuatu, akan tetapi ia akan menunggu sampai pelanggan datang ke restoran tersebut. Pada saat seseorang datang, hal ini mengindikasikan bahwa ia mempunyai keinginan untuk memesan makanan dari restaurant tersebut. Atau juga dapat kita nyatakan bahwa pelanggan yang memasuki restaurant mengindikasikan (notify) bahwa pelayan dibutuhkan untuk memberikan pelayanan. Akan tetapi,dalam kondisi sepert ini, seorang pelanggan belum

Pengenalan Pemrograman 2

12

J.E.N.I.

siap untuk memesan. Akan sangat mengganggu apabila pelayan terus-menerus bertanya kepada pelanggan apakah ia telah siap untuk memesan atau tidak. Oleh karena itu, pelayan akan menunggu (wait) sampai pelanggan memberikan tanda (notifies) bahwa ia telah siap untuk memesan. Sekali pelanggan sudah memesan, akan sangat mengganggu apabila ia terus menerus bertanya kepada pelayan, apakah pesanannya sudah tersedia atau tidak. Normalnya, pelanggan akan menunggu sampai pelayan memberikan tanda (notifies) dan kemudian menyajikan makanan. Perhatikan pada skenario berikut, setiap anggota yang menunggu, hanya akan berjalan sampai anggota yang lain memberi tanda yang memerintahkan untuk berjalan. Hal ini sama dengan yang terjadi pada thread.

Gambar 1.5: Skenario Pelayan-Pelanggan

9.6.1 Contoh Produsen-Konsumen
Contoh dibawah ini adalah salah satu implementasi dari permasalahan produsenkonsumen. Sebuah kelas yang menyediakan method untuk membangkitkan dan mengurangi nilai dari integer yang dipisahkan dari class Produsen dan Konsumen thread.

Pengenalan Pemrograman 2

13

J.E.N.I.

class SharedData { int data; synchronized void set(int value) { System.out.println("Generate " + value); data = value; } synchronized int get() { System.out.println("Get " + data); return data; } } class Producer implements Runnable { SharedData sd; Producer(SharedData sd) { this.sd = sd; new Thread(this, "Producer").start(); } public void run() { for (int i = 0; i < 10; i++) { sd.set((int)(Math.random()*100)); } } } class Consumer implements Runnable { SharedData sd; Consumer(SharedData sd) { this.sd = sd; new Thread(this, "Consumer").start(); } public void run() { for (int i = 0; i < 10 ; i++) { sd.get(); } } } class TestProducerConsumer { public static void main(String args[]) throws Exception { SharedData sd = new SharedData(); new Producer(sd); 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

J.E.N.I.

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. Kita berharap bahwa setiap nilai yang diproduksi oleh produser dan juga kita akan mengansumsikan bahwa konsumen akan mendapatkan nilai tersebut. Dibawah ini adalah keluaran yang kita harapkan. 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, kita akan menggunakan method untuk komunikasi interthread. Implementasi dibawah ini adalah implementasi dari permasalahan produsen konsumen dengan menggunakan method untuk komunikasi interthread. class SharedData { int data; boolean valueSet = false; synchronized void set(int value) { if (valueSet) { //baru saja membangkitkan sebuah nilai try { wait(); } catch (InterruptedException ie) { } } System.out.println("Generate " + value); data = value;

Pengenalan Pemrograman 2

15

J.E.N.I.

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

Pengenalan Pemrograman 2

16

J.E.N.I.

9.7 Kemampuan Concurrency
Dengan dirilisnya J2SE 5.0, telah tersedia kontrol threading yang baru dan juga tambahan fitur yang disebut concurrency. Fitur baru ini dapat ditemukan didalam package java.util.concurrent. Didalam sub bab ini, ada dua jenis fitur concurrency yang akan dijelaskan.

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

Pengenalan Pemrograman 2

17

J.E.N.I.

Factory Method dari class Executor public static ExecutorService newCachedThreadPool() Menciptakan sebuah pool thread yang akan menciptakan thread sesuai yang dibutuhkan, atau ia akan menggunakan kembali thread yang telah dibangun sebelumnya, apabila tersedia. Sebuah method overloading, juga akan menggunakan object ThreadFactory sebagai argument. 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. Sebuah overloading method, akan menggunakan object ThreadFactory sebagai tambahan parameter. public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) Menciptakan sebuah pool thread yang akan menjadwalkan command yang akan berjalan setelah diberikan sebuah delay, atau untuk mengeksekusi secara periodic. Sebuah overloading method, 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. Sebuah overloading method, juga akan menggunakan object ThreadFactory sebagai tambahan parameter. public static ScheduledExecutorService newSingleThreadScheduledExecutor() Menciptakan sebuah Executor thread yang akan menjadwalkan command untuk dijalankan setelah delay tertentu, atau dieksekusi secara periodic. Sebuah overloading method, juga akan menggunakan object ThreadFactory sebagai tambahan parameter
Tabel 1.1: Factory Method didalam class Executor

Pada saat sebuah tugas dari Runnable telah dieksekusi dan diselesaikan dengan control sebuah interface Executor. Untuk memberhentikan thread ini, kita dapat dengan mudah memanggil method shutdown dari interface tersebut seperti berikut ini: executor.shutdown();

9.7.2 Interface Callable
Ingatlah kembali, bahwa ada dua cara untuk menciptakan sebuah thread. Kita dapat meng-extend sebuah class Thread atau meng-implement sebuah interface Runnable. Untuk menentukan teknik mana yang akan digunakan, kita akan melihat secara spesifik fungsi dari masing-masing teknik dengan cara meng-override method run. Penulisan method tersebut ditunjukkan seperti berikut ini: public void run() Kelemahan-kelemahan dari menciptakan thread dengan cara tersebut adalah: 1. Method run tidak dapat melakukan pengembalian hasil selama ia memiliki void sebagai nilai kembaliannya. 2. Method run mewajibkan Anda untuk mengecek setiap exception karena overriding method tidak dapat menggunakan klausa throws. Interface Callable pada dasarnya adalah sama dengan interface Runnable tanpa kelemahan-kelemahan yang telah disebutkan diatas. Untuk mendapatkan hasil dari sebuah pekerjaan yang telah diselesaikan oleh Runnable, kita harus melakukan suatu teknik untuk mendapatkan hasilnya. Teknik yang paling umum adalah dengan membuat
Pengenalan Pemrograman 2 18

J.E.N.I.

sebuah instance variable untuk menyimpan hasilnya. Kode berikut ini akan menunjukkan bagaimana hal tersebut dilakukan. public MyRunnable implements Runnable { private int result = 0; public void run() { ... result = someValue; } /* Hasil dari attribute ini dijaga dari segala sesuatu perubahan yang dilakukan oleh kode-kode lain yang mengakses class ini */ public int getResult() { return result; } } Tulislah interface Callable, kemudian dapatkanlah hasil sesederhana yang ditampilkan pada contoh dibawah ini. import java.util.concurrent.*; public class MyCallable implements Callable { public Integer call() throws java.io.IOException { ... return someValue; } } 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. Masih ada lagi fitur-fitur concurrency dalam J2SE 5.0. Lihatlah lagi didalam dokumentasi API untuk mendapatkan informasi lebih detail lagi mengenai fitur-fitur yang lain.

9.8 Latihan
9.8.1 Banner
Dengan menggunakan AWT atau Swing, buatlah sebuah banner sederhana yang akan
Pengenalan Pemrograman 2 19

J.E.N.I.

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. Untuk memastikan bahwa proses perpindahannya tidak terlalu cepat, Anda sebaiknya menggunakan method sleep dari class Thread. Berikut ini adalah sebuah contoh dimana Anda menuliskan ”Your name here!”.

Gambar 1.6.1: Contoh pergerakan string

Pengenalan Pemrograman 2

20

J.E.N.I.

BAB 10 Jaringan
Java memperbolehkan Anda dalam mempermudah pengembangan aplikasi yang mengerjakan berbagai pekerjaan melalui jaringan. Ini adalah suatu cita-cita pembuatan Java yang menjadi salah satu kekuatan Java sejak dapat dibuat untuk ditampilkan melalui internet. Sebelum mempelajari tentang jaringan dalam Java. Pertama-tama Anda akan diperkenalkan kepada beberapa konsep dasar jaringan. Pada akhir pembahasan, diharapkan pembaca dapat : 1.Mengerti konsep dasar jaringan  IP address  protokol  ports  paradigma client/server  socket 2.Membuat aplikasi menggunakan package jaringan Java  ServerSocket  Socket  MulticastSocket  DatagramPacket

10.1 Konsep Dasar Jaringan
Jika sebelumnya Anda telah mengetahui, bahwa internet adalah jaringan global dengan berbagai jenis komputer yang berbeda yang tersambung dalam berbagai cara. Walaupun terdapat perbedaan dalam software dan hardware yang tersambung bersama-sama, hal tersebut sangatlah bagus bahwa internet masih dapat berfungsi. Hal ini memungkinkan karena standar komunikasi memiliki ketetapan dan juga keselarasan. Standar ini menjamin kesesuaian dan kekuatan komunikasi diantara luasnya sistem pada internet. Mari kita pelajari beberapa standar yang berlaku.

10.1.1 IP Address
Pada setiap komputer yang tersambung dengan internet memiliki alamat IP yang unik. Alamat IP secara logika hampir sama dengan alamat pengiriman surat tradisional dimana memiliki arti bahwa alamat yang bersifat unik tersebut mewakili dari keterangan sebuah object. Alamat tersebut diwakilkan dalam 32-bit nomor yang digunakan sebagai pengenal yang bersifat unik dari setiap komputer yang tersambung dengan internet. 192.1.1.1 adalah contoh dari sebuah alamat IP. Mereka juga bisa ditulis dengan bentuk simbol seperti docs.rinet.ru.

10.1.2 Protokol
Karena terdapat jenis komunikasi yang berbeda-beda yang mungkin terjadi pada internet, di sana harus terdapat suatu jumlah yang sama untuk mekanisme penangangan komunikasi. Setiap jenis komunikasi membutuhkan protokol yang spesifik dan unik. Protokol mengatur peraturan dan standar yang menetapkan jenis komunikasi internet yang khusus. Hal tersebut menjelaskan format data yang dikirim lewat internet, seiring dengan bagaimana dan kapan itu dikirim. Konsep dari protokol tentunya tidak terlalu asing untuk kita. Mengingat sudah beberapa kali Anda telah menggunakan jenis percakapan ini :

Pengenalan Pemrograman 2

1

J.E.N.I.

"Hallo." "Hallo. Selamat siang. Bolehkah saya berbicara dengan Joan?" "Okay, mohon tunggu sebentar." "terima kasih." ... Ini adalah protokol sosial yang digunakan ketika dalam pembicaraan melalui telepon. Jenis protokol tipe ini memberikan kita kepercayaan untuk mengetahui apa yang harus dilakukan dalam situasi tersebut. Mari kita lihat beberapa protokol penting yang digunakan pada internet. Hypertext Transfer Protocol (HTTP) adalah salah satu protokol yang sering digunakan. Digunakan untuk mentransfer dokumen HTML pada Web. Kemudian, ada juga File Transfer Protocol (FTP) dimana lebih umum dibandingkan dengan HTTP dan memperbolehkan Anda untuk mentransfer file biner lewat intenet. Kedua protokol tersebut memiliki peraturan masing-masing dan standar dalam pengiriman data. Java juga mendukung kedua protokol tersebut.

10.1.3 Port
Sekarang, protokol hanya bisa dipertimbangkan jika digunakan dalam konteks suatu jasa. Sebagai contoh, protokol HTTP digunakan ketika Anda menyediakan isi Web melalui layanan HTTP. Setiap komputer pada internet dapat menyediakan berbagai jenis layanan melalui berbagai jenis protokol yang mendukung. Masalahnya, bagaimanapun juga, kita harus mengetahui jenis layanan sebelum sebuah informasi dapat ditransfer. Untuk itulah port digunakan. Port adalah 16-bit nomor dimana mengenal setiap layanan yang ditawarkan oleh server jaringan. Untuk menggunakan layanan khusus dan oleh karena itu, jalur komunikasi yang melewati protokol tertentu, Anda perlu menyambungkan pada port yang sesuai. Port dihubungkan dengan nomor dan beberapa nomor bersifat spesifik yang berhubungan dengan jenis layanan khusus. Port dengan layanan pekerjaan tertentu disebut port standar. Sebagai contoh, layanan FTP terletak pada port 21 sedangkan layanan HTTP terletak pada port 80. Jika Anda ingin menggunakan file transfer FTP, Anda perlu terhubung dengan port 21 pada komputer Anda. Sekarang, semua standar layanan tertentu diberikan nilai port dibawah 1024. port dengan nilai diatas 1024 disediakan untuk komunikasi custom. Jika terdapat kasus dimana port dengan nilai diatas 1024 telah digunakan oleh beberapa komunikasi custom, Anda harus mencari nilai lain yang tidak digunakan.

10.1.4 Paradigma client/server
Paradigma client/server adalah dasar untuk framework jaringan Java. Tentunya, penetapan ini terdiri dari dua elemen besar, yaitu client dan server. Client adalah mesin yang membutuhkan beberapa jenis informasi sedangkan server adalah mesin yang menyimpan informasi dan menunggu untuk menyampaikannya pada client. Paradigma ini menjelaskan sebuah skenario sederhana. Tentunya, client terhubung dengan sever dan meminta informasi. Kemudian server mengingat permintaan dan mengembalikan informasi yang tersedia kepada client.

Pengenalan Pemrograman 2

2

J.E.N.I.

Gambar1.1.4: Model Client/Server

10.1.5 sockets
Konsep umum jaringan yang terakhir sebelum kita membahas lebih dalam tentang Java networking adalah dengan memperhatikan sockets. Kebanyakan pemrograman Java network menggunakan jenis khusus dari komunikasi jaringan yang diketahui sebagai sockets.

Socket adalah software abstrak untuk media input atau output komunikasi. Socket digunakan oleh Java untuk mengatasi komunikasi pada jaringan level rendah. Jalur komunikasi ini memungkinkan untuk mentransfer data melalui port khusus. Singkatnya, socket adalah point terakhir untuk komunikasi antara dua mesin.

10.2 The Java Networking Package
Package dari java.net menyediakan banyak class yang berguna untuk pengembangan aplikasi jaringan. Untuk daftar lengkap dari class jaringan dan interface, dapat dilihat pada dokumentasi API. Pembelajaran akan difokuskan pada empat class yaitu : class ServerSocket, Socket, MulticastSocket, dan DatagramPacket.

10.2.1 Class ServerSocket dan Socket
Class ServerSocket menyediakan fungsi-fungsi dasar dari sebuah server. Tabel berikut menjelaskan dua dari empat constructor pada class ServerSocket:

Pengenalan Pemrograman 2

3

J.E.N.I.

Constructor ServerSocket ServerSocket(int port) Ketika sebuah server menetapkan suatu port tertentu, sebuah port 0 menugaskan sebuah server kepada port bebas manapun. Panjang antrian maksimum untuk koneksi yang akan datang diatur sebanyak 50 sebagai defaultnya. ServerSocket(int port, int backlog) Ketika sebuah server menetapkan suatu port tertentu, panjang antrian maksimum untuk koneksi yang akan datang berdasarkan pada parameter backlog.
Tabel 1.2.1a: Constructor ServerSocket

Berikut ini adalah beberapa method class pada ServerSocket :

Method ServerSocket public Socket accept() Menyebabkan server untuk menunggu dan mendengarkan dari koneksi client, kemudian menerimanya. public void close() Menutup socket server. Client tidak dapat lagi terhubung ke server hingga dibuka kembali public int getLocalPort() Mengembalikan port dimana socket juga membatasi public boolean isClosed() Mendeteksi apakah socket tertutup atau belum
Tabel 1.2.1b: Method ServerSocket

Contoh yang berhasil melakukan implementasi sebuah server sederhana, dimana sebuah informasi sederhana dikirim oleh client dapat dilihat pada listing program berikut ini : import java.net.*; import java.io.*; public class EchoingServer { public static void main(String [] args) { ServerSocket server = null; Socket client; try { server = new ServerSocket(1234);

Pengenalan Pemrograman 2

4

J.E.N.I.

//1234 nomor port yang belum digunakan } catch (IOException ie) { System.out.println("Cannot open socket."); System.exit(1); } while(true) { try { client = server.accept(); OutputStream clientOut = client.getOutputStream(); PrintWriter pw = new PrintWriter(clientOut, true); InputStream clientIn = client.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)); pw.println(br.readLine()); } catch (IOException ie) { } } } } Ketika class ServerSocket mengimplementasikan server socket, Class Socket mengimplementasikan socket client. Class Socket memiliki delapan constructor, dua diantaranya siap dipanggil. Langsung saja kita lihat dua constructor tersebut. Constructor Socket Socket(String host, int port) Membuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada host tertentu. Socket(InetAddress address, int port) Membuat sebuah socket client dimana dihubungkan dengan diberikannya nomor port pada alamat IP tertentu.
Tabel 1.2.1c: Constructor Socket

Berikut adalah beberapa dari method class pada Socket :

Method Socket public void close() Menutup socket client public InputStream getInputStream() Menerima kembali input stream yang berhubungan dengan socket ini. public OutputStream getOutputStream() Menerima kembali output stream yang berhubungan dengan socket ini. public InetAddress getInetAddress()

Pengenalan Pemrograman 2

5

J.E.N.I.

Method Socket Mengembalikan alamat IP kepada socket ini pada saat masih terhubung. public int getPort() Mengembalikan remote port kepada socket ini pada saat masih terhubung. public boolean isClosed() Mendeteksi apakah socket telah tertutup atau tidak
Tabel 1.2.1d: Method Socket

Contoh yang berhasil melakukan implementasi sebuah client sederhana, dimana mengirim data kepada server dapat dilihat pada listing program dibawah ini :
import java.io.*; import java.net.*; public class MyClient { public static void main(String args[]) { try { //Socket client = new Socket("133.0.0.1", 1234); Socket client = new Socket(InetAddress.getLocalHost(), 1234); InputStream clientIn = client.getInputStream(); OutputStream clientOut = client.getOutputStream(); PrintWriter pw = new PrintWriter(clientOut, true); BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Type a message for the server: "); pw.println(stdIn.readLine()); System.out.println("Server message: "); System.out.println(br.readLine()); pw.close(); br.close(); client.close(); } catch (ConnectException ce) { System.out.println("Cannot connect to the server."); } catch (IOException ie) { System.out.println("I/O Error."); } } }

10.2.2 Class MulticastSocket dan DatagramPacket
Class MulticastSocket sangat berguna untuk aplikasi yang mengimplementasikan komunikasi secara berkelompok. Alamat IP untuk kelompok multicast berkisar antara 224.0.0.0 hingga 239.255.255.255. Meskipun begitu, alamat 224.0.0.0 telah dipesan dan seharusnya tidak digunakan. Class ini memiliki tiga constructor tetapi yang akan dibahas hanya salah satu dari ketiga constructor ini.

Pengenalan Pemrograman 2

6

J.E.N.I.

Constructor MulticastSocket MulticastSocket(int port) Membuat multicast socket dibatasi dengan pemberian nomor port

Tabel 1.2.2a: Constructor MulticastSocket

Tabel berikutnya memberikan penjelasan beberapa method MulticastSocket.

Method MulticastSocket public void joinGroup(InetAddress mcastaddr) Bergabung dengan kelompok multicast pada alamat tertentu public void leaveGroup(InetAddress mcastaddr) Meninggalkan kelompok multicast pada alamat tertentu public void send(DatagramPacket p) Metode turunan dari class DatagramSocket. Mengirim p dari socket ini.
Tabel 1.2.2b:Method MulticastSocket

Sebelum seseorang dapat mengirim pesan kepada suatu kelompok, pertama kali yang harus dilakukan oleh orang tersebut adalah harus menjadi anggota dari multicast kelompok dengan menggunakan method joinGroup. Sekarang seorang anggota dapat mengirim pesan melalui method send. Jika Anda telah selesai berbicara dengan kelompok, Anda dapat menggunakan method leaveGroup untuk melepaskan keanggotaan Anda. Sebelum melihat contoh dalam menggunakan class multicastSocket, pertama-tama mari kita lihat pada class DatagramPacket. Perhatikan bahwa dalam method send dari class multiSocket, dibutuhkan parameter yaitu object DatagramPacket. Sehingga, kita harus mengerti object jenis ini sebelum menggunakan method send. Class DatagramPacket digunakan untuk mengirim data melalui protokol connectionless seperti multicast. Masalah yang ditimbulkan bahwa pengiriman packet tidak terjamin. Mari kita perhatikan dua dari enam constructor.

Constructor DatagramPacket DatagramPacket(byte[] buf, int length) Constructor dari datagramPacket untuk menerima paket dengan panjang length. Seharusnya kurang dari atau sama dengan ukuran dari buffer buf. DatagramPacket(byte[] buf, int length, InetAddress address, int port) Constructor dari datagramPacket untuk mengirim paket dengan panjang length dengan nomor port tertentu dan host tertentu.
Tabel 1.2.2c: Constructor DatagramPacket

Pengenalan Pemrograman 2

7

J.E.N.I.

Berikut adalah beberapa method dari class DatagramPacket.

Method-method DatagramPacket public byte[] getData() Mengembalikan buffer dimana data telah disimpan public InetAddress getAddress() Mengembalikan alamat IP mesin dimana paket yang dikirim atau yang diterima public int getLength() Mengembalikan panjang data yang dikirim atau diterima public int getPort() Mengembalikan nomor port pada remote host dimana paket yang dikirim atau yang diterima
Table 1.2.2d: Method DatagramPacket

Contoh multicast kita juga mengandung dua class, server dan client. Server menerima pesan dari client dan mencetak pesan tersebut. Berikut adalah class server import java.net.*; public class ChatServer { public static void main(String args[]) throws Exception { MulticastSocket server = new MulticastSocket(1234); InetAddress group = InetAddress.getByName("234.5.6.7"); //getByName – Mengembalikan alamat IP yang diberikan oleh Host server.joinGroup(group); boolean infinite = true; /* Server terus-menerus menerima data dan mencetaknya*/ while(infinite) { byte buf[] = new byte[1024]; DatagramPacket data = new DatagramPacket(buf, buf.length); server.receive(data); String msg = new String(data.getData()).trim(); System.out.println(msg); } server.close(); } } Berikut adalah class client import java.net.*; import java.io.*; public class ChatClient { public static void main(String args[]) throws Exception { MulticastSocket chat = new MulticastSocket(1234);

Pengenalan Pemrograman 2

8

J.E.N.I.

InetAddress group = InetAddress.getByName("234.5.6.7"); chat.joinGroup(group); String msg = ""; System.out.println("Type a message for the server:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); msg = br.readLine(); DatagramPacket data = new DatagramPacket(msg.getBytes(), 0, msg.length(), group, 1234); chat.send(data); chat.close(); } }

10.3 Latihan
10.3.1 Trivia Server
Buatlah sebuah server yang berisi satu set pertanyaan yang mudah. Secara sederhana, akan ada sekitar 5-10 pertanyaan. Client yang terhubung ke server mengirim sebuah permintaan untuk sebuah pertanyaan atau jawaban sebuah pertanyaan, Client mengirim pesan “permintaan”. Untuk jawaban dari sebuah pertanyaan, client mengirim pesan “jawaban”. Ketika menerima pesan “permintaan”, secara acak server akan memilih satu pertanyaan dari koleksi yang ada. Dia mengirimkan pertanyaan yang dipilih sesuai dengan nomor yang bersangkutan kepada client. Ketika server menerima pesan “jawaban” dari client, dia menginformasikan user bahwa user perlu mengirimkan jawaban sesuai dengan nomor pertanyaan kepada server. Jawaban itu harus dalam format <no pertanyaan>#<jawaban Anda>. 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! ...

Pengenalan Pemrograman 2

9

J.E.N.I.

BAB 11 Applet
11.1 Tujuan
Applet adalah satu fitur yang paling menarik dalam java. Applet merupakan program yang Anda jalankan melalui web browser. Pada pembelajaran ini Anda akan belajar tentang membuat sebuah applet.

Pada akhir pembahasan, diharapkan pembaca dapat : 1. Mendefinisikan apa yang dimaksud dengan applet 2. Membuat applet sendiri 3. Mengetahui siklus yang terdapat pada applet
   

init start stop destroy

4. Menggunakan method applet yang lain
  

paint showStatus Method untuk memainkan sebuah audio clip

5. Memahami tag html pada applet

11.2

Membentuk Applet

Sebuah applet adalah tipe yang spesial dari program java yang dieksekusi melalui internet. Secara khusus berjalan pada suatu web browser seperti Netscape Navigator, Mozilla, atau Microsoft Internet Explorer. Bagaimanapun juga, jika dibandingkan dengan aplikasi Java yang normal, tidak diperbolehkan mengakses applet pada komputer yang dijalankan untuk alasan keamanan. Applet ini cukup terbatas jika dibandingkan dengan aplikasi Java. Pada module ini, Anda akan mempelajari tentang membuat applet menggunakan AWT.

11.2.1 Hello World Applet
Class Applet adalah sebuah subclass dari class Panel yang didefinisikan dalam AWT. Cara terbaik untuk memahami bagaimana membuat applet adalah dengan contoh. Jadi, berikut ini adalah contoh applet sederhana yang menampilkan "Hello world!". import java.awt.*; import java.applet.*;

Pengenalan Pemrograman 2

1

J.E.N.I.

/* masukkan bagian ini dalam kode html <applet code="AppletDemo" width=300 height=100> </applet> */ public class AppletDemo extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 80, 25); } } Setelah proses kompilasi, usahakan menjalankan contoh ini menggunakan perintah java. Apa yang terjadi? Ingat bahwa applet adalah aplikasi java yang spesial. Mereka tidak dieksekusi menggunakan perintah java. Bahkan applet berjalan pada web browser atau menggunakan applet viewer. Untuk membuka applet melalui sebuah web browser, secara sederhana buka dokumen HTML dimana applet terintegrasi ke dalamnya menggunakan applet HTML tag (Perintah mengeluarkan kode pada contoh Hello World). Cara lain untuk menjalankan sebuah applet adalah melalui perintah appletviewer. Untuk lebih mudahnya ikuti syntax berikut ini: appletviewer <java filename> Untuk menjalankan contoh applet yang dijalankan , menggunakan: appletviewer AppletDemo.java Tag HTML pada contoh yang diberikan mengindikasikan bahwa sebuah applet dibuat dengan lebar 300 pixel dan tinggi 100 pixel. Kemudian, method drawString menggambar string "Hello world!" pada posisi pixel (80,25) menghitung kebawah dari bagian kanan.

Gambar 1.1.1: Contoh Applet

Ketika membuat sebuah applet, diharuskan meng-extend class Applet. Sebagaimana yang disebutkan sebelumnya, classnya dapat ditemukan dalam package java.applet. Oleh karena itu, mengimport package java.applet merupakan suatu keharusan. Juga, telah disebutkan sebelumnya bahwa class Applet adalah subclass dari class Panel. Hal ini mengimplikasikan bahwa beberapa method dari class applet ditemukan dalam class Panel. Untuk mengakses method atau field dalam class Panel atau class-class induk, diperlukan suatu aksi untuk import package java.awt .

Pengenalan Pemrograman 2

2

J.E.N.I.

11.3 Method-Method Applet
Bagian ini membahas manfaat-manfaat method applet.

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

Pengenalan Pemrograman 2

3

J.E.N.I.

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

Pengenalan Pemrograman 2

4

J.E.N.I.

11.3.2 Method paint
Method lain yang tidak kalah penting adalah method paint, yang mana class Applet menurunkannya dari class induknya yaitu class Component, yang meminta output applet setiap waktu yang diperlukan untuk dapat digambar kembali. Sebagai contoh dari setiap instance adalah ketika sebuah applet tersembunyi oleh window lain dapat dibuat terlihat lagi. Method ini selalu menolak ketika Anda ingin membuat bagaimana applet yang Anda buat harus terlihat seperti yag Anda inginkan. Pada contoh Hello World, applet memiliki string "Hello world!"pada background setelah menolak method paint.

11.3.3 Method ShowStatus
Applet memiliki window status, dimana memberi informasi kepada Anda tentang apa yang sebenarnya dilakukan applet. Jika Anda ingin memberi output ke window status, secara sederhana memanggil method showStatus. Contoh berikut ini sama seperti contoh Hello World tapi dengan pernyataan tambahan yang memodifikasi isi dari window status. import java.awt.*; import java.applet.*; /* <applet code="AppletDemo" width=300 height=100> </applet> */ public class AppletDemo extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 80, 25); showStatus("This is an important information."); } } Berikut ini adalah contoh hasil outputnya:

Gambar 1.2.3: contoh showStatus()

Pengenalan Pemrograman 2

5

J.E.N.I.

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

Pengenalan Pemrograman 2

6

J.E.N.I.

11.4 Tag-tag Applet HTML
Pada contoh sebelum-sebelumnya, Anda sudah melihat bagaimana tag-tag applet HTML digunakan dalam dokumen HTML atau source code java. Sekarang, Anda akan dikenalkan pada versi tag-tag applet HTML yang lebih lengkap. <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>] ... [<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. Untuk dokumen HTML, direktori URL sesuai dengan setting awalnya/defaultnya. CODE Nama file yang berisi kode applet. Dengan atau tanpa nama ekstensi .java atau .class . ALT Text ditampilkan jika browser mengerti applet tags tapi applet tidak dapat dieksekusi secara langsung. Mungkin terjadi jika Javanya disabled. NAME Nama dari applet. Digunakan untuk memungkinkan applet yang lain untuk berkomunikasi dengan applet ini dengan menunjukkan suatu applet berdasarkan namanya. WIDTH, HEIGHT Width dan height dari window applet. Dinyatakan dalam pixel. ALIGN

Pengenalan Pemrograman 2

7

J.E.N.I.

Kata kunci Applet HTML Tag Alignment atau pengaturan posisi dari applet. Satu diantara "left", "right", "top", "bottom", "middle", "baseline", "texttop", "absmiddle", atau "absbottom". Peletakan posisi secara Default tergantung pada lingkungan. "top" – posisi atas dari applet diratakan dengan item tertinggi dalam baris yang ada. "bottom", baseline – posisi bawah dari applet diratakan dengan bawah dari content lain dalam baris yang sama. "middle" – tengah dari applet diratakan dengan bawah dari content yang lain dalam baris yang sama. "texttop" – posisi atas dari applet diratakan dengan posisi atas dari applet diratakan dengan posisi tertinggi dari posisi atas pada baris yang sama. "absmiddle" – tengah dari applet diratakan dengan vertical middle dari content lain pada baris yang sama. "absbottom" – posisi bawah dari applet diratakan dengan posisi bawah dari content lain dalam baris yang sama. VSPACE, HSPACE Spasi diatas dan dibawah (VSPACE) dan pada sisi (HSPACE) dari applet.. PARAM NAME, VALUE Untuk mengelompokkan parameter yang dapat menampilkan applet; applet dapat meminta method getParameter(String paramName).
Table 1.3: Applet HTML Tags

Contoh dibawah ini mendemokan bagaimana untuk mengakses parameter tertentu pada HTML tag. import java.awt.*; import java.applet.*; /* <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.drawString(getParameter("myParam"), 80, 25); } } Output dari program ini sama seperti applet Hello World.

Pengenalan Pemrograman 2

8

J.E.N.I.

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

Pengenalan Pemrograman 2

9

J.E.N.I.

BAB 12 Stream I/O Lanjut
12.1 Tujuan
Dalam module sebelumnya, Anda telah mempelajari bagaimana untuk mendapatkan input user dan memanipulasi file-file menggunakan strea. Kini Anda akan mempelajari lebih banyak tentang stream dan class-class stream yang lain. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Tahu tipe-tipe stream yang umum digunakan 2. Menggunakan class File dan methodnya  Karakter dan Stream byte  Input dan Output Streams  Node dan Filter Streams 3. Menggunakan class-class Input/Output yang berbeda  Reader  Writer  InputStream  OutputStream 4. Memahami konsep dari stream chaining 5. Mendefinisikan serialisasi 6. Memahami penggunaan dari kata kunci transient 7. Menulis dan membaca dari sebuah object stream

12.2 Tipe-Tipe Stream yang Umum Digunakan
12.2.1 Stream Karakter dan Byte
Seperti yang telah disebutkan sebelumnya, secara umum ada dua tipe dari stream, yaitu stream karakter dan byte. Kita hanya mengulang perbedaan mendasar antara keduanya. Stream byte adalah abstraksi file atau alat untuk data biner sedangkan stream karakter adalah untuk karakter Unicode. Class InputStream adalah abstraksi class root untuk semua input stream byte sedangkan class OutputStream adalah class root abstraksi dari semua output stream byte. Untuk stream karakter, superclasss yang sesuai dari semua class-class secara berturut-turut adalah class Reader dan the Writer. Kedua class-class ini adalah abstraksi class-class untuk membaca dan menulis stream karakter.

12.2.2 Input dan Output Stream
Stream juga dikategorikan berdasarkan apakah mereka digunakan untuk membaca atau menulis stream.Walaupun ini sudah cukup nyata, Anda diperbolehkan untuk membaca

Pengenalan Pemrograman 2

1

J.E.N.I.

dari input stream tapi tidak menulisnya. Di lain pihak, Anda diperbolehkan untuk menulis output streams tapi tidak membacanya. Class InputStream dan class Reader adalah superclass-superclass dari semua input stream. Class OutputStream dan class Writer adalah class-class root dari semua output stream. Input stream juga dikenal sebagai stream sumber (source stream) sejak kita memperoleh informasi dari stream ini. sementara itu output stream disebut juga stream hasil(sink stream).

12.2.3 Node dan Stream Filter
Kini package java.io membedakan antara node dan stream filter. Sebuah stream node adalah sebuah stream dengan fungsi dasar berupa fungsi membaca atau menulis dari sebuah lokasi khusus seperti pada disk atau dari jaringan. Tipe-tipe dari stream node terdiri atas file, memory dan jalur data. Stream filter, di lain pihak, diletakkan pada layer stream node diantara threads atau proses untuk menyediakan fungsi tambahan yang tidak dapat ditemukan dalam stream node oleh stream node itu sendiri. Penambahan lapisan pada sebuah stream node disebut dengan stream chaining. Sesi ini berturut-turut mempunyai sebuah tujuan dari class-class stream yang berbeda. Untuk melengkapi daftar dari class-class ini, lihatlah pada dokumentasi Java's API.

Pengenalan Pemrograman 2

2

J.E.N.I.

12.3 Class File
Walaupun class File bukan merupakan class stream, ini sesuatu yag penting bahwa kita mempelajari ini sejak class-class stream merupakan file-file yang telah dimanipulasi. Class adalah sebuah perwakilan dari abstraksi dari file-file nyata dan nama path direktori. Untuk meng-instantiate sebuah object File, Anda dapat menggunakan constructor berikut ini: Sebuah Constructor File File(String pathname) Instantiate sebuah object File dengan nama path khusus sebagai nama filenya. Nama filenya mungkin salah satu menjadi penuh( sebagai contoh, isi dengan path yang lengkap) atau mungkin terdiri atas namafile itu sendiri dan diasumsikan menjadi diisi dalam direktori tersebut.
Table 1.2a: Constructor File

Class File menyediakan beberapa method untuk memanipulasi file dan direktori. Berikut ini beberapa dari method-method tersebut. Method-method File public String getName() Mengembalikan nilai nama file atau nama direktori dari object File ini. public boolean exists() Menguji apakah sebuah file atau sebuah direktori masih ada atau tidak public long length() Mengembalikan nilai ukuran dari file. public long lastModified() Mengembalikan nilai tanggal dalam milidetik ketika file terakhir kali dimodifikasi. public boolean canRead() Mengembalikan nilai true jika dijinkan untuk membaca dari file. Sebaliknya, nilai pengembaliannya bernilai false. public boolean canWrite() mengembalikan nilai true jika diijinkan untuk menulis ke sebuah file. Sebaliknya, nilai pengembaliannya bernilai false. public boolean isFile() Menguji apakah object ini berupa sebuah file, yaitu persepsi normal kita tentang apa itu sebuah file (bukan sebuah direktori) atau bukan. public boolean isDirectory() menguji apakah object ini adalah sebuah direktori atau bukan. public String[] list()

Pengenalan Pemrograman 2

3

J.E.N.I.

Method-method File Mengembalikan nilai daftar file dan subdirektori yang ada dalam object ini. Object ini haruslah berupa sebuah direktori. public void mkdir() Membuat sebuah direktori yang merupakan abstraksi nama path ini. public void delete() Membuang file atau direktori yang sebenarnya diwakili oleh object File tersebut.
Table 1.2a: method-method File

Mari kita melihat bagaimana method ini bekerja berdasarkan contoh berikut ini : import java.io.*; public class FileInfoClass { public static void main(String args[]) { String fileName = args[0]; File fn = new File(fileName); System.out.println("Name: " + fn.getName()); if (!fn.exists()) { System.out.println(fileName + " does not exists."); /* membuat sebuah temporary directory . */ System.out.println("Creating temp directory..."); fileName = "temp"; fn = new File(fileName); fn.mkdir(); System.out.println(fileName + (fn.exists()? "exists": "does not exist")); System.out.println("Deleting temp directory..."); fn.delete(); System.out.println(fileName + (fn.exists()? "exists": "does not exist")); return; } System.out.println(fileName + " is a " + (fn.isFile()? "file." :"directory.")); if (fn.isDirectory()) { String content[] = fn.list(); System.out.println("The content of this directory:"); for (int i = 0; i < content.length; i++) { System.out.println(content[i]); } } if (!fn.canRead()) { System.out.println(fileName + " is not readable."); return; } System.out.println(fileName + " is " + fn.length() + " bytes long."); System.out.println(fileName + " is " + fn.lastModified() + " bytes long."); if (!fn.canWrite()) {

Pengenalan Pemrograman 2

4

J.E.N.I.

System.out.println(fileName + " is not writable."); } } }

12.4 Class Reader
Bagian ini menggambarkan stream karakter yang digunakan untuk membaca.

12.4.1 Method Reader
Class Reader terdiri atas beberapa method untuk membaca karakter. berikut ini adalah beberapa method class : Method Reader public int read(-) throws IOException Sebuah method overload, yang mana memiliki tiga versi. Membaca karakter, segala karakter array atau sebuah porsi untuk sebuah karakter array. public int read() - membaca sebuah karakter tunggal. public int read(char[] karakter array cbuf. cbuf)- Membaca karakter dan menyimpannya dalam

public abstract int read(char[] cbuf, int offset, int length)- Membaca karakter sejumlah panjang karakter tertentu dan menyimpannya dalam karakter cbuf dimulai pada tanda offset khusus yang telah ditentukan. public abstract void close() throws IOException Menutup Stream ini. Memanggil method Reader yang lain setelah menutup stream akan menyebabkan suatu IOException dijalankan. public void mark(int readAheadLimit) throws IOException Menandai posisi tertentu pada stream. Setelah menandai, panggil untuk melakukan reset() kemudian stream akan mencoba mengatur posisinya kembali pada titik ini. Tidak semua stream input karakter mendukung operasi ini. public boolean markSupported() mengindikasikan apakah sebuah stream mendukung operasi pemberian tanda (mark) atau tidak Tidak didukung oleh default. Seharusnya bersifat overid subclass. public void reset() throws IOException Reposisi stream ke posisi akhir stream yang telah ditandai
Table 1.3.1: Method Reader

12.4.2 Class Node Reader
Berikut ini adalah beberapa dasar class Reader:

Pengenalan Pemrograman 2

5

J.E.N.I.

Class-class Node Reader FileReader Untuk membaca file-file karakter. CharArrayReader Mengimplementasikan suatu karakter buffer yang dapat dibaca. StringReader Untuk membaca dari sebuah sumber string. PipedReader Digunakan untuk pasangan (dengan sebuah PipedWriter yang sesuai) oleh dua urutan yang ingin berkomunikasi. Salah satu dari urutan tersebut membaca karakter dari sumber tertentu.
Table 1.3.2: Class-class Node Reader Classes

12.4.3 Class-Class Filter Reader
Untuk menambah fungsi ke class-class dasar Reader, Anda dapat menggunakan class stream filter. Berikut ini adalah beberapa dari class-class tersebut : Class-Class Filter Reader BufferedReader mengizinkan penyimpanan sementara karakteryang bertujuan untuk menyediakan fasilitas pembacaan karakter, arrays, dan bais yang lebih efisien. FilterReader Untuk membaca stream karakter yang telah terfilter. InputStreamReader Menkonversi pembacaan byte ke bentuk karakter. LineNumberReader Sebuah subclass dari class BufferedReader yang dapat menjaga memori penyimpanan untuk nomor baris. PushbackReader Sebuah subclass dari class FilterReader yang memungkinkan karakter dikembalikan atau tidak terbaca oleh stream.
Table 1.3.3: Class-class Filter Reader

Pengenalan Pemrograman 2

6

J.E.N.I.

12.5 Class-Class Writer
Pada pembahasan ini menjelaskan tentang stream karakter yang digunakan untuk menulis.

12.5.1 Writer Method
Class Writer terdiri atas beberapa method untuk menulis karakter. Berikut ini adalah beberapa method class : Method Writer public void write(-) throws IOException Sebuah method overloading dalam lima versi: public void write(int c) – Menulis sebuah karakter tunggal yang diwakili oleh pemberian nilai integer. public void write(char[] cbuf) – Menulis isi dari karakter array cbuf. public abstract void write(char[] cbuf, int offset, int length) – Menulis sejumlah length karakter dari aaray cbuf, dimulai pada offset tertentu. public void write(String str) – Menulis string string. public void write(String str, int offset, int length) – Menulis sejumlah length karakter dari string str, dimulai pada offset tertentu. public abstract void close() throws IOException Menutup stream ini setelah flushing beberapa karaktr yang tidak tertulis. Invocation method lain setelah menutup stream ini akan menyebabkan terjadinya IOException. public abstract void flush() Mengganti stream(yaitu karakter yang disimpan dalam buffer dengan segera ditulis ke tujuan yang dimaksud).
Table 1.4.1: Method Writer

12.5.2 Node Writer Classes
Berikut ini beberapa dasar class Writer: Node Writer Classes FileWriter Untuk menulis karakter ke sebuah file. CharArrayWriter Menggunakan karakter penyangga yang dapat dituliskan juga. StringWriter Untuk menulis source string PipedWriter

Pengenalan Pemrograman 2

7

J.E.N.I.

Node Writer Classes Digunakan dengan berpasangan(dengan menghubungkan PipedReader) oleh dua thread yang ingin berkomunikasi. Satu dari thread ini menulis karakter ke stream ini.
Table 1.4.2: Node Writer classes

12.5.3 Filter Writer Classes
Untuk menambah fungsionalitas ke dasar class Writer, Anda dapat menggunakan class stream filter.Terdapat beberapa class-class: Filter Writer Classes BufferedWriter Menyediakan penyangga karakter bertujuan untuk menyediakan efisiensi penulisan karakter, array, dan garis. FilterWriter Untuk menulis stream karakter yang difilter. OutputStreamWriter Mengkodekan karakter yang ditulis ke dalam byte. PrintWriter Mencetak representasi yang diformat dari object ke dala stream text-output.
Table 1.4.3: Filter Writer classes

12.6 Contoh Dasar Reader/Writer
Contoh penggantian menggunakan class FileReader dan FileWriter. Dalam contoh ini, program membaca dari file yang khusus oleh user dan mengkopi isi dari file ke file lain. import java.io.*; class CopyFile { void copy(String input, String output) { FileReader reader; FileWriter writer; int data; try { reader = new FileReader(input); writer = new FileWriter(output); while ((data = reader.read()) != -1) { writer.write(data); } reader.close(); writer.close(); } catch (IOException ie) { ie.printStackTrace(); }

Pengenalan Pemrograman 2

8

J.E.N.I.

} public static void main(String args[]) { String inputFile = args[0]; String outputFile = args[1]; CopyFile cf = new CopyFile(); cf.copy(inputFile, outputFile); } } Cobalah program tersebut sendiri dan amatilah apa ang terjadi pada file yang dimanipulasi.

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

Pengenalan Pemrograman 2

9

J.E.N.I.

12.8 Class InputStream
Bagian ini memberikan gambaran perbedaan stream byte yang digunakan membaca.

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

12.8.2 Class-Class Node InputStream
Berikut ini merupakan beberapaclass-class dasar InputStream : Class-class Node InputStream FileInputStream Untuk membaca baris byte dari sebuah file BufferedArrayInputStream

Pengenalan Pemrograman 2

10

J.E.N.I.

Class-class Node InputStream Mengimplementasikan sebua penimpan sementara yang terdiri atas data byte, yang mungkin dpat dibaca dari streamnya. PipedInputStream Seharusnya terhubung ke sebuah PipedOutputStream. Stream ini secara khusus digunakan oleh dua urutan yang didalamnya satu dari urutan tersebut membaca data dari sumber ini sementara urutan yang lain menulis ke PipedOutputStream tujuan.
Table 1.7.2: class-class Node InputStream

12.8.3 Class-class Filter InputStream
Untuk menambah fungsi ke class dasar InputStream, Anda dapat menggunakan class stream filter. Berikut ini adalah beberapa dari class-class tersebut : Class-class Filter InputStream BufferedInputStream Sebuah subclass dari FilterInputStream yang memungkinkan penyimpanan input sementara untuk menyediakan pembacaan byte yang lebih efisien. FilterInputStream Untuk membaca byte stream yang telah terfilter, yang mungkin memindahkan source dasar dari data sepanjang proses dan menyediakan fungsi tambahan. ObjectInputStream Digunakan untuk serialisasi object. Deserialisasi object dan data primitif yang telah tertulis sebelumnya menggunakan sebuahObjectOutputStream. DataInputStream Sebuah subclass dari FilterInputStream yang memerintahkan sebuah aplikasi membaca data primitif Java dari sebuah input stream dasar dalam sebuah Mesin yang berjalan secara bebas(machine-independent way). LineNumberInputStream Sebuah subclass FilterInputStream yang memungkinkan pemeriksaan posisi dari nomor baris tertentu. PushbackInputStream Sebuah subclass dari class FilterInputStream yang memungkinkan byte diproses balik atau tidak dibaca ke bentuk sreamnya.
Table 1.7.3: Class-class Filter InputStream

Pengenalan Pemrograman 2

11

J.E.N.I.

12.9 Class-Class OutputStream
Pada pembahasan ini memberikan sebuah pandangan tentang byte stream yang berbeda yang digunakan dalam proses penulisan.

12.9.1 Method OutputStream
Class OutputStream terdiri atas beberapa method untuk menulis data byte. Berikut ini adalah beberapa dari class methodnya : Method OutputStream public void write(-) throws IOException Sebuah method overloaded untuk menulis bentuk byte ke bentuk stream. Ada tiga versi : public abstract void write(int b) – Menulis nilai byte khusus b ke bentuk output stream nya. public void write(byte[] bBuf) – Menulis isi dari array byte bBuf ke bentuk stream nya. public void write(byte[] bBuf, int offset, int length) – Menulis sejumlah length byte dari array bBuf ke bentuk streamnya, dimulai pada offset khusus ke streamnya. public abstract void close() throws IOException Menutup stream ini dan mengeluarkan beberapa sumber dari sistem digabungkan dengan streamnya. Penggunaan method lain setelah memanggil method ini akan menyebabkan sebuahIOException dijalankan. public abstract void flush() Mengganti stream (sebagai contoh, data byte tersimpan dalam buffer akan segera ditulis dalam tujuan yang diamksud).
Table 1.8.1: Method OutputStream

12.9.2 Class-Class Node OutputStream
Berikut ini adalah beberapa dari class dasar OutputStream : Clas-class Node OutputStream FileOutputStream Untuk menulis byte ke sebuah file. BufferedArrayOutputStream Mengimplementasikan sebuah penyimpan sementara berupa byte, yang mana mungkin akan dituliskan ke bentuk streamnya. PipedOutputStream

Pengenalan Pemrograman 2

12

J.E.N.I.

Clas-class Node OutputStream Seharusnya tersambung ke sebuah PipedInputStream. Stream ini secara khusus digunakan oleh dua urutan dimana didalamnya satu dari urutan tersebut menulis data ke bentuk streamnya sementara urutan yang lain membaca dari PipedInputStream tujuan.
Table 1.8.2: Class-class Node OutputStream

12.9.3 Class-Class Filter OutputStream
Untuk menambah fungsi ke class dasar OutputStream, Anda dapat menggunakan class stream filter.berikut ini beberapa dari class tersebut : Class-Class Filter OutputStream BufferedOutputStream Sebuah subclass dari FilterOutputStream yang memungkinkan penyimpanan output sementara untuk proses penulisan byte yang lebih efisien. Memungkinkan penulisan byte ke bentuk dasar output stream tanpa menyebabkan diperlukannya pemanggilan dasar sistem untuk setiap penulisan byte. FilterOutputStream Untuk menulis stream byte yang telah difilter, yang mana mungkin dipindahkan ke source dasar dari data sepanjang proses dan menyediakan fungsi tambahan. ObjectOutputStream Digunakan untuk serialisasi object. Serialisasi object dan data primitif untuk sebuah OutputStream. DataOutputStream Sebuah subclass dari FilterOutputStream yang menjalankan aplikasi penulisan data primitif ke output stream dasar ke dalam sebuah mesin yang bebas berjalan (machineindependent way). PrintStream Sebuah subclass dari FilterOutputStream yang menyediakan kemampuan untuk mencetak representasi dari nilai data yang bermacam-macam dengan tepat.
Table 1.8.3: Class-Class Filter OutputStream

Pengenalan Pemrograman 2

13

J.E.N.I.

12.10 Contoh Dasar InputStream/OutputStream
Contoh berikut ini menggunakan class FileInputStream dan FileOutputStream untuk membaca dari sebuah file khusus dan mengcopy isi dari file ini ke file yang lain. import java.io.*; class CopyFile { void copy(String input, String output) { FileInputStream inputStr; FileOutputStream outputStr; int data; try { inputStr = new FileInputStream(input); outputStr = new FileOutputStream(output); while ((data = inputStr.read()) != -1) { outputStr.write(data); } inputStr.close(); outputStr.close(); } catch (IOException ie) { ie.printStackTrace(); } } public static void main(String args[]) { String inputFile = args[0]; String outputFile = args[1]; CopyFile cf = new CopyFile(); cf.copy(inputFile, outputFile); } }

Pengenalan Pemrograman 2

14

J.E.N.I.

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

Pengenalan Pemrograman 2

15

J.E.N.I.

12.12 Serialisasi
Java Virtual Machine (JVM) mendukung kemampuan untuk membaca atau menulis sebuah object ke bentuk stream. kemampuan ini disebut dengan serialisasi, proses "flattening" sebuah object sehingga data tersebut dapat disimpan ke beberapa penyimpanan permanen atau dilewatkan ke object lain melalui class OutputStream. Ketika menulis sebuah object, ini merupakan hal yang penting bahwa keadaan tersebut sudah tertulis dan telah diserialisasi dari setiap objectnya dapat dibangun kembali sebagaimana dtaa tersebut dibaca. Menyimpan sebuah objectke beberapa tipe penyimpanan permanen yang dikenal sebagai persistence. Stream yang digunakan untuk deserialisasi dan serialisasi secara berurutan adalah class ObjectInputStream dan ObjectOutputStream . Untuk memungkinkan sebuah object diserialisasi (sebagai contoh dapat disimpan dan diurutkan), Class tersebut harus mengimplementasikan interface yang dapat diserialisasi. Class ini seharusnya juga menyediakan default constructor atau sebuah constructor tanpa argumen. Satu hal yang baik mengenai kemampuan untuk melakukan serialisasiyang dapat diturunkan, yang berarti kita tidak memiliki implementasi serialisasi pada setiap class. Ini berarti mengurangi pekrjaan untuk programmer. Anda hanya dapat mengimplementasikan serialisasi sekali sepanjang hirarki class.

12.12.1 Kata Kunci transient
Ketika suatu object diserialisasi, tempat hanya disediakan untuk data object. Method dan Constructor bukan merupakan bagian dari stream serialisasi. Ada beberapa object yang tidak diserialisasi kaena data yang diwakilinya berubah secara konstan. Beberapa contoh dari setiap object adalah object FileInputStream dan Object Thread. Sebuah NotSerializableException dijalankan jika operasi serialisasi gagal karena beberapa alasan. Jangan berputus asa. Sebuah class yang mengandung object yang tidak diserialisasi dapat tetap diserialisasi jika penunjuk ke object non-serialisasi ditandai dengan katakunci transient. Pertimbangkan contoh berikut ini : class MyClass implements Serializable { transient Thread thread; //try removing transient int data; /* beberapa data yang lain*/ } Kata kunci transient mencagah data dari proses serialisasi. Object instantiasi dari class ini sekarang dapat ditulis ke sebuah OutputStream.

12.12.2 Serialisasi: Menulis Suatu Object Stream
Untuk menulis object ke sebuah stream, Anda perlu menggunakan classObjectOutputStream class dan methodnya yaitu method writeObject. Method writeObject memiliki tanda sebagai berikut : public final void writeObject(Object obj) throws IOException dimana obj adalah object yang ditulis ke stream.

Pengenalan Pemrograman 2

16

J.E.N.I.

Contoh dibawah ini menuliskan sebuah object Boolean ke sebuah ObjectOutputStream. Class Boolean mengimplementasikan interface yang dapat di Serialisasi. Selanjutnya, Instantiasi object dari class ini dapat ditulis ke dan dibaca dari sebuah stream. import java.io.*; public class SerializeBoolean { SerializeBoolean() { Boolean booleanData = new Boolean("true"); try { FileOutputStream fos = new FileOutputStream("boolean.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(booleanData); oos.close(); } catch (IOException ie) { ie.printStackTrace(); } } public static void main(String args[]) { SerializeBoolean sb = new SerializeBoolean(); } }

12.12.3 Deserialisasi: Membaca Sebuah Object Stream
Untuk membaca sebuah object dari sebuah stream, Anda perlu menggunakan class ObjectInputStream dan methodnya yaitu method readObject. Method readObject memiliki tanda sebagai berikut : public final Object readObject() throws IOException, ClassNotFoundException dimana obj adalah object yang dibaca dari stream. tipe Object dikembalikan harus melalui proses typecast ke nama class yang sesuai sebelum method pada class tersebut dapat dieksekusi. Contoh dibawah ini membaca sebuah object Boolean dari sebuah ObjectInputStream. Ini merupakan kesinambungan dari contoh sebelumnya pada serialisasi. import java.io.*; public class UnserializeBoolean { UnserializeBoolean() { Boolean booleanData = null; try { FileInputStream fis = new FileInputStream("boolean.ser"); ObjectInputStream ois = new ObjectInputStream(fis); booleanData = (Boolean) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace();
Pengenalan Pemrograman 2 17

J.E.N.I.

} System.out.println("Unserialized Boolean from " + "boolean.ser"); System.out.println("Boolean data: " + booleanData); System.out.println("Compare data with true: " + booleanData.equals(new Boolean("true"))); } public static void main(String args[]) { UnserializeBoolean usb = new UnserializeBoolean(); } }

12.13 Latihan
12.13.1 Enkripsi Sederhana
Baca dari sebuah file khusus oleh user dan encrypt isi file menggunakan teknik penggeseran yang sederhana. Juga, tanyakan pada user untuk menginput ukuran pergeseran. Output dari pesan yang telah di encrypt pada file yang lain yang memiliki nama yang juga dibuat oleh user sendiri. Sebagai contoh, Ukuran pergeseran: 1 Pesan yang dibaca dari file: Hello Pesan ter-encrypt: Ifmmp

Pengenalan Pemrograman 2

18

J.E.N.I.

BAB 13 Pengenalan Generics
13.1 Tujuan
Release Java terbaru menyediakan langkah terbesar dalam pemrograman Java dibandingkan dengan versi-versi lain sebelumnya. Ini terdiri atas ekstensi yang cukup signifikan terhadap source language syntax. Bagian yang paling terlihat yaitu penambahan generic types. Modul ini mengenalkan Anda konsep dasar mengenai Java generic types. Pada akhir pembahasan, diharapkan pembaca dapat : 1. 2. 3. 4. Mengapresiasikan keuntungan dari generic types Mendeklarasikan class generic Menggunakan constrained generic Mendeklarasikan method generic

13.2 Mengapa Generic?
Satu dari penyebab adanya bugs yang paling signifikan dalam Bahasa pemrograman Java adalah keperluan akan pernyataan typecast atau downcast untuk lebih mengkhususkan tipe data dari tipe staticnya secara terus-menerus. Sebagai contoh, Sebuah object arraylist memungkinkan kita untuk menambahkan beberapa referensi tipe object pada list tapi ketika kita mendapatkan kembali elemet ini , kita perlu untuk typecast object ke tipe referensi khusus yang sesuai dengan keperluan kita. Downcasting adalah hotspot yang potensial untuk ClassCastException. Yang juga membuat kode kita menjadi lebih panjang, jadi, menjadi lebih sedikit dapat terbaca. Lebih dari itu, downcasting juga efektif merusak manfaat dari sebuah kekuatan bahasa yang diketikkan sejak dia menghapuskan keamanan yang disediakan perusahaan berupa pemeriksaan tipe(type checking). Tujuan utama dari penambahan generic pada Java adalah untuk memecahkan masalah ini. tipe Generic memungkinkan subuah single class untuk bekerja dengan pilihan tipe yang beraneka ragam. Ini adalah jalan yang alami untuk mengeliminasi keperluan untuk pemilihan (casting). Langkah awal mempertimbangkan sebuah object ArrayList dan lihatlah bagaimana type generic akan membantu dalam peningkatan kode kita. Seperti yang sudah Anda ketahui, sebuah object arraylist memiliki kemampuan untuk menyimpan elemen-elemen dari beberapa tipe referensi untuk list ini. Sebuah instance arraylist, bagaimanapun, selalu memaksa kita untuk men-downcast object-object kita membantu mendapatkan kembali dari list. Pertimbangkan pernyataan berikut : String myString = (String) myArrayList.get(0); Versi generic dari class ArrayList didesain untuk bekerja secara asli dengan beberapa

Pengenalan Pemrograman 2

1

J.E.N.I.

tipe class. Sama seperti, dia juga mempertahankan manfaat dari pengecekan tipe (type checking). Kita dapat melanjutkannya dengan keperluan memiliki typecast elemen yang kita dapatkan dari list dan memiliki pernyataan berikut terhadap pernyataan sebelumnya : String myString = myArrayList.get(0); Walaupun downcasting sudah terhapus, ini bukan berarti bahwa Anda dapat menandai segala sesuatu sebagai return value dari method get dan melanjutkannya dengan typecasting semuanya. Jika Anda menandai sesuatu yang lain disamping sebuah String untuk output dari method get, Anda akan menghadapi sebuah waktu mengcompile type tidak sesuai seperti pesan berikut ini : found: java.lang.String required: java.lang.Integer Integer data = myArrayList.get(0); Agar hanya memiliki ide bagaimana type-type generic digunakan sebelum materi ini dibahas lebih dalam, sebaiknya Anda pertimbangkan potongan kode berikut ini : ArrayList <String> genArrList = new ArrayList <String>(); genArrList.add("A generic string"); String myString = genArrList.get(0); JoptionPane.showMessageDialog(this, myString); Amatilah melalui pernyataan, anda mungkin mengamati kata <String> segera terlihat setelah referensi tipe data arraylist. Anda dapat menerjemahkan pernyataan pertama sebagai instantiasi sebuah versi generic dari class ArrayList dan versi generic ini terdiri dari object-object dari tipe String. genArrList adalah batas dari tipe String. Oleh sebab itu, mengikat sebuah Integer atau beberapa tipe lain bukan String untuk hasil dari get function akan menjadi illegal. Pernyataan berikut ini adalah illegal. int myInt = genArrList.get();

13.3 Mendeklarasikan sebuah Class Generic
Untuk menjalankan potongan code sebelumnya, kita harus sudah mendefinisikan versi generic dari class ArrayList. Untungnya, versi java terbaru sudah menyediakan user dengan versi generic dari semua class-class Java Collection. Pada sesi ini, Anda akan mempelajari bagaimana untuk mendeklarasikan class generic anda sendiri. Dripada berdiskusi lebihpanjang lagi tentang bagaimana untuk mendeklarasikan sebuah class generic , anda akan diberikan sebuah contoh sederhana tentang class generic untuk dipelajari bentuknya. class BasicGeneric <A> { private A data; public BasicGeneric(A data) { this.data = data; } public A getData() { return data; } }

Pengenalan Pemrograman 2

2

J.E.N.I.

public class GenSample { public String method(String input) { String data1 = input; BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1); String data2 = basicGeneric.getData(); return data2; } public Integer method(int input) { Integer data1 = new Integer(input); BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1); Integer data2 = basicGeneric.getData(); return data2; } public static void main(String args[]) { GenSample sample = new GenSample(); System.out.println(sample.method("Some generic data")); System.out.println(sample.method(1234)); } }

Sekarang mari kita melalui bagian dari kode yang menggunakan syntax untuk type generic. Untuk deklarasi dari class BasicGeneric, class BasicGeneric <A> nama class diikuti oleh sepasang kurung yang didalamnya terdapat huruf kapital A: <A>. Ini disebut dengan sebuah parameter tipe. Penggunaan kurung ini mengindikasikan bahwa class yang dideklarasikan adalah class generic. Ini berarti bahwa class tidak bekerja dengan beberapa type referensi khusus. kemudian, amati bahwa sebuah field dari class dideklarasikan menjadi tipe A private A data; Deklarasi ini mengelompokkan bahwa field data adalah dari tipe generic, tergantung pada tipe data yang telah didesain untuk bekerja dengan object BasicGeneric. Ketika mendeklarasikan sebuah instance dari class, anda harus mengelompokkan tipe referensi dengan yang mana yang anda inginkan untuk bekerja sama. BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1); Syntax <String> setelah mendeklarasi BasicGeneric mengelompokkan bahwa instance dari class ini akan bekerja dengan variabel-variabel bertipe String. Anda juga dapat bekerja denga variabel-variabel bertipe Integer atau referensi tipe yang lain. Untuk bekrja dengan Integer, potongan kode memiliki pernyataan berikut ini : BasicGeneric <Integer> basicGeneric = new

Pengenalan Pemrograman 2

3

J.E.N.I.

BasicGeneric <Integer>(data1); Anda mungkin dapat menerjemahkan sisa dari kode dengan pemahaman anda sendiri. Mempertimbangkan deklarasi dari method getData . public A getData() { return data; } Method getData mengembalikan sebuah nilai dari tipe A, Sebuah Tipe type. Ini bukan berarti bahwa method tidak akan memiliki tipe data runtime, atau even pada waktu meng-compile. Setelah Anda mendeklarasikan sebuah object yang bertipe BasicGeneric, A adalah pengikat ke sebuah tipe data yang spesifik. Instance ini akan berlaku sebagai jika ini dideklarasikan untuk memiliki tipe data spesifik ini dan tipe ini hanya dari bagian sangat awal. Pada kode yang diberikan, dua instances dari class BasicGeneric terbentuk. BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1); String data2 = basicGeneric.getData(); BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1); Integer data2 = basicGeneric.getData(); Perlu diperhatikan perhatian bahwa instantiasi dari class generic adalah hanya sama dengan instantiasi sebuah class normal kecuali bahwa tipe data khusus berada dalam <> menggantikan nama konstruktor. Informasi tambahan ini mengindikasikan tipe dari data anda akan bekerja dengan siapa untuk bagian instance ini dari class BasicGeneric.Setelah instantiasi, anda dapat mengakses anggota dari class melalui instance sekarang. Tidak ada yang lebih diperlukan untuk typecast nilai pengembalian dari method getData sejak diputuskan bahwa ini akan bekerja dengan sebuah referensi tipe data yang spesifik.

13.3.1 Pembatasan"Primitive"
Sebuah pembatasan type generic dalam Java adalah mereka dibatasi oleh tipe referensi dan tidak akan bekerja dengan tipe data primitive. Sebagai contoh, pernyataan berikut akan menjadi illegal sejak int adalah sebuah tipe data primitive. BasicGeneric <int> basicGeneric = new BasicGeneric <int>(data1); Petama-tama Anda akan menyelesaikan type primitive sebelum menggunakan mereka sebagai arguments ke sebuah type generic.

13.3.2 Meng-compilasi Generic
Untuk meng-compile source codes Java denagn type generic menggunakan JDK (v.

Pengenalan Pemrograman 2

4

J.E.N.I.

1.5.0), gunakan syntax berikut ini : javac -version -source "1.5" -sourcepath src -d classes src/SwapClass.java Dimana src mengarah pada lokasi dari source code java sementara class mengarah pada lokasi dimana file class akan disimpan. Beriut ini sebuah contoh : javac -version -source "1.5" -sourcepath c:\temp -d c:\temp c:/temp/SwapClass.java

13.4 Constrained Generic
Dalam contoh yang diberikan terdahulu, type parameter dari class BasicGeneric dapat memiliki beberapa referensi tipe data. Ada beberapa kasus, bagaimanapun, dimana anda ingin untuk membatasi tipe instantiasi yang potensial dari class generic. Java juga memungkinkan kita untuk membatasi set argument type yang mungkin untuk subtypes dari sebuah batas type yang diberikan. Sebagai contoh, kita mungkin ingin untuk mendefinisikan sebuah class generic ScrollPane yang merupakan sebuah template untuk sebuah Container asli yang telah dilengkapi dengan fungsi scrolling. Tipe runtime dari sebuah instance dari class ini akan sering menjadi sebuah subclass dari Container, tapi tipe static atau general adalah Container yang lebih sederhana. Untuk membatasi instantiasi tipe dari sebuah class, kita menggunakan kata kunci extends diikuti oleh class yang membatasi tipe generic sebagai bagian dari tipe parameter. Contoh berikut ini membatasi instantiasi tipe dari class ScrollPane ke subtipe dari class Container. class ScrollPane <MyPane extends Container> { ... } class TestScrollPane { public static void main(String args[]) { ScrollPane <Panel> scrollPane1 = new ScrollPane <Panel>(); // pernyataan berikutnya adalah illegal ScrollPane <Button> scrollPane2 = new ScrollPane <Button>(); } } 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. menggunakan generic constrained yang dapat memberikan kita penambahan
5

Pengenalan Pemrograman 2

J.E.N.I.

pengecekan tipe static. Sebagai sebuah hasil, kita akan menjamin bahwa setiap instantiasi dari tipe generic yang melekat pada batas yang kita miliki. Sejak kita yakin bahwa setiap tipe instantiasi adalah sebuah subclass dari batas yang dimiliki, kita dapat memanggil beberapa method secara aman yang ditemukan dalam objek static tipe. Jika kita belum menempatkan beberapa batas eksplisit pada parameternya, default batas adalah Object. Ini berarti bahwa kita tidak dapat menjalankan method pada sebuah instance dari batas yang tidak ditampilkan dalam class Object.

13.5 Mendeklarasikan sebuah Method Generic
Disamping mendeklarasikan sebuah class generic, Java juga memberi kita perlakuan khusus untuk mendeklarasikan sebuah method generic. ini disebut dengan method polymorphic, yang mana didefinisikan menjadi method yang diberi nilai parameter berupa tipe. method parameterisasi sangat membantu kita kita ingin untuk menampilkan tugas dimana ketergantungan tipe antara argument dan nilai pengembalian aslinya merupakan generic, tapi generic sebenarnya tidak mempercayakan pada beberapa tipe level class informasi dan akan merubah dari method call ke method call. Sebagai contoh, Andaikata kita menginginkan untuk menambahkan sebuah method make untuk sebuah class ArrayList. Method static ini akan diambil dalam sebuah argument tunggal, yang mana akan menjadi satu-satunya elemen dari object ArrayList. Untuk membuat generic ArrayList kita, sebagai penampung beberapa tipe elemen, argumen tunggal dalam method make harus memiliki sebuah tipe generic sebagai sebuah argumen dan sebagai sebuah tipe nilai kembalian. Untuk mendeklarasikan tipe generic pada level method, 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); } } Java juga menggunakan sebuah mekanisme type-inference untuk secara otomatis menyimpulkan tipe method polymorphic berdasarkan pada tipe-tipe argumennya. Ini mengurangi panjang dan kompleksitas dari sebuah alur untuk menjalankan suatu method. Untuk membangun sebuah instance baru dari ArrayList<Integer>, kita mempunyai cara yang cukup sederhana yaitu pernyataan berikut : Utilities.make(Integer(0));

Pengenalan Pemrograman 2

6

J.E.N.I.

13.6 Latihan
13.6.1 Swapping
Membentuk sebuah class dengan sebuah versi generic dari method printSwapped. Method ini menukar secara sederhana nilai dari parameternya secara lokal dan mencetak nilainya. Catatan bahwa pencetakan harus dilakukan pada method ini. Mencetak nilai dari argument dalam method lain tidak akan bekerja karena Java melewatkan object ke method melalui suatu nilai. Uji method ini pada object Integer, object String dan object ArrayList.

Pengenalan Pemrograman 2

7

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->