Anda di halaman 1dari 169

 

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 Persyaratan-persyaratan Untuk Latihan Laboratorium


Joyce Avestro
Sistem Operasi yang mendukung

NetBeans IDE 5.5 berjalan pada sistem operasi yang mendukung Java VM.
Team Dibawah ini merupakan daftar dari platform-platform yang digunakan:
Joyce Avestro
Florence Balagtas
• Microsoft Windows XP Professional SP2 atau yang terbaru
Rommel Feria
• Mac OS X 10.4.5 atau yang terbaru
Reginald Hutcherson
• Red Hat Fedora Core 3
Rebecca Ong
• Sistem Operasi Solaris™ 10 Update 1 (SPARC® and x86/x64
John Paul Petines Platform Edition)
Sang Shin
Raghavan Srinivas NetBeans Enterprise Pack juga dapat digunakan pada platform-platform
Matthew Thompson berikut ini:

• Microsoft Windows 2000 Professional SP4


Team Translator • Solaris™ 8 OS (SPARC and x86/x64 Platform Edition) and Solaris 9
Frans Thamura OS (SPARC and x86/x64 Platform Edition)
Joko Pitono • Berbagai macam distribusi LINUX
Eko Subiyantoro
Cahya Kusuma Ratih Minimum konfigurasi Hardware
Dwi Martha Sari
Mir’atul Khusna Mufida Catatan: Minimum resolusi layar NetBeans IDE's adalah 1024x768 pixels.
Khansa Fitriannisa
Sulistyaningtyas • Sistem Operasi Microsoft Windows:
Allin Junikhah o Prosesor: 500 MHz Intel Pentium III workstation atau
Bagus Chandra setaranya
Rizzatama N.S o Memori: 512 MB
Badar Agung Nugroho o Disk space: 850 MB dari free disk space
Kadek Surya Pranata • 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 Prosesor: AMD Opteron 100 Series 1.8 GHz


o Memori: 1 GB
o 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 default/package protected public


class yang sama Yes Yes Yes Yes
package yang sama Yes Yes Yes
package yang Yes Yes
berbeda (subclass)
package yang Yes
berbeda (non-
subclass)

Tabel 1.2: Acces Modifier

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 dan
package(yakni jika tidak ada acces modifier mengawali kata kunci class).

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

Contoh berikut menunjukkan bagaimana mendeklarasikan dan menggunakan sebuah interface.

Pengenalan Pemrograman 2 10
J.E.N.I.

interface MyInterface {
void iMethod();
}
class MyClass1 implements MyInterface {
public void iMethod() {
System.out.println("Interface method.");
}

void myMethod() {
System.out.println("Another method.");
}
}

class MyClass2 implements MyInterface {


public void iMethod() {
System.out.println("Another implementation.");
}
}

class InterfaceDemo {
public static void main(String args[]) {
MyClass1 mc1 = new MyClass1();
MyClass2 mc2 = new MyClass2();

mc1.iMethod();
mc1.myMethod();
mc2.iMethod();
}
}

1.3.14 Kata kunci this

Kata kunci this dapat digunakan untuk beberapa alasan berikut:


1.Adanya ambigu pada atribut lokal dari variabel lokal
2.Menunjuk pada object yang meminta method non-static
3.Menunjuk pada constructor lain.

Sebagai contoh pada maksud pertama, perhatikan kode berikut dimana variabel data disediakan
sebagai sebuah atribut dan parameter lokal pada saat yang sama.

class ThisDemo1 {
int data;
void method(int data) {
this.data = data;
/* this.data menunjuk ke atribut
sementara data menunjuk ke variabel lokal */
}
}

Contoh berikut menunjukkan bagaimana object this secara mutlak menunjuk ketika anggota non-

Pengenalan Pemrograman 2 11
J.E.N.I.

static dipanggil.

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

Sebelum melihat ke contoh yang lain, mari pertama meninjau pengertian method overloading.
Constructor seperti juga method dapat juga menjadi overload. Method yang berbeda dalam class
dapat memberi nama yang sama asalkan list parameter juga berbeda. Method overloaded harus
berbeda dalam nomor dan/atau tipe dari parameternya. Contoh selanjutnya memiliki constructor
overloaded dan referensi this yang dapat digunakan untuk menunjuk versi lain dari constructor.

class ThisDemo3 {
int data;
ThisDemo3() {
this(100);
}
ThisDemo3(int data) {
this.data = data;
}
}

Petunjuk Penulisan Program:


Memanggil this() harus ada pernyataan pertama dalam constructor.

