1
1 Pengenalan Java Overview
Bab ini akan menjelaskan tentang dasar-dasar pemrograman menggunakan bahasa Java. Penjelasan
tentang karakteristik bahasa Java, identifier, tipe data, dan operator pada Java.
Tujuan
1. Mengaplikasikan dasar-dasar pemrograman menggunakan Java
2. Menggunakan identifier dan tipe data pada Java
1.1 Sejarah Java
Pada tahun 1991, Sun dipimpin Patric Naughton dan James Gosling ingin merancang
bahasa computer untuk perangkat consumer seperti cable TV Box. Karena perangkat itu tidak
mempunyai banyak memori, bahasa harus berukuran kecil dan menghasilkan kode program yang liat.
Juga karena manufaktur-manufaktur berbeda memilih pemroses-pemroses yang berbeda, maka
bahasa harus bebas dari arsitektur manapun. Proyek ini diberi nama kode “Green”.
Kebutuhan untuk kecil, liat dan kode netral terhadap platform mengatur tim mempelajari
implementasi pascal yang pernah dicoba. Niklaus Wirth, pencipta bahasa Pascal telah merancang
bahasa portable yang menghasilkan kode intermediate untuk mesin hipotetis. Mesin ini sering disebut
Virtual machine. Kode antara ini kemudian dapat digunakan disembarang mesin yang memiliki
interpreter. Proyek Green menggunakan virtual machine untuk mengatasi isu utama netral terhadap
arsitektur mesin.
Karena orang-orang di proyek Green berbasis C++ bukan Pascal maka kebanyakan Sintaks
diambil dari C++, serta mengadopsi orientasi obyek bukan procedural. Mulanya bahasa yang
diciptakan diberi nama “Oak” kemudian diganti “Java” karena telah ada bahasa pemrograman
bernama “Oak”
Produk pertama proyek Green adalah “*7”, sebuah kendali jauh yang sangat cerdas. Karena
pasar masih belum tertarik dengan produk consumer cerdas maka proyek Green harus menemukan
pasar lain dari teknologi yang diciptakan. Kemudian, penerapan mengarah menjadi teknologi yang
berperan di web.
Pada 1995, Netscape memutuskan membuat browser yang dilengkapi dengan Java. Setelah itu
diikuti oleh IBM, Symantec, Inprise, bahkan Microsoft.
Setelah itu Java mulai didengar. Dengan strategi terbukanya, banyak industri yang meliriknya.
Bersamaan itu disusul berbagai universitas Amerika, Jepang, dan Eropa yang mengubah pengenalan
bahasa pemrograman komputer menjadi Java, meninggalkan C++. Java lebih sederhana dan telah
mengakomodasikan hampir seluruh fitur penting bahasa-bahasa pemrograman yang ada semenjak
perkembangan komputasi modern.
Java pertama kali diluncurkan sebagai bahasa pemrograman umum (general purpose
programming language) dengan kelebihan dia bisa dijalankan di web browser sebagai applet. Sejak awal,
para pembuat Java telah menanamkan visi mereka ke dalam Java untuk small embedded customer
device)seperti TV, telepon, radio, dan sebagainya supaya dapat berkomunikasi satu sama lain.
Langkah pertama yang diambil oleh Sun Microsistem adalah dengan membuat JVM (Java Virtual
machine) yang kemudian diimplementasikan dalam bentuk JRE (Java Runtime Environment). JVM adalah
lingkungan tempat eksekusi program Java berlangsung di mana para obyek saling berinteraksi satu
dengan yang lainnya. Virtual machine inilah yang menyebabkan Java mempunyai kemampuan
penanganan memori yang lebih baik, keamanan yang lebih tinggi serta portabilitas yang besar. Apabila
kita hanya ingin menjalankan program Java, maka kita cukup memiliki JRE saja. Tapi seandainya kita
2
ingin mengembangkan perangkat lunak sendiri, JRE saja tidak cukup.
Untuk lebih meningkatkan produktivitas pengembang perangkat lunak, Sun juga meluncurkan
SDK (Standard Development Kit) yang berisi kakas dan API untuk membuat program aplikasi berbasis
Java. Pada tahun 1999 Sun meluncurkan J2EE (Java 2 Enterprise Edition) sebagai framework untuk
membuat aplikasi enterprise berskala besar. Pada tahun 2001, Sun meluncurkan J2ME yang kelak
menjadi salah satu standar pemrograman di dalam PDA maupun handphone.
1.2 Karakteristik Bahasa Java
1. Sederhana, semudah C dan seampuh C++: berlawanan dengan anggapan orang-orang bahwa
bahasa Java sulit untuk dipelajari, Java gampang untuk dipelajari terutama untuk orang yang sudah
mengenal pemrograman tapi belum terlalu terikat pada paradigma pemrograman prosedural. Tentu
saja ini berarti bahwa kita harus siap mempelajari salah satu teknologi yang berkembang paling cepat
di dunia dalam dua tahun terakhir ini dengan banyak membaca tentunya baik dari buku maupun
melalui web.
2. Sangat berorientasi obyek (OOP) dengan implementasi yang sangat baik sehingga kita
bukan hanya belajar bagaimana membuat program yang baik (reusable, scalable, dan maintanable)
tetapi juga kita belajar bagaimana cara berfikir yang baik untuk mengenali struktur masalah yang
sedang kita hadapi dan memecahkannya secara sistematis dengan pola-pola tertentu (patterns
OpenPlatform, Write Once Run Anywhere (WORA), portable atau multiplatform, program yang kita buat
dapat dijalankan di Windows, Linux/Unix, Solaris, dan Macintosh tanpa perlu diubah maupun di
kompilasi ulang. Java adalah juga bahasa yang paling sesuai digunakan bersama dengan XML yang
membuat data menjadi portable, ini karena kelahiran XML tidak terlepas dari dukungan parser-parser
berbahasa Java.
3. Arsitekturnya yang kokoh dan pemrograman yang aman. Dalam Java program yang kita buat
tidak mudah untuk “hang” karena konflik pada memori biasanya diselesaikan dengan mengumpulkan
obyek-obyek yang sudah tak terpakai lagi secara otomatis oleh garbage collector. Penanganan
kesalahan juga dipermudah dalam Java dengan konsep Exception.
4. Bukan sekedar bahasa tapi juga platform sekaligus arsitektur. Java mempunyai portabilitas yang
sangat tinggi. Ia dapat berada pada smartcard, pager, POS (Point of Service), handphone, PDA, palm, TV,
Embedded device (PLC, micro controller), laptop, pc, dan bahkan server). Menyadari akan hal ini Sun
membagi arsitektur Java membagi tiga bagian, yaitu:
a. Enterprise Java (J2EE) untuk aplikasi berbasis web, aplikasi sistem tersebar dengan beraneka ragam klien dengan kompleksitas yang tinggi. Merupakan superset dari Standar Java
b. Standard Java (J2SE), ini adalah yang biasa kita kenal sebagai bahasa Java, dan merupakan fokus
kita sekarang.
c. Micro Java (J2ME) merupakan subset dari J2SE dan salah satu aplikasinya yang banyak dipakai
adalah untuk wireless device/mobile device
5. Program Java dijalankan menggunakan interpreter melalui Java Virtual machine (JVM). Hal ini
menyebabkan source code Java yang telah dikompilasi menjadi Java bytecodes dapat dijalankan pada
platform yang berbeda-beda.
6. Fitur-fitur utama yang lain:
a. Mendukung multithreading.
b. Selalu memeriksa tipe obyek pada saat runtime.
c. Mempunyai automatic garbage collection untuk membersihkan obyek yang tidak terpakai dari
memori
3
d. Mendukung exception sebagai salah satu cara penanganan kesalahan
1.3 Bagaimana Java Bekerja?
Lingkungan pemrograman pada Java menggunakan compiler sekaligus interpreter agar dapat
berjalan pada platform yang berbeda. Java compiler melakukan kompilasi pada source code (.java)
menjadi Java bytecodes (.class) seperti ditunjukkan oleh Gambar 2.1 berikut.
Gambar 1.1 Mekanisme Kompilasi dan Eksekusi Program Java
Java bytecodes merupakan instruksi mesin yang tidak spesifik terhadap processor. Oleh karena
itu, program Java hasil kompilasi akan dapat dijalankan pada berbagai platform sistem komputer
dengan menggunakan Java Virtual machine (JVM), "write once, run anywhere" (lihat Gambar 2.2). JVM
disebut juga bytecodes interpreter atau Java runtime interpreter.
Gambar 1.2 Konsep Write Once, Run Anywhere pada Java
1.4 Platform Java
Platform dapat diartikan sebagai lingkungan perangkat keras atau perangkat lunak di mana program dijalankan. Umumnya platform dinyatakan berdasarkan nama sistem operasi yang digunakan,
misalnya Windows 2000, Linux, Solaris, atau MacOS.
Tidak seperti bahasa pemrograman lainnya, platform Java mempunyai dua komponen, yaitu:
1. Java Virtual machine (Java VM)
Merupakan fondasi untuk platform Java yang dapat digunakan di berbagai platform perangkat
keras.
2. Java Application Programming Interface (Java API)
Kumpulan komponen-komponen perangkat lunak siap pakai (ready-made software components)
untuk berbagai keperluan penulisan program, seperti graphical user interface (GUI).
Gambar 2.3. berikut memperlihatkan gambaran program yang berjalan di atas di kedua
4
komponen platform Java.
Gambar 2.3 Platform Java
1.5 Aplikasi Java
Ada dua tipe aplikasi pada Java yang umumnya sering ditulis, yaitu aplikasi stand alone dan
applets. Aplikasi stand alone merupakan aplikasi yang dijalankan langsung di atas platform Java.
Sedangkan applets adalah aplikasi yang dijalankan melalui web browser ataupun applet viewer.
Perbedaan applets dengan Java stand alone adalah:
1. Applets melakukan extends dari class applets.
2. Applets tidak mempunyai fungsi main().
3. Applets mempunyai beberapa batasan keamanan, seperti tidak diperbolehkan membaca atau
menulis file pada sistem komputer.
4. Applets tidak dapat menjalankan program lain pada komputer yang menjalankan applets.
Selain kedua tipe aplikasi tersebut, ada beberapa tipe aplikasi Java yang lain yaitu:
1. Aplikasi berbasis Windows, misalnya dengan menggunakan fasilitas Swing.
2. Java Servlet, yaitu aplikasi seperti applets tetapi dijalankan di sisi server.
3. Java Server Pages, yaitu aplikasi di sisi server yang ditulis dalam bahasa script yang melekat
pada halaman HTML untuk memberikan efek tampilan pada web browser.
4. Java Beans dan Enterprise Java Beans, yaitu aplikasi untuk program multitiers.
5. Java Micro Edition, yaitu aplikasi yang diperuntukan bagi perangkat genggam (handheld
devices), seperti telepon genggam.
1.6 Identifier di Java
Identifier adalah nama yang diberikan kepada variabel, method, kelas, paket, dan interface
untuk unik mengidentifikasikan bagi kompilator dan memberikan nama yang berarti bagi pemrogram.
Adapun tatacara penamaan identifier:
1. Case sensitive, huruf kapital dan kecil dibedakan
2. Identifier yang diberikan oleh pemrogram tidak boleh sama dengan keyword yang ada di Java
3. Dimulai dengan huruf atau underscore (garis bawah) atau tanda ($). Namun sebisa mungkin
diawali dengan huruf karena mungkin identifier dengan awalan underscore dan ($) digunakan
unruk pemrosesan internal dan file import
4. Karakter berikutnya dapat berupa huruf atau angka 0 sampai 9. Simbol-simbol seperti „+‟ dan
spasi tidak dapat digunakan
5
1.7 Keyword di Java
Keyword adalah identifier yang digunakan Java untuk suatu tujuan khusus. Daftar keyword Java
adalah sebagai berikut:
Tabel 1.1 Keyword dalam Java
abstract do implements private this
boolean double import protected throw
break else instanceof public throws
byte extends int return transient
case false interface short true
catch final long static try
char finally native strictfp void
class float new super volatile
continue for null switch while
default if package synchronized
1.8 Tipe Data di Java
Tipe data dalam Java dibagi dalam dua kategori:
1. Sederhana
2. Komposit
1.8.1 Tipe data sederhana
Tipe data sederhana merupakan tipe inti. Tipe sederhana tidak diturunkan dari tipe lain. Tipe ini
adalah tipe data primitif. Terdapat delapan tipe data primitif di Java:
- Empat tipe adalah untuk bilangan bulat: byte, short, int, long
- Dua untuk tipe angka pecahan (floating point): float, double
- Satu untuk tipe karakter, yaitu char
- Satu untuk tipe boolean yang berisi nilai logika: true/false
Tipe data integer
Tipe data integer memiliki jangkauan nilai sebagai berikut:
Tabel 1.1 Jangkauan nilai integer
Panjang Integer Tipe data
Jangkauan
Nilai
8 bit byte -27 to 27-1
16 bit short -215 to 215-1
6
32 bit int -231 to 231-1
64 bit long -263 to 263-1
Pada kebanyakan situasi, tipe int paling banyak dipakai. Untuk data yang berukuran besar, digunakan
tipe data long. Tipe short dan byte terutama digunakan untuk aplikasi khusus yang menangani
file level rendah.
Tipe data Floating Point
Tipe data ini digunakan untuk perhitungan yang melibatkan bilangan pecahan, seperti perhitungan
kosinus, akar persamaan, dan sebagainya. Java mengimplementasikan standar himpunan tipe dan
operator titik mengambang IEEE-754.
Keakuratan nilai untuk tipe data floating point adalah sebagai berikut:
Tabel 1.2 Presisi nilai float
Panjang Float Tipe data Nilai terbesar
32 bit Float 3.40282e+38
64 bit Double 1.79769e+308
Masing-masing tipe data floating point memiliki kebutuhan memori yang berbeda. Tipe data float
memerlukan 32 bit sebagai single-precision, sedangkan tipe data double memerlukan 64 bit sebagai
double precision.
Nama double mengacu pada presisinya yang sebesar dua kali dibandingkan float. Presisi float
kebanyakan tidak memadai untuk banyak aplikasi komputasi. Angka literal bertipe float berakhiran
F, contoh 3.14F sedangkan kalau tidak diberi akhiran F akan dipandang sebagai bertipe double.
Tipe data Char
Tipe data char merupakan tipe data yang direpresentasikan dengan 16-bit Unicode character. Literal
dari char harus berada di antara single quotes („ „) Contohnya :
„a‟ huruf a
„\t‟ karakter tab
Unicode dirancang untuk menangani semua karakter di dunia dalam kode 2 byte. Kode 2 byte
memungkinkan 65.536 karakter, dimulai dari nilai byte 0 sampai 65.535. Himpunan karakter ASCII
dipandang sebagai bagian dari Unicode dan ditempatkan sebagai 256 karakter pertama dari Unicode.
Terdapat pula beberapa barisan escape untuk karakter Unicode yang spesial, seperti berikut:
Tabel 1.3 Karakter Unicode spesial
Barisan Escape Nama Nilai Unicode
\b Backspace \u008
\t Tab \u009
\n Linefeed \u00a
\r Carriage return \u00d
\” Petik ganda \u0022
\‟ Petik tunggal \u0027
\\ Backslash \u005c
7
Tipe data Boolean
Tipe data boolean memiliki 2 literal yaitu : true dan false. Contoh, statement :
boolean truth = true;
mendeklarasikan variabel truth sebagai tipe data boolean dan memberikan nilai true
1.8.2 Tipe data komposit
Tipe data komposit merupakan tipe data yang disusun dari tipe data sederhana atau tipe komposit
lain yang sudah ada. Tipe ini dapat berupa array, string, kelas, dan interface.
Khusus untuk String pada Java dikenali sebagai kelas, bukan sebagai array of character. String
pada Java diapit oleh tanda petik ganda (“.....”), contoh:
String s=”Saya makan nasi”;
1.9 Operator di Java
Java memiliki beberapa jenis operator di antaranya:
- Operator unary:
Tabel 1.4 Operator unary
Nama Operator Simbol Definisi
Increment ++ Akan menambahkan nilai
sejumlah satu
Decrement -- Akan mengurangi nilai
sejumlah satu
Contoh penggunaan:
int x = 5;
int y = x++;
pada kasus di atas nilai y akan berisi 5 dan nilai x akan berisi 6 karena nilai y akan mengambil nilai
x dahulu setelah itu baru nilai x ditambahkan satu, berbeda kasusnya pada contoh di bawah ini:
int x = 5;
int y = ++x;
pada kasus di atas, nilai y akan berisi 6 dan x berisi 6 karena nilai x akan ditambahkan satu dahulu
baru kemudian dimasukkan ke variabel y.
- Operator aritmatika:
Tabel 1.5 Operator aritmatika
Nama
Operator
Simbol Deskripsi
Penambahan + Menambahkan dua buah nilai
Pengurangan - Pengurangan dua buah nilai
Perkalian * Perkalian dua buah nilai
Pembagian / Pembagian dua buah nilai
Sisa bagi % Sisa pembagian dua buah
nilai
- Operator relasi:
8
Tabel 1.6 Operator relasi
Simbol Deskripsi
< Kurang dari
> Lebih dari
<= Kurang dari atau sama
dengan
>= Lebih dari atau sama dengan
== Sama dengan
!= Tidak sama dengan
- Operator boolean: Tabel 1.7 Operator boolean
Simbol Deskripsi
&& AND
|| OR
^ XOR
! NOT
9
2 Flow Control Overview
Bab ini akan menjelaskan tentang flow control pada Java. Flow control yang dasar pada pemrograman
ada dua, yakni percabangan dan pengulangan.
Tujuan
1. Mampu menggunakan flow control percabangan pada Java
2. Mampu menggunakan flow control pengulangan pada Java
2.1 Percabangan pada Java
Percabangan merupakan sebuah alur pemilihan berdasarkan kondisi tertentu. Pada Java, terdapat
beberapa jenis sintaks untuk alur percabangan.
1. Sintaks if
Sintaks if digunakan untuk menyatakan alur percabangan dengan pengecekan kondisi. Jika suatu
kondisi yang dicek terpenuhi, maka aksi tertentu akan dilakukan. Jika tidak terpenuhi, maka akan
dilakukan pengecekan kondisi pada else if berikutnya. Jika tidak ada kondisi yang terpenuhi, maka
akan dilakukan aksi pada else-nya.
Sintaks if-else, sebagai berikut :
if (boolean expression) {
statement or block
} else if (boolean expression) {
statement or block
} else {
statement or block
}
Contohnya:
public class CobaIf {
public static void main(String[] args) {
int i = 3;
if (i%2==0){
System.out.println(“Bilangan genap”):
}
else {
System.out.println(“Bilangan ganjil”);
}
}
}
2. Sintaks switch
Sintaks switch digunakan untuk menyatakan alur percabangan dengan pengecekan pada sebuah
nilai variabel. Variabel yang bisa dicek pada sintaks switch adalah variabel bertipe int, char dan
boolean. Jika ditemukan nilai yang cocok dengan variabel yang dicek, maka dilakukan aksi yang
pada case yang bersesuaian dengan nilai tersebut. Jika tidak ditemukan nilai yang cocok, akan
dijalankan aksi pada default. Sintaks switch sebagai berikut :
switch (expression) {
case constant1 : statements;
break;
case constant2 : statements;
break;
default : statements;
10
break;
}
Contohnya
public class CobaSwitch {
public static void main(String[] args) {
int x = 7;
switch(x){
case 1: System.out.println(“Januari”);break;
case 2: System.out.println(“Februari”);break;
case 3: System.out.println(“Maret”);break;
case 4: System.out.println(“April”);break;
case 5: System.out.println(“Mei”);break;
case 6: System.out.println(“Juni”);break;
case 7: System.out.println(“Juli”);break;
case 8: System.out.println(“Agustus”);break;
case 9: System.out.println(“September”);break;
case 10: System.out.println(“Oktober”);break;
case 11: System.out.println(“November”);break;
case 12: System.out.println(“Desember”);break;
default: System.out.println(“Salah input”);break;
}
}
}
2.2 Perulangan pada Java
Perulangan adalah sebuah alur yang memungkinkan satu atau beberapa proses dilakukan beberapa
kali. Beberapa sintaks perulangan yang ada di Java antara lain sebagai berikut.
1. Perulangan for
Sintaks for digunakan untuk melakukan pengulangan sejumlah nilai tertentu. Perulangan akan
dilakukan mulai dari nilai tertentu hingga nilai tertentu dicapai. Sintaks for sebagai berikut :
for (init_expr;boolean testexpr;alter_expr) {
statement or block
}
Contoh penggunaan sintaks for adalah sebagai berikut:
public class ContohFor {
public static void main(String[] args) {
for (int i=0;i<10;i++) {
System.out.println(i);
}
}
}
Pada kode di atas, program akan mengulang proses mencetak nilai variabel i di layar angka. Nilai
variabel i mulai dari 1 kemudian setiap iterasi ditambahkan 1 (i++) hingga bernilai 10.
2. Perulangan while
Sintaks while digunakan untuk melakukan pengulangan selama kondisi tertentu terpenuhi.
Pengecekan kondisi dilakukan sebelum memasuki pengulangan, sehingga ada kemungkinan sebuah
pengulangan tidak dilakukan sama sekali. Sintaks looping while sebagai berikut :
while (boolean testexpr) {
11
statement or block
}
Contoh penggunaan sintaks while adalah sebagai berikut:
public class ContohWhile {
public static void main(String[] args) {
int i = 0;
while (i<10) {
System.out.println(i);
i++;
}
}
}
Pada kode di atas, program akan mengulang proses mencetak nilai variabel i di layar angka.
Proses akan diulangi selama nilai i<10.
3. Perulangan do....while
Sintaks do....while digunakan seperti pada sintaks while. Perbedaannya adalah pengecekan kondisi
pada do....while adalah di akhir sehingga proses pengulangan pasti akan dilakukan minimal sekali.
Sintaks do....while loop, sebagai berikut
do {
statement or block
} while (boolean testexpr)
Contoh penggunaan sintaks do....while adalah sebagai berikut:
public class ContohDoWhile {
public static void main(String[] args) {
int i = 0;
do {
System.out.println(i);
i++;
} while (i<10);
}
}
12
3 Kelas dan Obyek Overview
Bab ini akan menjelaskan tentang dasar Pemrograman Berorientasi Obyek yaitu Kelas dan Obyek.
Penjelasan tentang karakteristik kelas dan obyek, komponen kelas, serta cara pembuatan dan
pendeklarasian kelas di dalam Java. Akan dijelaskan juga tentang cara pengaksesan komponen kelas.
Tujuan
1. Mampu membuat kelas dan obyek
2. Mampu menggunakan array pada Java
3. Mampu membuat atribut bertipe obyek di Java
3.1 Kelas dan Obyek
Obyek merupakan dasar dari struktur Pemograman Berorientasi Obyek (OOP). Fitur dari
OOP adalah Abstraksi, Enkapsulasi, Pewarisan, dan Polymorphism. Fitur Abstraksi yaitu
mengkarakteristikan obyek yaitu dengan pemberian atribut pada suatu obyek, hal ini akan
diimplementasikan dengan pembuatan kelas (class). Kelas mempunyai 2 komponen yaitu Atribut dan
Method. Sedangkan fitur Enkapsulasi digunakan untuk menyembunyikan informasi atau detil dari
obyek yang tidak penting, hal ini diimplementasikan dengan access specifier. Access Specifiers di dalam
Java terdiri dari :
o public : kelas dapat diakses dari manapun termasuk dari kelas lain dan kelas-kelas yang
berada dalam package yang berbeda
o private : kelas dapat diakses oleh anggota kelas itu sendiri.
o protected : kelas dapat diakses oleh kelas turunan
o default : kelas dapat diakses dari manapun tetapi harus berada dalam package yang sama.
Pembuatan kelas di dalam java :
class <classname>
{
//declaration of data member
//declaration of methods
}
Pembuatan kelas lengkap dengan access specifier
class <classname>
{
<access specifier> <deklarasi atribut>
<access specifier> <deklarasi method>
}
Karena dasar pemrograman OOP adalah obyek, sehingga class yang sudah dibuat akan dibuat
obyeknya atau diinstansiasi, cara pembuatan obyek dari kelas adalah :
<class name> <object name>;
<object name> = new <class name>();
13
Untuk menjalankan program dibutuhkan sebuah method main(). Method main() dapat
dideklarasikan di kelas manapun tetapi nama kelas tempat method main() berada harus sama
dengan nama file .java nya. Deklarasi method main :
public static void main(String[] args)
{
//code for the main method
}
Berikut adalah contoh pembuatan kelas dan obyek secara lengkap, berikut dengan main
method-nya
class book
{
int price;
int pages;
public void set(int price,int pages)
{
this.price=price;
this.pages=pages;
}
public void show()
{
System.out.println("Books Information");
System.out.println("Books Price : "+price);
System.out.println("Number of pages : "+pages);
}
}
public class MainBook
{
public static void main(String[] args)
{
book javabook=new book();
javabook.set(60000,100);
javabook.show();
}
}
3.2 Konstruktor
Konstruktor merupakan method yang akan dieksekusi secara otomatis ketika sebuah obyek
dibuat. Method ini mempunyai nama yang sama dengan nama kelas tempat konstruktor
dideklarasikan. Konstruktor tidak mengembalikan nilai dan tidak dapat dideklarasikan sebagai static.
Konstruktor biasanya digunakan untuk memberikan nilai pada atribut ketika obyek dibuat dari kelas.
Sintaks konstruktor adalah :
public class <class name>
{
<constructor name same with class name>();
}
14
Contoh dengan menggunakan konstruktor
public class Employee
{
String EmpName;
int EmpID;
String EmpPosition;
Employee (String name,int Id, String position)
{
EmpName = name;
EmpID = Id;
EmpPosition = position;
}
void Show()
{
System.out.println("Employee Information");
System.out.println("Name : "+EmpName);
System.out.println("ID : "+EmpID);
System.out.println("Position : "+EmpPosition);
}
public static void main(String args[])
{
Employee Empobj;
Emp_obj = new Employee("Mark",10010,"Manager");
Empobj.Show();
}
3.3 Package dan Import
Package merupakan sebuah cara untuk menyatukan beberapa kelas yang memiliki fungsi yang
berhubungan ke dalam sebuah paket. Deklarasi sebuah package diletakkan pada posisi paling atas dari
sebuah kode program.
Import merupakan cara sebuah kelas untuk menggunakan kelas dari package yang berbeda. Deklarasi
import dituliskan di atas nama kelas dan di bawah nama package. Contoh penulisan lengkap deklarasi
package, import dan nama kelas.
package new;
import java.util.*;
class ex {
.......
}
Tanda bintang pada deklarasi import menyatakan bahwa semua kelas di dalam package yang
bersangkutan ikut dipanggil oleh kelas tersebut.
3.4 Penggunaan modifier static
Modifier static digunakan untuk memastikan bahwa sebuah atribut/method dialokasikan hanya sekali di
memory tanpa mempedulikan jumlah obyek yang diinstansiasi dari kelas tersebut. Modifier static hanya
digunakan pada atribut/method, tidak dapat digunakan pada kelas.
class ex {
static value;
}
public class Main {
public static void main(String[] args) {
15
ex a = new ex();
ex b = new ex();
ex c = new ex();
a.value = 10;
System.out.println(“Nilai untuk a = ”+a.value);
System.out.println(“Nilai untuk b = ”+b.value);
System.out.println(“Nilai untuk c = ”+c.value);
// Pemanggilan atribut static oleh kelasnya
System.out.println(“Nilai untuk kelas ex = ”+ex.value);
}
}
Hasil dari program tersebut adalah sebagai berikut:
Nilai untuk a = 10
Nilai untuk a = 10
Nilai untuk a = 10
Nilai untuk a = 10
Atribut/method non-static tidak dapat diakses oleh method static. Untuk mengakses atribut/method
non-static pada method static, harus dibuat dulu obyek dari atribut/method kelas yang ingin diakses.
2.5 Array
3.5.1 Mendeklarasikan Array
Array biasanya digunakan untuk mengelompokkan data atau obyek yang memiliki tipe yang sama.
Array memungkinkan untuk mengacu ke sekumpulan obyek dengan nama yang sama. Array dapat dideklarasikan dengan tipe apa saja, baik itu yang bertipe data primitif maupun obyek.
Berikut contoh deklarasi Array :
char s[];
point p[]; // point adalah sebuah kelas
Dalam bahasa pemrograman Java, Array merupakan sebuah obyek meskipun ia terdiri dari elemen
yang bertipe data primitif. Seperti halnya kelas yang lain, ketika mendeklarasikan Array belum
dibentuk sebuah obyek Array. Deklarasi Array hanya membuat sebuah referensi yang dapat digunakan
untuk mengacu ke sebuah obyek Array.
Besarnya memori yang digunakan oleh elemen-elemen Array akan dialokasikan secara dinamis dengan
menggunakan pernyataan new atau dengan array initializer.
Contoh deklarasi array di atas, dengan menggunakan kurung siku setelah nama variabel, merupakan
standar penulisan array dalam C, C++ dan Java. Format demikian agak sulit untuk dibaca. Oleh
karenanya, bahasa Java menggunakan bentuk deklarasi array alternatif dengan menggunakan kurung
siku di sebelah kiri seperti dalam contoh berikut :
char [] s;
point [] p; // point adalah sebuah kelas
Sebuah deklarasi array dapat ditulis sebagai pendeklarasian tipe array di bagian kiri dan nama variabel di bagian kanan. Kedua bentuk deklarasi array di atas dapat digunakan, tetapi sebaiknya konsisten
dalam menggunakan satu bentuk saja. Dalam deklarasi array, tidak ditentukan ukuran aktual dari
array. Ketika mendeklarasikan array dengan kurung siku yang berada di sebelah kiri nama variabel,
kurung siku tersebut berlaku bagi semua variabel yang berada di sebelah kanannya.
3.5.2 Membuat Array
Array dibuat dengan menggunakan keyword new. Contoh di bawah ini membuat sebuah Array dengan
tipe primitif char:
16
s = new char[26];
Indeks array dimulai dengan angka 0. Batasan legal untuk nilai indeks ini adalah dari nol hingga jumlah
elemen array – 1. Apabila program berusaha mengakses array di luar batas yang legal, maka akan
muncul runtime exception.
Untuk membuat Array dengan elemen obyek, gunakan cara penulisan berikut
p = new point[10];
Pernyataan tersebut tidak membuat 10 obyek Point. Untuk membuat obyek Point, gunakan
pernyataan berikut :
p[0] = new point(0, 1);
p[1] = new point(1, 2);
...
3.5.3 Menginisialisasi Array
Java memiliki cara singkat untuk membuat sebuah obyek Array dengan elemen-elemennya memiliki
nilai awal :
String names[] = {"Georgianna","Jen","Simon"};
Kode di atas adalah sama dengan kode berikut ini:
String names[];
names[0] = "Georgianna";
names[1] = "Jen";
names[2] = "Simon";
Cara singkat ini dapat digunakan untuk Array dengan berbagai jenis
tipe, seperti dalam contoh berikut :
MyDate dates[] = {
new MyDate(22, 7, 1964),
new MyDate(1, 1, 2000),
new MyDate(22, 12, 1964),
};
3.5.4 Array Multidimensi
Dalam Java, dapat dibuat Array dari Array sehingga dinamai Array multidimensi. Contoh berikut ini
memperlihatkan cara membuat Array dua dimensi :
int twoDim [][] = new int[4][];
twoDim[0] = new int[5];
twoDim[1] = new int[5];
Array dari Array yang bersifat non-rectangular dapat dibuat seperti dalam contoh berikut :
twoDim[0] = new int[2];
twoDim[1] = new int[4];
twoDim[2] = new int[6];
twoDim[3] = new int[8];
Untuk membuat Array dari Array yang rectangular dengan cara mudah, gunakan bentuk berikut ini :
int twoDim[][] = new int[4][5];
3.5.5 Batasan Array
Dalam bahasa Java, indeks Array dimulai dengan angka nol. Jumlah elemen di dalam Array disimpan
sebagai bagian dari obyek Array di dalam atribut length. Atribut ini dapat digunakan untuk melakukan
proses iterasi pada Array seperti dalam contoh berikut :
17
int list[] = new int[10];
for(int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
Dengan menggunakan atribut length, pemeliharaan kode program menjadi mudah karena program
tidak perlu mengetahui jumlah eleman Array pada saat kompilasi.
Setelah membuat obyek Array, ukuran Array tersebut tidak dapat diubah. namun demikian, dapat
digunakan variabel referensi yang sama untuk menunjuk ke sebuah obyek Array baru seperti dalam contoh di bawah ini :
int myArray[] = new int[6];
myArray = new int[10];
Dalam kode program ini, obyek Array yang pertama akan hilang kecuali ada variabel lain yang dibuat
untuk merujuk ke obyek Array tersebut.
3.6 Atribut bertipe obyek
Dalam Object Oriented Programming, kelas-kelas yang terbentuk dapat memiliki atribut dengan tipe
obyek lainnya. Hal ini dapat dilihat pada contoh berikut:
//mahasiswa.java
public class mahasiswa {
private String NIM, Nama;
public mahasiswa(String no, String nm) {
this.NIM = no;
this.Nama = nm;
}
public String GetNIM() {
return (NIM);
}
public String GetNama() {
return (Nama);
}
}
//jurusan.java
public class Jurusan {
private String KodeJurusan, NamaJurusan;
private Mahasiswa[] Daftar=new Mahasiswa[10];
public Jurusan(String kode, String nama) {
this.KodeJurusan = kode;
this.NamaJurusan = nama;
}
private static int JmlMhs = 0;
public void AddMahasiswa(Mahasiswa m) {
if(this.JmlMhs<10){
this.Daftar[JmlMhs] = m;
this.JmlMhs++;
}
}
public void DisplayMahasiswa() {
int i;
System.out.println("Kode Jurusan : "+this.KodeJurusan);
System.out.println("Nama Jurusan : "+this.NamaJurusan);
System.out.println("Daftar Mahasiswa :");
18
for (i=0;i<JmlMhs;i++)
System.out.println(Daftar[i].GetNIM()+"
"+Daftar[i].GetNama());
}
}
Pada kode program di atas dapat dilihat bahwa pada satu kelas jurusan terdapat atribut bernama
Daftar yang bertipe array dari obyek Mahasiswa. Penggambaran kode program di atas pada diagram
kelas adalah sebagai berikut:
Gambar 3.1 Diagram kelas Jurusan-Mahasiswa
Dari gambar dapat dilihat bahwa satu kelas Jurusan dapat memiliki beberapa atribut bertipe kelas
Mahasiswa.
19
4 Inheritance dan Polimorfisme Overview
Inheritance dan Polymorphism merupakan konsep OOP yang memberikan fleksibilitas kepada
programmer dalam menulis program. Dengan mengaplikasikan konsep inheritance, sebuah kelas
dapat menurunkan fungsi dan atribut yang dimilikinya kepada kelas yang menjadi turunannya. Dengan
mengaplikasikan konsep polymorphism, programmer dapat memperlakukan seluruh object yang
berasal dari superclass yang sama seakan-akan mereka adalah object dari superclass. Pada Java, konsep
polymorphism diimplementasikan melalui beberapa cara yaitu overloading, overriding, abstract class dan
melalui interface.
Tujuan
1. Memahami dan menerapkan konsep pewarisan dalam OOP
2. Memahami penggunaan kelas abstrak dalam OOP
3. Memahami penggunaan interface dalam OOP
4. Memahami dan menerapkan konsep polimorfisme dalam OOP
4.1 Pewarisan di Java
Pewarisan di Java hanya mengenal pewarisan tunggal, artinya sebuah kelas hanya mewarisi atribut dan
method dari satu kelas induk. Untuk menggunakan pewarisan di Java digunakan keyword extends.
Contoh pewarisan dapat dilihat pada diagram kelas berikut ini:
Gambar 4.1 Contoh Pewarisan Kelas
Implementasi dari diagram kelas di atas dalam Java adalah sebagai berikut:
//Employee.java
public class Employee {
public String name;
public Date birthDate;
public double salary;
public String getDetails() {...}
}
//Manager.java
public class Manager extends Employee {
public String department;
}
Atribut name, birthDate, dan salary serta method getDetails() diturunkan ke kelas
Manager sehingga kelas Manager dapat menggunakan atribut dan method tersebut. Konstruktor dari
kelas induk tidak dapat diturunkan kepada kelas turunannya.
+getDetails() : String
+name : String = ""
+salary : double
+birthDate : Date
Employee
+departement : String
Manager
20
Untuk menggunakan method dan konstruktor dari kelas induk pada kelas anak digunakan keyword
super, contoh:
//Employee.java
public class Employee {
private String name;
private double gaji;
public Employee (String s, double g) {
name = s;
gaji=g;
}
public double getgaji() {
return gaji;
}
}
//Manager.java
public class Manager extends Employee {
private String alamat;
private double tunjangan;
private double bonus;
public Manager(String nama, String s) {
super(nama);
alamat = s;
}
Public double getgaji() {
return (super.getgaji()+tunjangan+bonus);
}
}
4.1.1 Kelas Abstrak
Kelas abstrak merupakan suatu bentuk khusus dari kelas di mana kelas tersebut tidak dapat
diinstansiasi dan digunakan hanya untuk diturunkan ke dalam bentuk kelas konkret atau kelas abstrak
berikutnya.
Kelas abstrak dideklarasikan menggunakan keyword abstract.
Di dalam kelas abstrak dapat dideklarasikan atribut dan method sama seperti kelas konkret, namun
ada juga method abstrak, yaitu suatu method yang tidak mempunyai implementasi hanya memiliki
deklarasi saja, contoh:
public abstract class LivingThing {
public void breath(){
System.out.println("Living Thing breathing...");
}
public void eat(){
System.out.println("Living Thing eating...");
}
public abstract void walk(); //merupakan method abstrak
}
Ketika sebuah kelas mewarisi sebuah kelas abstrak, kelas tersebut harus mendefinisikan implementasi
dari method abstrak yang ada dalam kelas induknya. Jika tidak didefinisikan implementasinya, maka
kelas tersebut akan menjadi kelas abstrak juga, contoh:
public class Human extends LivingThing {
21
//implementasi dari method abstrak walk()
public void walk(){
System.out.println("Human walks...");
}
}
4.1.2 Interface
Interface adalah prototype kelas yang berisi definisi konstanta dan deklarasi method (hanya nama
method tanpa definisi kode programnya). Dalam sebuah interface:
- Semua atribut adalah public, static dan final (semua atribut bertindak sebagai konstanta) secara
default. Artinya, jika tidak dideklarasikan secara eksplisit, maka sebuah atribut memiliki sifat-
sifat tersebut secara otomatis.
- Semua method adalah abstract dan public secara default. Artinya, jika tidak dideklarasikan
secara eksplisit, maka sebuah method memiliki sifat-sifat tersebut secara otomatis.
- Tidak boleh ada deklarasi konstruktor.
- Interface dapat meng-extend satu atau beberapa interface lainnya.
Dengan adanya interface, Java menyediakan sebuah fitur untuk keperluan pewarisan jamak (multiple
inheritance).
Contoh interface dan kegunaannya:
Gambar 4.2 Contoh Interface
Untuk membuat interface di Java digunakan keyword interface. Source code untuk diagram kelas di atas
dalam Java adalah sebagai berikut:
//Relation.java
public interface Relation {
public boolean isGreater( Object a, Object b);
public boolean isLess( Object a, Object b);
public boolean isEqual( Object a, Object b);
}
//Line.java
public class Line implements Relation {
private double x1;
private double x2;
private double y1;
private double y2;
public Line(double x1, double x2, double y1, double y2){
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}
22
public double getLength(){
double length = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)* (y2-y1));
return length;
}
public boolean isGreater( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen > bLen);
}
public boolean isLess( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen < bLen);
}
public boolean isEqual( Object a, Object b){
double aLen = ((Line)a).getLength();
double bLen = ((Line)b).getLength();
return (aLen == bLen);
}
}
4.1.3 Beberapa Catatan tentang Pewarisan
1. Sebuah kelas dengan akses public bersifat visible oleh semua kelas dari semua package.
Visibilitas kelas berarti sebuah kelas dapat:
a. Membuat instance dari kelas lain yang visible
b. Meng-extend sebuah kelas lain yang visible
c. Mengakses method dan atribut dari kelas lain yang visible
2. Kelas dapat diberi modifier final atau abstract.
a. Sebuah kelas tidak dapat final dan abstract sekaligus.
b. Sebuah kelas yang final tidak dapat diturunkan.
c. Sebuah kelas yang abstract tidak dapat diinstansiasi.
d. Sebuah method abstract di dalam sebuah kelas berarti kelas tersebut adalah abstract.
e. Sebuah kelas abstract dapat memiliki beberapa abstract dan juga beberapa concrete
method. Concrete method ditandai dengan:
i. Tidak diberi modifier abstract.
ii. Memiliki kurung kurawal dan penutup pada deklarasi method-nya.
f. Sebuah kelas concrete yang meng-extend sebuah kelas abstract harus
mengimplementasikan seluruh method abstract pada superclass-nya.
4.2 Konsep Poliformisme
Memahami proses terjadinya Virtual Method Invocation Tulislah listing program berikut ini dan amati
yang terjadi pada saat terjadinya Virtual Method Invocation.
23
Gambar 4.3 Virtual Method Invocation
Ketika program tersebut dijalankan, akan tampak hasil seperti di bawah ini :
Nilai x = 5
Ini class Child
Mengimplementasikan UML class diagram dalam program
Suatu program terdiri dari class Pegawai sebagai parent class, dan class Manajer dan
class Kurir sebagai subclass. Buatlah suatu program yang menerapkan konsep polymorphic
argument sebagaimana yang telah disinggung dalam pembahasan sebelumnya.
Gambar 4.4 Contoh Class diagram
24
Transformasikan class diagram di atas ke dalam bentuk program?. Tulislah listing program berikut
ini sebagai pengetesan.
Gambar 4.5 Implementasi class diagram
Lakukan kompilasi pada program di atas dan jalankan.
Bayaran untuk Manajer : 850
Bayaran untuk Programmer : 630
4.2.1 Overloading
Mengimplementasikan UML class diagram dalam program untuk class Kalender
Gambar 4.6 Kelas Kalender
Dari class diagram di atas, desainlah suatu class yang memenuhi konsep enkapsulasi.
Untuk nilai inisialisasi, dipakai 1-1-2000. Pakailah kata kunci this untuk mempersingkat
pengkodean. Tulislah listing program berikut ini sebagai pengetesan.
25
Gambar 4.7 Penggunaan kelas Kalender
Lakukan kompilasi pada program di atas dan jalankan.
Waktu awal : 8-1-2000
1 hari setelah waktu awal : 9-1-2000
Waktu berubah : 1-6-2003
1 bulan setelah itu : 1-7-2003
Waktu berubah : 20-10-2004
1. tahun setelah itu : 20-10-2005
4.2.2 Overriding
Overriding adalah suatu keadaan di mana method pada subclass menolak method pada parent
class-nya. Overriding mempunyai ciri-ciri sebagai berikut :
1. Nama method harus sama
2. Daftar parameter harus sama
3. Return type harus sama atau bertipe turunan dari return type parent class
Berikut ini contoh terjadinya overriding di mana method Info() pada class Child meng-
override method Info() pada class parent:
26
Gambar 4.8 Contoh overloading
Method yang terkena override (overridden method) diharuskan tidak boleh mempunyai modifier
yang lebih luas aksesnya dari method yang meng-override (overriding method).
4.2.3 Beberapa Catatan Penting tentang Polimorfisme
1. Sebuah reference variable tidak dapat berubah tipe, tapi dapat merujuk ke obyek yang bertipe
subclass variabel tersebut.
2. Sebuah obyek dapat diacu oleh beberapa reference variable selama memiliki tipe yang sama
atau merupakan tipe superclass obyek tersebut.
3. Method yang dapat dipanggil ditentukan oleh tipe reference variable, bukan tipe obyeknya.
4. Method yang di-override yang digunakan ditentukan oleh tipe obyek, bukan tipe reference
variable.
5. Terdapat dua jenis reference variable casting:
ii. Downcasting: Sebuah reference variable merujuk kepada obyek bertipe subclass dapat di-
assign ke reference variable bertipe subclass dengan melakukan casting secara explisit.
Reference variable bertipe subclass tersebut dapat mengakses properti dari kelas tipenya.
class parent { }
class child extends parent { }
public class Main {
public static void main(String[] args) {
parent a = new child();
child b = (child) a;
}
}
iii. Upcasting: Sebuah reference variable dapat di-assign ke reference variable bertipe superclass-
nya secara implisit.
class parent { }
class child extends parent { }
public class Main {
public static void main(String[] args) {
child a = new child();
parent b = a;
27
}
}
6. Hanya method yang diturunkan yang dapat di-override. Method yang bersifat private tidak
diturunkan. Sebuah�subclass menggunakan super.overridden_Method_Name() untuk
memanggil versi superclass dari overridden method.
7. Sebuah method yang di-overload:
a. Harus memiliki daftar argumen yang berbeda
b. Boleh memiliki return type berbeda
c. Boleh memiliki access specifier yang berbeda
d. Method dari superclass dapat di-overload oleh subclass
28
5 Exception Handling Overview
Bab ini akan menjelaskan tentang Exception di Java, apa yang dimaksud dengan Exception, bagaimana
menangkap Exception. Serta akan dijelaskan throwing exception dan membuat user define exception.
Tujuan
1. Mengetahui tentang Exception di Java.
2. Mengetahui kelas-kelas exception di Java
3. Mengetahui bagaimana Exception muncul dan cara menangkap Exception
4. Mengetahui cara melempar Exception
5. Mengetahui tentang User Define Exception
Ketika sebuah exception muncul selama eksekusi program, dikatakan bahwa exception telah dilempar
(exception is thrown). Ketika hal ini terjadi program diberhentikan dan program bisa rusak.
Bagaimanapun, kegagalan program dapat dihindari jika exception yang dilempar dapat ditangkap dan
dikelola sebagaimana mestinya. Sebuah exception dapat dilempar di suatu bagian program dan dapat
ditangkap di bagian lain dari program tersebut. Exception yang tidak ditangkap akan membuat
program gagal. Contoh : Jika terjadi pembagian dengan nol atau membuka file yang tidak ada, maka
exception akan muncul.
Ketika sebuah exception dilempar, hal yang sebenarnya dilempar adalah sebuah obyek. Obyek ini
membawa informasi dari tempat di mana exception di tangkap dan dikelola. Biasanya sebuah obyek
exception mengandung pesan error yang mendeskripsikan apa yang terjadi sehingga menyebabkan
exception dan dapat berisi data lain.
Semua obyek exception merupakan subclass dari kelas standar java.lang.Throwable, dan
subclass ini diatur dalam hirarki kelas yang kompleks. Class Throwable mempunyai turunan Class
yaitu class Error dan Exception. Kedua kelas ini nanti yang akan mempunyai beberapa turunan. Subclass
yang ada di bawah Error merupakan kelas yang merepresentasikan error serius di dalam Java Vitual
Machine yang membuat program di terminasi karena terdapat masalah. Umumnya, sebaiknya tidak
dilakukan try catch pada error. Subclass Exception merepresentasikan exception yang biasanya disebut
error tetapi error ini merupakan error yang dapat di atasi dengan cara tertentu.
Kelas Exception mempunyai beberapa subclass seperti RunTimeException,
InterruptedException, dan IOException. Exception RunTimeException
mengelola exception yang muncul di dalam program ketika runtime. Untuk lebih lengkapnya, dapat
dibaca di javadoc manual. Berikut beberapa penyebab exception muncul :
Tabel 5.1 Contoh Exception
Exception Penyebab
IllegalArgumentException Muncul ketika memberikan argumen yang tidak
sesuai dengan tipe data pada suatu method
ArrayIndexOutOfBoundsException Muncul ketika mengakses elemen array yang tidak
terdapat pada array tersebut (melampui batas
indeks)
NumberFormatException Muncul ketika ingin mengubah sebuah string ke
format numerik
29
ArithmeticException Muncul ketika membuat sebuah error dalam
aritmatika seperti pembagian dengan nol
NullPointerException Muncul ketika suatu aplikasi berusaha menggunakan
obyek tanpa mengalokasikan memori
ClassCastException Muncul ketika terjadi kesalahan melakukan casting
sebuah obyek
Exception secara umum dibagi dua:
1. Checked exception, yakni exception yang akan dicek pada saat dilakukan kompilasi. Exception ini
terdiri dari seluruh turunan kelas Exception kecuali RunTimeException. Exception ini harus
ditangani secara explisit menggunakan mekanisme exception handling.
2. Unchecked exception, yakni exception yang tidak dicek pada saat dilakukan kompilasi. Exception
ini terdiri dari turunan kelas Error dan RunTimeException beserta seluruh turunannya.
5.1 Mengimplementasikan Exception Handling
Ketika sebuah error muncul di dalam method, Java membuat sebuah obyek Exception. Setelah
membuat obyek exception, Java mengirimkannya ke program dengan melemparkan exception (throwing
exception). Exception yang dlempar perlu ditangani menggunakan exception handler dan diproses.
Untuk mengimplementasikan Exception handling digunakan keyword berikut :
o Try
o Catch
o Finally
o Throw
o Throws
5.1.1 Statement Try dan Catch
Untuk menangkap exception di dalam program java, diperlukan Statement try. Blok Statement
try membingkai kode yang kemungkinan akan memunculkan exception dan mendefinisikan exception
handler yang dapat menanganinya. Blok catch digunakan sebagai exception handler. Blok try harus
mempunyai minimal satu buah blok catch yang mengikutinya. Klausa catch menspesifikasikan tipe
exception yang akan ditangani. Lingkup dari blok catch dibatasi oleh Statement yang ada di dalam blok
try. Statement untuk mendeklarasikan blok try catch :
try {
//Statements that cause an exception
}
catch(<exception name> <object name>){
//error handling code
} Komputer akan mengeksekusi statement yang ada di dalam blok try. Jika tidak ada exception
yang muncul ketika dieksekusi maka Statement catch tidak akan di jalankan. Jika sebuah exception
muncul maka blok catch akan langsung dijalankan. Contoh :
public class ArithmeticException{
public static void main (String[] args){
int num1=5, num2=0;
int num3=num1/num2;
30
System.out.println(“The num3 = “+num3);
}
} Jika program di atas di compile maka tidak ada error, tetapi setelah di eksekusi, handler pada
Java runtime sistem akan melempar sebuah exception ketika terjadi pembagian dengan nol sehingga
akan dibuat sebuah obyek dari kelas exception yang dilempar yaitu ArithmeticException.
Jika sebuah exception muncul di dalam blok try maka exception handler yang berkaitan akan
menangani exception tersebut, pada contoh di atas karena muncul exception
ArithmeticException maka akan dibuat exception handler untuk ArithmeticException
public class ArithmeticException{
public static void main (String[] args){
int num1=5, num2=0;
try{
int num3=num1/num2;
System.out.println(“The num3 = “+num3);
}
catch(ArithmeticException obj){
System.out.println(“Division by zero”);
}
}
} Dengan menangani exception maka program terhindar dari kerusakan. Sebelum isi dari catch
dieksekusi, obyek yang merepresentasikan exception diletakkan ke dalam variabel obj, yang berisi data
tentang exception.
5.1.2 Multiple Catch
Sebuah blok try dapat diikuti oleh banyak blok catch. Hal ini penting ketika sebuah blok try
mempunyai Statement yang mungkin akan memunculkan berbagai tipe exception. Contoh :
public class MultipleCatch{
public static void main (String[] args){
int num1=5, num2=0;
int arrNum[]= {1,2,3 };
try{
int num3=num1/num2;
System.out.println(“The num3 = “+num3);
System.out.println(“The 3 elemen is “+ArrNum[3]);
}
catch(ArithmeticException obj){
System.out.println(“Division by zero”);
}
catch(ArrayIndexOutOfBondException obj){
System.out.println(“Error…Out Of Bounds”);
}
31
catch(Exception obj){
System.out.println(“Other error”);
}
}
}
Pada kode di atas terdapat tiga catch untuk menangani exception yaitu ArithmeticException,
ArrayIndexOutOfBoundException, dan Exception. Blok catch yang pertama akan dieksekusi jika di dalam
blok try melempar ArithmeticException, blok catch yang kedua akan dieksekusi jika di dalam blok try
melempar ArrayIndexOutOfBoundException, dan blok catch yang terakhir akan menangkap exception
yang lain. Ketika program mengeksekusi int num3=num1/num2;, maka ArithmeticException akan
muncul dan akan ditangkap oleh blok catch yang pertama (ArithmeticException obj).
Kelas Exception merupakan superclass dari semua tipe kelas exception. Jika blok catch yang pertama
berisi obyek dari kelas Exception maka blok catch berikutnya tidak akan dieksekusi, hal ini disebut
unreachable code. Untuk menghindari error unreachable code, maka catch yang di dalamnya
mengandung kelas Exception diletakkan pada urutan blok catch yang terakhir.
5.1.3 Statement Finally
Statement yang berada di dalam blok finally akan dieksekusi paling akhir ketika sedang mengeksekusi blok try, meskipun tidak ada exception yang muncul atau ada exception yang muncul.
Statement finally digunakan untuk melakukan sesuatu yang penting ketika terdapat exception atau
tidak. Sintaks try-catch-finaly :
try{
//block of code
}
catch (<exception name> <object name>){
//block of exception code
}
finally{
//block of code that is always executed
}
Jika sebuah exception dilempar atau tidak dilempar, blok finally akan dieksekusi meskipun tidak ada
Statement catch yang cocok dengan exception yang muncul. Untuk menghindari duplikasi kode maka
dapat diletakkan di dalam blok finally. Blok finally merupakan pilihan, boleh ada atau tidak di dalam try
catch blok, tetapi hanya satu blok finally saja yang dapat dibuat dalam satu buah blok try.
5.1.4 Throwing Exception
Suatu saat dibutuhkan untuk melempar exception pada program yang dibuat. Hal ini terjadi jika
di dalam program ditemukan beberapa exceptional atau kondisi error tetapi tidak ada alasan untuk
menangani error tersebut di mana permasalahan ditemukan. Program dapat melempar sebuah
exception dengan harapan dapat ditangkap dan ditangani oleh blok catch. Hal ini dapat dilakukan
dengan melempar exception secara eksplisit dengan menggunakan Statement throw. Contoh:
dibutuhkan untuk melempar exception ketika user salah memasukkan nilai.
Statement throw akan menyebabkan terminasi dari aliran control program Java dan menghentikan
eksekusi ketika Statement tersebut dieksekusi. Exception yang dilempar oleh Statement throw akan ditangkap oleh blok catah yang ada, jika tidak ada blok catch yang sesuai dengan exception yang
dilempar maka program akan diterminasi. Contoh pengggunaan Statement throw:
public class ThrowingStatement{
32
static double root(double A,double B, double C){
double disc=0;
try {
if(A==0){
throw new IllegalArgumentException("A can't be zero");
}
else{
disc = (B*B)-(4*A*C);
if (disc<0)
throw new IllegalArgumentException("Discriminant< 0");
}
}
//endtry
catch(IllegalArgumentException obj){
System.out.println("Illegal Argument in : "+obj);
}
return ((-B + Math.sqrt(disc))/(2*A));
}
public static void main(String[] args){
double Ans = root(0,2,4);
}
}
Program di atas mempunyai kondisi A!= 0dan B*B-4*A*C>=0. Method akan melempar sebuah
exception IllegalArgumentException jika kondisi tersebut tidak terpenuhi. Ketika sebuah
kondisi illegal ditemukan dalam method, melempar sebuah exception merupakan cara yang masuk akal.
Jika program yang memanggil method mengetahui cara menangani error, maka dapat menangkap
exception, jika tidak maka program akan rusak dan harus diperbaiki.
Statement Throws digunakan oleh method untuk menspesifikasikan tipe-tipe exception yang akan dilempar di dalam method. Jika method yang melempar exception tidak dapat menanganinya maka
exception harus ditangani oleh bagian yang memanggil method tersebut. Hal ini dilakukan dengan
Statement throws. Statement throws digunakan untuk menuliskan tipe-tipe exception yang terdapat di
dalam method. Contoh :
class ThrowingStatement{
static double root(double A,double B, double C) throws
IllegalArgumentException{
double disc=0;
if(A==0){
throw new IllegalArgumentException("A can't be zero");
}
33
else{
disc = (B*B)-(4*A*C);
if (disc<0)
throw new IllegalArgumentException("Discriminant< 0");
}
return ((-B + Math.sqrt(disc))/(2*A));
}
public static void main (String[] args){
double Ans;
try{
Ans = root(0,2,4);
}
catch(IllegalArgumentException obj){
System.out.println("Illegal Argument in : "+obj);
}
}
}
5.2 User defined Exception
User defined exception merupakan exception yang dibuat oleh programmer sesuai dengan
permintaan pada aplikasi. Tiap aplikasi yang dibuat kemungkinan mempunyai batasan yang spesifik.
Statement throw, throws, try, catch, dan finally digunakan dalam mengimplementasikan user define
exception. Kelas Exception menuruni semua method yang ada di dalam kelas Throwable. User defined
exception juga menuruni semua method yang didefinisikan di dalam kelas Throwable. Contoh :
class MyException extends Exception{
public String toString(){
return "MyException caught : The Input value cannot less than
0";
}
}
public class UserException {
static int TestUAQ, TestUTQ;
static void setValue(int UAQ,int UTQ) throws MyException{
if ((UAQ<0)||(UTQ<0))
throw new MyException();
TestUAQ=UAQ;
TestUTQ=UTQ;
System.out.println("The value UAQ : "+TestUAQ+", UTQ :
"+TestUTQ);
34
}
public static void main (String[] args){
try{
setValue(80,90);
setValue(-70,60);
}
catch(MyException obj){
System.out.println("The Exception raised : "+obj);
}
}
}
5.3 Beberapa Catatan tentang Exception
1. Pada multiple catch exception, exception yang merupakan superclass harus berada di bawah
exception subclass-nya.
2. Kode program pada klausa finally akan selalu dieksekusi, meskipun terjadi exception atau tidak,
meskipun exception yang ada berhasil ditangani atau tidak.
3. Sebuah method yang meng-override tidak dapat mendeklarasikan checked exception baru yang
tidak dideklarasikan oleh method yang di-override.
4. Sebuah method yang meng-override tidak dapat mendeklarasikan checked exception yang
merupakan superclass dari exception yang dideklarasikan pada method yang di-override.
5. Sebuah method yang meng-override dapat mendeklarasikan checked exception yang merupakan
turunan dari exception yang dideklarasikan pada method yang di-override.
6. Sebuah method yang meng-override dapat mendeklarasikan segala jenis unchecked exception
tanpa peduli apakah exception tersebut dideklarasikan oleh method yang di-override.
35
6 Input/Output Overview
Dalam bab ini akan dibahas tentang bagaimana cara melakukan pengaksesan data kedalam file, baik
melakukan proses pembacaan ataupun penulisan. Akan dibahas tentang pengaksesan data
menggunakan stream dan random access file.
Tujuan
1. Penggunaan file menggunakan kelas File.
2. Penggunaan byte stream.
3. Penggunaan character stream.
4. Pengaksesan dengan random-access file
6.1 Implementasi Kelas File
Kelas file dalam package java.io menyediakan berbagai macam method untuk mengakses atribut-
atribut dari file dan direktori, seperti hak akses dari, tanggal pembuatan dan akses, alamat dari
direktori di mana file tersebut berada, dan lain-lain. Sebuah obyek yang dibuat dari kelas File yang
akan merepresentasikan file atau direktori. Terdapat beberapa konstruktor yang bisa kita gunakan
untuk membuat instance pada kelas File:
1. File(File obyekDirektori, String namaFile):
Membuat sebuah instance pada kelas File di mana obyekDirektori adalah sebuah obyek
dari kelas File yang menunjuk sebuah direktori, sedang namaFile adalah file yang akan
diakses.
2. File (String alamatDirektori):
Membuat sebuah obyek dari kelas File. alamatDirektori merupakan alamat di
direktori mana file yang akan diakses berada.
3. File(String alamatDirektori, String namaFile):
Membuat sebuah obyek dari kelas File. alamatDirektori menentukan alamat direktori
dari file sedangkan nama file menentukan file mana yang akan diakses.
Keterangan: Alamat disini bisa berupa alamat absolut atau alamat relatif.
Terdapat beberapa method yang bisa digunakan di dalam sebuah obyek dari kelas File, antara lain:
Tabel 6.1 Method dalam kelas File
Method Keterangan
boolean canRead() Akan mengembalikan nilai true jika file yang sedang diakses saat ini dapat
dibaca (readable). Jika tidak akan mengembalikan nilai false.
boolean
canWrite()
Akan mengembalikan nilai true jika file bisa ditulis (writable). Jika tidak
akan mengembalikan nilai false
boolean exists() Akan mengembalikan nilai true jika argumen yang ditunjuk pada konstruktor instantiasi obyek merupakan sebuah file atau direktori. Jika
bukan file atau direktori akan mengembalikan nilai false.
boolean isFile() Akan mengembalikan nilai true jika argumen yang ditulis dalam
36
konstruktor merupakan sebuah file. Selain itu akan bernilai false.
boolean
isDirectory()
Akan mengembalikan nilai true jika argumen yang ditulis dalam
konstruktor adalah sebuah direktori. Selain itu akan mengembalikan nilai
false.
boolean
isAbsolute()
Akan mengembalikan nilai true jika argument yang ditulis dalam
konstruktor adalah sebuah alamat absolut dari file atau direktori. Selain
itu akan mengembalikan nilai false.
String
getAbsolutePath()
Akan mengembalikan sebuah string alamat absolut dari sebuah file atau
direktori.
String getName() Akan mengembalikan sebuah string nama dari file atau direktori.
String getPath() Akan mengembalikan sebuah string alamat dari di mana file atau
direktori tersebut.
String
getParent()
Akan mengembalikan sebuah string alamat induk dari file atau direktori
tersebut. (direktori di mana file atau direktori tersebut disimpan)
long length() Mengembalikan panjang dari file, dalam ukuran byte. Jika berupa sebuah
direktori akan mengembalikan nilai 0 (nol).
long
lastModified()
Akan mengembalikan sebuah representasi waktu kapan terakhir kali file
atau direktori tersebut dimodifikasi.
String[] list() Akan mengembalikan sebuah array berbentuk string yang akan
menyimpan daftar isi (file dan direktori) dari sebuah direktori. Jika
bukan sebuah direktori akan mengembalikan nilai null.
Berikut adalah contoh penggunaan kelas File.
import java.io.File;
import java.io.IOException;
class AksesFile{
String daftar[] = new String[20];
public void displayData() {
try {
File obj1 = new File("D:\\IO","KelasFile.java");
File obj2 = new File("D:\\IO");
System.out.println("Sebuah obyek file");
System.out.println("Nama File : "+obj1.getName());
System.out.println("getAbsolutPath : "+obj1.getAbsolutePath());
System.out.println("getPath : "+obj1.getPath());
System.out.println("Lokasi : "+obj1.getParent());
System.out.println("Panjang : "+obj1.length());
37
System.out.println("Last Modif : "+obj1.lastModified());
System.out.println();
System.out.println("Sebuah obyek Direktori");
System.out.println("Nama Direktori : "+obj2.getName());
System.out.println("getAbsolutPath : "+obj2.getAbsolutePath());
System.out.println("getPath : "+obj2.getPath());
System.out.println("Lokasi : "+obj2.getParent());
System.out.println("Panjang : "+obj2.length());
System.out.println("last Modif : "+obj2.lastModified());
daftar = obj2.list();
System.out.println("Isi dari direktori : ");
for (int i=0;i<daftar.length;i++) {
System.out.println("\t"+daftar[i]);
}
}
catch (Exception e) {
System.out.println(e);
}
}
}
public class KelasFile {
public static void main(String[] args){
AksesFile aksesFile = new AksesFile();
aksesFile.displayData();
}
}
Keluaran dari program di atas adalah:
38
Gambar 6.1 Contoh penggunaan File
6.2 Penggunaan Stream dalam Java
Stream dalam sebuah program java digunakan untuk melakukan pembacaan atau penulisan kedalam
sebuah asal (source) atau tujuan (destination). Operasi Input output (I/O) terdiri dari dua bagian, yaitu
input yang berasal dari sebuah sumber (misal sebuah keyboard, jaringan komputer, file) kemudian
data masukan tadi akan diproses dan akan dikeluarkan menuju sebuah tujuan (misal monitor, jaringan
komputer, file).
Di dalam Java, package java.io terdiri dari berbagai macam kelas dan interface stream I/O yang
mendukung operasi I/O. Stream dibagi menjadi dua jenis, byte stream dengan unit dasar satu byte data
dan character stream dengan dasar satu karakter Unicode.
6.2.1 Implementasi Byte Stream
Byte stream menggunakan byte sebagai unit dasar operasi baca dan tulis terhadap streamnya.
Terdapat dua Kelas byte stream yaitu InputStream dan OutputStream.
6.2.1.1 Ouput Stream
Kelas OutputStream merupakan stream yang digunakan untuk menulis data dalam bentuk
byte. Beberapa contohnya adalah digunakan untuk menulis kedalam layar monitor atau file. Beberapa
method yang digunakan dalam kelas OutputStream
Tabel 6.2 Method pada kelas OutputStream
Method Keterangan
write(byte b) Menulis sekian b byte kedalam sebuah file.
write(byte b[])
Menulis array berisi byte kedalam sebuah file.
write(byte b[],
int offset, int
length)
Menulis kedalam byte di mana datanya berasal dari sebuah array b,
dimulai dari lokasi offset sebanyak sekian length byte.
close() Menutup stream output.
flush() Menghapus buffer stream output.
Kelas System dalam package java.lang memiliki sebuah variabel statik yang digunakan untuk
merepresentasikan sebuah layar monitor. Variabel tersebut adalah System.out, yang merupakan
instance dari kelas PrintStream yang bisa menggunakan method write() untuk menulis
kedalam layar monitor. Contoh penggunaannya sebagai berikut.
import java.io.*;
public class CobaSystemOut {
public static void main(String[] args) {
byte[] data = new byte[10];
int panjang=0;
System.out.print("Masukkan data : ");
try {
panjang=System.in.read(data);
39
System.out.print("Yang anda ketik : ");
System.out.write(data);
System.out.println("Panjang Karakter : "+panjang);
System.out.print("index ke-1 sebnyk 3 : ");
System.out.write(data,1,3);
} catch (IOException e) {
System.out.print("Terjadi Exception");
}
}
}
Untuk melakukan operasi penulisan ke dalam sebuah file digunakan kelas FileOutputStream.
Beberapa konstruktor yang bisa digunakan dalam kelas FileOutputStream adalah:
1. FileOutputStream(File objFile):
Membuat sebuah obyek File stream yang menghubungkan dengan sebuah file. objFile
merupakan sebuah file obyek yang merepresentasikan sebuah file.
2. FileOutputStream(String alamatFile):
Membuat sebuah obyek File stream yang menghubungkan dengan sebuah file. String
alamatFile merupakan alamat dari file yang akan dijadikan tujuan penulisan.
3. FileOutputStream(File objFile, boolean bool):
Membuat sebuah obyek File stream yang menghubungkan dengan sebuah file. objFile
merupakan sebuah file obyek yang merepresentasikan sebuah file, sedang boolean bool jika
bernilai true menunjukkan bahwa penulisan file dilakukan dalam mode append (penambahan
data di akhir file)
4. FileOutputStream(String s, boolean bool):
Membuat sebuah obyek File stream yang menghubungkan dengan sebuah file. String
alamatFile merupakan alamat dari file yang akan dijadikan tujuan penulisan, sedang
boolean bool jika bernilai true menunjukkan bahwa penulisan file dilakukan dalam mode
append (penambahan data di akhir file)
Beberapa method untuk melakukan penulisan kedalam stream dengan kelas FileOutputStream
Tabel 6.3 Method dalam kelas FileOutputStream
Method Keterangan
write(byte b) Menulis byte b kedalam file stream.
write(byte b[], int
offset, int length)
Menulis sejumlah length byte dari posisi offset kedalam
file stream, sebanyak length byte.
Berikut adalah contoh dari penggunaan FileOutputStream.
import java.io.*;
public class ContohFOS {
public static void main(String args[]){
40
byte buffer[]=new byte[100];
try{
System.out.println("Masukkan data:");
System.in.read(buffer, 0, 100);
}
catch(IOException e){
System.out.println(e);
}
try{
FileOutputStream objFOS;
objFOS= new FileOutputStream("textFOS.txt");
objFOS.write(buffer);
System.out.println("Data telah ditulis...");
}
catch(FileNotFoundException f){
System.out.println(f);
}
catch(IOException i){
System.out.println(i);
}
}
}
Runtime dari kode di atas
Gambar 6.2 Contoh FOS
Hasil penulisan dalam file textFOS.txt
41
Gambar 6.3 textFOS.txt
6.2.1.2 Input Stream
Input stream adalah stream yang membaca data dalam bentuk byte. Java menyediakan kelas
InputStream yang merupakan kelas abstrak untuk melakukan proses input untuk membaca data
dari berbagai macam sumber (seperti file, keyboard dan jaringan) dan menampilkan datanya kedalam
layar monitor. Beberapa method yang digunakan dalam kelas InputStream.
Tabel 6.4 Method InputStream
Method Keterangan
int read() Membaca satu byte data dari input stream.
int read(byte b[]) Membaca beberapa byte dari input stream dan
memasukkannya kedalam array b
int read(byte b[], int
offset, int length)
Membaca sebanyak length byte dari stream dan
memasukkannya kedalam array b.
Jika memasuki akhir dari stream akan mengembalikan nilai -1
available() Mengembalikan jumlah byte yang bisa dibaca dari sebuah
stream.
long skip(long n) Melewatkan sekian n byte dari input stream.
mark(int nbyte): Menandai posisi yang ada pada input stream saat ini.
reset(): Mengembalikan posisi kepada lokasi yang telah ditandai dari
method mark.
void close()
Menutup input stream dan melepaskan sumber daya yang
terikat pada stream tersebut.
Kelas System dalam package java.lang memiliki satu anggota static yang merupakan referensi
dari sebuah keyboard. Variabel dengan nama System.in merupakan sebuah instance dari kelas
InputStream yang dapat digunakan untuk membaca dari dari keyboard. Berikut adalah contoh
penggunaan System.in yang akan digunakan untuk membaca inputan user dari keyboard.
public class CobaSystemIn{
public static void main(String args[]){
byte buffer[]=new byte[80];
System.out.print("Ketik sesuatu, ");
System.out.print("akhiri dengan ");
System.out.println("menekan tombol enter");
try {
System.in.read(buffer);
}
catch(Exception e) {
42
System.out.println(e);
}
System.out.println();
String str=new String(buffer);
System.out.println("isi Teks:");
System.out.print(str);
}
}
Berikut adalah hasil dari kode di atas:
Gambar 6.4 Obyek System.in
Untuk melakukan operasi input pembacaan data dari dalam file digunakan kelas
FileInputStream. Berikut adalah beberapa konstruktor yang bisa digunakan dalam kelas
FileInputStream.
1. FileInputStream(File namaFile):
Membuat sebuah obyek yang akan menggunakan file dengan nama namaFile sebagai sumber inputannya.
2. FileInputStream(String alamatFile):
Membuat sebuah obyek yang akan menggunakan sebuah file dengan alamat alamatFile
(berbentuk string) sebagai sumber inputannya.
3. FileInputStream(FileDescriptor obyekFile):
Membuat sebuah obyek yang akan menggunakan sebuah obyekfile yang sudah ditentukan
sebelumnya sebagai sumber inputannya.
Beberapa method yang digunakan dalam kelas FileInputStream
Tabel 6.5 Method dalam kelas FileInputStream
Method Keterangan
read() Membaca satu byte data dari stream inputan.
read(byte b[], int offset,
int length)
Membaca sekian length byte data dari stream input
dan memasukkannya kedalam sebuah array b.
long skip(long n) Melewatkan sekian n byte data dari stream input.
Berikut adalah contoh penggunaan FileInputStream.
43
import java.io.*;
public class ContohFIS{
public static void main(String args[]){
byte buffer[]=new byte[100];
try{
FileInputStream file=new FileInputStream("dokumen.txt");
file.read(buffer,0,50);
}
catch(Exception e){
System.out.println(e);
}
System.out.println("Isi file dokumen.txt adalah:");
String str=new String(buffer);
System.out.println(str);
}
}
Berikut adalah hasil dari kode di atas
Gambar 6.5 Contoh FIS
6.2.2 Implementasi Character Stream
Kelas-kelas stream karakter menangani proses I/O dengan basis unit adalah sebuah karakter dengan
menggunakan representasi Unicode yang disimbolkan dengan 16 bit. Stream karakter terdiri dari
kelas-kelas Reader dan Writer dalam package java.io.
6.2.2.1 Kelas Reader
Kelas java.io.Reader merupakan sebuah kelas abstrak yang menyediakan berbagai macam
method untuk melakukan proses pembacaan dalam bentuk karakter Unicode dari berbagai sumber
data seperti harddisk, keyboard atau memori. Karena merupakan sebuah kelas abstrak, maka kelas
ini tidak bisa diinstantiasi, tetapi sub-kelasnya lah yang akan digunakan untuk proses pembacaan data.
Terdapat berbagai macam method dalam kelas Reader, tetapi sebenarnya hanya method read()
dan close() saja yang kita perlukan.
Tabel 6.6 Method dalam kelas Reader
Method Keterangan
int read() Membaca satu karakter dan mengembalikan sebuah nilai
44
integer dari karakter yang dibaca. Jika yang dibaca adalah
EOF maka akan dikembalikan nilai -1.
int read(char buffer[])
Membaca karakter dan memasukkannya kedalam sebuah
array buffer dan mengembalikan sebuah bilangan dari
karakter yang dibaca. Jika EOF akan mengembalikan nilai -1
abstract void close() Menutup stream.
Kelas FileReader
Kelas FileReader digunakan untuk membaca karakter dari dalam file, tetapi kelas ini tidak
memiliki method di dalamnya. Method-nya sendiri diturunkan dari kelas induknya yaitu Reader dan
InputStreamReader. Terdapat beberapa konstruktor dala kelas FileReader ini.
1. FileReader(File objFile)
Membuat sebuah kelas FileReader dengan inputan sebuah obyek objFile.
2. FileReader(String namaFile)
Membuat sebuah kelas FileReader dengan inputan sebuah nama namaFile.
Berikut adalah contoh penggunaan FileReader
import java.io.*;
public class contohFR{
public static void main(String args[]){
try{
File file=new File("cthFileReader.txt");
FileReader f=new FileReader(file);
int ch;
while((ch=f.read())!=-1){
System.out.print((char)ch);
}
}
catch(FileNotFoundException fnf){
System.out.println(fnf);
}
catch(IOException io){
System.out.println(io);
}
}
}
File yang akan dibaca dari kode di atas berisi hal berikut.
45
Gambar 6.6 Contoh FileReader
Berikut adalah hasil eksekusi dari kode di atas
Gambar 6.7 Hasil eksekusi FileReader
Kelas BufferedReader
Kelas BufferedReader membaca teks dalam bentuk stream karakter dan memasukkannya
kedalam sebuah buffer di dalam stream input. Dengan menggunakan buffer, maka proses pembacaan
bisa dilakukan lebih dari satu kali pada saat yang sama, sehingga bisa lebih meningkatkan performansi
dari aplikasi. Contoh penggunaan dari kelas ini adalah untuk mendapatkan inputan dari user melalui
konsole. Beberapa konstruktor dari kelas BufferedReader ini.
1. BufferedReader(Reader objStream)
Membuat sebuah obyek BufferedReader dengan ukuran buffer default.
2. BufferedReader(Reader objStream, int ukuranBuffer)
Membuat sebuah obyek BufferedReader dengan ukuran buffer sebesar
ukuranBuffer.
Berikut adalah contoh dari BufferedReader
import java.io.*;
public class contohBR{
public static void main(String args[]){
System.out.println("Ketik :");
BufferedReader br=
new BufferedReader(new InputStreamReader(System.in));
String str=new String();
try{
str=br.readLine();
}
catch(IOException io){
46
System.out.println(io);
}
System.out.println();
System.out.println("Isi ketikan: ");
System.out.println(str);
}
}
Hasil dari kode di atas adalah
Gambar 6.8 Contoh BufferedReader
6.2.2.2 Kelas Writer
Kelas java.io.Writer merupakan sebuah kelas abstrak yang menyediakan berbagai macam
method untuk melakukan proses penulisan dalam bentuk karakter Unicode ke berbagai tujuan data
seperti harddisk dan monitor. Karena merupakan sebuah kelas abstrak, maka kelas ini tidak bisa
diinstantiasi, tetapi sub-kelasnya lah yang akan digunakan untuk proses pembacaan data. Berikut
adalah kelas-kelas turunan dari kelas Writer. Terdapat banyak method dalam kelas Writer, tetapi
hanya method write(), flush() dan close() saja yang kita butuhkan.
Tabel 6.7 Method dalam kelas Writer
Method Keterangan
int write(int ch) Menulis sebuah karakter kedalam stream output-karakter.
int write(char buffer[]) Menulis sebuah array karakter kedalam stream output-
karakter.
abstract void close() Menutup stream.
Void flush() Mem-flush buffer output
Kelas FileWriter
Kelas FileWriter digunakan untuk menulis data kedalam sebuah file, tetapi kelas ini tidak
memiliki method di dalamnya. Methodnya sendiri diturunkan dari kelas induknya yaitu Writer dan
OutputStreamReader. Terdapat beberapa konstruktor dala kelas FileWriter ini.
1. FileWriter(String namaFile)
Membuat sebuah obyek FileWriter dengan parameter inputan nama file yang akan ditulis.
2. FileWriter(String namaFile, boolean boolAppend)
Membuat sebuah obyek FileWriter dengan parameter inputan nama file yang akan ditulis,
sedangkan boolAppend digunakan untuk menentukan bahwa penulisan akan dilakukaan
secara menambahkan data di bagian paling bawah jika boolAppend bernilai true.
47
3. FileWriter(File objFile)
Membuat sebuah obyek FileWriter dengan parameter inputan sebuah obyek dari kelas
File.
Berikut adalah contoh dari penggunaan kelas FileWriter.
import java.io.*;
public class ContohFW{
public static void main (String args[]){
String str="contoh dari";
String str2="penggunaan kelas FileWriter";
try{
FileWriter fout = new FileWriter("cthFileWriter.txt" );
fout.write(str, 0, str.length() );
fout.write(str2, 0, str2.length() );
System.out.println("Data sudah ditulis...");
fout.close();
}
catch (IOException io){
System.out.println(io);
}
}
}
Hasil dari kode di atas
Gambar 6.9 Contoh FileWriter
File cthFileWriter.txt akan berisi.
Gambar 6.10 Isi cthFileWriter.txt
48
Kelas PrintWriter
Kelas PrintWriter merupakan turunan dari kelas Writer dan akan menuliskan karakter yang
telah terformat kedalam stream karakter output. Di dalam kelas ini terdapat beberapa method yang
akan digunakan yaitu print() dan println(). Terdapat beberapa konstruktor dalam kelas ini.
1. PrintWriter(OutputStream streamObj)
Membuat sebuah obyek dari kelas PrintWriter dengan menggunakan obyek dari kelas
OutputStream.
2. PrintWriter(OutputStream streamObj, boolean autoflush)
Membuat sebuah obyek dari kelas PrintWriter dengan menggunakan obyek dari kelas
OutputStream. Parameter autoflush menandakan bahwa method println() akan
memflush kedalam buffer output.
3. PrintWriter(Writer outWriter, boolean autoflush)
Membuat sebuah obyek dari kelas PrintWriter dengan menggunakan obyek dari karakter
stream output. Parameter autoflush menandakan bahwa method println() akan
memflush kedalam buffer output.
Contoh penggunaan kelas PrintWriter.
import java.io.*;
public class contohPW{
public static void main(String args[]){
PrintWriter pw=null;
try{
FileWriter file=new FileWriter("cthPrintWriter.txt");
pw=new PrintWriter(file);
}
catch(IOException io){
System.out.println(io);
}
pw.print("30108999:");
pw.print("Chairil Anwar:");
pw.print("Bandung");
pw.println();
pw.print("30208999:");
pw.print("Budiman:");
pw.print("Jakarta");
pw.println();
pw.print("30308999:");
pw.print("Agus Subagus:");
pw.print("Subang");
49
pw.println();
System.out.println("Data Telah Ditulis...");
pw.close();
}
}
Eksekusi dari kode di atas
Gambar 6.11 Contoh PrintWriter
Hasil penyimpanan data di atas pada file cthPrintWriter.txt
Gambar 6.12 Isi cthPrintWriter.txt
6.3 Implementasi RandomAccessFile
Random access file (pengaksesan file secara acak) memungkinkan kita untuk mengakses isi dari sebuah
file secara tidak berurutan. Dengan cara ini kita bisa membaca dan menulis data teks dan byte pada
lokasi manapun dalam sebuah file. Ambil sebuah kasus ketika yang kita inginkan tidak semua teks dari
sebuah file kita butuhkan, tetapi hanya pada posisi tertentu saja, misal pada baris ke-sekian. Maka
dengan menggunakan Random access file ini kita bisa langsung menuju ke posisi yang diinginkan dan
mengambil teks yang kita butuhkan saja.
Kelas java.io.RandomAccessFile mengimplementasikan sebuah interface DataInput dan
DataOutput yang bisa digunakana untuk melakukan proses baca dan tulis kedalam file. Di dalam
kelas ini, kita harus mendefinisikan proses apa yang akan kita lakukan, apakah membaca atau juga
akan menulis kedalam file tersebut. Terdapat beberapa konstruktor yang bisa digunakan dalam kelas
RandomAccessFile, antara lain:
1. RandomAccessFile(File obyekFile, String mode):
Membuat sebuah obyek dari kelas RandomAccessFile, di mana argumen obyekFile adalah
obyek yang menentukan file mana yang akan dibuka, sedangkan argumen mode menentukan
jenis hak akses pembukaan file tersebut.
2. RandomAccessFile(String namaFile, String mode):
50
Membuat sebuah obyek dari kelas RandomAccessFile, di mana argumen namaFile adalah
nama dari file yang akan dibuka, sedang argumen mode menentukan jenis hak akses
pembukaan file tersebut.
Terdapat beberapa jenis hak akses pembukaan file, antara lain:
Tabel 6.8 Jenis akses pembukaan file
Nilai Keterangan
"r" Membuka file hanya untuk dilakukan proses pembacaan saja. Jika dilakukan
proses penulisan pada obyek ini maka akan menghasilkan sebuah
IOException
"rw" Membuka sebuah file untuk dilakukan proses baca dan tulis. Jika file yang
ditunjuk tidak ada, maka akan dibuat sebuah file baru.
"rws" Membuka sebuah file untuk dilakukan proses baca dan tulis, sebagaimana
mode “rw”, untuk mode “s” juga akan dilakukan proses update terhadap
isi dan metadata dari file tersebut, yang akan dituliskan secara
tersinkronisasi.
"rwd"
Membuka sebuah file untuk dilakukan proses baca dan tulis, sebagaimana
mode “rw”, untuk mode “s” juga akan dilakukan proses update terhadap
isi dari file tersebut, yang akan dituliskan secara tersinkronisasi.
Terdapat beberapa method yang bisa digunakan di dalam sebuah obyek dari kelas File, antara
lain:
Tabel 6.9 Method dalam kelas RandomAccessFile
Method Keterangan
void close()
Menutup sebuah obyek RandomAccessFile dan melepas semua
sumber daya yang digunakan, seperti stream dan pointer yang digunakan dalam file tersebut.
long getFilePointer() Mendapatkan posisi pointer saat ini di dalam sebuah file.
long length() Mendapatkan panjang dari sebuah file.
void seek(long
position)
Menentukan posisi pointer kepada lokasi yang ditentukan
(posisi sebelum lokasi tersebut).
int skipBytes(int n) Akan melewati sekian n byte karakter dari posisi sekarang.
Berikut adalah contoh penggunaan RandomAccessFile.
import java.io.RandomAccessFile;
import java.io.IOException;
class RAC{
RandomAccessFile file=null;
51
public void aksesFile(){
try{
/*
membuka file work.txt, dengan mode akses read dan
write jika file tidak ditemukan, maka akan dibuat
sebuah file baru
*/
file=new RandomAccessFile("work.txt","rw");
file.writeChar('A');
file.writeChar('K');
file.writeInt(4);
file.writeInt(6);
file.seek(0);
System.out.println(file.readChar());
System.out.println(file.readChar());
System.out.println(file.readInt());
System.out.println(file.readInt());
file.close();
}
catch(IOException e){
System.out.println("Exception: " +e);
}
}
}
class ContohRandomAccessFile{
public static void main(String[] args){
RAC obj = new RAC();
obj.aksesFile();
}
}
Ouput dari contoh di atas
52
Gambar 6.13 Contoh RandomAccessFile
7 Multithreading Overview
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.
Tujuan
1. Mampu mendefinisikan threads
2. Mengerti perbedaan state dalam threads
3. Mengerti konsep prioritas dalam threads
4. Mengetahui bagaimana menggunakan method di dalam class Thread
5. Membuat sendiri sebuah thread
6. Menggunakan sinkronisasi pada thread yang bekerja bersama-sama dan saling bergantung satu
dengan yang lainya
7. Memungkinkan thread untuk dapat berkomunikasi dengan thread lain yang sedang berjalan
8. Mengerti dan menggunakan kemampuan concurency
7.1 Multithreading di Java
Sebuah thread merupakan sebuah pengontrol aliran program. Untuk lebih mudahnya, bayangkanlah thread sebagai sebuah proses yang akan dieksekusi di dalam sebuah program tertentu. Java
mendukung adanya Multithreading. Pada saat menjalankan Program, sebuah thread utama akan dibuat
oleh Java untuk mengeksekusi Program tersebut, yang dimulai dengan memanggil method main().
Untuk membuat thread baru yang terpisah dari thread utama, terdapat dua cara yang dapat dilakukan
yakni:
Membuat class yang mengimplementasikan interface Runnable dan mengimplementasikan
method run()
Membuat class yang merupakan turunan dari class Thread dan meng-override method run(). Berikut terdapat sebuah contoh kelas yang tidak menggunakan Thread.
class HelloRunner {
int i;
public void tampil() {
i = 0;
while (i<5) {
System.out.println("Hello " + i++);
}
}
}
public class DemoThread1 {
53
public static void main(String args[]) {
HelloRunner r1 = new HelloRunner();
HelloRunner r2 = new HelloRunner();
System.out.println("Jalankan Hello Runner 1");
r1.tampil();
System.out.println("Jalankan Hello Runner 2");
r2.tampil();
System.out.println("Selesai");
}
}
Berikut kode program untuk membuat Thread dengan mengimplementasikan interface Runnable.
class HelloRunner implements Runnable{
int i;
public void run() {
Thread tr = Thread.currentThread();
i = 0;
while (i<5) {
System.out.println(tr.getName()+" : Hello " + i++);
try {
Thread.sleep(500);
}
catch (InterruptedException e) {
System.out.println("Program di interrupt");
}
}
}
}
public class DemoThread3 {
public static void main(String args[]) {
HelloRunner r1 = new HelloRunner();
HelloRunner r2 = new HelloRunner();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
Jika menggunakan turunan kelas Thread, maka kode programnya sebagai berikut.
class HelloRunner extends Thread{
int i;
@Override
public void run() {
Thread tr = Thread.currentThread();
i = 0;
while (i<5) {
System.out.println(tr.getName()+" : Hello " + i++);
try {
Thread.sleep(500);
}
catch (InterruptedException e) {
System.out.println("Program di interrupt");
}
54
}
}
}
public class DemoThread5 {
public static void main(String args[]) {
HelloRunner r1 = new HelloRunner();
HelloRunner r2 = new HelloRunner();
r1.start();
r2.start();
}
}
Lakukan eksekusi terhadap ketiga kode program di atas, maka terlihat proses yang mengalami
Multithreading. Untuk kode kedua (mengimplementasikan interface Runnable) dan kode ketiga
(menurunkan kelas Thread) memiliki kelebihan dan kekurangan masing-masing. Penggunaan interface Runnable mensyaratkan pembuatan obyek tambahan selain HelloRunner, yakni obyek Thread. Di lain
sisi, penggunaan turunan kelas Thread akan membatasi jika programmer ingin Thread mewarisi sifat
dari kelas lain dikarenakan Java tidak memperbolehkan adanya multiple inheritance.
7.2 Priority Thread
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, di mana semakin tinggi prioritas dari sebuah thread, berarti semakin besar
kesempatan dari thread tersebut untuk dieksekusi terlebih dahulu.
Untuk memberikan nilai prioritas kepada Thread, digunakan method setPriority.
7.3 State dari Thread
Sebuah thread memungkinkan untuk memiliki beberapa state:
1. Running: Sebuah thread yang pada saat ini sedang dieksekusi dan di dalam 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.
6. End
7.4 Sinkronisasi Thread
Marilah kita perhatikan sebuah kode sederhana yang mencetak sebuah string dengan urutan tertentu.
Berikut ini adalah listing program tersebut:
class TwoStrings {
static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
55
}
System.out.println(str2);
}
}
class PrintStringsThread implements Runnable {
Thread thread;
String str1, str2;
PrintStringsThread(String str1, String str2) {
this.str1 = str1;
this.str2 = str2;
thread = new Thread(this);
thread.start();
}
public void run() {
TwoStrings.print(str1, str2);
}
}
class TestThread {
public static void main(String args[]) {
new PrintStringsThread("Hello ", "there.");
new PrintStringsThread("How are ", "you?");
new PrintStringsThread("Thank you ", "very much!");
}
}
Program ini diharapkan dapat mencetak dua argument object Runnable secara berurutan.
Permasalahannya adalah, pendeklarasian method sleep akan menyebabkan thread yang lain akan
dieksekusi walaupun thread yang pertama belum selesai dijalankan pada saat eksekusi method print
dari class TwoStrings.
Solusi dari masalah ini adalah dengan melakukan sinkronisasi terhadap method print, sehingga pada
satu saat hanya boleh ada satu Thread yang menggunakan method print tersebut. Proses sinkronisasi
juga dapat dilakukan kepada obyek. Berikut contoh proses sinkronisasi terhadap kasus di atas.
class TwoStrings {
synchronized static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
class PrintStringsThread implements Runnable {
Thread thread;
String str1, str2;
PrintStringsThread(String str1, String str2) {
this.str1 = str1;
this.str2 = str2;
thread = new Thread(this);
thread.start();
}
public void run() {
TwoStrings.print(str1, str2);
56
}
}
class TestThread {
public static void main(String args[]) {
new PrintStringsThread("Hello ", "there.");
new PrintStringsThread("How are ", "you?");
new PrintStringsThread("Thank you ", "very much!");
}
}
7.5 Komunikasi antar Thread
Java juga menyediakan mekanisme untuk Thread saling berkomunikasi. Berikut contohnya.
class SharedData {
int data;
synchronized void set(int value) {
System.out.println("Generate " + value);
data = value;
}
synchronized int get() {
System.out.println("Get " + data);
return data;
}
}
class Producer implements Runnable {
SharedData sd;
Producer(SharedData sd) {
this.sd = sd;
new Thread(this, "Producer").start();
}
public void run() {
for (int i = 0; i < 5; i++) {
sd.set((int)(Math.random()*100));
}
}
}
class Consumer implements Runnable {
SharedData sd;
Consumer(SharedData sd) {
this.sd = sd;
new Thread(this, "Consumer").start();
}
public void run() {
for (int i = 0; i < 5 ; i++) {
sd.get();
}
}
}
class TestProducerConsumer {
public static void main(String args[]) throws Exception {
SharedData sd = new SharedData();
new Producer(sd);
57
new Consumer(sd);
}
}
Di bawah ini adalah contoh dari keluaran program :
Generate 8
Generate 45
Get 52
Generate 65
Get 65
Generate 23
Get 23
Generate 49
Get 49
Get 35
Hasil tersebut bukanlah yang diharapkan. Dari program di atas, diinginkan setiap kali producer
melakukan generate sebuah nilai, maka consumer akan mendapatkan nilai tersebut. Untuk mengatasi
problem di atas, dibuat sebuah mekanisme komunikasi antara producer dan consumer menggunakan
method wait() dan notify(). Berikut solusinya.
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;
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 Producer implements Runnable {
SharedData sd;
Producer(SharedData sd) {
this.sd = sd;
58
new Thread(this, "Producer").start();
}
public void run() {
for (int i = 0; i < 5; i++) {
sd.set((int)(Math.random()*100));
}
}
}
class Consumer implements Runnable {
SharedData sd;
Consumer(SharedData sd) {
this.sd = sd;
new Thread(this, "Consumer").start();
}
public void run() {
for (int i = 0; i < 5 ; i++) {
sd.get();
}
}
}
class TestProducerConsumer {
public static void main(String args[]) throws Exception {
SharedData sd = new SharedData();
new Producer(sd);
new Consumer(sd);
}
}
59
8 Collection Overview
Programmer yang perlu menggunakan list atau pohon biner, seharusnya tidak perlu lagi membuat
data struktur ini dari awal. Struktur data ini sudah banyak dimengerti dan diprogram ribuan kali
sebelumnya. Masalahnya adalah bagaimana agar struktur data yang tangguh tersedia dan siap
digunakan oleh programmer. Di bagian ini kita akan melihat bagaimana Java menyelesaikan masalah
ini.
Tujuan
1. Memahami pemrograman generik pada Java
2. Mampu menggunakan List
3. Mampu menggunakan Set
4. Mampu menggunakan Map
8.1 Pemrograman Generik
Pemrograman generik adalah penulisan kode yang bisa digunakan oleh berbagai macam tipe data.
Kepada kita, Java telah menyajikan classes dan interfaces Collection yang lain, di mana 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.
Beberapa method yang ada di interface Collection.
1. public boolean add(Object o)
Memasukkan Object o ke dalam collection ini. Mengembalikan nilai true jika o telah sukses
ditambahkan ke dalam collection.
2. public void clear()
Menghapus semua elemen dari collection ini.
3. 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. 4. public boolean contains(Object o)
Mengembalikan nilai true jika collection ini berisi Object o.
5. public boolean isEmpty()
Mengembalikan nilai true jika collection ini tidak berisi object atau elemen apapun.
6. public int size()
Mengembalikan jumlah dari elemen pada collection ini.
7. public Iterator iterator()
Mengembalikan sebuah iterator yang menunjukkan kita pada isi collection ini.
8. public boolean equals(Object o)
Mengembalikan nilai true jika Object o sama dengan yang ada pada collection ini.
9. 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.
Beberapa implementasi dari interface Collection beserta karakteristiknya.
1. List, antara lain:
a. ArrayList: Menyediakan iterasi yang cepat dan random access.
b. Vector: ArrayList yang performa lebih lambat, namun menyediakan method yang
tersinkronisasi.
60
c. LinkedList: Bagus untuk menambahkan elemen di ujung struktur data, contohnya
Stack dan Queue.
d. PriorityQueue: List yang diurutkan berdasarkan prioritas elemen.
2. Set, antara lain:
a. HashSet: Akses cepat, menjamin tidak ada duplikasi, namun data tidak terurut.
b. LinkedHashSet: Tidak ada duplikat, iterasi berdasarkan urutan input.
c. TreeSet: Tidak ada duplikat, iterasi dilakukan terurut.
Selain implementasi interface Collection, terdapat juga interface Map yang dapat digunakan seperti
Collection, namun dengan menambahkan properti key sebagai unique atributte dari sebuah elemen.
a. HashMap: Update data tercepat, menggunakan pasangan kunci dan nilai, membolehkan nilai null.
b. Hashtable: HashMap yang lebih lambat karena ada method yang tersinkronisasi. Tidak
membolehkan nilai null.
c. LinkedHashMap: Iterasi lebih cepat, iterasi berdasarkan urutan input, membolehkan nilai null.
d. TreeMap: Map yang terurut.
Untuk melakukan iterasi terhadap sebuah Collection, digunakan kelas Iterator. Berikut contoh
proses iterasi sebuah Collection.
Iterator iter = kol.iterator();
while ( iter.hasNext() ) {
Object item = iter.next();
System.out.println(item);
}
Mulai dari java versi 1.5, proses looping sudah menyediakan fitur untuk mengakses elemen
Collection secara langsung.
.....
ArrayList nameList = new ArrayList();
nameList.add("Mikalai");
nameList.add("Michael");
nameList.add("Craig");
for (Object name:nameList) {
System.out.println(name);
}
.....
8.2 Generic
Generic adalah sebuah mekanisme yang digunakan mulai dari Java 1.5 untuk mendefinisikan elemen
yang boleh ditampung ke dalam sebuah Collection. Contoh penggunaannya adalah sebagai berikut.
ArrayList<String> genArrList = new ArrayList<String>();
genArrList.add("A generic string");
String myString = genArrList.get(0);
JoptionPane.showMessageDialog(this, myString);
Pada ArrayList di atas didefinisikan Generic untuk tipe String. Maka, ArrayList hanya akan dapat
menampung elemen bertipe String atau turunan dari String.
61
9 Aplikasi Desktop GUI Overview
Tanpa mempelajari tentang grapichal user interface (GUI) API masih tetap bisa membuat suatu
program. Tetapi, program 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.
Tujuan
1. Mendesain aplikasi GUI menggunakan Swing.
2. Menjelaskan tentang flow layout, border layout, dan grid layout dalam komponen GUI.
3. Membuat komponen Swing jButton, jTextField, jCheckBox, jRadioButton, jComboBox dalam
GUI
4. Membuat tampilan yang komplek dalam mendesain aplikasi GUI.
9.1 Layout Manager
Posisi dan ukuran suatu komponen ditentukan oleh layout manager. Layout manager mengatur
tampilan dari komponen di dalam kontainer. Berikut ini beberapa layout manager yang terdapat di
dalam Java.
1. FlowLayout
2. BorderLayout
3. GridLayout
4. GridBagLayout
5. CardLayout
Layout manager dapat diatur menggunakan method setLayout dari class Container. Method ini
dapat ditulis sebagai berikut.
void setLayout(LayoutManager mgr)
Jika Anda memilih untuk tidak menggunakan layout manager, Anda dapat mengisi null sebagai
argumen untuk method ini. Tetapi selanjutnya, Anda akan mengatur posisi elemen secara manual
dengan menggunakan method setBounds dari class Components.
public void setBounds(int x, int y, int width, int height)
Method ini mengatur posisi berdasarkan pada argumen x dan y, dan ukuran berdasarkan argumen
width dan height. Hal ini akan cukup menyulitkan dan membosankan untuk aplikasi jika Anda
memiliki beberapa obyek komponen di dalam object container. Anda akan memanggil method ini
untuk setiap komponen.
9.1.1 FlowLayout Manager
FlowLayout Manager adalah default manager untuk class Panel dan subclassnya, termasuk class applet.
Cara meletakkan komponen dari FlowLayout Manager dimulai dari kiri ke kanan dan dari atas ke
bawah, dimulai dari pojok kiri atas. Seperti pada saat Anda mengetik menggunakan editor kata pada
umumnya. Berikut adalah bagaimana FlowLayout Manager bekerja, di mana memiliki tiga constructor
seperti daftar di bawah ini.
1. FlowLayout()
Membuat object baru FlowLayout dengan posisi di tengah dan lima unit horizontal dan
vertikal gap dimasukkan pada komponen sebagai default.
2. FlowLayout(int align)
Membuat object baru FlowLayout dengan posisi spesifik dan lima unit horizontal dan vertikal
gap dimasukkan pada komponen sebagai default.
3. FlowLayout(int align, int hgap, int vgap)
Membuat object baru FlowLayout dengan argumen pertama sebagai posisi pada komponen
62
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
Berikut contoh program menggunakan FlowLayout.
import java.awt.*;
class FlowLayoutDemo extends Frame {
public static void main(String args[]) {
FlowLayoutDemo fld = new FlowLayoutDemo();
fld.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
fld.add(new Button("ONE"));
fld.add(new Button("TWO"));
fld.add(new Button("THREE"));
fld.setSize(100, 100);
fld.setVisible(true);
}
}
Gambar 9.1 Contoh FlowLayout
9.1.2 BorderLayout Manager
BorderLayout membagi kontainer menjadi lima bagian di antaranya utara, selatan, timur, 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 antara lain:
1. BorderLayout()
Membuat object BorderLayout baru tanpa spasi yang diaplikasikan di antara komponen yang berbeda.
2. BorderLayout(int hgap, int vgap)
Membuat object BorderLayout baru dengan spasi unit hgap horizontal dan unit vgap vertikal
yang diaplikasikan di antara komponen yang berbeda.
Seperti pada FlowLayout Manager, parameter hgap dan vgap disini juga menjelaskan jarak antara
komponen dengan kontainer. Untuk menambahkan komponen kedalam region yang spesifik, gunakan
method menambahkan dan melewatkan dua argumen yaitu : komponen yang ingin dimasukkan ke
dalam region dan region mana yang ingin dipakai untuk meletakkan komponen. Perlu diperhatikan
bahwa hanya satu komponen yang dapat dimasukkan dalam satu region. Menambahkan lebih dari satu
komponen pada kontainer yang bersangkutan, maka komponen yang terakhir ditambahkan yang akan
ditampilkan. Berikut ini adalah daftar dari kelima region.
1. BorderLayout.NORTH
63
2. BorderLayout.SOUTH
3. BorderLayout.EAST
4. BorderLayout.WEST
5. BorderLayout.CENTER
Berikut ini adalah contoh program yang menunjukkan bagaimana BorderLayout bekerja.
import java.awt.*;
class BorderLayoutDemo extends Frame {
public static void main(String args[]) {
BorderLayoutDemo bld = new BorderLayoutDemo();
bld.setLayout(new BorderLayout(10, 10));
bld.add(new Button("NORTH"), BorderLayout.NORTH);
bld.add(new Button("SOUTH"), BorderLayout.SOUTH);
bld.add(new Button("EAST"), BorderLayout.EAST);
bld.add(new Button("WEST"), BorderLayout.WEST);
bld.add(new Button("CENTER"), BorderLayout.CENTER);
bld.setSize(200, 200);
bld.setVisible(true);
}
} Berikut ini adalah hasil dari contoh program tersebut.
Gambar 9.2 Contoh BorderLayout
9.1.3 GridLayout Manager
Dengan GridLayout manager, komponen juga diposisikan dari kiri ke kanan dan dari atas ke bawah
seperti pada FlowLayout manager. GridLayout manager membagi kontainer menjadi baris dan kolom.
Semua region memiliki ukuran yang sama. Hal tersebut tidak mempedulikan ukuran sebenarnya dari
komponen. Berikut ini adalah daftar dari constructor untuk class GridLayout.
1. GridLayout()
Membuat object GridLayout baru dengan satu baris dan satu kolom sebagai default
2. GridLayout(int rows, int cols) Membuat object GridLayout baru dengan jumlah baris dan kolom sesuai dengan keinginan
3. GridLayout(int rows, int cols, int hgap, int vgap)
Membuat object GridLayout baru dengan jumlah baris dan kolom yang ditentukan. Unit spasi
hgap horizontal dan vgap vertikal diaplikasikan ke dalam komponen.
Berikut contoh GridLayout.
import java.awt.*;
class GridLayoutDemo extends Frame {
public static void main(String args[]) {
64
GridLayoutDemo gld = new GridLayoutDemo();
gld.setLayout(new GridLayout(2, 3, 4, 4));
gld.add(new Button("ONE"));
gld.add(new Button("TWO"));
gld.add(new Button("THREE"));
gld.add(new Button("FOUR"));
gld.add(new Button("FIVE"));
gld.setSize(200, 200);
gld.setVisible(true);
}
}
Berikut ini adalah output dari program.
Gambar 9.3 Contoh GridLayout
Untuk membuat tampilan yang lebih lengkap, layout manager yang berbeda dapat digabungkan
dengan menggunakan panel. Panel adalah kontainer dan komponen pada saat yang sama. Komponen
dapat ditambahkan ke dalam panel. Perhatikan teknik yang digunakan pada contoh berikut.
import java.awt.*;
class ComplexLayout extends Frame {
public static void main(String args[]) {
ComplexLayout cl = new ComplexLayout();
Panel panelNorth = new Panel();
Panel panelCenter = new Panel();
Panel panelSouth = new Panel();
/* Panel utara */
// Panel menggunakan FlowLayout sebagai default
panelNorth.add(new Button("ONE"));
panelNorth.add(new Button("TWO"));
panelNorth.add(new Button("THREE"));
/* Panel tengah */
panelCenter.setLayout(new GridLayout(4,4));
panelCenter.add(new TextField("1st"));
panelCenter.add(new TextField("2nd"));
panelCenter.add(new TextField("3rd"));
panelCenter.add(new TextField("4th"));
/* Panel selatan */
panelSouth.setLayout(new BorderLayout());
panelSouth.add(new Checkbox("Choose me!"), BorderLayout.CENTER);
panelSouth.add(new Checkbox("I'm here!"), BorderLayout.EAST);
65
panelSouth.add(new Checkbox("Pick me!"), BorderLayout.WEST);
/* Menambahkan panel pada container Frame */
// Frame menggunakan BorderLayout sebagai default
cl.add(panelNorth, BorderLayout.NORTH);
cl.add(panelCenter, BorderLayout.CENTER);
cl.add(panelSouth, BorderLayout.SOUTH);
cl.setSize(300,300);
cl.setVisible(true);
}
}
Berikut ini adalah output dari program.
9.2 Komponen Swing
Seperti pada package AWT, package dari Swing menyediakan banyak class untuk membuat aplikasi
GUI. Package tersebut dapat ditemukan di javax.swing. Perbedaan utama antara keduanya adalah
komponen Swing ditulis menyeluruh menggunakan Java. Kesimpulannya, program GUI ditulis
menggunakan banyak class dari package Swing yang mempunyai tampilan look and feel yang sama
meski dijalankan pada paltform yang berbeda. Lebih dari itu, Swing menyediakan komponen yang
lebih menarik seperti color chooser dan option pane.
Tabel 9.1 Komponen Swing
Komponen Swing Penjelasan
JComponent class induk untuk semua komponen Swing, tidak termasuk top-level
kontainer
JButton Tombol “push”
JCheckBox Item yang dapat dipilih atau tidak oleh pengguna, pemilihan dapat lebih
dari satu
JFileChooser Form untuk memilih sebuah file
JTextField Form text satu baris
JFrame Frame tempat meletakkan komponen, diperlukan content pane sebelum
menambah sebuah komponen
JPanel Class Container sederhana tetapi bukan top-level
JOptionPane Menampilkan popup kotak dialog
JDialog Digunakan untuk menginformasikan sesuatu kepada pengguna
atau prompt pengguna untuk input
JColorChooser Memungkinkan pengguna untuk memilih warna yang diinginkan
66
9.3 Membuat Swing HelloWorld dengan Netbeans
Netbeans dilengkapi dengan GUI builder yang dikenal dengan Matisse. Tools ini sangat powerful dan
produktif dalam membuat komponen GUI. Berikut beberapa contoh cara membuat aplikasi dengan
Netbeans GUI Builder menggunakan beberapa komponen Swing.
9.3.1 Contoh Penggunaan JButton dan JTextField
Berikut contoh aplikasi penjumlahan menggunakan Netbeans
Gambar 9.4 Contoh aplikasi penjumlahan
Untuk membuat aplikasi ini menggunakan Matisse, lakukan langkah-langkah berikut ini:
1. Buat project baru di Netbeans (kalau sudah membuat project, tidak perlu membuat lagi)
dengan cara memilih menu: File > New Project
Kemudian ikuti petunjuk yang diberikan dialog.
2. Buat class JFrame baru, caranya dengan memilih menu: File > New File
Kemudian akan muncul dialog seperti di bawah ini :
Gambar 9.5 Jendela dialog new file
3. Pilih kategori: Java GUI Forms > JFrame Form
Seperti terlihat di dialog New File dialog di atas, kemudian beri nama Penjumlahan.java
4. Buat tampilan form seperti gambar bawah ini, caranya dengan klik Jendela Pallete di sebalah
kanan untuk memilih komponen apa yang akan dibuat, kemudian klik di jendela Design untuk
menempatkan komponen yang sudah dipilih tadi ke dalam form. Hasilnya terlihat seperti pada
gambar di bawah ini:
67
Gambar 9.6 Jendela design Netbens Matisse
5. Ganti nama setiap komponen agar mudah dikenali. Klik kanan di atas setiap komponen yang
ada dalam Jendela Design di atas, kemudian pilih menu: Klik kanan > Change Variable Name
...
Ganti nama komponen-komponen tersebut (sesuai urutan dari kiri ke kanan, atas ke bawah)
menjadi : lblKeterangan, txtA, lblPlus, txtB, btnHitung, lblHasil.
6. Menambahkan variable untuk menampung nilai yang akan dijumlahkan. Klik tombol Source
untuk membuka jendela yang menampilkan kode sumber dari program di atas kemudian
tambahkan kode di bawah ini tepat di bawah definisi dari class Penjumlahan:
private String str = "Hasilnya adalah : ";
private int a, b; 7. Menangani penekanan tombol btnHitung. Klik kanan di atas komponen btnHitung kemudian
pilih menu: Events > Action > actionPerformed
Anda akan dibawa ke jendela Source, dan akan menemukan kode program seperti di bawah
ini:
private void btnHitungActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
JLabel dan JTextField mempunyai method getText dan setText untuk mengambil dan
mengeset text yang ditampilkan.
Ubah kode program di atas menjadi :
private void btnHitungActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
a = Integer.parseInt(txtA.getText());
b = Integer.parseInt(txtB.getText());
int hasil = a + b;
lblHasil.setText(str + hasil);
}
8. Compile dan jalankan program. Tekan tombol SHIFT + F6, atau klik kanan file
Penjumlahan.java kemudian pilih menu Run File.
68
9.3.2 Contoh Penggunaan JCheckBox dan JRadioButton Berikut contoh aplikasi menggunakan JCheckBox dan JRadioButton.
Gambar 9.7 Contoh check box dan radio button
Untuk membuat program di atas ikuti langkah-langkah berikut ini:
1. Buat class baru bertipe JFrame Form, kemudian beri nama Pilihan.java 2. Buat tampilan di atas menggunakan Matisse. komponen yang harus dibuat adalah:
dua object JradioButton (radioBerwarna dan radioTransparan)
satu object ButtonGroup (groupTipeWarna)
empat object JCheckBox (chkHijau, chkBiru, chkMerah, chkKuning)
satu object JTextArea (txtWarna)
satu object JScrollPane (scrollWarna) Untuk melihat semua komponen yang ada dalam Jendela Design, gunakan Jendela Inspector di
sisi kiri bawah.
3. Masukkan object radioBerwarna dan radioTransparan ke dalam object groupTipeWarna.
Caranya dengan:
a. Memilih komponen radioBerwarna di Jendela Design
b. Klik tab code di Jendela Properties
c. Pilih properti : Post-Creation Code
d. Masukkan kode berikut ini kedalam dialog yang muncul :
groupTipeWarna.add(radioBerwarna);
JRadioButton yang mempunyai group yang sama, harus dimasukkan dalam sebuah object
ButtonGroup yang sama. Lakukan langkah yang sama terhadap object radioTransparan.
4. Menangani event ketika JRadioButton diklik. Caranya dengan:
e. Memilih komponen radioBerwarna di Jendela Design
f. Klik kanan komponen radioBerwarna, kemudian pilih menu:
Event > Action > actionPerformed
g. Anda akan dibawa ke dalam Jendela Code, dan menemukan kode berikut ini :
private void radioBerwarnaActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
Ubahlah kode di atas menjadi :
private void radioBerwarnaActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
if(radioBerwarna.isSelected()){
lblTipeWarna.setText("Tipe warna : " +
radioBerwarna.getText());
69
}
}
Lakukan langkah yang sama terhadap radioTransparan.
5. Buat sebuah private method untuk menangani event pemilihan terhadap JCheckBox. Method
tampilkanWarna ini nantinya akan dipanggil setiap kali salah satu dari JCheckBox dipilih. Yang
dilakukan oleh metod tampilkanWarna adalah mengecek status setiap JCheckBox, apakah
sedang dipilih atau tidak. Jika sedang dipilih maka text dari JCheckBox tersebut akan
ditampilkan dalam txtWarna. Class StringBuffer digunakan untuk menampung nilai text dari
JCheckBox yang statusnya terpilih.
private void tampilkanWarna(){
StringBuffer warna = new StringBuffer();
if(chkBiru.isSelected()){
warna.append(chkBiru.getText() + " ");
}
if(chkHijau.isSelected()){
warna.append(chkHijau.getText() + " ");
}
if(chkKuning.isSelected()){
warna.append(chkKuning.getText() + " ");
}
if(chkMerah.isSelected()){
warna.append(chkMerah.getText() + " ");
}
txtWarna.setText(warna.toString());
} 6. Menangani event pemilihan JCheckBox. Caranya sebagai berikut:
a. Pilih komponen chkHijau di Jendela Design.
b. Klik kanan komponen chkHijau untuk memunculkan context (popup) menu.
c. Pilih menu: Event > Action > actionPerformed
d. Anda akan dibawa ke Jendela Code, kemudian dalam method chkHijauActionPerformed
tersebut panggil method tampilkanWarna. seperti di bawah ini :
private void chkHijauActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
tampilkanWarna();
} Lakukan hal ini untuk semua JCheckBox.
7. Compile dan jalankan program dengan menekan tombol SHIFT + F6.
9.3.3 Contoh Penggunaan JList dan JComboBox
Berikut contoh program menggunakan JList dan JComboBox.
70
Gambar 9.8 Contoh JList dan JComboBox
Ikuti langkah-langkah berikut ini untuk membuat program di atas:
1. Buatlah class JFrame Form baru dan beri nama ListAndCombo.java.
2. Buat tampilan program di atas menggunakan Matisse, kemudian tambahkan komponen-
komponen:
a. Empat buah JLabel : lblPekerjaan, lblPilihanPekerjaan, lblHobby, lblPilihanHobby.
b. Satu buah JComboBox : cmbPekerjaan
c. Satu buah JList : lstHobby
d. Satu buah JtextArea : txtPilihanHobby
3. Untuk merubah isi dari JComboBox dan JList kita akan menggunakan Jendela Properties,
Jendela ini letaknya di sebelah kanan bawah, di bawah Jendela Pallete dan akan muncul hanya
jika jendela Design yang dipilih.
Gambar 9.9 Jendela Properties
Pilih komponen JComboBox di Jendela Design, Jendela Properties akan menampilkan
properties dari JComboBox. Pada bagian model di dalam Jendela Properties masukkan item Pelajar, Mahasiswa, Programmer, Technical Writer dan Tester dipisahkan dengan koma.
4. Pilih JList di Jendela Design maka Jendela Properties untuk JList akan muncul. Di bagian model
isikan item : Membaca, Olahraga, Trekking, Coding, Menonton Film, Bersepeda dan Mengajar.
Setiap item dipisahkan dengan koma.
5. Menangani pemilihan JComboBox. Klik kanan JComboBox di Jendela Design, kemudian pilih
menu: Events > Action > actionPerformed
Jendela Code akan terbuka, tambahkan code seperti di bawah ini:
71
private void cmbPekerjaanActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
lblPilihanPekerjaan.setText("Pekerjaan:
"+cmbPekerjaan.getSelectedItem());
}
Method getSelectedItem dari JComboBox digunakan untuk memperoleh item yang sedang di
pilih dalam JComboBox.
6. Untuk menangani pemilihan item dari JList berbeda dengan JComboBox. JList akan
mengaktifkan ListSelection event ketika user memilih item dalam JList. Untuk menangani
event ini, lakukan langkah-langkah berikut :
a. Klik kanan pada JList di dalam Jendela Design, kemudian pilih menu:
Events > ListSelection > valueChanged
b. Dalam jendela kode yang ketik kode seperti berikut ini:
private void lstHobbyValueChanged(
javax.swing.event.ListSelectionEvent evt) {
// TODO add your handling code here:
Object[] selectedItems = lstHobby.getSelectedValues();
if(selectedItems == null || selectedItems.length == 0)
txtPilihanHobby.setText("");
else{
StringBuffer strValues = new StringBuffer();
for(Object item : selectedItems){
strValues.append(item.toString()+",");
}
txtPilihanHobby.setText(strValues.substring(0,
strValues.length()-2));
}
} Method getSelectedValues dari JList mengembalikan item-item yang terpilih.
9.3.4 Contoh Penggunaan Menu, Popup Menu dan Toolbar
Untuk membuat menu pada program sebagai berikut.
1. Buat sebuah class JFrame dan beri nama ToolbarMenu.java
2. Pilih komponen Menu Bar dari Jendela Pallete kemudian klik JFrame di Jendela Design. Sebuah
class JMenuBar akan ditambahkan di dalam JFrame. Ganti namanya menjadi menuBar.
3. Klik kanan JMenuBar yang baru saja kita buat di Jendela Inspector, kemudian pilih menu:
Add > JMenu
Ganti nama JMenu tersebut menjadi menuFile. Kemudian alihkan perhatian anda ke Jendela
Properties
72
Gambar 9.10 Jendela Properties dari class JMenu
Isi properti text dengan string “File”. Kemudian set isi properti mnemonic dengan string “f”,
hal ini akan menyebabkan tampilanya menuFile menjadi File dan user dapat menekan tombol
ALT + F untuk mengaktifkan menu menuFile.
4. Langkah berikutnya adalah menambahkan JMenuItem ke dalam JMenu menuFile yang telah
dibuat di langkah sebelumnya. caranya, klik kanan di JMenu menuFile di Jendela Inspector,
kemudian pilih menu: Add > JMenuItem
Tambahkan berturut-turut menuNew, menuOpen dan menuSave. Pilih JMenuItem dari
Jendela Inspector, kemudian untuk masing-masing JMenuItem set text dan mnemonic yang
sesuai dari Jendela Properties.
5. Dalam struktur menu yang bagus, menu yang mempunyai fungsi serupa diletakkan dalam
urutan berdekatan dan dipisahkan dengan separator (pemisah). Klik kanan di JMenu menuFile
kemudian pilih menu: Add > JSeparator
6. Berikutnya kita akan menambahkan JMenu baru ke dalam JMenu menuFile. JMenu yang baru
ini akan bertindak sebagai sub menu. Caranya juga sama : klik kanan di JMenu menuFile
kemudian pilih menu: Add > JMenu
Beri nama menuSetting, set text dan mnemonic yang sesuai pada Jendela Properties.
7. Perilaku JCheckBoxMenuItem tidak berbeda jauh dengan JCheckBox biasa, bedanya hanyalah
JCheckBoxMenuItem berada dalam struktur menu. Cara menambahkan JCheckBoxMenuItem
sama dengan komponen lain: klik kanan JMenu menuSetting kemudian pilih menu:
Add > JCheckBoxMenuItem
Beri nama chkLineNumber, set text dan mnemonic yang sesuai pada Jendela Properties. JCheckBoxMenuItem sedikit spesial dibandingkan dengan JMenuItem, karena
JCheckBoxMenuItem memiliki properties selected. Properties selected ini digunakan untuk
menentukan apakah JCheckBoxMenuItem dalam keadaan terpilih atau tidak.
8. Dalam contoh ini kita akan mempunyai dua buah JRadioButtonMenuItem, radioBinary dan
radioText. Keduanya dibuat dengan langkah yang sama dengan komponen lain, klik kanan di
JMenu menuSetting, kemudian pilih menu: Add > JRadioButtonMenuItem
Set text dan mnemonic yang sesuai dari Jendela Properties.
9. Menambahkan ButtonGroup. Seperti halnya JRadioButton, JRadioButtonMenuItem juga
memerlukan ButtonGroup agar hanya satu buah JRadioButtonMenuItem yang bisa dipilih.
Cara menambahkan ButtonGroup sangat mudah, klik item ButtonGroup dari Jendela Pallete
kemudian klik Jendela Design, maka otomatis ButtonGroup akan ditambahkan. Ganti
namanya menjadi groupOpenMethod. Dalam Jendela Inspector, ButtonGroup yang baru
73
dibuat tadi akan berada dalam kategori Other Components, seperti terlihat dalam gambar di
bawah ini:
Gambar 9.11 ButtonGroup berada dalam kategori Other Components
10. Pilih masing-masing JRadioButtonMenuItem dari Jendela Inspector, kemudian perahatikan
Jendela Properties dari JRadioButtonMenuItem tersebut, pada bagian groupButton pilih item
groupOpenMethod, seperti terlihat dalam gambar di bawah ini:
Gambar 9.12 Properties dari JRadioButtonMenuItem
11. Compile dan jalankan class ToolbarMenu.java. Klik kanan class ToolbarMenu dari Jendela
Design kemudaian pilih menu Run File atau tekan tombol SHIFT + F6.
Untuk menambahkan aplikasi dengan PopUp Menu, lakukan langkah berikut ini.
1. Buka class ToolbarMenu.java, yang telah dibuat dalam langkah sebelumnya, dalam Jendela
Design.
2. Klik Jendela Pallete dan pilih JPopupMenu, kemudian klik Jendela Design. Secara otomatis
JPopupMenu akan ditambahkan dalam class ToolbarMenu.java. JPopupMenu tidak terlihat
dalam Jendela Design, namun anda bisa mengkasesnya melalui Jendela Inspector.
3. Seperti halnya JMenuBar, JPopupMenu dapat memiliki child berupa JMenu, JMenuItem,
JCheckBoxMenuItem, JRadioButtonMenuItem dan JSeparator. Menambahkan JMenuItem ke
dalam JPopupMenu sangat sederhana, caranya: klik kanan pada JPopupMenu di Jendela Design,
kemudian pilih menu: Add > JMenuitem
74
Ganti nama objectnya menjadi menuCut, beralihlah ke Jendela Properties kemudian set text
dan mnemonic yang sesuai. Lakukan langkah ini untuk JMenuItem yang lain, menuCopy dan
menuPaste.
4. Ketika tombol kanan mouse di klik di atas JFrame, JPopupMenu akan tampil. Agar behavior
tersebut berjalan, kita perlu menangani event mouseClick terhadap JFrame. Caranya :
a. Klik kanan JFrame di Jendela Design, kemudian pilih menu:
Events > Mouse > mouseClicked
b. Di dalam jendela source yang terbuka masukkan kode berikut ini:
private void formMouseClicked(java.awt.event.MouseEvent evt){
// TODO add your handling code here:
if(evt.getButton() == MouseEvent.BUTTON3){
popUpMenu.show(
(Component)evt.getSource(),
evt.getX(),evt.getY());
}
}
Kondisi if di atas digunakan apakah tombol yang diklik mouse adalah tombol sebelah kanan,
jika nilai kembalian method getButton sama dengan nilai BUTTON3 maka benar tombol
kanan yang ditekan. Method show digunakan untuk memunculkan popup menu, parameter
pertama diisi dengan Component di mana nantinya popup menu akan ditampilkan, sedangkan
parameter kedua dan ketiga diisi dengan letak koordinat popup menu akan ditampilkan.
5. Simpan file ToolbarMenu.java, compile dan jalankan. Kemudian coba munculkan popup menu
dengan mengklik kanan JFrame.
Untuk menambahkan toolbar pada aplikasi, lakukan langkah berikut ini.
1. Buatlah sebuah java package baru untuk menampung semua icon yang akan digunakan.
caranya klik kanan di jendela Projects bagian nama project, pilih menu: New > Java Package
Beri nama images untuk java package yang baru saja kita buka.
2. Memasukkan Icon ke dalam package. Untuk memasukkan image ke dalam package kita perlu
tahu di mana project disimpan, misalkan project disimpan dalam folder:
c:\javaswing
Buka file explorer, kemudian navigasi ke folder
c:\javaswing\src\images
Copy semua icon yang diperlukan ke dalam folder di atas. Build Project akan berhasil jika
tidak ada satupun error dalam kode program. Sebelum melakukan build project pastikan
terlebih dahulu tidak ada error dalam kode. Lakukan build setiap kali menambahkan file non-
java ke dalam folder source file. Agar file tersebut ikut tercopy ke dalam folder build\classes
penting
3. Build project.
4. Buka class ToolbarMenu.java yang sudah dibuat di langkah sebelumnya.
5. Buat sebuah object JToolBar, caranya: klik item JToolBar dari Jendela Pallete, kemudian klik
JFrame di Jendela Design. Secara otomatis sebuah object JToolBar akan dimasukkan ke dalam
JFrame. Ganti namanya menjadi toolBar.
6. Klik item JButton dalam Jendela Pallete kemudian klik komponen JToolBar yang baru saja kita
buat tadi. JButton baru akan diletakkan di atas JToolBar, ganti nama JButton tersebut menjadi
btnNew. Letakkan lagi satu buah JButton di atas JToolBar dan beri nama btnMaximize.
7. Agar tampilan JButton terlihat cantik, kita perlu mengeset beberapa nilai dari properti JButton, seperti terlihat pada gambar di bawah ini:
75
Gambar 9.13 Jendela Properties JButton
a. Text, hapus nilai textnya.
b. Border, pilih bordernya menjadi empty border dan set nilai bordernya menjadi [5,5,5,5].
Tujuan pemberian empty border ini agar tombol berukuran lebih besar dibandingkan dengan
icon yang akan digunakan nanti, dan setiap mouse melewati JButton, ada efek transisi yang
cantik. Untuk mengedit border dari JButton, Matisse menyediakan Jendela Border untuk
memilih border yang kita inginkan untuk Jbutton. Border yang dipilih bisa single border, atau
composite border yang terdiri dari beberapa border.
Gambar 9.14 Jendela Border Editor dari Jbutton
c. Opaque, uncheck nilai opaque. Bertujuan agar tombolnya berwarna transparan, sehingga
mempunyai warna background yang sama dengan background JToolBar.
d. Icon, ganti iconya dengan icon yang telah disiapkan. Untuk memasukkan icon ke dalam
JButton, tekan tombol di samping pilihan Icon di dalam Jendela Properties, kemudianakan
muncul Dialog Icon Editor seperti di bawah ini:
76
Gambar 9.15 Jendela icon editor
Pilih radio button Classpath, kemudian tekan tombol Select File dan pilih salah satu icon yang
telah disiapkan. Tekan OK. Lakukan langkah-langkah yang sama terhadap JButton yang lain.
8. Compile dan jalankan class ToolbarMenu untuk melihat hasilnya.
9.3.5 JDialog
Beberapa contoh penggunaan JDialog sebagai berikut.
JOptionPane.showMessageDialog(null, "Simple plain dialog",
"Plain dialig", JOptionPane.PLAIN_MESSAGE);
Gambar 9.16 Tampilan dialog sederhana
JOptionPane.showMessageDialog(null, "Your action was succeed, “ +
“you can proceed to next assigment", "Information dialog",
JOptionPane.INFORMATION_MESSAGE);
Gambar 9.17 Tampilan dialog dengan tipe dialog Information
JOptionPane.showMessageDialog(null, "You neet to be sure to do this
action!", "Dialog Peringatan", JOptionPane.WARNING_MESSAGE);
77
Gambar 9.18 Dialog dengan tipe Warning
JOptionPane.showMessageDialog(null, "Something goes wrong and
generate error message", "Error Dialog", JOptionPane.ERROR_MESSAGE);
Gambar 9.19 Dialog dengan tipe Error
JOptionPane.showConfirmDialog(null, "Choose yes or no","Confirmation
Dialog", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
Gambar 9.20 Option dialog dengan tipe Information dan pilihan YES_NO
JOptionPane.showConfirmDialog(null, "Choose yes, no or
cancel","Confirmation Dialog", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);
Gambar 9.21 OptionDialog dengan tipe Plain dan pilihan YES_NO_CANCEL
JOptionPane.showInputDialog(null, "Input your name here","Input
Dialog", JOptionPane.INFORMATION_MESSAGE);
78
Gambar 9.22 InputDialog dengan tipe message Information
String[] options = {"Apple","Mango","Grape","Guava"};
JOptionPane.showInputDialog(null, "Choose this one Option","Input
dialog", JOptionPane.WARNING_MESSAGE,null,options,"Apple");
Gambar 9.23 InputDialog dialog dengan tipe Warning, Options berupa array of String
dan initialValue = 'Apple'
9.3.6 JFileChooser
Aplikasi berikut ini adalah contoh penggunaan JFileChooser untuk membuka dan menyimpan file.
Gambar 9.24 Contoh program menggunakan JFileChooser
Tampilan JFileChooser ketika tombol open ditekan adalah seperti di bawah ini:
Gambar 9.25 Tampilan JFileChooser
79
Untuk membuat aplikasi di atas lakukan langkah-langkah berikut ini:
1. Buat class JFrame Form baru, beri nama Chooser.java
2. Masukkan dua buah JTextField: txtOpen dan txtSave, dua buah Jbutton: btnOpen dan btn
save, sebuah JLabel: lblStatus. Sesuaikan penataan komponen sesuai dengan gambar di atas.
3. Tambahkan sebuah object JFileChooser sebagai field dari class Chooser, beri nama chooser.
public class Chooser{
JFileChooser chooser = new JFileChooser();
//kode lain di sini
} 4. FileNameExtentionFilter digunakan sebagai file filter dalam JFileChooser. Metode filteringnya
adalah mencocokkan ekstensi file dalam file system dengan ekstensi yang ada dalam
FileNameExtentionFilter. Contoh kode di bawah ini akan menyebabkan JFileChooser
mempunyai pilihan “JPEG File”, dan jika pilihan tersebut dipilih, maka file dengan ekstensi
“jpg”, “jpeg”,”JPG” atau“JPEG” saja yang akan ditampilkan oleh JFileChooser.
FileNameExtensionFilter JPEGFilter =
New FileNameExtensionFilter(
"JPEG File","jpg","jpeg",”JPG”,”JPEG”);
chooser.addChoosableFileFilter(JPEGFilter);
5. Set direktori yang akan dituju oleh JFileChooser. Untuk mengetahui di mana direktori aktif
aplikasi, kita bisa menggunakan system property “user.dir”. Kode berikut ini akan
menyebabkan JFileChooser dibuka pada direktori aktif aplikasi:
String dir = System.getProperty("user.dir");
chooser.setCurrentDirectory(new File(dir));
6. Menghandle event penekanan tombol btnSave. Ketika tombol btnSave ditekan, chooser akan
menampilkan dialog save file, kemudian mengambil nama file yang dipilih dan menampilkannya
dalam txtSave, serta menampilkanya dalam lblStatus. Berikut ini kodenya :
private void btnSaveActionPerformed(ActionEvent evt) {
// TODO add your handling code here:
int ret = chooser.showSaveDialog(this);
if(ret == JFileChooser.APPROVE_OPTION){
File f = chooser.getSelectedFile();
lblStatus.setText("Status : saving file" + f.getAbsolutePath());
txtSave.setText(f.getAbsolutePath());
}
}
7. Menghandle penekanan tombol btnOpen. Kode untuk menangani penekanan tombol
btnOpen mirip dengan kode untuk menangani penenakan tombol btnSave, perbedaanya
adalah btnOpen akan menampilkan dialog open file, berikit ini kodenya:
private void btnBrowseActionPerformed(ActionEvent evt){
// TODO add your handling code here:
int ret = chooser.showOpenDialog(this);
if(ret == JFileChooser.APPROVE_OPTION){
File f = chooser.getSelectedFile();
lblStatus.setText("Status : opening file" + f.getAbsolutePath());
txtOpen.setText(f.getAbsolutePath());
}
}
8. Compile dan jalankan aplikasinya dengan menekan tombol SHIFT + F6
80
10 Akses Database Via JDBC Overview
Bagian ini akan membahas bagaimana mengakses database via JDBC. Dengan mengakses database,
kita dapat membuat aplikasi yang bisa melakukan penyimpanan data ke dalam storage dan juga
mengakses untuk keperluan proses bisnis tertentu.
Tujuan
1. Memahami konsep JDBC
2. Myenggunakan JDBC
10.1 Pengenalan JDBC
Java Database Connectivity (JDBC) merupakan Application Programming Interface (API), dalam
paket java.sql.*, yang memungkinkan untuk mengakses segala database menggunakan Java. Dari JDBC
ini kemudian muncul konsep‐konsep yang berdiri di atas JDBC, seperti SQL‐Mapping (misal
menggunakan iBatis), Data Access Object (DAO, misal menggunakan SpringDAO), dan Object
Relational Mapping (ORM, misal menggunakan Oracle Toplink dan Hibernate). Posisi JDBC dalam
program Java dapat dilihat pada gambar berikut:
Gambar 10.1 Posisi JDBC dalam program Java
10.2 Menggunakan JDBC
Pada dasarnya, untuk mengakses database dengan JDBC, diperlukan langkah-langkah berikut:
a. Load Database Driver
b. Buat koneksi
c. Lakukan pemrosesan query
d. Tutup koneksi
Berdasarkan langkah di atas maka kita memerlukan Database Driver dari masing‐masing vendor database (misal untuk MySQL bisa diunduh dari http://mysql.com ) supaya JDBC bisa mengakses
database dari vendor tersebut. Untuk me‐load sebuah driver digunakan dynamic class loading,
contoh:
Class.forName(“com.mysql.jdbc.Driver”);
Sintaks di atas digunakan untuk me‐load database driver milik MySQL ke dalam system property
“jdbc.drivers”. Setelah driver di‐load,class javax.sql.DriverManager dibutuhkan untuk me‐load system property “jdbc.drivers”. Saat koneksi dibutuhkan, method getConnection() dari Driver manager
digunakan untuk membuat koneksi JDBC.
Connection con = DriverManager.getConnection(
"jdbc:mysql://host:port/dbname",
81
"dbuser",
"dbpass" );
Setelah koneksi berhasil terbentuk, maka bisa dilakukan interaksi dengan database melalui
perintah‐perintah SQL, dengan terlebih dahulu membuat objek Statement sebagai berikut:
. . . . .
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery(SQLQuery);
. . . . .
SQLQuery merupakan suatu String yang berisi query ke database. Hasil query tersebut disimpan di
objek ResultSet. Untuk menampilkan hasil dari query tersebut, digunakan variabel rset yang
kemudian dimasukkan dalam suatu loop sebagai berikut:
. . . . .
while(rset.next()){
System.out.print(rset.getString(1)+"--");
System.out.print(rset.getString(2)+"--");
System.out.print(rset.getString(3));
System.out.println();
}
. . . . . perintah while di atas akan mengambil hasil kolom pertama, kedua dan ketiga. Bila koneksi telah
dilakukan dan aplikasi tidak lagi membutuhkan koneksi ke database, session yang terbentuk antara
aplikasi dengan database sebaiknya ditutup dengan kode sebagai berikut:
try{
con.close();
}catch(SQLException ex){}
10.3 Membuat Form CRUD dengan JDBC
Pada bagian ini, kita akan mencoba untuk membuat sebuah aplikasi CRUD (Create, Read, Update,
Delete) sederhana menggunakan JDBC. Sebelumnya dibuat dulu database dengan satu tabel
mahasiswa dengan 4 atribut (Nama, NIM, JenisKelamin dan Jurusan).
Untuk membuat form CRUD, lakukan langkah-langkah berikut ini. Pertama kita buat aplikasi desktop
menggunakan JTable sesuai gambar di bawah ini.
1. Pilih File > New File > Swing GUI Form > JFrame Form.
82
Gambar 10.2 Dialog window
2. Isi nama Classnya dan pilih packagenya sesuai anak panah.
3. Pertama kita membuat Table dengan Mendrag JTable pada Palette. Kita beri nama dgn klik
kanan pilih “change variable name”,kita beri nama misal : “table”
4. Pilih Table klik kanan Properties,seperti gambar di bawah ini :
Gambar 10.3 Tabel Properties
5. Buat kolom dengan klik Model lalu isi nama kolom – kolomnya seperti gambar di bawah ini
sesuai anak panah:
Gambar 10.4 JTable Model
6. Setting di source code nya. Pada baris paling akhir di sourcenya buat obyek untuk
TableModel langsung ketik code di bawah ini:
private javax.swing.table.DefaultTableModel tblModel =
getDefaultTabelModel();
7. Buat fungsi getDefaultTabelModel(); dan Tabel untuk pengaturan tablenya seperti pada
gambar di bawah ini, juga diketik secara manual:
83
8. Setting di konstruktornya, untuk pengaturan lebar kolomnya. Tambahkan source code
berikut:
tabel.setModel(tblModel);
Tabel(tabel,new int[]{120,180,120,120}); 9. Cara menginput data kedalam ke JTable. Pertama kali kita deklarasikan dulu variable array
satu dimensi di luar fungsi supaya dikenal disemua fungsi yang lain.
String data[] = new String [4];
Di dalam fungsi private void cmdsimpanactionperformed() tambahkan kode berikut.
10. Cara Menampilkan Data dari JTable kedalam Form di Netbeans. Nanti kita akan mengklik 2x
baris dalam JTable yang berisi data yang akan ditampilkan kedalam Form di Netbeans, caranya
pilih Inspector kemudian ikuti petunjuk di bawah ini:
84
Gambar 10.5 Inspector window
Setelah itu akan muncul Fungsi :
private void tabelMouseClicked(java.awt.event.MouseEvent evt) {
}
Kita modifikasi Fungsi tersebut sehingga menjadi seperti di bawah ini :
Dengan code di atas maka secara otomatis jika kita klik 2x baris dalam JTable maka
data dalam baris terpilih akan muncul dalam Form kemudian bisa kita edit dan delete.
11. Cara mengedit data dalam JTable. Setelah data muncul dalam Form untuk mengeditnya ikuti
code di bawah ini:
85
12. Cara menghapus data dalam JTable. Ketikan code di bawah ini:
private void cmdhapusActionPerformed(
java.awt.event.ActionEvent evt) {
tblModel.removeRow(row);
}
Langkah berikutnya adalah melakukan setting terhadap database dan koneksi JDBC yang digunakan.
1. Pertama kita buat file dengan extention .ini pada folder lib dengan terlebih dahulu membuat
folder lib(misal : database.ini). yang isinya seperti di bawah ini:
Gambar 10.6 Setting JDBC
2. Lalu kita buat file Database.java untuk melakukan relasi dengan file Database.ini yang isinya:
86
3. Memanggil class Database.java jika kita ingin melakukan pemrosesan data yang berhubungan
ke database. Untuk mengambil data dari file database.ini kita akan memodifikasi program
seperti di bawah ini pada sebelum dan dalam Konstruktor:
4. Lalu kita buat Function setDefaultTable():
87
5. Setelah code di atas selesai, data dari mysql akan tertampil pada table di Form javanya seperti
gambar di bawah ini:
Gambar 10.7 Aplikasi jadi
Berikutnya adalah membuat fungsi untuk pemrosesan data dengan Java. Berikut langkah-langkahnya.
1. Untuk pembuatan menu input . klik kanan tombol “Input” lalu pilih
Event ->action->Action Performed
Setelah itu buatlah code dalam function yg baru terbentuk seperti di bawah ini:
88
2. Untuk pembuatan menu cari . klik kanan tabel di Netbeans lalu pilih
Event ->Mouse->Mouse Click.
Kita menggunakan metode “klik”,jika tablenya diklik maka data dari table akan tertampil di
Formnya.Lalu tambahkan coding dalam Fungsi tabelMouseClicked seperti code di bawah ini:
3. Untuk pembuatan menu edit . klik kanan tombol ”ubah” di Netbeans lalu pilih
Event ->Action->ActionPerformed.
Untuk lebih jelasnya lihat code berikut:
89
4. Untuk pembuatan menu Hapus . klik kanan tombol ”Hapus” di Netbeans lalu pilih
Event ->Action->ActionPerformed.
Setelah data dicari, Menu yang terakhir adalah delete (untuk menghapus data):
90
11 Networking Overview
Java memberikan kemudahan dalam pengembangan aplikasi yang meliputi berbagai fungsi yang melalui
jaringan. Pada bagian ini, akan dibahas tentang konsep dasar jaringan dan aplikasi via jaringan
sederhana menggunakan Java.
Tujuan
1. Mengerti konsep dasar jaringan
2. Membuat aplikasi menggunakan package jaringan Java
11.1 Konsep Dasar Jaringan
Jika sebelumnya Anda telah mengetahui, bahwa internet adalah jaringan global dengan berbagai jenis
komputer yang berbeda yang tersambung dalam berbagai cara. Walaupun terdapat perbedaan dalam
software dan hardware yang tersambung bersama-sama, hal tersebut sangatlah bagus bahwa internet
masih dapat berfungsi. Hal ini memungkinkan karena standar komunikasi memiliki ketetapan dan juga
keselarasan. Standar ini menjamin kesesuaian dan kekuatan komunikasi di antara luasnya sistem pada
internet. Mari kita pelajari beberapa standar yang berlaku.
11.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 di mana 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.
11.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:
"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) di mana
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.
91
11.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 di mana 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 di bawah 1024.
port dengan nilai di atas 1024 disediakan untuk komunikasi custom. Jika terdapat kasus di mana port
dengan nilai di atas 1024 telah digunakan oleh beberapa komunikasi custom, Anda harus mencari
nilai lain yang tidak digunakan.
11.1.4 Paradigma client/server
Paradigma client/server adalah dasar untuk framework jaringan Java. Tentunya, penetapan ini terdiri
dari dua elemen besar, yaitu client dan server. Client adalah mesin yang membutuhkan beberapa
jenis informasi sedangkan server adalah mesin yang menyimpan informasi dan menunggu untuk
menyampaikannya pada client.
Paradigma ini menjelaskan sebuah skenario sederhana. Tentunya, client terhubung dengan server dan
meminta informasi. Kemudian server mengingat permintaan dan mengembalikan informasi yang
tersedia kepada client.
11.1.5 Socket
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.
11.2 Java Networking Package
Package dari java.net menyediakan banyak class yang berguna untuk pengembangan aplikasi jaringan.
Untuk daftar lengkap dari class jaringan dan interface, dapat dilihat pada dokumentasi API.
Pembelajaran akan difokuskan pada empat class yaitu : class ServerSocket, Socket, MulticastSocket,
dan DatagramPacket.
11.2.1 Class ServerSocket dan Socket
Class ServerSocket menyediakan fungsi-fungsi dasar dari sebuah server. Tabel berikut menjelaskan
dua dari empat constructor pada class ServerSocket:
Tabel 11.1 Contructor class ServerSocket
Nama Constructor Fungsi
ServerSocket(int port) Ketika sebuah server menetapkan suatu port tertentu, sebuah
port 0 menugaskan sebuah server kepada port bebas manapun.
92
Panjang antrian maksimum untuk koneksi yang akan datang
diatur sebanyak 50 sebagai defaultnya.
ServerSocket(int port, int backlog) Ketika sebuah server menetapkan suatu port tertentu, panjang
antrian maksimum untuk koneksi yang akan datang berdasarkan
pada parameter backlog.
Berikut ini adalah beberapa method class pada ServerSocket:
Tabel 11.2 Method class ServerSocket
Nama method Fungsi
public Socket accept() Menyebabkan server untuk menunggu dan mendengarkan dari
koneksi client, kemudian menerimanya.
public void close() Menutup socket server. Client tidak dapat lagi terhubung ke
server hingga dibuka kembali
public int getLocalPort() Mengembalikan port di mana socket juga membatasi
public boolean isClosed() Mendeteksi apakah socket tertutup atau belum
Contoh yang berhasil melakukan implementasi sebuah server sederhana, di mana sebuah informasi sederhana dikirim oleh client dapat dilihat pada listing program berikut ini:
import java.net.*;
import java.io.*;
public class EchoingServer {
public static void main(String [] args) {
ServerSocket server = null;
Socket client;
try {
server = new ServerSocket(1234);
//1234 nomor port yang belum digunakan
} catch (IOException ie) {
System.out.println("Cannot open socket.");
System.exit(1);
}
while(true) {
try {
client = server.accept();
OutputStream clientOut = client.getOutputStream();
PrintWriter pw = new PrintWriter(clientOut, true);
InputStream clientIn = client.getInputStream();
BufferedReader br = new BufferedReader(new
InputStreamReader(clientIn));
pw.println(br.readLine());
} catch (IOException ie) {
}
}
93
}
}
Ketika class ServerSocket mengimplementasikan server socket, Class Socket mengimplementasikan
socket client. Class Socket memiliki delapan constructor, dua di antaranya siap dipanggil. Langsung
saja kita lihat dua constructor tersebut.
Tabel 11.3 Constructor class Socket
Nama Constructor Fungsi
Socket(String host, int port) Membuat sebuah socket client di mana dihubungkan dengan
diberikan nomor port pada host tertentu.
Socket(InetAddress address, int
port)
Membuat sebuah socket client di mana dihubungkan dengan
diberikannya nomor port pada alamat IP tertentu.
Berikut adalah beberapa dari method class pada Socket:
Tabel 11.4 Method class Socket
Nama Method Fungsi
public void close() Menutup socket client
public InputStream getInputStream() Menerima kembali input stream yang berhubungan
dengan socket ini.
public OutputStream getOutputStream() Menerima kembali output stream yang berhubungan
dengan socket ini.
public InetAddress getInetAddress() Mengembalikan alamat IP kepada socket ini pada saat
masih terhubung.
public int getPort() Mengembalikan remote port kepada socket ini pada
saat masih terhubung.
public boolean isClosed() Mendeteksi apakah socket telah tertutup atau tidak
Contoh yang berhasil melakukan implementasi sebuah client sederhana, di mana mengirim data
kepada server dapat dilihat pada listing program di bawah ini:
import java.io.*;
import java.net.*;
public class MyClient {
public static void main(String args[]) {
try {
//Socket client = new Socket("133.0.0.1", 1234);
Socket client = new Socket(InetAddress.getLocalHost(), 1234);
InputStream clientIn = client.getInputStream();
OutputStream clientOut = client.getOutputStream();
PrintWriter pw = new PrintWriter(clientOut, true);
BufferedReader br = new BufferedReader(new
94
InputStreamReader(clientIn));
BufferedReader stdIn = new BufferedReader(new
InputStreamReader(System.in));
System.out.println("Type a message for the server: ");
pw.println(stdIn.readLine());
System.out.println("Server message: ");
System.out.println(br.readLine());
pw.close();
br.close();
client.close();
} catch (ConnectException ce) {
System.out.println("Cannot connect to the server.");
} catch (IOException ie) {
System.out.println("I/O Error.");
}
}
}
11.2.2 Class MulticastSocket dan DatagramPacket
Class MulticastSocket sangat berguna untuk aplikasi yang mengimplementasikan komunikasi secara
berkelompok. Alamat IP untuk kelompok multicast berkisar antara 224.0.0.0 hingga 239.255.255.255.
Meskipun begitu, alamat 224.0.0.0 telah dipesan dan seharusnya tidak digunakan. Class ini memiliki
tiga constructor tetapi yang akan dibahas hanya salah satu dari ketiga constructor ini.
Tabel 11.5 Constructor class MulticastSocket
Nama Constructor Fungsi
MulticastSocket(int port) Membuat multicast socket dibatasi dengan pemberian nomor port
Tabel berikutnya memberikan penjelasan beberapa method MulticastSocket.
Tabel 11.6 Method class MulticastSocket
Nama Method Fungsi
public void joinGroup(InetAddress mcastaddr) Bergabung dengan kelompok multicast pada
alamat tertentu
public void leaveGroup(InetAddress mcastaddr) Meninggalkan kelompok multicast pada alamat
tertentu
public void send(DatagramPacket p) Metode turunan dari class DatagramSocket.
Mengirim p dari socket ini.
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.
95
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.
Tabel 11.7 Constructor class DatagramPacket
Nama Constructor Fungsi
DatagramPacket(byte[] buf, int length) Constructor dari datagramPacket untuk menerima paket
dengan panjang length. Seharusnya kurang dari atau sama
dengan ukuran dari buffer buf.
DatagramPacket(byte[] buf, int length,
InetAddress address, int port)
Constructor dari datagramPacket untuk mengirim paket
dengan panjang length dengan nomor port tertentu dan host
tertentu.
Berikut adalah beberapa method dari class DatagramPacket.
Tabel 11.8 Method class DatagramPacket
Nama Method Fungsi
public byte[] getData() Mengembalikan buffer di mana data telah disimpan
public InetAddress getAddress() Mengembalikan alamat IP mesin di mana paket yang dikirim
atau yang diterima
public int getLength() Mengembalikan panjang data yang dikirim atau diterima
public int getPort() Mengembalikan nomor port pada remote host di mana
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.*;
public class ChatServer {
public static void main(String args[]) throws Exception {
MulticastSocket server = new MulticastSocket(1234);
InetAddress group = InetAddress.getByName("234.5.6.7");
//getByName – Mengembalikan alamat IP yang diberikan oleh Host
server.joinGroup(group);
boolean infinite = true;
/* Server terus-menerus menerima data dan mencetaknya*/
while(infinite) {
byte buf[] = new byte[1024];
DatagramPacket data = new DatagramPacket(buf,buf.length);
server.receive(data);
96
String msg = new String(data.getData()).trim();
System.out.println(msg);
}
server.close();
}
}
Berikut adalah class client:
import java.net.*;
import java.io.*;
public class ChatClient {
public static void main(String args[]) throws Exception {
MulticastSocket chat = new MulticastSocket(1234);
InetAddress group = InetAddress.getByName("234.5.6.7");
chat.joinGroup(group);
String msg = "";
System.out.println("Type a message for the server:");
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
msg = br.readLine();
DatagramPacket data = new DatagramPacket(msg.getBytes(),
0, msg.length(), group, 1234);
chat.send(data);
chat.close();
}
}