Professional Documents
Culture Documents
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
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:
Pengenalan Pemrograman 2
J.E.N.I
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.
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
Pengenalan Pemrograman 2
J.E.N.I
Pengenalan Pemrograman 2
J.E.N.I
Pengenalan Pemrograman 2
J.E.N.I
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.
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
1.2.8 Enkapsulasi
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
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.
Pada bagian ini meringkaskan syntax dasar yang digunakan dalam pembuatan aplikasi 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.
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]);
}
}
}
<attributeDeclaration> ::=
<modifier> <type> <name> [= <default_value>];
<type> ::=
byte | short | int | long | char | float | double | boolean
| <class>
Inilah contohnya.
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;
}
}
<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.
class ConstructorDemo {
private int data;
public ConstructorDemo() {
data = 100;
}
ConstructorDemo(int data) {
this.data = data;
}
}
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.
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>;
<importDeclaration> ::=
import <packageName.elementAccessed>;
[<packageDeclaration>]
<importDeclaration>*
<classDeclaration>+
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.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;
}
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 OverrideDemo {
public static void main(String args[]) {
Subclass SubObj = new Subclass();
Superclass SuperObj = SubObj;
SubObj.display(3);
((Superclass)SubObj).display(4);
}
}
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() {
}
}
Sebuah class yang berisi method abstract harus dideklarasikan sebagai sebuah class abstract.
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.
Pengenalan Pemrograman 2 9
J.E.N.I.
Sebagai contoh:
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>*);]*
}
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.
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 InterfaceDemo {
public static void main(String args[]) {
MyClass1 mc1 = new MyClass1();
MyClass2 mc2 = new MyClass2();
mc1.iMethod();
mc1.myMethod();
mc2.iMethod();
}
}
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;
}
}
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;
}
}
Pengenalan Pemrograman 2 12
J.E.N.I.
studNum = sNum;
}
}
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 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);
}
}
Pengenalan Pemrograman 2 13
J.E.N.I.
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
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,
Pengenalan Pemrograman 2 14
J.E.N.I.
data++;
class final tidak dapat diwariskan tidak seperti class yang biasanya.
Pernyataan ini akan menyebabkan kesalahan compilation terjadi karena MyClass dapat tidak lama
di-extended.
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
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.
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
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.
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.
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 :
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.
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.
try {
<code to be monitored for exceptions>
} catch (<ExceptionType1> <ObjName>) {
<handler if ExceptionType1 occurs>
}
...
} catch (<ExceptionTypeN> <ObjName>) {
<handler if ExceptionTypeN occurs>
}
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.”);
}
}
Pengenalan Pemrograman 2 3
J.E.N.I.
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.”);
}
}
Pelajari apakah yang akan terjadi terhadap program bila argumen – argumen berikut
dimasukkan oleh user :
a) Tidak ada argument
b) 1
c) 0
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
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!");
}
}
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.
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.
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.
class ThrowsDemo {
public static void main(String args[]) {
try {
ThrowingClass.myMethod();
} catch (ClassNotFoundException e) {
System.out.println(e);
}
}
}
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.
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) {
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.
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.
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
Pengenalan Pemrograman 2 10
J.E.N.I.
Jika Anda ingin untuk menjalankan program tanpa menggunakan fitur assertions,
cukup jalankan program secara normal.
java MyProgram
assert <expression1>;
Bentuk yang lain menggunakan dua ekspresi, berikut ini cara penulisannya :
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
*
***
*****
***
*
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.
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.
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.
Pengenalan Pemrograman 2 1
J.E.N.I.
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.
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));
}
}
Contoh berikutnya. Nilai input desimalnya adalah 165 dan akan dikonversi ke base 16.
Pengenalan Pemrograman 2 3
J.E.N.I.
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.
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.
n-1
...
6
5 Jayz top
4 KC
3 Jojo
2 Toto
1 Kyla
0 DMX bottom
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.
0 1 2 3 4 5 6 7 8 9 ... n-1
Eve Jayz KC Jojo Toto Kyla DMX
front end Insert
Delete
Queue akan kosong jika nilai end kurang dari front. Sementara itu, akan penuh jika end
sama dengan n-1.
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.
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());
}
}
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.
Berikut ini merupakan contoh dari non-empty linked list dengan 3 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.
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;
}
}
Pengenalan Pemrograman 2 9
J.E.N.I.
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.
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.
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);
}
}
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)
Dengan menggunakan ide dari linked list, implementasikan sebuah integer queue
dinamis seperti integer stack dinamis yang diperkenalkan seperti contoh berikut.
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.
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.
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.
Pengenalan Pemrograman 2 3
J.E.N.I.
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.
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.
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.
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.
Pengenalan Pemrograman 2 7
J.E.N.I.
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.
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.
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.
Method-Method Process
public abstract void destroy()
Mengakhiri proses.
public abstract int waitFor() throws InterruptedException
Tidak mengirim sampai proses yang dipanggil berakhir.
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.
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.
}
}
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.
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 :
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.
Pengenalan Pemrograman 2 1
J.E.N.I.
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.
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.
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.
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);
Pengenalan Pemrograman 2 2
J.E.N.I.
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 :
Method read dari object BufferedReader selanjutnya digunakan untuk membaca nilai
input dari perangkat input.
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.
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.
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.
Pengenalan Pemrograman 2 4
J.E.N.I.
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.");
}
}
}
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.
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
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.
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
Pada akhir modul ini, anda akan diminta untuk membuat implementasi bermacam
algoritma sorting yang akan dibahas pada bagian ini.
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
Pengenalan Pemrograman 2 3
J.E.N.I.
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.
Rangkaian data:
7 2 5 6
7 2 5 6
7 2
Mengkombinasikan
2 7
Mengkombinasikan
5 6
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
Rangkaian data:
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
Pengenalan Pemrograman 2 6
J.E.N.I.
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
Kemudian urutkan elemen sub-rangkaian pada setiap sisi dari elemen pivot.
6.6 Latihan
6.6.1 Insertion Sort
Pengenalan Pemrograman 2 7
J.E.N.I.
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++];
}
}
}
6.6.4 Quicksort
Pengenalan Pemrograman 2 8
J.E.N.I.
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);
}
}
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.
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.
Pengenalan Pemrograman 2 1
J.E.N.I.
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.
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)
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.*;
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.
Hubungan dari class ini adalah class Color, dimana memiliki tiga constructor.
Dibawah ini adalah contoh program yang menggunakan beberapa method di dalam class
Graphic.
import java.awt.*;
Pengenalan Pemrograman 2 3
J.E.N.I.
Agar panel dapat terlihat atau visible, dia harus diletakkan didalam window yang dapat terlihat
seperti sebuah frame.
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.
Berikut adalah aplikasi membuat sebuah frame dengan kontrol yang telah dimasukkan di
dalamnya.
import java.awt.*;
Pengenalan Pemrograman 2 4
J.E.N.I.
fwc.setVisible(true);
}
}
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.
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.
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.
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
Membuat object baru FlowLayout dengan argumen pertama sebagai posisi pada komponen
dan hgap untuk horizontal dan vgap untuk vertikal pada komponen
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
import java.awt.*;
Gambar berikut adalah contoh dari hasil yang berjalan pada platform 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.
Membuat object BorderLayout baru dengan spasi unit hgap horizontal dan unit vgap vertikal
yang diaplikasikan diantara komponen yang berbeda.
Seperti pada FlowLayout Manager, parameter hgap dan vgap disini juga menjelaskan jarak
antara komponen dengan kontainer.
Berikut ini adalah contoh program yang menunjukkan bagaimana BorderLayout bekerja.
import java.awt.*;
Pengenalan Pemrograman 2 7
J.E.N.I.
Constructor GridLayout
GridLayout()
Membuat object GridLayout baru dengan satu baris dan satu kolom sebagai default
Membuat object GridLayout baru dengan jumlah baris dan kolom sesuai dengan keinginan
Membuat object GridLayout baru dengan jumlah baris dan kolom yang ditentukan. Unit spasi
hgap horizontal dan vgap vertikal diaplikasikan ke dalam komponen.
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.
Pengenalan Pemrograman 2 9
J.E.N.I.
Pengenalan Pemrograman 2 10
J.E.N.I.
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
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.
JApplet Turunan dan Berhubungan dengan class Applet dalam package AWT. Juga
sedikit tidak cocok dengan class applet dalam kaitannya dengan
menambahkan komponen pada container
JDialog Turunan dan Berhubungan dengan class dialog dalam package AWT.
Biasanya digunakan untuk menginformasikan sesuatu kepada pengguna
atau prompt pengguna untuk input.
Untuk daftar yang lengkap dari komponen Swing, Anda dapat melihatnya di dokumentasi API.
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.
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.
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();
}
}
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.
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.
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.
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.
<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)
Pengenalan Pemrograman 2 3
J.E.N.I.
Method ActionListener
public void actionPerformed(ActionEvent e)
Mengendalikan ActionEvent e yang terjadi.
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
Pengenalan Pemrograman 2 4
J.E.N.I.
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.
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.
Pengenalan Pemrograman 2 5
J.E.N.I.
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.
import java.awt.*;
import java.awt.event.*;
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();
}
}
import java.awt.*;
import java.awt.event.*;
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(this);
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
Pengenalan Pemrograman 2 7
J.E.N.I.
import java.awt.*;
import java.awt.event.*;
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(w);
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
Pengenalan Pemrograman 2 8
J.E.N.I.
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(new CFListener());
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
Pengenalan Pemrograman 2 9
J.E.N.I.
import java.awt.*;
import java.awt.event.*;
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);
}
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.
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.
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.
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.
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.
9.3.2 Constants
Class Thread juga menyediakan beberapa constants sebagai nilai prioritas. Tabel berikut
Pengenalan Pemrograman 2 3
J.E.N.I.
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.
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.
import javax.swing.*;
import java.awt.*;
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
Contoh dibawah ini hampir sama dengan contoh terakhir yang telah Anda pelajari, tapi
pada contoh ini Anda akan mengimplement interface Runnable.
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");
}
}
Pengenalan Pemrograman 2 7
J.E.N.I.
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.
class TwoStrings {
static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
Program ini diharapkan dapat mencetak dua argument object Runnable secara
Pengenalan Pemrograman 2 9
J.E.N.I.
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.
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.
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 TestThread {
public static void main(String args[]) {
new PrintStringsThread("Hello ", "there.");
new PrintStringsThread("How are ", "you?");
new PrintStringsThread("Thank you ", "very much!");
}
}
Hello there.
How are you?
Thank you very much!
class TwoStrings {
static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
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);
}
}
Pengenalan Pemrograman 2 12
J.E.N.I.
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.
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 TestProducerConsumer {
public static void main(String args[]) throws Exception {
SharedData sd = new SharedData();
new Producer(sd);
new Consumer(sd);
}
}
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;
}
}
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.
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 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:
Pengenalan Pemrograman 2 17
J.E.N.I.
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();
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.
import java.util.concurrent.*;
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!”.
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.
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.
Paradigma ini menjelaskan sebuah skenario sederhana. Tentunya, client terhubung dengan
sever dan meminta informasi. Kemudian server mengingat permintaan dan mengembalikan
informasi yang tersedia kepada client.
Pengenalan Pemrograman 2 2
J.E.N.I.
10.1.5 sockets
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.
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.
Ketika sebuah server menetapkan suatu port tertentu, panjang antrian maksimum untuk
koneksi yang akan datang berdasarkan pada parameter backlog.
Method ServerSocket
Menyebabkan server untuk menunggu dan mendengarkan dari koneksi client, kemudian
menerimanya.
Menutup socket server. Client tidak dapat lagi terhubung ke server hingga dibuka kembali
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.*;
try {
server = new ServerSocket(1234);
Pengenalan Pemrograman 2 4
J.E.N.I.
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) {
}
}
}
}
Constructor Socket
Membuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada host
tertentu.
Membuat sebuah socket client dimana dihubungkan dengan diberikannya nomor port pada
alamat IP tertentu.
Tabel 1.2.1c: Constructor Socket
Method Socket
Pengenalan Pemrograman 2 5
J.E.N.I.
Method Socket
Mengembalikan remote port kepada socket ini pada saat masih terhubung.
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.*;
Pengenalan Pemrograman 2 6
J.E.N.I.
Constructor MulticastSocket
MulticastSocket(int port)
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
Constructor dari datagramPacket untuk menerima paket dengan panjang length. Seharusnya
kurang dari atau sama dengan ukuran dari buffer buf.
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.
Method-method DatagramPacket
Mengembalikan alamat IP mesin dimana paket yang dikirim atau yang diterima
Mengembalikan nomor port pada remote host dimana paket yang dikirim atau yang diterima
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.*;
import java.net.*;
import java.io.*;
Pengenalan Pemrograman 2 8
J.E.N.I.
10.3 Latihan
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>.
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 module ini, Anda akan mempelajari tentang membuat applet menggunakan AWT.
import java.awt.*;
import java.applet.*;
Pengenalan Pemrograman 2 1
J.E.N.I.
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 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.
Pengenalan Pemrograman 2 2
J.E.N.I.
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>
*/
<HTML>
<TITLE>Life Cycle Demo</TITLE>
<applet code="LifeCycleDemo" width=300 height=100>
</applet>
</HTML>
Pengenalan Pemrograman 2 4
J.E.N.I.
import java.awt.*;
import java.applet.*;
/*
<applet code="AppletDemo" width=300 height=100>
</applet>
*/
Pengenalan Pemrograman 2 5
J.E.N.I.
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>
*/
Pengenalan Pemrograman 2 6
J.E.N.I.
<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>
Pengenalan Pemrograman 2 7
J.E.N.I.
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>
*/
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
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.
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).
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.
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.
Mari kita melihat bagaimana method ini bekerja berdasarkan contoh berikut ini :
import java.io.*;
Pengenalan Pemrograman 2 4
J.E.N.I.
Pengenalan Pemrograman 2 5
J.E.N.I.
Pengenalan Pemrograman 2 6
J.E.N.I.
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).
Pengenalan Pemrograman 2 7
J.E.N.I.
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.
Cobalah program tersebut sendiri dan amatilah apa ang terjadi pada file yang
dimanipulasi.
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();
}
}
Bandingkan kode ini dengan sebelumnya. Apakah hasil dari menjalankan program ini?
Pengenalan Pemrograman 2 9
J.E.N.I.
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)
Pengenalan Pemrograman 2 10
J.E.N.I.
Pengenalan Pemrograman 2 11
J.E.N.I.
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).
Pengenalan Pemrograman 2 12
J.E.N.I.
Pengenalan Pemrograman 2 13
J.E.N.I.
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();
}
}
Pengenalan Pemrograman 2 14
J.E.N.I.
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();
}
}
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.
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 :
Kata kunci transient mencagah data dari proses serialisasi. Object instantiasi dari class
ini sekarang dapat ditulis ke sebuah OutputStream.
Pengenalan Pemrograman 2 16
J.E.N.I.
import java.io.*;
try {
FileOutputStream fos = new
FileOutputStream("boolean.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(booleanData);
oos.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
Contoh dibawah ini membaca sebuah object Boolean dari sebuah ObjectInputStream. Ini
merupakan kesinambungan dari contoh sebelumnya pada serialisasi.
import java.io.*;
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")));
}
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.
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 :
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
:
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 :
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.
Pengenalan Pemrograman 2 2
J.E.N.I.
Sekarang mari kita melalui bagian dari kode yang menggunakan syntax untuk type
generic.
Untuk deklarasi dari class BasicGeneric,
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.
Anda juga dapat bekerja denga variabel-variabel bertipe Integer atau referensi tipe yang
lain. Untuk bekrja dengan Integer, potongan kode memiliki pernyataan berikut ini :
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.
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.
Pengenalan Pemrograman 2 4
J.E.N.I.
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 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.
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.
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.
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);
}
}
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