1.3.15 Kata kunci super

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

class Person {
String firstName;
String lastName;
Person(String fname, String lname) {
firstName = fname;
lastName = lname;
}
}

class Student extends Person {


String studNum;
Student(String fname, String lname, String sNum) {
super(fname, lname);

Pengenalan Pemrograman 2 12
J.E.N.I.

studNum = sNum;
}
}

Petunjuk Penulisan Program:


super() menunjuk pada superclass dengan segera. Ini harus berada pada pernyataan pertama
dalam constructor superclass.

Kata kunci dapat juga digunakan untuk menunjuk anggota superclass seperti yang ditunjukkan
pada contoh berikut.

class Superclass{
int a;
void display_a(){
System.out.println("a = " + a);
}
}

class Subclass extends Superclass {


int a;
void display_a(){
System.out.println("a = " + a);
}
void set_super_a(int n){
super.a = n;
}
void display_super_a(){
super.display_a();
}
}

class SuperDemo {
public static void main(String args[]){
Superclass SuperObj = new Superclass();
Subclass SubObj = new Subclass();
SuperObj.a = 1;
SubObj.a = 2;
SubObj.set_super_a(3);
SuperObj.display_a();
SubObj.display_a();
SubObj.display_super_a();
System.out.println(SubObj.a);
}
}

Program tersebut akan menampilkan hasil berikut.


a = 1
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 2 3 4 5
1 1
2 2 4
3 3 6 9
4 4 8 12 16
5 5 10 15 20 25

1.4.2 Greatest Common Factor(GCF)

Tulis sebuah program yang mempunyai tiga integer dan menghitung nilai GCF dari tiga angka.
GCF adalah angka terbesar yang secara rata dibagi ke semua angka yang diberikan.

Input 1: 25 Input 1: 1 Input 1: 9


Input 2: 15 Input 2: 2 Input 2: 27
Input 3: 35 Input 3: 3 Input 3: 12
GCF: 5 GCF: 1 GCF: 3

1.4.3 Shape

Buatlah class Shape. class memiliki dua field String: name dan size. class mempunyai method
printShapeInfo, dimana hanya mengeluarkan nilai name dan field size dari object Shape. Juga
memiliki method printShapeName dan printShapeSize, dimana mencetak nama dan size dari
object, berturut-turut.
Menggunakan pewarisan, buat class Square dengan field yang sama dan method seperti itu dari
class Shape. Class ini mempunyai dua tambahan field integer: length dan width. Method
printShapeLength dan printShapeWidth yang mencetak panjang dan lebar object yang juga
termasuk dalam class ini. Anda juga harus meng-override printShapeInfo untuk mencetak
keluaran field tambahan dalam subclass juga.

1.4.4 Binatang

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

Pengenalan Pemrograman 2 16
J.E.N.I.

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 non-
public methods jika public methods dapat diakses oleh class lain. Hal itu mungkin
terjadi bila penulis dari class lain tidak menyadari bahwa mereka dapat
menonaktifkan assertions. Dalam hal ini program tidak dapat bekerja dengan baik.
Pada non-public methods, hal tersebut tergunakan secara langsung oleh kode yang
ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga

Pengenalan Pemrograman 2 10
J.E.N.I.

mereka menyadari bahwa saat menjalankannya, assertion harus dalam keadaan


aktif.

Untuk mengkompilasi file yang menggunakan assertions, sebuah tambahan


parameter perintah diperlukan seperti yang terlihat dibawah ini :

javac –source 1.4 MyProgram.java

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

java MyProgram

Namun, jika Anda ingin mengaktifkan assertions, Anda perlu menggunakan


parameter –enableassertions atau –ea.

java –enableassertions MyProgram

2.6.3 Sintaks Assertions

Penulisan assertions memiliki dua bentuk.

Bentuk yang paling sederhana terlihat sebagai berikut :

assert <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 macam-
macam 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 elemen-
elemen hanya diperbolehkan pada tumpukan teratas dari stack. Hal ini merupakan
perintah pengumpulan data secara linier yang disebut “last in, first out” (LIFO). Stacks
berguna untuk bermacam-macam aplikasi seperti pattern recognition dan
pengkonversian antar notasi infix, postfix dan prefix.

Dua operasi yang dihubungkan dengan stacks adalah operasi push dan pop. Push berarti
memasukkan data ke dalam stacks yang paling atas dimana pop sebagai
penunjuk/pointer untuk memindahkan elemen ke atas stacks. Untuk memahami
bagaimana cara kerja stacks, pikirkan bagaimana Anda dapat menambah atau
memindakan sebuah data dari tumpukan data. Pikiran Anda akan memberitahu Anda
untuk menambah atau memindahkan data hanya pada stack yang paling atas karena
jika menggunakan cara lain, dapat menyebabkan tumpukan stack akan terjatuh.

Dibawah ini merupakan ilustrasi bagaimana tampilan dari stacks.

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

Tabel 1.2.2: Ilustrasi Stack

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

Pengenalan Pemrograman 2 5
J.E.N.I.

3.3.3 Queues

Queues adalah contoh lain dari ADT. Hal ini merupakan perintah pengumpulan data yang
disebut “first-in, first-out”. Aplikasi ini meliputi tugas penjadwalan dalam sistem operasi,
topological sorting dan graph traversal.

Enqueue dan dequeue merupakan operasi yang berhubungan dengan queues. Enqueue
menunjuk pada memasukkan data pada akhir queue sedangkan dequeue berarti
memindahkan elemen dari queue tersebut. Untuk mengingat bagaimana queue bekerja,
ingatlah arti khusus dari queue yaitu baris. Berikut ini bagaimana cara kerja queue.
Siapa yang akan mendapatkan kesempatan pertama untuk bertemu bintang idolanya
dari mereka yang sedang menunggu dalam sebuah barisan? Seharusnya orang pertama
yang berada pada barisan tersebut. Orang ini mendapat kesempatan pertama untuk
meninggalkan barisan. Hubungkan hal tersebut dengan bagaimana queue bekerja.

Berikut ini merupakan ilustrasi dari bagaimana tampilan dari queue.

0 1 2 3 4 5 6 7 8 9 ... n-1
Eve Jayz KC Jojo Toto Kyla DMX
front end Insert
Delete

Tabel 1.2.3: Ilustrasi Queue

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

3.3.4 Sequential and Linked Representation

ADTs biasanya dapat diwakilkan menggunakan sequential dan linked representation. Hal
ini memudahkan untuk membuat sequential representation dengan menggunakan array.
Bagaimanapun juga, masalah dengan menggunakan array adalah pembatasan size,
yang membuatnya tidak fleksibel. Dengan menggunakan array, sering terjadi
kekurangan atau kelebihan space memori. Mempertimbangkan hal tersebut, Anda harus
membuat sebuah array dan mendeklarasikannya agar mampu menyimpan 50 elemen.
Jika user hanya memasukkan 5 elemen, maka 45 space pada memori akan sia-sia. Disisi
lain, jika user ingin memasukkan 51 elemen, space yang telah disediakan didalam array
tidak akan cukup.

Dibandingkan dengan sequential representation, linked representation lebih sedikit rumit


tetapi lebih fleksibel. Linked representation menyesuaikan memori yang dibutuhkan oleh
user. Penjelasan lebih lanjut pada linked representation akan didiskusikan pada bab
berikutnya.

3.3.5 Sequential Representation dari Integer Stack


class SeqStack {
int top = -1; /* pada permulaan, stack kosong*/
int memSpace[]; /* penyimpanan untuk integer */
int limit; /* ukuran dari memSpace */

Pengenalan Pemrograman 2 6
J.E.N.I.

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

3.3.6 Linked Lists

Sebelum mengimplementasikan linked representation dari stacks, pertama mari kita


pelajari bagaimana membuat linked representation. Dalam hal ini, kita akan
menggunakan linked list.

Linked list merupakan struktur dinamis yang berlawanan dengan array, dimana
merupakan struktur statis. Hal ini berarti linked list dapat tumbuh dan berkurang dalam
ukuran yang bergantung pada kebutuhan user. Linked list digambarkan sebagai
kumpulan dari nodes, Yang masing-masing berisi data dan link atau pointer ke node
berikutnya di dalam list.

Pengenalan Pemrograman 2 7
J.E.N.I.

Gambar dibawah ini menunjukkan tampilan dari node.

Gambar 2.6a: Sebuah node

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

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

Berikut ini bagaimana class node diimplementasikan. Class ini dapat digunakan untuk
membuat linked list.

class Node {
int data; /* integer data diisikan dalam node */
Node nextNode; /* node selanjutnya dalam list */
}

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

Pengenalan Pemrograman 2 8
J.E.N.I.

3.3.7 Linked Representation dari Integer Stack


Sekarang Anda telah mempelajari tentang linked list. Maka Anda telah siap untuk
menerapkan apa yang telah Anda pelajari untuk implementasi linked representation dari
stack.

class DynamicIntStack{
private IntStackNode top; /* head atau puncak dari stack */
class IntStackNode { /* class node */
int data;
IntStackNode next;
IntStackNode(int n) {
data = n;
next = null;
}
}

void push(int n){


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

Pengenalan Pemrograman 2 9
J.E.N.I.

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> <interface>
Set List
<implementing classes> <implementing classes>
HashSet LinkedHashSet TreeSet ArrayList LinkedList Vector
Tabel 1.2.8a: Java collections

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

Pengenalan Pemrograman 2 10
J.E.N.I.

Disarankan bahwa Anda mengacu pada Collection methods yang terbaru dimana Anda
lebih mudah mengerti generic types, yang akan didiskusikan pada chapter berikutnya.

Collection Methods
public boolean add(Object o)
Memasukkan Object o ke dalam collection ini. Mengembalikan nilai true jika o telah
sukses ditambahkan ke dalam collection.
public void clear()
Menghapus semua elemen dari collection ini.
public boolean remove(Object o)
Menghapus single instance dari Object o pada collection ini, jika hal tersebut telah
diinputkan. Mengembalikan nilai true jika o telah ditemukan dan dihapus dari
collection.
public boolean contains(Object o)
Mengembalikan nilai true jika collection ini berisi Object o.
public boolean isEmpty()
Mengembalikan nilai true jika collection ini tidak berisi object atau elemen apapun.
public int size()
Mengembalikan jumlah dari elemen pada collection ini.
public Iterator iterator()
Mengembalikan sebuah iterator yang menunjukkan kita pada isi collection ini.
public boolean equals(Object o)
Mengembalikan nilai true jika Object o sama dengan yang ada pada collection ini.
public int hashCode()
Mengembalikan nilai hash code (yaitu ID) untuk collection ini. Objects atau collections
yang sama memiliki nilai hash code atau ID yang sama.

Tabel 1.2.8b: Methods dari class Collection

Anda diharapkan mengacu pada dokumentasi API untuk mengetahui daftar lengkap dari
methods dalam interface Collection, List dan Set.
Saat ini kita akan melihat beberapa classes collection. Harap mengacu pada API untuk
daftar dari methods yang dimasukkan ke dalam class ini.

Pada bagian sebelumnya, Anda telah melihat bagaimana mengimplementasikan linked


list dengan cara Anda sendiri. Java SDK juga telah menyediakan built-implementation
dari linked list untuk kita. Class LinkedList berisi methods yang memperbolehkan linked
list digunakan seperti stacks, queue atau ADT yang lain. Listing program berikut ini
menunjukan bagaimana menggunakan class LinkedList.

Pengenalan Pemrograman 2 11
J.E.N.I.

import java.util.*;

class LinkedListDemo {
public static void main(String args[]) {
LinkedList list = new LinkedList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(3));
list.add(new Integer(1));
System.out.println(list + ", size = " + list.size());
list.addFirst(new Integer(0));
list.addLast(new Integer(4));
System.out.println(list);
System.out.println(list.getFirst() + ", " +
list.getLast());
System.out.println(list.get(2) + ", " + list.get(3));
list.removeFirst();
list.removeLast();
System.out.println(list);
list.remove(new Integer(1));
System.out.println(list);
list.remove(3);
System.out.println(list);
list.set(2, "one");
System.out.println(list);
}
}

ArrayList merupakan versi fleksibel dari array biasa. Yang mengimplementasikan List
interface. Telitilah kode berikut ini.

import java.util.*;

class ArrayListDemo {
public static void main(String args[]) {
ArrayList al = new ArrayList(2);
System.out.println(al + ", size = " + al.size());
al.add("R");
al.add("U");
al.add("O");
System.out.println(al + ", size = " + al.size());
al.remove("U");
System.out.println(al + ", size = " + al.size());
ListIterator li = al.listIterator();
while (li.hasNext())
System.out.println(li.next());
Object a[] = al.toArray();
for (int i=0; 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 class-
class 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 constructor-
constructor 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 variabel-
variabel non-objek yang sederhana. Demikian daftar dari class wrapper.

Tipe Data Primitive Class Wrapper yang Sesuai


Boolean Boolean
Char Character
Byte Byte
Short Short
Int Integer
Long Long
Float Float
Double Double

Tabel 1.3: Tipe data primitif dan class wrappernya yang sesuai

Nama-nama class wrapper cukup mudah untuk diingat selama nama-nama itu sama
dengan tipe data primitive. Dan juga sebagai catatan, bahwa class-class wrapper diawali
dengan huruf besar dan versi yang ditunjukkan dari tipe data primitive.

Di bawah ini contoh penggunaan class wrapper untuk boolean.

class BooleanWrapper {
public static void main(String args[]) {
boolean booleanVar = 1>2;
Boolean booleanObj = new Boolean("TRue");
/* primitif ke objek; dapat juga menggunakan method
valueOf */
Boolean booleanObj2 = new Boolean(booleanVar);
System.out.println("booleanVar = " + booleanVar);
System.out.println("booleanObj = " + booleanObj);
System.out.println("booleanObj2 = " + booleanObj2);
System.out.println("compare 2 wrapper objects: " +
booleanObj.equals(booleanObj2));
/* objek ke primitif */
booleanVar = booleanObj.booleanValue();
System.out.println("booleanVar = " + booleanVar);
}
}

Pengenalan Pemrograman 2 9
J.E.N.I.

4.5 Class Process dan Runtime


4.5.1 Class Process
class Process menyediakan method-method untuk memanipulasi proses-proses, seperti
mematikan proses, menjalankan proses dan mengecek status proses. Class ini
merepresentasikan program- program yang berjalan. Di bawah ini beberapa method
pada class Process.

Method-Method Process
public abstract void destroy()
Mengakhiri proses.
public abstract int waitFor() throws InterruptedException
Tidak mengirim sampai proses yang dipanggil berakhir.

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 lingkungan runtime yang
berhubungan dengan aplikasi Java saat itu.
public Process exec(String command) throws IOException
Disebabkan command yang ditentukan untuk dieksekusi. Memperbolehkan Anda
mengeksekusi proses baru.

Tabel 1.4.2: Beberapa method dari class Runtime

4.5.3 Membuka Registry Editor


Berikut program untuk membuka registry editor tanpa harus mengetikkan perintah dari
command prompt.

class RuntimeDemo {
public static void main(String args[]) {
Runtime rt = Runtime.getRuntime();
Process proc;
try {
proc = rt.exec("regedit");
proc.waitFor(); //cobalah menghapus baris ini
} catch (Exception e) {
System.out.println("regedit is an unknown command.");
}

Pengenalan Pemrograman 2 10
J.E.N.I.

}
}

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: " + (endTime-
startTime) + " ms.");
System.gc(); //force garbage collector to work
System.setIn(new FileInputStream("temp.txt"));
System.exit(0);
}
}

Pengenalan Pemrograman 2 12
J.E.N.I.

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

Input: 10
Output: 72.35939938935488
Input: 11
Output: 87.20864179427238

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

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

Pengenalan Pemrograman 2 13
J.E.N.I.

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 1st Pass 2nd Pass 3rd Pass 4th Pass

Mango Mango Apple Apple Apple

Apple Apple Mango Mango Banana

Peach Peach Peach Orange Mango

Orange Orange Orange Peach Orange

Banana Banana Banana Banana Peach

Gambar 1.1.2: Contoh insertion sort

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

6.3 Selection Sort


Jika Anda diminta untuk membuat algoritma sorting tersendiri, anda mungkin akan
menemukan sebuah algoritma yang mirip dengan selection sort. Layaknya insertion
sort, algoritma ini sangat rapat dan mudah untuk diimplementasikan.

Mari kita kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket
kartu. Asumsikan bahwa kartu tersebut akan diurutkan secara ascending. Pada
awalnya, kartu tersebut akan disusun secara linier pada sebuah meja dari kiri ke
kanan, dan dari atas ke bawah. Pilih nilai kartu yang paling rendah, kemudian
tukarkan posisi kartu ini dengan kartu yang terletak pada pojok kiri atas meja. Lalu
cari kartu dengan nilai paling rendah diantara sisa kartu yang tersedia. Tukarkan
kartu yang baru saja terpilih dengan kartu pada posisi kedua. Ulangi langkah –
langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan
dapat digeser dengan kartu yang bernilai lebih rendah.

Pengenalan Pemrograman 2 2
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 1st Pass 2nd Pass 3rd Pass 4th Pass

Maricar Hannah Hannah Hannah Hannah

Vanessa Vanessa Margaux Margaux Margaux

Margaux Margaux Vanessa Maricar Maricar

Hannah Maricar Maricar Vanessa Rowena

Rowena Rowena Rowena Rowena Vanessa

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

Geser elemen kiri kearah kanan sampai ditemukan nilai yang lebih besar dari elemen
pivot tersebut. Geser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen
yang tidak lebih besar dari elemen tersebut.
kiri kanan
3 1 4 1 5 9 2 6 5 3 5 8

Tukarkan antara elemen kiri dan kanan


kiri kanan
3 1 3 1 5 9 2 6 5 4 5 8

Pengenalan Pemrograman 2 6
J.E.N.I.

Geserkan lagi elemen kiri dan kanan.


kiri kanan
3 1 3 1 5 9 2 6 5 4 5 8

Tukarkan antar elemen kembali.


kiri kanan
3 1 3 1 2 9 5 6 5 4 5 8

Geserkan kembali elemen kiri dan kanan.


kanan kiri
3 1 3 1 2 9 5 6 5 4 5 8

Terlihat bahwa titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen
kanan < elemen kiri. Dalam hal ini tukarkan elemen pivot dengan elemen kanan.
pivot
2 1 3 1 3 9 5 6 5 4 5 8

Gambar 1.4.2: Contoh quicksort

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

6.6 Latihan
6.6.1 Insertion Sort

Impelementasikan algoritma insertion sort dalam Java untuk mengurutkan


serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda
terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command
line.

6.6.2 Selection Sort

Pengenalan Pemrograman 2 7
J.E.N.I.

Impelementasikan algoritma selection sort dalam Java untuk mengurutkan


serangkaian data integer. Lakukan percobaan terhadap hasil implementasi anda
terhadap rangkaian data integer yang dimasukkan oleh pengguna melalui command
line.

6.6.3 Merge Sort

Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.

class MergeSort {
static void mergeSort(int array[], int startIdx,
int endIdx) {
if(startIdx == _____) {
return;
}
int length = endIdx-startIdx+1;
int mid = _____;
mergeSort(array, _____, mid);
mergeSort(array, _____, endIdx);
int working[] = new int[length];
for(int i = 0; i < length; i++) {
working[i] = array[startIdx+i];
}
int m1 = 0;
int m2 = mid-startIdx+1;
for(int i = 0; i < length; i++) {
if(m2 <= endIdx-startIdx) {
if(m1 <= mid-startIdx) {
if(working[m1] > working[m2]) {
array[i+startIdx] = working[m2++];
} else {
array[i+startIdx] = _____;
}
} else {
array[i+startIdx] = _____;
}
} else {
array[_____] = working[m1++];
}
}
}

public static void main(String args[]) {


int numArr[] = new int[args.length];
for (int i = 0; i < args.length; i++) {
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 Deskripsi


Komponen Abstract Class untuk object yang dapat ditampilkan pada console dan
berinteraksi dengang user. Bagian utama dari semua class AWT.

Kontainer Abstract Subclass dari Component Class. Sebuah komponen yang dapat
menampung komponen yang lainnya.

Panel Turunan dari Container Class. Sebuah frame atau window tanpa titlebar,
menubar tidak termasuk border. Superclass dari applet class.

Window Turunan dari Container class. Top level window, dimana berarti tidak bisa
dimasukkan dalam object yang lainnya.Tidak memiliki border dan menubar.

Frame 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)

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() drawPolyline() setColor()

fillRect() drawPolygon() getFont()

drawRect() fillPolygon() setFont()

clearRect() getColor() drawString()

Tabel 1.2.2a: Beberapa metode dari kelas Graphics

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

Format Constructor Deskripsi


Color(int r, int g, int b) Nilai integer 0 - 255.

Color(float r, float g, float b) Nilai float 0.0 - 1.0.

Color(int rgbValue) 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 Button Choice

TextField Checkbox List

TextArea CheckboxGroup 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. BorderLayout.NORTH
2. BorderLayout.SOUTH
3. BorderLayout.EAST
4. BorderLayout.WEST
5. 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 Penjelasan
Swing
JComponent class induk untuk semua komponen Swing, tidak termasuk top-level
kontainer

JButton Tombol “push”. Berhubungan dengan class button dalam package AWT

JCheckBox Item yang dapat dipilih atau tidak oleh pengguna. Berhubungan dengan
class checkbox dalam package AWT

JFileChooser Mengijinkan pengguna untuk memilih sebuah file. Berhubungan dengan


class filechooser dalam package AWT

Pengenalan Pemrograman 2 11
J.E.N.I.

Komponen Penjelasan
Swing
JTextField Mengijinkan untuk mengedit text satu baris. Berhubungan dengan class
textfield dalam package AWT.

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

JPanel Turunan Jcomponent. Class Container sederhana tetapi bukan top-level.


Berhubungan dengan class panel dalam package AWT.

JApplet Turunan dan Berhubungan dengan class Applet dalam package AWT. Juga
sedikit tidak cocok dengan class applet dalam kaitannya dengan
menambahkan komponen pada container

JOptionPane Turunan Jcomponent. Disediakan untuk mempermudah menampilkan pop-


up kotak dialog.

JDialog Turunan dan Berhubungan dengan class dialog dalam package AWT.
Biasanya digunakan untuk menginformasikan sesuatu kepada pengguna
atau prompt pengguna untuk input.

JColorChooser Turunan Jcomponent. Memungkinkan pengguna untuk memilih warna yang


diinginkan.

Tabel 1.4: Beberapa komponen Swing

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 AWT-
based events. Berikut ini beberapa dari class-class AWT event.

Class Event Deskripsi


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

Tabel 1.2: Class-Class Event

Catatan, bahwa semua subclass-subclass AWTEvent mengikuti konvensi nama berikut


ini:
<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 Deskripsi


ActionListener Bereaksi atas perubahan mouse atau atau keyboard.
MouseListener Bereaksi atas pergerakan mouse.
MouseMotionListener Interface MouseMotionListener mendukung MouseListener.
Menyediakan method-method yang akan memantau pergerakan
mouse,seperti drag dan pemindahan mouse.
WindowListener Bereaksi atas perubahan window.

Tabel 1.3: Event Listeners

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 class-
class adapter yang menerapkan semua method dari masing-masing listener interface
dengan lebih dari satu method. Implementasi dari method-method semuanya adalah
kosong.

8.5.1 Close Window Example

import java.awt.*;
import java.awt.event.*;

class CloseFrame extends Frame{


Label label;
CFListener w = new CFListener(this);

CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(w);
}

void launchFrame() {
setSize(300,300);
setVisible(true);
}

public static void main(String args[]) {


CloseFrame cf = new CloseFrame("Close Window Example");
cf.launchFrame();
}
}

class CFListener extends WindowAdapter{


CloseFrame ref;
CFListener( CloseFrame ref ){
this.ref = ref;
}

public void windowClosing(WindowEvent e) {


ref.dispose();
System.exit(1);
}
}

Pengenalan Pemrograman 2 8
J.E.N.I.

8.6 Inner Class dan Anonymous Inner Class


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

8.6.1 Inner Class


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

8.6.2 Contoh Menutup Window


import java.awt.*;
import java.awt.event.*;

class CloseFrame extends Frame{


Label label;

CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(new CFListener());
}

void launchFrame() {
setSize(300,300);
setVisible(true);
}

class CFListener extends WindowAdapter {


public void windowClosing(WindowEvent e) {
dispose();
System.exit(1);
}
}

public static void main(String args[]) {


CloseFrame cf = new CloseFrame("Close Window
Example");
cf.launchFrame();
}
}

Pengenalan Pemrograman 2 9
J.E.N.I.

8.6.3 Anonymous Inner Class


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

8.6.4 Contoh Menutup Window

import java.awt.*;
import java.awt.event.*;

class CloseFrame extends Frame{


Label label;

CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
dispose();
System.exit(1);
}
});
}

void launchFrame() {
setSize(300,300);
setVisible(true);
}

public static void main(String args[]) {


CloseFrame cf = new CloseFrame("Close Window Example");
cf.launchFrame();
}
}

Pengenalan Pemrograman 2 10
J.E.N.I.

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

Gambar 8.2 : Program Tic-Tac-Toe

Pengenalan Pemrograman 2 11
J.E.N.I.

BAB 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 jangka waktu milis. Hal ini dapat menyebabkan
InterruptedException.
public void run()
Eksekusi thread dimulai dari method ini.
public void start()
Menyebabkan eksekusi dari thread berlangsung dengan cara memanggil method run.

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 main(String args[]) {
PrintNameThread pnt1 = new PrintNameThread("A");
PrintNameThread pnt2 = new PrintNameThread("B");
PrintNameThread pnt3 = new PrintNameThread("C");
PrintNameThread 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 PrintNameThread("A");
new PrintNameThread("B");
new PrintNameThread("C");
new 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 saat-
saat 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 bersama-
sama 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 bersama-


sama 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 permasalahan-
permasalahan 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 pelayan-


pelanggan. 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 produsen-
konsumen. 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 8
Generate 45
Generate 52
Generate 65
Get 65
Generate 23
Get 23
Generate 49

Pengenalan Pemrograman 2 14
J.E.N.I.

Get 49
Generate 35
Get 35
Generate 39
Get 39
Generate 85
Get 85
Get 85
Get 85
Generate 35
Get 35
Get 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 76
Get 76
Generate 25
Get 25
Generate 34
Get 34
Generate 84
Get 84
Generate 48
Get 48
Generate 29
Get 29
Generate 26
Get 26
Generate 86
Get 86
Generate 65
Get 65
Generate 38
Get 38
Generate 46
Get 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 me-
manage 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[] cbuf)- Membaca karakter dan menyimpannya dalam
karakter array cbuf.
public abstract int read(char[] cbuf, int offset, int length)- Membaca
karakter sejumlah panjang karakter tertentu dan menyimpannya dalam karakter cbuf
dimulai pada tanda offset khusus yang telah ditentukan.
public abstract void close() throws IOException
Menutup Stream ini. Memanggil method Reader yang lain setelah menutup stream akan
menyebabkan suatu IOException dijalankan.
public void mark(int readAheadLimit) throws IOException
Menandai posisi tertentu pada stream. Setelah menandai, panggil untuk melakukan
reset() kemudian stream akan mencoba mengatur posisinya kembali pada titik ini.
Tidak semua stream input karakter mendukung operasi ini.
public boolean markSupported()
mengindikasikan apakah sebuah stream mendukung operasi pemberian tanda (mark)
atau tidak Tidak didukung oleh default. Seharusnya bersifat overid subclass.
public void reset() throws IOException
Reposisi stream ke posisi akhir stream yang telah ditandai

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 (machine-
independent 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. Mengapresiasikan keuntungan dari generic types


2. Mendeklarasikan class generic
3. Menggunakan constrained generic
4. Mendeklarasikan method generic

13.2 Mengapa Generic?


Satu dari penyebab adanya bugs yang paling signifikan dalam Bahasa pemrograman
Java adalah keperluan akan pernyataan typecast atau downcast untuk lebih
mengkhususkan tipe data dari tipe staticnya secara terus-menerus. Sebagai contoh,
Sebuah object arraylist memungkinkan kita untuk menambahkan beberapa referensi tipe
object pada list tapi ketika kita mendapatkan kembali elemet ini , kita perlu untuk
typecast object ke tipe referensi khusus yang sesuai dengan keperluan kita. Downcasting
adalah hotspot yang potensial untuk ClassCastException. Yang juga membuat kode kita
menjadi lebih panjang, jadi, menjadi lebih sedikit dapat terbaca. Lebih dari itu,
downcasting juga efektif merusak manfaat dari sebuah kekuatan bahasa yang diketikkan
sejak dia menghapuskan keamanan yang disediakan perusahaan berupa pemeriksaan
tipe(type checking).

Tujuan utama dari penambahan generic pada Java adalah untuk memecahkan masalah
ini. tipe Generic memungkinkan subuah single class untuk bekerja dengan pilihan tipe
yang beraneka ragam. Ini adalah jalan yang alami untuk mengeliminasi keperluan untuk
pemilihan (casting).

Langkah awal mempertimbangkan sebuah object ArrayList dan lihatlah bagaimana type
generic akan membantu dalam peningkatan kode kita. Seperti yang sudah Anda ketahui,
sebuah object arraylist memiliki kemampuan untuk menyimpan elemen-elemen dari
beberapa tipe referensi untuk list ini. Sebuah instance arraylist, bagaimanapun, selalu
memaksa kita untuk men-downcast object-object kita membantu mendapatkan kembali
dari list. Pertimbangkan pernyataan berikut :

String myString = (String) myArrayList.get(0);

Versi generic dari class ArrayList didesain untuk bekerja secara asli dengan beberapa

Pengenalan Pemrograman 2 1
J.E.N.I.

tipe class. Sama seperti, dia juga mempertahankan manfaat dari pengecekan tipe (type
checking). Kita dapat melanjutkannya dengan keperluan memiliki typecast elemen yang
kita dapatkan dari list dan memiliki pernyataan berikut terhadap pernyataan sebelumnya
:

String myString = myArrayList.get(0);

Walaupun downcasting sudah terhapus, ini bukan berarti bahwa Anda dapat menandai
segala sesuatu sebagai return value dari method get dan melanjutkannya dengan
typecasting semuanya. Jika Anda menandai sesuatu yang lain disamping sebuah String
untuk output dari method get, Anda akan menghadapi sebuah waktu mengcompile type
tidak sesuai seperti pesan berikut ini :

found: java.lang.String
required: java.lang.Integer
Integer data = myArrayList.get(0);

Agar hanya memiliki ide bagaimana type-type generic digunakan sebelum materi ini
dibahas lebih dalam, sebaiknya Anda pertimbangkan potongan kode berikut ini :

ArrayList <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

Pengenalan Pemrograman 2 5
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