Anda di halaman 1dari 369

J.E.N.

Pengenalan Pemrograman 1

Versi 1.2
Juni 2007
Sumber JEDI

Pengenalan Pemrograman 1

J.E.N.I

Pengarang
Joyce Avestro

Persyaratan-persyaratan untuk latihan laboratorium

Team
Joyce Avestro
Florence Balagtas
Rommel Feria
Reginald Hutcherson
Rebecca Ong
John Paul Petines
Sang Shin
Raghavan Srinivas
Matthew Thompson

NetBeans IDE 5.5 berjalan pada sistem operasi yang mendukung Java VM.
Dibawah ini merupakan daftar dari platform-platform yang digunakan:

Team Translator
Frans Thamura
Eko Subiyantoro
Cahya Kusuma Ratih
Rizzatama N.S.
Miratul Khusna Mufida
Khansa Fitriannisa
Sulistyaningtyas
Allin Junikhah
Bagus Chandra
Badar Agung Nugroho
Kadek Surya Pranata

Sistem Operasi yang mendukung

Mac OS X 10.4.5 atau yang terbaru


Red Hat Fedora Core 3
Sistem Operasi Solaris 10 Update 1 (SPARC and x86/x64
Platform Edition)

NetBeans Enterprise Pack juga dapat digunakan pada platform-platform


berikut ini:

Microsoft Windows 2000 Professional SP4


Solaris 8 OS (SPARC and x86/x64 Platform Edition) and Solaris 9
OS (SPARC and x86/x64 Platform Edition)
Berbagai macam distribusi LINUX

Minimum konfigurasi Hardware


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

Pengenalan Pemrograman 1

Microsoft Windows XP Professional SP2 atau yang terbaru

Sistem Operasi Microsoft Windows:


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

J.E.N.I

Konfigurasi Hardware yang direkomendasikan

Sistem Operasi Microsoft Windows:


o Prosesor: 1.4 GHz Intel Pentium III workstation atau
setaranya
o Memori: 1 GB
o Disk space: 1 GB dari free disk space

Sistem Operasi Linux:


o Prosesor: 1.4 GHz Intel Pentium III atau setaranya
o Memori: 1 GB
o Disk space: 850 MB dari free disk space

Solaris OS (SPARC):
o Prosesor: UltraSPARC IIIi 1 GHz
o Memori: 1 GB
o Disk space: 850 MB dari free disk space
Solaris OS (x86/x64 platform edition):

o
o
o

Prosesor: AMD Opteron 100 Series 1.8 GHz


Memori: 1 GB
Disk space: 850 MB dari free disk space

Sistem Operasi Macintosh OS X:


o Prosesor: PowerPC G5
o Memori: 1 GB
o Disk space: 850 MB dari free disk space

Software yang diperlukan


NetBeans Enterprise Pack 5.5 dapat diakses pada Java 2 Platform Standard
Edition Development Kit 5.0 Update 1 atau diatasnya (JDK 5.0, versi
1.5.0_01 atau diatasnya), dimana berisi Java Runtime Environment plus
developer tools untuk meng-compile, men-debug, and menjalankan aplikasi
yang ditulis dengan bahasa Java. Sun Java System Application Server
Platform Edisi 9 telah diuji dengan JDK 5.0 update 6.

Untuk Solaris, Windows, dan Linux, Anda dapat mendownload


JDK untuk platform Anda pada

http://java.sun.com/j2se/1.5.0/download.html

Untuk Mac OS X, memerlukan Java 2 Platform Standard Edition


(J2SE) 5.0 Release 4. Anda dapat mendownload JDK dari Apple's
Developer Connection site. Pada:

http://developer.apple.com/java

(untuk mendownload
JDK Anda harus melakukan register terlebih dahulu).

Pengenalan Pemrograman 1

J.E.N.I

Daftar Isi
1 Pengenalan Pemrograman Komputer
1.1 Tujuan
1.2 Pendahuluan
1.3 Komponen dasar komputer
1.3.1 Hardware
1.3.1.1 Central Processing Unit
1.3.1.2 Memori
1.3.1.3 Input dan Output Device
1.3.2 Software
1.4 Sekilas Bahasa Pemrograman
1.4.1 Apa yang Disebut Bahasa Pemrograman?
1.4.2 Kategori Bahasa Pemrograman
1.5 Alur pembuatan program
1.5.1 Definisi Permasalahan
1.5.2 Analisa Permasalahan
1.5.3 Desain Algorithma dan Representasi
1.5.3.1 Simbol flow chart dan Artinya
1.5.4 Pengkodean, Uji Coba, dan Pembuatan Dokumentasi
1.6 Sistem Numerik dan Konversi
1.6.1 Sistem Bilangan Desimal
1.6.2 Sistem Bilangan Biner
1.6.3 Sistem Bilangan Oktal
1.6.4 Sistem Bilangan Heksadesimal
1.6.5 Konversi
1.6.5.1 Desimal ke Biner dan Biner ke Desimal
1.6.5.2 Desimal ke Oktal/ Heksadesimal dan Oktal/Heksadesimal ke Desimal
1.6.5.3 Biner ke Oktal dan Oktal ke Biner
1.6.5.4 Biner ke Heksadesimal dan Heksadesimal ke Biner
1.7 Latihan
1.7.1 Menyusun Algorithma
1.7.2 Konversi Sistem Bilangan
2 Pengenalan Bahasa Java
2.1 Tujuan
2.2 Latar Belakang Java
2.2.1 Sejarah Singkat Java
2.2.2 Apa itu Teknologi Java
2.2.2.1 Sebuah Bahasa Pemrograman
2.2.2.2 Sebuah Development Environment
2.2.2.3 Sebuah Aplikasi
2.2.2.4 Sebuah Deployment environment
2.2.2.5 Mengapa Mempelajari JAVA?

Pengenalan Pemrograman 1

J.E.N.I

2.2.3 Sebagian feature dari Java


2.2.3.1 Java Virtual Machine
2.2.3.2 Garbage Collection
2.2.3.3 Code Security
2.2.4 Fase-fase Pemrograman Java
3 Mengenali Lingkup Pemrograman Anda
3.1 Tujuan
3.2 Pendahuluan
3.3 Program Java Pertama
3.4 Menggunakan Text Editor dan Console
3.4.1 Errors
3.4.1.1 Syntax Errors
3.4.1.2 Run-time Errors
3.5 Using NetBeans
3.6 Latihan
3.6.1 Hello World
3.6.2 The Tree
4 Dasar - dasar Pemrograman
4.1 Tujuan
4.2 Menganalisa program pertama saya
4.3 Komentar pada Java
4.3.1 Penulisan komentar pada C ++
4.3.2 Penulisan komentar pada C
4.3.3 Komentar khusu Javadoc
4.4 Pernyataan dalam Java dan Blocks
4.5 Java Identifiers
4.6 Java Keywords
4.7 Java Literals
4.7.1 Integer Literals
4.7.2 Floating-Point Literals
4.7.3 Boolean Literals
4.7.4 Character Literals
4.7.5 String Literals
4.8 Tipe data primitive
4.8.1 Logika - boolean
4.8.2 Textual char
4.8.3 Integral byte, short, int & long
4.8.4 Floating Point float and double
4.9 Variabel
4.9.1 Deklarasi dan Inisialisasi Variable
4.9.2 Menampilkan Data Variabel
4.9.3 System.out.println() vs. System.out.print()
4.9.4 Reference Variables vs. Primitive Variables

Pengenalan Pemrograman 1

J.E.N.I

4.10 Operators
4.10.1 Operator Arithmetika
4.10.2 Operator Increment dan Decrement
4.10.3 Operator Relasi
4.10.4 Operator Logika
4.10.4.1 && (logika AND) and & (boolean logika AND)
4.10.4.2 || (logika OR) and | (boolean logika inclusive OR)
4.10.4.3 ^ (boolean logika exclusive OR)
4.10.4.4 ! (logika NOT)
4.10.5 Operator Kondisi (?:)
4.10.6 Operator Precedence
4.11 Latihan
4.11.1 Mendeklarasikan dan Mencetak Variable
4.11.2 Mendapatkan nilai rata-rata dari tiga angka
4.11.3 Menampilkan nilai terbesar
4.11.4 Operator precedence
5 Mendapatkan Input dari Keyboard
5.1 Tujuan
5.2 Menggunakan BufferedReader untuk mendapatkan input
5.3 Menggunakan JoptionPane untuk mendapatkan input
5.4 Latihan
5.4.1 3 Kata Terakhir (versi BufferedReader)
5.4.2 3 Kata Terakhir (versi JOptionPane)
6 Struktur Kontrol
6.1 Tujuan
6.2 Struktur Kontrol Keputusan
6.2.1 Statement if
6.2.2 Statement if-else
6.2.3 Statement if-else-if
6.2.4 Kesalahan umum apabila menggunakan statement if-else
6.2.5 Contoh Statement if-else-else if
6.2.6 Statement switch
6.2.7 Contoh statement switch
6.3 Struktur Kontrol Perulangan
6.3.1 while loop
6.3.2 do-while loop
6.3.3 for loop
6.4 Branching Statements
6.4.1 break statement
6.4.1.1 Unlabeled break statement
6.4.1.2 Labeled break statement
6.4.2 continue statement
6.4.2.1 Unlabeled continue statement
6.4.2.2 Labeled continue statement
6.4.3 return statement
Pengenalan Pemrograman 1

J.E.N.I

6.5 Latihan
6.5.1 Nilai
6.5.2 Membaca Bilangan
6.5.3 Cetak Seratus Kali
6.5.4 Perpangkatan
7 Java Arrays
7.1 Tujuan
7.2 Penganalan array
7.3 Pendeklarasian array
7.4 Pengaksesan sebuah element array
7.5 Panjang Array
7.6 Array Multidimensi
7.7 Latihan
7.7.1 Hari dalam seminggu
7.7.2 Nomor Terbesar
7.7.3 Buku Alamat
8 Argumen dari Command-lin
8.1 Tujuan
8.2 Argumen Command-line
8.3 Argumen Command-line di NetBeans
8.4 Latihan
8.4.1 Mencetak Argumen
8.4.2 Operasi Aritmatik
9 Bekerja dengan Pustaka Class Java
9.1 Tujuan
9.2 Pengenalan Pemrograman Berorientasi Object
9.3 Class dan Object
9.3.1 Perbedaan Class dan Object
9.3.2 Instansiasi Class
9.3.3 Variabel class dan Method
9.4 Methods
9.4.1 Apakah method itu dan mengapa menggunakan method?
9.4.2 Memanggil instance dari Method dan Passing variabel
9.4.3 Passing Variabel dalam Method
9.4.3.1 Pass-by-value
9.4.3.2 Pass-by-reference
9.4.4 Memanggil method Static
9.4.5 Lingkup variabel
9.5 Casting, Converting dan Comparing Objects
9.5.1 Casting Tipe Primitive
9.5.2 Casting Objects
9.5.3 Converting Tipe Primitive ke object dan sebaliknya
9.5.4 Comparing Objects
9.5.5 Menentukan class dari sebuah object

Pengenalan Pemrograman 1

J.E.N.I

9.6 Latihan
9.6.1 Mendefinisikan Istilah
9.6.2 Java Scavenger Hunt
10 Membuat Class Sendiri
10.1 Tujuan
10.2 Mendefinisikan Class Anda
10.3 Deklarasi Atribut
10.3.1 Instance Variable
10.3.2 Class Variable atau Static Variable
10.4 Deklarasi Methods
10.4.1 Accessor Methods
10.4.2 Mutator Methods
10.4.3 Multiple Return statements
10.4.4 Static Methods
10.4.5 Contoh Kode Program Dari Class StudentRecord
10.5 Referensi this
10.6 Overloading Methods
10.7 Deklarasi Construktor
10.7.1 Default Constructor
10.7.2 Overloading Constructor
10.7.3 Menggunakan Constructors
10.7.4 Pemanggilan Constructor Dengan this()
10.8 Packages
10.8.1 Mengimport Packages
10.8.2 Membuat Package
10.8.3 Pengaturan CLASSPATH
10.9 Access Modifiers
10.9.1 Akses Default(package accessibility)
10.9.2 Akses Public
10.9.3 Akses Protected
10.9.4 Akses Private
10.10 Latihan
10.10.1 Entry Buku Alamat
10.10.2 Buku Alamat
11 Pewarisan, Polimorfisme dan Interface
11.1 Tujuan
11.2 Pewarisan
11.2.1 Mendefinisikan Superclasses dan Subclasses
11.2.2 Kata Kunci Super
11.2.3 Overriding Method
11.2.4 Method Final dan Class Final
11.3 Polimorfisme
11.4 Abstract Class

Pengenalan Pemrograman 1

J.E.N.I

11.5 Interface
11.5.1 Kenapa Kita Memakai Interface?
11.5.2 Interface vs. Class Abstract
11.5.3 Interface vs. Class
11.5.4 Membuat Interface
11.5.5 Hubungan dari Interface ke Class
11.5.6 Pewarisan Antar Interface
11.6 Latihan
11.6.1 Extend StudentRecord
11.6.2 Bentuk Abstract Class
12 Dasar Exception Handling
12.1 Tujuan
12.2 Apa itu Exceptions?
12.3 Menangani Exceptions
12.4 Latihan
12.4.1 Menangkap Exception 1
12.4.2 Menangkap Exception 2

Pengenalan Pemrograman 1

J.E.N.I.

BAB 1
Pengenalan Pemrograman Komputer
1.1 Tujuan
Bagian ini akan membahas dasar dasar komponen dari komputer meliputi hardware
(perangkat keras) dan software (perangkat lunak). Kami juga akan menyertakan
gambaran global tentang bahasa pemrograman dan sirkulasi pemrograman. Akan
dibahas pula pada akhir pembahasan ini mengenai sistem dan konversi numerik.
Pada akhir pembahasan, diharapkan pembaca dapat :
Mengidentifikasi perbedaan komponen pada komputer
Mengetahui tentang bahasa pemrograman komputer dan kategorinya
Mengetahui alur kerja pembuatan program dan mengaplikasikannya
pemecahan masalah
Mempelajari tentang berbagai sistem numerik dan metode konversinya.

pada

1.2 Pendahuluan
Kata komputer berasal dari bahasa Latin yaitu Computare yang artinya menghitung.
Dalam bahasa Inggris disebut to compute. Secara definisi komputer diterjemahkan
sebagai sekumpulan alat elektronik yang saling bekerja sama, dapat menerima data
(input), mengolah data (proses) dan memberikan informasi (output) serta terkoordinasi
dibawah kontrol program yang tersimpan di memorinya. Jadi cara kerja komputer dapat
kita gambarkan sebagai berikut :

Gambar 1: Skema IO Komputer

Pengenalan Pemrograman 1

J.E.N.I.

Komputer memiliki dua komponen utama. Yang pertama adalah hardware (perangkat
keras) yang tersusun atas komponen elektronik dan mekanik.
Komponen utama yang lain yaitu software (perangkat lunak). Komponen ini terdiri atas
data dan aplikasi aplikasi komputer.

1.3 Komponen Dasar Komputer


1.3.1 HARDWARE
1.3.1.1 Central Processing Unit (CPU)
Processor, merupakan bagian dari perangkat keras komputer yang melakukan
pemprosesan aritmatika dan logika serta pengendalian operasi komputer secara
keseluruhan. Prosesor terdiri atas dua bagian utama, yaitu ALU (Arithmetic Logic Unit)
dan Control Unit. Kecepatan kerja prosesor biasanya ditentukan oleh kecepatan clock
dari Control Unit-nya.
Contoh : jika prosesor memiliki frekuensi clock 350 MHz, berarti kecepatan pemprosesan
satu instruksinya = T = 1/f = 1/(350 x 106 Hz), = 0,286 x 10-8 detik.

1.3.1.2 Memori
Memori adalah media penyimpan data pada komputer. Memori, berdasarkan fungsinya
dibagi menjadi dua yaitu :
a.

Primary Memory
Dipergunakan untuk menyimpan data dan instruksi dari program yang sedang
dijalankan. Seringkali disebut juga sebagai RAM. Karakteristik dari memori primer
adalah :
o
o
o

b.

Volatile (informasi ada selama komputer bekerja. Ketika komputer


dipadamkan, informasi yang disimpannya juga hilang)
Berkecepatan tinggi
Akses random (acak)

Secondary Memory
Dipergunakan untuk menyimpan data atau program biner secara permanen.
Karakteristik dari memori sekunder adalah
o
o
o

Non volatile atau persisten


Kecepatan relatif rendah (dibandingkan memori primer)
Akses random atau sekuensial

Contoh memori sekunder : floppy, harddisk, CD ROM, magnetic tape, optical disk,
dll. Dari seluruh contoh tersebut, yang memiliki mekanisme akses sekuensial
adalah magnetic tape

Pengenalan Pemrograman 1

J.E.N.I.

Memori Utama
(RAM)

Memori Sekunder
(ROM)

Kategori

Cepat

Lambat

Kecepatan

Mahal

Murah

Harga

Kecil

Besar

Kapasitas

Ya

Tidak

Volatile

Tabel 1: Perbandingan antara memori utama dan memori sekunder

1.3.1.3 Input Dan Output Device


Input-Output Device, merupakan bagian yang berfungsi sebagai penghubung antara
komputer dengan lingkungan di luarnya. Dapat dibagi menjadi dua kelompok, yaitu :
a.

Input Device (Piranti Masukan)


Berfungsi sebagai media komputer untuk menerima masukan dari luar.
Beberapa contoh piranti masukan :
o
o
o
o
o

b.

Keyboard
Mouse
Touch screen
Scanner
Camera

Output Device (Piranti Keluaran)


Berfungsi sebagai media komputer untuk memberikan keluaran. Beberapa
contoh piranti keluaran :
o
o
o
o

Monitor
Printer
Speaker
Plotter

1.3.2 Software
Merupakan program-program komputer yang berguna untuk menjalankan suatu
pekerjaan sesuai dengan yang dikehendaki. Program tersebut ditulis dengan bahasa
khusus yang dimengerti oleh komputer. Program dapat dianalogikan sebagai instruksi
yang akan dijalankan oleh prosessor. Software terdiri dari beberapa jenis, yaitu :
1. Sistem Operasi, seperti DOS, Unix, Novell, OS/2, Windows.
Adalah software yang berfungsi untuk mengaktifkan seluruh perangkat yang
terpasang pada komputer sehingga masing-masing dapat saling berkomunikasi.
Tanpa ada sistem operasi maka komputer tidak dapat difungsikan sama sekali.

Pengenalan Pemrograman 1

J.E.N.I.

2. Program Utility, seperti Norton Utility, Scandisk, PC Tools.


Program utility berfungsi untuk membantu atau mengisi kekurangan/kelemahan dari
sistem operasi, misalnya PC Tools dapat melakukan perintah format sebagaimana
DOS, tapi PC Tools mampu memberikan keterangan dan animasi yang bagus dalam
proses pemformatan. File yang telah dihapus oleh DOS tidak dapat dikembalikan lagi
tapi dengan program bantu hal ini dapat dilakukan.
3. Program Aplikasi, seperti GL, MYOB, Payroll.
Merupakan program yang khusus melakukan suatu pekerjaan tertentu, seperti
program gaji pada suatu perusahaan. Maka program ini hanya digunakan oleh bagian
keuangan saja tidak dapat digunakan oleh departemen yang lain. Umumnya program
aplikasi ini dibuat oleh seorang programmer komputer sesuai dengan
permintaan/kebutuhan seseorang/lembaga/perusahaan guna keperluan interennya.
4. Program Paket
Merupakan program yang dikembangkan untuk kebutuhan umum, seperti :
o
o
o
o

Pengolah kata /editor naskah : Wordstar, MS Word, Word Perfect, AmiPro


Pengolah angka / lembar kerja : Lotus123, MS Excell, QuattroPro, dll
Presentasi : MS PowerPoint
Desain grafis : CorelDraw, PhotoShop

5. Compiler.
Komputer hanya memahami satu bahasa, yaitu bahasa mesin. Bahasa mesin adalah
terdiri dari nilai 0 dan 1. Sangatlah tidak praktis dan efisien bagi manusia untuk
membuat program yang terdiri dari nilai 0 dan 1, maka dicarilah suatu cara untuk
menterjemahkan sebuah bahasa yang dipahami oleh manusia menjadi bahasa mesin.
Dengan tujuan inilah, diciptakan compiler.

1.4 Sekilas Bahasa Pemrograman


1.4.1 Apa yang Disebut Bahasa Pemrograman?
Bahasa pemrograman adalah teknik komunikasi standar untuk mengekspresikan
instruksi kepada komputer. Layaknya bahasa manusia, setiap bahasa memiliki tata tulis
dan aturan tertentu.
Bahasa pemrograman memfasilitasi seorang programmer secara tepat menetapkan data
apa yang sedang dilakukan oleh komputer selanjutnya, bagaimana data tersebut
disimpan dan dikirim, dan apa yang akan dilakukan apabila terjadi kondisi yang variatif.
Bahasa pemrograman dapat diklasifikasikan menjadi tingkat rendah, menengah, dan
tingkat tinggi. Pergeseran tingkat dari rendah menuju tinggi menunjukkan kedekatan
terhadap bahasa manusia.

Pengenalan Pemrograman 1

J.E.N.I.

1.4.2 Kategori Bahasa Pemrograman


1. Bahasa Pemrograman Tingkat Tinggi
Merupakan bahasa tingkat tinggi yang mempunyai ciri-ciri mudah dimengerti karena
kedekatannya terhadap bahasa sehari hari. Sebuah pernyataan program
diterjemahkan kepada sebuah atau beberapa mesin dengan menggunakan
compiler.
Sebagai contoh adalah : JAVA, C++, .NET
2. Bahasa Pemrograman Tingkat Rendah
Bahasa pemrograman generasi pertama. Bahasa jenis ini sangat sulit dimengerti
karena instruksinya menggunakan bahasa mesin. Disebut juga dengan bahasa
assembly merupakan bahasa dengan pemetaan satu persatu terhadap instruksi
komputer. Setiap intruksi assembly diterjemahkan dengan menggunakan
assembler.
3. Bahasa Pemrograman Tingkat Menengah
Dimana penggunaan instruksi telah mendekati bahasa sehari hari, walaupun masih
cukup sulit untuk dimengerti karena menggunakan singkatan singkatan seperti
STO yang berarti simpan (STORE) dan MOV yang artinya pindah (MOVE). Yang
tergolong dalam bahasa ini adalah Fortran.

1.5 Alur Pembuatan Program


Seorang programmer tidak melakukan pembuatan dan pengkodean program secara
begitu saja, namun mengikuti perencanaan dan metodologi yang terstruktur yang
memisahkan proses suatu aplikasi menjadi beberapa bagian.
Berikut ini langkah langkah sistematis dasar dalam menyelesaikan permasalahan
pemrograman :
1. Mendefinisikan masalah
2. Menganalisa dan membuat rumusan pemecahan masalah
3. Desain Algoritma dan Representasi
4. Pengkodean, Uji Coba dan pembuatan dokumentasi
Untuk memahami langkah dasar dalam pemecahan masalah dalam sebuah komputer
mari kita mendefinisikan sebuah permasalahan yang akan diselesaikan langkah demi
langkah sebagaimana metodologi pemecahan masalah yang akan dibahas selanjutnya.
Masalah yang akan kita selesaikan akan didefinisikan pada bagian selanjutnya.

1.5.1 Definisi Permasalahan


Seorang programmer umumnya mendapatkan tugas berdasarkan sebuah permasalahan.
Sebelum sebuah program dapat terdesain dengan baik untuk menyelesaikan beberapa
permasalahan, masalahmasalah yang terjadi harus dapat diketahui dan terdefinisi
Pengenalan Pemrograman 1

J.E.N.I.

dengan baik untuk mendapatkan detail persyaratan input dan output.


Sebuah pendefinisan yang jelas adalah sebagian dari penyelesaian masalah.
Pemrograman komputer mempersyaratkan untuk mendefiniskan program terlebih
dahulu sebelum membuat suatu penyelesaian masalah.
Mari kita definisikan sebuah contoh permasalahan :
Buatlah sebuah program yang akan menampilkan berapa kali sebuah nama
tampil pada sebuah daftar

1.5.2 Analisa Permasalahan


Setelah sebuah permasalahan terdefinisi secara memadai, langkah paling ringkas dan
efisien dalam penyelesaian harus dirumuskan.
Umumnya, langkah berikutnya meliputi
beberapa bagian kecil dan ringkas.

memecahkan masalah

tersebut menjadi

Contoh masalah :
Menampilkan jumlah kemunculan sebuah nama pada daftar

Input Terhadap Program :


Daftar Nama, Nama yang akan dicari
Output Dari Program :
Jumlah kemunculan nama yang dicari

1.5.3 Desain Algoritma dan Representasi


Setelah kita mengetahui dengan baik dan jelas mengenai permasalahan yang ingin
diselesaikan, langkah selanjutnya yaitu membuat rumusan algoritma untuk
menyelesaikan permasalahan. Dalam pemrograman komputer penyelesaian masalah
didefinisikan dalam langkah demi langkah.
Algoritma adalah urutan langkah langkah logis penyelesaian masalah yang disusun
secara sistematis dan logis. Logis merupakan kunci dari sebuah algoritma. Langkahlangkah dalam algoritma harus logis dan bernilai benar atau salah.
Algoritma dapat diekpresikan dalam bahasa manusia, menggunakan presentasi grafik
melalui sebuah FlowChart (diagram alir) ataupun melalui PseudoCode yang
menjembatani antara bahasa manusia dengan bahasa pemrograman.
Berdasarkan permasalahan yang terjadi pada bagian sebelumnya, bagaimanakah kita
dapat memberikan solusi penyelesaian secara umum dalam sebuah alur yang dapat
dengan mudah dimengerti?

Mengekspresikan cara penyelesaian melalui bahasa manusia :


Pengenalan Pemrograman 1

J.E.N.I.

1.
2.
3.
4.

Tentukan daftar nama


Tentukan nama yang akan dicari, anggaplah ini merupakan sebuah kata kunci
Bandingkan kata kunci terhadap setiap nama yang terdapat pada daftar
Jika kata kunci tersebut sama dengan nama yang terdapat pada daftar,
tambahkan nilai 1 pada hasil perhitungan
5. Jika seluruh nama telah dibandingkan, tampilkan hasil perhitungan (output)
Mengekspresikan cara penyelesaian melalui FlowChart :

Gambar 2: Contoh Flowchart

Mengekspresikan solusi melalui Pseudocode :


listNama
keyNama
hitung

=
=
=

Daftar Nama
Nama yang dicari
0

Untuk setiap nama pada Daftar Nama lakukan :


Jika nama == keyNama
Hitung = Hitung + 1
Tampilkan Hitung

1.5.3.1 Simbol Flowchart dan Artinya

Pengenalan Pemrograman 1

J.E.N.I.

Flowchart adalah representasi grafis dari langkah langkah yang harus diikuti dalam
menyelesaikan suatu permasalahan yang terdiri atas sekumpulan simbol, dimana
masing masing simbol merepresentasikan kegiatan tertentu. Flowchart diawali dengan
penerimaan input dan diakhiri dengan penampilan output.
Sebuah flowchart pada umumnya tidak menampilkan instruksi bahasa pemrograman,
namun menetapkan konsep solusi dalam bahasa manusia ataupun notasi matematis.
Berikut ini akan dibahas tentang simbolsimbol yang digunakan dalam menyusun
flowchart, kegiatan yang diwakili serta aturan yang diterapkan dalam penggunaan
simbol tersebut :

Simbol

Nama

Simbol Proses

Simbol Input
Output (IO)

Simbol Garis Alir

Pengenalan Pemrograman 1

Pengertian
Simbol ini digunakan untuk melambangkan
kegiatan pemprosesan input. Dalam simbol ini, kita
dapat menuliskan operasi-operasi yang dikenakan
pada input, maupun operasi lainnya. Sama seperti
aturan pada simbol input, penulisan dapat
dilakukan secara satu per satu maupun secara
keseluruhan.

Merepresentasikan fungsi I/O yang membuat


diproses
(input)
atau
sebuah data dapat
ditampilkan (output) setelah mengalami eksekusi
informasi.
Simbol ini digunakan untuk menghubungkan setiap
langkah dalam flowchart dan menunjukkan kemana
arah aliran diagram. Anak panah ini harus
mempunyai arah dari kiri ke kanan atau dari atas
ke bawah. Anak panah ini juga dapat diberi label,
khususnya jika keluar dari symbol percabangan.

Simbol Anotasi

Merepresentasikan informasi deskriptif tambahan,


komentar atau catatan penjelasan. Dalam simbol
ini, kita dapat menuliskan komentar apapun dan
sebanyak apapun,
hal ini berguna untuk
memperjelas langkah-langkah dalam flowchart.
Garis vertical dan garis putusputus dapat
ditempatkan pada sisi kanan maupun kiri.

Simbol
Percabangan

Simbol ini digunakan untuk melambangkan


percabangan, yaitu pemeriksaan terhadap suatu
kondisi. Dalam simbol ini, kita menuliskan keadaan
yang harus dipenuhi. Hasil dari pemeriksaan dalam
simbol ini adalah YES atau NO. Jika pemeriksaan
menghasilkan keadaan benar, maka jalur yang

J.E.N.I.

Simbol

Nama

Pengertian
harus dipilih adalah jalur yang berlabel Yes,
sedangkan
jika
pemeriksaan
menghasilkan
keadaan salah, maka jalur yang harus dipilih
adalah jalur yang berlabel No.

Terminator berfungsi untuk menandai awal dan


akhir dari suatu flowchart. Simbol ini biasanya
diberi label START untuk menandai awal dari
flowchart, dan label STOP untuk menandai akhir
Simbol Terminator dari flowchart. Jadi dalam sebuah flowchart pasti
terdapat sepasang terminator yaitu terminator
start dan stop.

Simbol Konektor

Simbol Prosedur

Simbol
konektor
digunakan
pada
waktu
menghubungkan suatu langkah dengan langkah
lain dalam sebuah flowchart dengan keadaan on
page atau off page. Konektor on page digunakan
untuk menghubungkan suatu langkah dengan
langkah lain dari flowchart dalam satu halaman,
sedangkan konektor off page digunakan untuk
menghubungkan suatu langkah dengan langkah
lain dari flowchart dalam halaman yang berbeda.
Konektor ini biasanya dipakai saat media yang kita
gunakan untuk menggambar flowchart tidak cukup
luas untuk memuat gambar secara utuh, jadi perlu
dipisah-pisahkan.
Dalam
sepasang
konektor
biasanya diberi label tertentu yang sama agar lebih
mudah diketahui pasangannya.

Simbol ini berperan sebagai blok pembangun dari


suatu program. Prosedur memiliki suatu flowchart
yang berdiri sendiri diluar flowchart utama. Jadi
dalam simbol ini, kita cukup menuliskan nama
prosedurnya saja, jadi sama seperti jika kita
melakukan pemanggilan suatu prosedur pada
program utama (main program). Sama dengan
aturan pada simbol percabangan, penulisan nama
prosedur dilakukan secara satu per satu.

Tabel 2: Simbol dari Flowchart

1.5.4 Pengkodean, Uji Coba dan Pembuatan Dokumentasi


Setelah membentuk algoritma, maka proses penulisan program dapat dimulai.
Menggunakan algoritma sebagai pedoman, maka kode program dapat ditulis sesuai
bahasa pemrograman yang dipilih.
Pengenalan Pemrograman 1

J.E.N.I.

Setelah menyelesaikan seluruh kode program, langkah selanjutnya yaitu menguji


program tersebut apakah telah berfungsi sesuai tujuannya untuk memberikan suatu
solusi untuk menyelesaikan suatu masalah. Bilamana terjadi kesalahan kesalahan
logika atas program, disebut juga sebagai bugs, maka kita perlu untuk mengkaji ulang
rumusan/algoritma yang telah dibuat, kemudian memperbaiki implementasi kode
program yang mungkin keliru. Proses ini disebut dengan debugging.
Terdapat dua tipe kesalahan (errors) yang akan dihadapi seorang programmer. Yang
pertama adalah compile-time error, dan yang kedua adalah runtime error.
Compile-time errors muncul jika terdapat kesalahan penulisan kode program. Compiler
akan mendeteksi kesalahan yang terjadi sehingga kode tersebut tidak akan bisa
dikompilasi.
Terlupakannya penulisan semi-colon (;) pada akhir sebuah pernyataan program atau
kesalahan ejaan pada beberapa perintah dapat disebut juga sebagai compiletime error.
Compiler tidaklah sempurna sehingga tidak dapat mengidentifikasi seluruh kemungkinan
kesalahan pada waktu kompilasi. Umumnya kesalahan yang terjadi adalah kesalahan
logika seperti perulangan tanpa akhir. Tipe kesalahan ini disebut dengan runtime error.
Sebagai contoh, penulisan kode pada program terlihat tanpa kesalahan, namun pada
saat anda menelusuri struktur logika kode tersebut, bagian yang sama pada kode
tereksekusi berulangulang tanpa akhir. Pada kasus tersebut compiler tidak cukup
cerdas untuk menangkap kesalahan tipe ini pada saat proses kompilasi. Sehingga saat
program dijalankan, aplikasi atau bahkan keseluruhan komputer mengalami hang karena
mengalami proses perulangan yang tidak berakhir. Contoh lain dari run-time error
adalah perhitungan atas nilai yang salah, kesalahan penetapan kondisi dan lain
sebagainya.
Untuk memudahkan dalam memeriksa suatu kesalahan suatu program ataupun
memahami jalannya program, kita juga perlu membuat suatu dokumentasi dari program
yang dibuat. Dokumentasi tersebut berisi informasi mulai dari tujuan dan fungsi
program, algoritma, serta cara penggunaannya.

1.6 Sistem Numerik dan Konversi


Bilangan dapat disajikan dalam beberapa cara. Cara penyajiannya tergantung pada Basis
(BASE) bilangan tersebut. Terdapat 4 cara utama dalam penyajian bilangan.

Pengenalan Pemrograman 1

10

J.E.N.I.

1.6.1 Sistem Bilangan Desimal


Manusia umumnya menggunakan bilangan pada bentuk desimal. Bilangan desimal
adalah sistem bilangan yang berbasis 10. Hal ini berarti bilangan bilangan pada sistem
ini terdiri dari 0 sampai dengan 9. Berikut ini beberapa contoh bilangan dalam bentuk
desimal :
12610 (umumnya hanya ditulis 126)
1110 (umumnya hanya ditulis 11)

1.6.2 Sistem Bilangan Biner


Bilangan dalam bentuk biner adalah bilangan berbasis 2. Ini menyatakan bahwa
bilangan yang terdapat dalam sistem ini hanya 0 dan 1. Berikut ini contoh penulisan dari
bilangan biner :

11111102
10112

1.6.3 Sistem Bilangan Oktal


Bilangan dalam bentuk oktal adalah sistem bilangan yang berbasis 8. Hal ini berarti
bilanganbilangan yang diperbolehkan hanya berkisar antara 0 7. Berikut ini contoh
penulisan dari bilangan oktal :

1768
138

1.6.4 Sistem Bilangan Heksadesimal


Bilangan dalam sistem heksadesimal adalah sistem bilangan berbasis 16. Sistem ini
hanya memperbolehkan penggunaan bilangan dalam skala 0 9, dan menggunaan
huruf A F, atau a f karena perbedaan kapital huruf tidak memiliki efek apapun.
Berikut ini contoh penulisan bilangan pada sistem heksadesimal :

7E16
B16

Pengenalan Pemrograman 1

11

J.E.N.I.

Heksadesimal

Nilai Dalam Desimal

10

11

12

13

14 15

Tabel 3: Bilangan heksadesimal dan perbandingannya terhadap desimal

Berikut adalah perbandingan keseluruhan sistem penulisan bilangan :

Desimal

Biner

Oktal

Heksadesimal

12610

11111102

1768

7E16

1110

10112

138

B16

Tabel 4: Contoh Konversi Antar Sistem Bilangan

1.6.5 Konversi
1.6.5.1 Desimal ke Biner / Biner ke Desimal
Untuk mengubah angka desimal menjadi angka biner digunakan metode pembagian
dengan angka 2 sambil memperhatikan sisanya. Ambil hasil bagi dari proses pembagian
sebelumnya, dan bagi kembali bilangan tersebut dengan angka 2. Ulangi langkahlangkah tersebut hingga hasil bagi akhir bernilai 0 atau 1. Kemudian susun nilainilai
sisa dimulai dari nilai sisa terakhir sehingga diperoleh bentuk biner dari angka bilangan
tersebut.

Sebagai Contoh :
12610 = ?

Hasil Bagi

Nilai Sisa

126 / 2 =

63

63 / 2 =

31

15

15 / 2 =

7/2=

3/2=

31 / 2 =

1/2=

Pengenalan Pemrograman 1

Urutkan

12

J.E.N.I.

Dengan menuliskan nilai sisa mulai dari bawah ke atas, didapatkan angka biner
11111102.
Konversi bilangan biner ke desimal didapatkan dengan menjumlahkan perkalian semua
bit biner dengan perpangkatan 2 sesuai dengan posisi bit tersebut.

Sebagai Contoh :
110011012 = ?

10

Angka desimal 205 diperoleh dari penjumlahan angka yang diarsir. Setiap biner yang
bernilai 1 akan mengalami perhitungan, sedangkan yang bernilai 0 tidak akan dihitung
karena hanya akan menghasilkan nilai 0.

1.6.5.2 Desimal ke Oktal/Heksadesimal dan Oktal/Heksadesimal ke


Desimal
Pengubahan bilangan desimal ke bilangan oktal atau bilangan heksadesimal pada
dasarnya sama dengan konversi bilangan desimal ke biner. Perbedaannya terletak pada
bilangan pembagi. Jika pada konversi biner pembaginya adalah angka 2, maka pada
konversi oktal pembaginya adalah angka 8, sedangkan pada konversi heksadesimal
pembaginya adalah 16.
Contoh konversi Oktal :
12610 = ?

Hasil Bagi

Nilai Sisa

15

15 / 8 =

1/8=

126 / 8 =

Dengan menuliskan nilai sisa dari bawah ke atas, kita peroleh bilangan oktal 1768

Pengenalan Pemrograman 1

13

J.E.N.I.

Contoh konversi Heksadesimal :

12610 = ?

16

Hasil Bagi

Nilai Sisa

14 (E)

126 / 16 =
7 / 16 =

Dengan menuliskan nilai sisa dari bawah ke atas, kita peroleh bilangan Heksadesimal
7E16
Konversi bilangan Oktal dan Heksadesimal sama dengan konversi bilangan Biner ke
Desimal. Perbedaanya hanya terdapat pada penggunaan angka basis. Jika sistem Biner
menggunakan basis 2, maka pada bilangan Oktal, basis yang digunakan adalah 8 dan
pada bilangan Heksadesimal adalah angka 16.
Contoh konversi Oktal :
1768 = ?

10

Posisi

Digit Oktal

6
6 x 80 = 6
7 x 81 = 56
1 x 82 = 64
TOTAL: 126

Pengenalan Pemrograman 1

14

J.E.N.I.

Contoh konversi Heksadesimal :

7E16 = ?

10

Posisi

Digit Heksadesimal

E
14 x 160 = 14
7 x 161 = 112
TOTAL: 126

1.6.5.3 Biner ke Oktal dan Oktal ke Biner


Untuk mengubah bilangan biner ke oktal, kita pilah bilangan tersebut menjadi 3 bit
bilangan biner dari kanan ke kiri. Tabel berikut ini menunjukkan representasi bilangan
biner terhadap bilangan oktal :
Digit Oktal

Representasi Biner

000

001

010

011

100

101

110

111

Tabel 5: Bilangan oktal dan perbandingannya dalam sistem biner

Pengenalan Pemrograman 1

15

J.E.N.I.

Sebagai contoh :
11111102 = ?

Mengubah sistem bilangan oktal menjadi bilangan biner dilakukan dengan cara kebalikan
dari konversi biner ke oktal. Dalam hal ini masingmasing digit bilangan oktal diubah
langsung menjadi bilangan biner dalam kelompok tiga bit, kemudian merangkai
kelompok bit tersebut sesuai urutan semula.
Sebagai contoh :
1768 = ?

1.6.5.4 Biner ke Heksadesimal dan Heksadesimal ke Biner


Pengubahan bilangan Biner ke Heksadesimal dilakukan dengan pengelompokan setiap
empat bit Biner dimulai dari bit paling kanan. Kemudian konversikan setiap kelompok
menjadi satu digit Heksadesimal. Tabel berikut menunjukkan representasi bilangan Biner
terhadap digit Heksadesimal :

Digit Heksadesimal

Representasi Biner

0000

0001

0010

0011

0100

Pengenalan Pemrograman 1

16

J.E.N.I.

Digit Heksadesimal

Representasi Biner

0101

0110

0111

1000

1001

1010

1011

1100

1101

1110

1111

Tabel 6: Bilangan heksadesimal dan konversinya dalam biner

Sebagai contoh :
11111102 = ?

16

Konversi bilangan Heksadesimal ke Biner dilakukan dengan membalik urutan dari proses
pengubahan Biner ke Heksadesimal. Satu digit Heksadesimal dikonversi menjadi 4 bit
Biner.
Sebagai contoh :

7E16 = ?

Pengenalan Pemrograman 1

17

J.E.N.I.

1.7 Latihan
1.7.1 Menyusun Algoritma
Dari permasalahanpermasalahan di bawah ini, susunlah sebuah algoritma untuk
menyelesaikannya. Anda dapat menyusunnya dengan menggunakan pseudocode
ataupun flowchart.
1. Memasak Roti
2. Menggunakan Komputer di Laboratorium
3. Menghitung ratarata dari 3 buah bilangan

1.7.2 Konversi Sistem Bilangan


Konversikan bilangan bilangan berikut ini :
1. 198010 ke sistem bilangan Biner, Heksadesimal dan Oktal
2. 10010011012 ke sistem bilangan Desimal, Heksadesimal dan Oktal
3. 768 ke sistem bilangan Biner, Heksadesimal dan Desimal
4. 43F16 ke sistem bilangan Biner, Desimal dan Oktal

Pengenalan Pemrograman 1

18

J.E.N.I.

BAB 2
Pengenalan Bahasa JAVA
2.1 Tujuan
Pada bab ini akan dibahas secara singkat tentang sejarah JAVA dan definisi teknologi
JAVA. Bab ini juga akan sedikit menyinggung tentang fasefase dalam program
JAVA.
Pada akhir pembahasan, diharapkan pembaca dapat :
1. Menjelaskan fiturfitur teknologi dari Java meliputi Java Virtual Machine
(JVM), garbage collection, dan code security.
2. Menjelaskan perbedaan fase pada pemrograman JAVA

2.2 Latar Belakang Bahasa JAVA


2.2.1 Sejarah Singkat JAVA
Pada 1991, sekelompok insinyur Sun dipimpin oleh Patrick Naughton dan James
Gosling ingin merancang bahasa komputer untuk perangkat konsumer seperti cable
TV Box. Dikarenakan perangkat tersebut tidak memiliki banyak memori, bahasa
harus berukuran kecil dan mengandung kode yang liat. Juga karena manufakturmanufaktur berbeda memilih processor yang berbeda pula, maka bahasa harus
bebas dari manufaktur manapun. Proyek diberi nama kode Green.
Kebutuhan untuk fleksibilitas, kecil, liat dan kode yang netral terhadap platform
mengantar tim mempelajari implementasi Pascal yang pernah dicoba. Niklaus Wirth,
pencipta bahasa Pascal telah merancang bahasa portabel yang menghasilkan
intermediate code untuk mesin hipotesis. Mesin ini sering disebut dengan mesin
maya (virtual machine). Kode ini kemudian dapat digunakan di sembarang mesin
yang memiliki interpreter. Proyek Green menggunakan mesin maya untuk mengatasi
isu utama tentang netral terhadap arsitektur mesin.
Karena orangorang di proyek Green berbasis C++ dan bukan Pascal maka
kebanyakan sintaks diambil dari C++, serta mengadopsi orientasi objek dan bukan
prosedural. Mulanya bahasa yang diciptakan diberi nama Oak oleh James Gosling
yang mendapat inspirasi dari sebuah pohon yang berada pada seberang kantornya,
namun dikarenakan nama Oak sendiri merupakan nama bahasa pemrograman yang
telah ada sebelumnya, kemudian SUN menggantinya dengan JAVA. Nama JAVA
sendiri terinspirasi pada saat mereka sedang menikmati secangkir kopi di sebuah
kedai kopi yang kemudian dengan tidak sengaja salah satu dari mereka
menyebutkan kata JAVA yang mengandung arti asal bijih kopi. Akhirnya mereka
sepakat untuk memberikan nama bahasa pemrograman tersebut dengan nama Java.
Pengenalan Pemrograman 1

J.E.N.I.

Produk pertama proyek Green adalah Star 7 (*7), sebuah kendali jarak jauh yang
sangat cerdas. Dikarenakan pasar masih belum tertarik dengan produk konsumer
cerdas maka proyek Green harus menemukan pasar lain dari teknologi yang
diciptakan. Pada saat yang sama, implementasi WWW dan Internet sedang
mengalami perkembangan pesat. Di lain pihak, anggota dari proyek Green juga
menyadari bahwa Java dapat digunakan pada pemrograman internet, sehingga
penerapan selanjutnya mengarah menjadi teknologi yang berperan di web.

Java telah mengakomodasi hampir seluruh fitur penting bahasabahasa


pemrograman yang ada semenjak perkembangan komputasi modern manusia :
1. Dari SIMULA, bahasa pada tahun 65-an, bahasa yang paling mempengaruhi
Java sekaligus C++. Dari bahasa ini diadopsi bentukanbentukan dasar dari
pemrograman berorientasi objek.
2. Dari LISP bahasa tahun 55-an. Diadopsi fasilitas garbage collection, serta
kemampuan untuk meniru generic list processing, meski fasilitas ini jarang
yang memanfaatkannya.
3. Dari Algol bahasa pada tahun 60-an, diambil struktur kendali yang
dimilikinya.
4. Dari C++, diadopsi sintaks, sebagian semantiks dan exception handling
5. Dari bahasa Ada, diambil strongly type, dan exception handling.
6. Dari Objective C, diambil fasilitas interface.
7. Dari bahasa SmallTalk, diambil pendekatan single-root class hirarchie,
dimana object adalah satu kesatuan hirarki pewarisan
8. Dari bahasa Eiffel, fasilitas assertion yang mulai diterapkan di sebagian JDK
1.4

Pengenalan Pemrograman 1

J.E.N.I.

2.2.2 Apa itu Teknologi JAVA?


2.2.2.1

Sebuah Bahasa Pemrograman

Sebagai sebuah bahasa pemrograman, Java dapat membuat seluruh bentuk aplikasi,
desktop, web dan lainnya, sebagaimana dibuat dengan menggunakan bahasa
pemrograman konvensional yang lain.
Java adalah bahasa pemrograman yang berorientasi objek (OOP) dan dapat
dijalankan pada berbagai platform sistem operasi. Perkembangan Java tidak hanya
terfokus pada satu sistem operasi, tetapi dikembangkan untuk berbagai sistem
operasi dan bersifat open source.

2.2.2.2

Sebuah Development Environment

Sebagai sebuah peralatan pembangun, teknologi Java menyediakan banyak tools :


compiler, interpreter, penyusun dokumentasi, paket kelas dan sebagainya.

2.2.2.3

Sebuah Aplikasi

Aplikasi dengan teknologi Java secara umum adalah aplikasi serba guna yang dapat
dijalankan pada seluruh mesin yang memiliki Java Runtime Environment (JRE).

2.2.2.4

Sebuah Deployment Environment

Terdapat dua komponen utama dari Deployment Environment. Yang pertama adalah
JRE, yang terdapat pada paket J2SDK, mengandung kelaskelas untuk semua paket
teknologi Java yang meliputi kelas dasar dari Java, komponen GUI dan sebagainya.
Komponen yang lain terdapat pada Web Browser. Hampir seluruh Web Browser
komersial menyediakan interpreter dan runtime environment dari teknologi Java.

Pengenalan Pemrograman 1

J.E.N.I.

2.2.5 Mengapa Mempelajari JAVA?


Berdasarkan white paper resmi dari SUN, Java memiliki karakteristik berikut :
1.

Sederhana
Bahasa pemrograman Java menggunakan sintaks mirip dengan C++ namun
sintaks pada Java telah banyak diperbaiki terutama menghilangkan
penggunaan pointer yang rumit dan multiple inheritance. Java juga
menggunakan automatic memory allocation dan memory garbage collection.

2.

Berorientasi objek (Object Oriented)


Java mengunakan pemrograman berorientasi objek yang membuat program
dapat dibuat secara modular dan dapat dipergunakan kembali. Pemrograman
berorientasi objek memodelkan dunia nyata kedalam objek dan melakukan
interaksi antar objek-objek tersebut.

3.

Dapat didistribusi dengan mudah


Java dibuat untuk membuat aplikasi terdistribusi secara mudah dengan adanya
libraries networking yang terintegrasi pada Java.

4.

Interpreter
Program Java dijalankan menggunakan interpreter yaitu Java Virtual Machine
(JVM). Hal ini menyebabkan source code Java yang telah dikompilasi menjadi
Java bytecodes dapat dijalankan pada platform yang berbeda-beda.

5.

Robust
Java mempuyai reliabilitas yang tinggi. Compiler pada Java mempunyai
kemampuan mendeteksi error secara lebih teliti dibandingkan bahasa
pemrograman lain. Java mempunyai runtime-Exception handling untuk
membantu mengatasi error pada pemrograman.

6.

Aman
Sebagai bahasa pemrograman untuk aplikasi internet dan terdistribusi, Java
memiliki beberapa mekanisme keamanan untuk menjaga aplikasi tidak
digunakan untuk merusak sistem komputer yang menjalankan aplikasi
tersebut.

7.

Architecture Neutral
Program Java merupakan platform independent. Program cukup mempunyai
satu buah versi yang dapat dijalankan pada platform yang berbeda dengan
Java Virtual Machine.

8.

Portabel
Source code maupun program Java dapat dengan mudah dibawa ke platform
yang berbeda-beda tanpa harus dikompilasi ulang.

9.

Performance
Performance pada Java sering dikatakan kurang tinggi. Namun performance
Java dapat ditingkatkan menggunakan kompilasi Java lain seperti buatan
Inprise, Microsoft ataupun Symantec yang menggunakan Just In Time
Compilers (JIT).

Pengenalan Pemrograman 1

J.E.N.I.

10.

Multithreaded
Java mempunyai kemampuan untuk membuat suatu program yang dapat
melakukan beberapa pekerjaan secara sekaligus dan simultan.

11.

Dinamis
Java didesain untuk dapat dijalankan pada lingkungan yang dinamis. Perubahan
pada suatu class dengan menambahkan properties ataupun method dapat
dilakukan tanpa menggangu program yang menggunakan class tersebut.

2.2.4 Sebagian Fitur dari JAVA


2.2.4.1

Java Virtual Machine (JVM)

JVM adalah sebuah mesin imajiner (maya) yang bekerja dengan menyerupai aplikasi
pada sebuah mesin nyata. JVM menyediakan spesifikasi hardware dan platform
dimana kompilasi kode Java terjadi. Spesifikasi inilah yang membuat aplikasi
berbasis Java menjadi bebas dari platform manapun karena proses kompilasi
diselesaikan oleh JVM.
Aplikasi program Java diciptakan dengan file teks berekstensi .java. Program ini
dikompilasi menghasilkan satu berkas bytecode berekstensi .class atau lebih.
Bytecode adalah serangkaian instruksi serupa instruksi kode mesin. Perbedaannya
adalah kode mesin harus dijalankan pada sistem komputer dimana kompilasi
ditujukan, sementara bytecode berjalan pada java interpreter yang tersedia di
semua platform sistem komputer dan sistem operasi.

2.2.4.2

Garbage Collection

Banyak bahasa pemrogaman lain yang mengijinkan seorang programmer


mengalokasikan memori pada saat dijalankan. Namun, setelah menggunakan alokasi
memori tersebut, harus terdapat cara untuk menempatkan kembali blok memori
tersebut supaya program lain dapat menggunakannya. Dalam C, C++ dan bahasa
lainnya, adalah programmer yang mutlak bertanggung jawab akan hal ini. Hal ini
dapat menyulitkan bilamana programmer tersebut alpa untuk mengembalikan blok
memori sehingga menyebabkan situasi yang dikenal dengan nama memory leaks.
Program Java melakukan garbage collection yang berarti program tidak perlu
menghapus sendiri objekobjek yang tidak digunakan lagi. Fasilitas ini mengurangi
beban pengelolaan memori oleh programmer dan mengurangi atau mengeliminasi
sumber kesalahan terbesar yang terdapat pada bahasa yang memungkinkan alokasi
dinamis.

Pengenalan Pemrograman 1

J.E.N.I.

2.2.4.3

Code Security

Code Security terimplementasi pada Java melalui penggunaan Java Runtime


Environment (JRE). Java menggunakan model pengamanan 3 lapis untuk melindungi
sistem dari untrusted Java Code.
1. Pertama, class-loader menangani pemuatan kelas Java ke runtime
interpreter. Proses ini menyediakan pengamanan dengan memisahkan kelas
kelas yang berasal dari local disk dengan kelaskelas yang diambil dari
jaringan. Hal ini membatasi aplikasi Trojan karena kelaskelas yang berasal
dari local disk yang dimuat terlebih dahulu.
2. Kedua, bytecode verifier membaca bytecode sebelum dijalankan dan
menjamin bytecode memenuhi aturanaturan dasar bahasa Java.
3. Ketiga, manajemen keamanan menangani keamanan tingkat aplikasi dengan
mengendalikan apakah program berhak mengakses sumber daya seperti
sistem file, port jaringan, proses eksternal dan sistem windowing.
Setelah seluruh proses tersebut selesai dijalankan, barulah kode program di
eksekusi.
Java juga menyediakan beragam teknik pengamanan lain :
1. Bahasa dirancang untuk mempersulit eksekusi kode perusak. Peniadaan
pointer merupakan langkah besar pengamanan. Java tidak mengenal operasi
pointer. Di tangan programmer handal, operasi pointer merupakan hal yang
luar biasa untuk optimasi dan pembuatan program yang efisien serta
mengagumkan. Namun mode ini dapat menjadi petaka di hadapan
programmer jahat. Pointer merupakan sarana luar biasa untuk pengaksesan
tak diotorisasi. Dengan peniadaan operasi pointer, Java dapat menjadi bahasa
yang lebih aman.
2. Java memiliki beberapa pengaman terhadap applet. Untuk mencegah
program bertindak mengganggu media penyimpanan, maka applet tidak
diperbolehkan melakukan open, read ataupun write terhadap berkas secara
sembarangan. Karena Java applet dapat membuka jendela browser yang
baru, maka jendela mempunyai logo Java dan teks identifikasi terhadap
jendela yang dibuka. Hal ini mencegah jendela pop-up menipu sebagai
permintaan keterangan username dan password.

Pengenalan Pemrograman 1

J.E.N.I.

2.2.5 Fase fase Pemrograman JAVA


Gambar dibawah ini menjelaskan aliran proses kompilasi dan eksekusi sebuah
program Java :

Gambar 2.1: Fase dari sebuah Program Java

Langkah pertama dalam pembuatan sebuah program berbasis Java adalah


menuliskan kode program pada text editor. Contoh text editor yang dapat digunakan
antara lain : notepad, vi, emacs dan lain sebagainya. Kode program yang dibuat
kemudian tersimpan dalam sebuah berkas berekstensi .java.
Setelah membuat dan menyimpan kode program, kompilasi file yang berisi kode
program tersebut dengan menggunakan Java Compiler. Hasil dari kompilasi berupa
berkas bytecode dengan ekstensi .class.
Berkas yang mengandung bytecode tersebut kemudian akan dikonversikan oleh Java
Interpreter menjadi bahasa mesin sesuai dengan jenis dan platform yang digunakan.

Proses

Tool

Hasil

Menulis kode program

Text editor

Berkas berekstensi .java

Kompilasi program

Java Compiler

Berkas berekstensi .class


(Java Bytecodes)

Menjalankan program

Java Interpreter

Program Output

Tabel 1: Ringkasan Fase dari sebuah Program Java

Pengenalan Pemrograman 1

J.E.N.I.

BAB 3
Mengenali Lingkup Pemrograman Anda
3.1 Tujuan
Dalam bagian ini, kita akan membahas tentang bagaimana menulis, mengkompilasi dan
menjalankan program Java. Terdapat dua cara dalam melakukannya, yang pertama
menggunakan console dan text editor. Sedangkan cara kedua adalah dengan
menggunakan NetBeans yang merupakan Integrated Development Environment
atau yang disebut IDE.
Pada akhir pembahasan, diharapkan pembaca dapat :

Membuat program Java menggunakan text editor dan console dalam Linux (Ubuntu
Dapper)

Membedakan antara syntax-errors dan runtime-errors

Membuat program Java menggunakan NetBeans

3.2 Pendahuluan
IDE adalah sebuah peralatan dalam pemrograman yang diintegrasikan ke dalam aplikasi
software yang mendukung pembangunan GUI, teks atau penulisan kode, compiler dan
debugger.
Tutorial ini menggunakan Ubuntu Dapper sebagai sistem operasinya. Sebelum
menggunakan tutorial ini, pastikan bahwa telah menginstal Java dan NetBeans dalam
sistem yang Anda gunakan. Untuk instruksi bagaimana cara menginstal Java dan
NetBeans, dapat dilihat pada Appendix A. Untuk versi Windows XP dalam bagian ini,
dapat dilihat pada Appendix B.
Sebelum membahas lebih terperinci, pada awalnya akan kita lihat program Java pertama
yang akan Anda tulis.

3.3 Program Java Pertama


public class Hello
{
/**
* My first java program
*/
public static void main(String[] args) {
//Menampilkan kata "Hello world" dilayar
System.out.println("Hello world!");
}
}
Pengenalan Pemrograman I

J.E.N.I.

Sebelum menjelaskan apa arti dari program tersebut, cobalah untuk menulis program
ini di dalam file dan kemudian menjalankannya.

3.4 Menggunakan Text Editor dan Console


Dalam contoh ini, kita akan menggunakan text editor untuk mengedit program Java.
Anda juga akan membuka terminal window untuk mengkompilasi dan mengeksekusi
program Java Anda.
Langkah 1: Memulai Text Editor
Untuk memulai text editor di Linux , klik pada Applications->Accessories->Text Editor.

Gambar 1: Aplikasi Text Editor di Linux

Pengenalan Pemrograman I

J.E.N.I.

Langkah 2: Membuka Terminal


Untuk membuka terminal di Linux, klik pada Applications-> Accessories-> Terminal.

Figure 2: Terminal pada Linux

Langkah 3: Tulislah listing program Java Anda dalam text editor.

Gambar 3: Menulis Kode Program Menggunakan Text Editor

Pengenalan Pemrograman I

J.E.N.I.

Langkah 4: Simpanlah program Java Anda


Program ini akan disimpan dalam file yang bernama ''Hello.java'', dan disimpan dalam
sebuah folder yang bernama MYJAVAPROGRAMS.
Untuk membuka Save dialog box, klik pada File menu yang terdapat pada menubar dan
kemudian klik save.
Setelah melakukan instruksi tersebut, dialog box akan tampil seperti gambar dibawah
ini.

Gambar 4: Menyimpan File

Pengenalan Pemrograman I

J.E.N.I.

Klik pada tombol browse, kemudian klik tombol Create Folder.

Pengenalan Pemrograman I

J.E.N.I.

Nama folder baru, MYJAVAPROGRAMS. Sekarang, klik pada folder MYJAVAPROGRAMS


untuk mengetahui isi folder yang ada didalamnya. Setelah Anda klik pada folder
tersebut, Anda akan melihat gambar yang ditampilkan seperti berikut ini. Untuk saat ini
folder tersebut harus kosong sampai terbuatnya folder baru dan kita akan menyimpan
semuanya didalam folder tersebut.

Sekarang, dalam textbox Selection, ketiklah nama file dari program Anda, yaitu
''Hello.java'', kemudian klik pada tombol SAVE.

Pengenalan Pemrograman I

J.E.N.I.

Sekarang Anda telah menyimpan file Anda, ingatlah cara bagaimana nama frame dapat
berubah dari ''Untitled Document 1 (modified) gedit'' menjadi "Hello.java
(~/MYJAVAPROGRAMS) gedit". Jika Anda ingin melakukan perubahan pada file Anda,
Anda hanya perlu mengeditnya, kemudian menyimpannya kembali dengan mengklik
pada File->Save.

Gambar 5: Jendela Baru setelah Penyimpanan

Pengenalan Pemrograman I

J.E.N.I.

Langkah 5: Mengkompilasi program Anda


Langkah berikut ini adalah mengkompilasi program Anda. Masuklah ke Terminal Window
yang telah kita buka sebelumnya.
Ketika Anda membuka terminal window, terminal tersebut menampilkan jendela yang
disebut sebagai home folder Anda. Untuk melihat isi dari folder tersebut, ketik ls dan
kemudian tekan ENTER. Apa yang akan Anda temukan adalah daftar file-file dan folder
di dalamnya.
Disinilah Anda dapat melihat folder dengan nama "MYJAVAPROGRAMS" yang telah kita
buat sebelumnya, dan merupakan tempat dimana kita menyimpan program Hello.java
kita. Kemudian masuklah ke dalam direktori tersebut.
Untuk masuk ke dalam sebuah direktori, ketiklah perintah : cd [directory name].
Perintah ''cd'' digunakan untuk merubah direktori. Dalam hal ini, nama dari direktori kita
adalah MYJAVAPROGRAM, maka Anda harus mengetik : cd MYJAVAPROGRAMS.

Gambar 6: Merubah Direktori

Pengenalan Pemrograman I

J.E.N.I.

Setelah berada di dalam folder yang berisi program Java Anda, sudah saatnya untuk
memulai meng-compile program Java tersebut. Sebagai catatan, bahwa file yang Anda
maksud harus ada didalam folder yang Anda pilih. Periksalah dengan menjalankan
perintah ''ls'' lagi untuk melihat bahwa file Anda ada didalam folder tersebut.

Gambar 7: Daftar File didalam Direktori yang Baru

Untuk mengkompilasi program Java, gunakanlah perintah : javac [filename]. Dalam


hal ini, Anda mengetikan perintah : javac Hello.Java.

Gambar 8: Mengkompilasi File Java


Pengenalan Pemrograman I

J.E.N.I.

Selama pengkompilasian, javac menambah file ke dalam disk yang disebut


[filename].class, atau dalam hal ini, Hello.class, yang merupakan kode sebenarnya.
Langkah 6 : Menjalakan Program
Selama proses pengkompilasian, javac menambah file baru kedalam disk yang disebut
[filename].class, dalam hal ini, Hello.class, yang merupakan kode sebenarnya saat
ini, dengan perkiraan tidak ada permasalahan pada saat proses compile (kita akan
menyelidiki dan membahas permasalahan yang ditemukan selama proses compile, pada
bagian berikutnya), berarti telah siap untuk menjalankan program Anda.
Untuk menjalankan program Java Anda, dengan mengetikkan perintah : java [filename
without the extension], maka dalam hal ini, Anda mengetikkan perintah : java Hello.
Sekarang Anda dapat melihat di layar bahwa Anda telah menjalankan program Java
pertama Anda, yang menampilkan pesan, ''Hello world!''.

Gambar 9: Menjalankan File Class

Pengenalan Pemrograman I

10

J.E.N.I.

3.4.1 Errors
Apa yang telah ditunjukan sejauh ini adalah program Java dimana kita tidak menemukan
berbagai masalah dalam proses kompilasi maupun pada saat menjalankannya.
Bagaimanapun juga, hal ini tidak selalu terjadi. Seperti yang telah kita diskusikan pada
bagian pertama dari latihan ini, biasanya kita juga akan menemukan permasalahan
selama proses berlangsung.
Seperti yang telah didiskusikan sebelumnya, ada 2 macam error. Pertama adalah
compile-time error atau yang disebut juga sebagai syntax error. Kedua adalah runtime
errors.

3.4.1.1 Syntax Errors


Syntax errors biasanya terjadi karena kesalahan penulisan. Mungkin Anda kekurangan
sebuah perintah di Java atau lupa untuk menulis tanda titik-koma pada akhir
pernyataan. Java mencoba untuk mengisolasi error tersebut dengan cara menunjukkan
baris dari kode dan terlebih dahulu menunjuk karakter yang salah dalam baris tersebut.
Bagaimanapun juga, error belum tentu berada pada titik yang ditunjuk.
Kesalahan umum lainnya adalah dalam kapitalisasi, ejaan, penggunaan dari karakter
khusus yang tidak benar, dan penghilangan dari pemberian tanda baca yang
sebenarnya.
Mari kita mengambil contoh, pada program Hello.java, dimana dengan sengaja kita
menghilangkan titik-koma pada akhir pernyataan dan juga mencoba untuk mengetikkan
ejaan yang salah pada sebuah perintah.

Gambar 10: Listing Program yang Memiliki Error

Pengenalan Pemrograman I

11

J.E.N.I.

Lihatlah pesan error yang ditampilkan setelah peng-compile-an program dijalankan.


Pesan error yang pertama memberitahu bahwa di program Anda terdapat error pada
baris 6. Hal itu menunjuk pada kata setelah statict, dimana seharusnya dieja sebagai
static.
Pesan error yang kedua memberitahukan bahwa pada program tersebut kehilangan titikkoma setelah pernyataan Anda.

Gambar 11: Pengkompilasian Llisting Program yang Memiliki Error

Jika Anda menemukan banyak pesan error, cobalah untuk mengoreksi kesalahan yang
pertama pada daftar error satu per satu, dan mencoba untuk mengkompilasinya
kembali. Dengan melakukan hal tersebut maka, dapat mengurangi total error yang ada.

3.4.1.2 Run-time Errors


Run-time error merupakan error yang tidak akan ditampilkan sampai Anda menjalankan
program Anda. Bahkan program yang dikompilasi dengan sukses dapat menampilkan
jawaban yang salah jika programmer belum berpikir sampai struktur dan proses logis
dari program tersebut.

Pengenalan Pemrograman I

12

J.E.N.I.

3.5 Menggunakan NetBeans


Sekarang kita mencoba mengerjakan program kita dengan jalan yang lebih rumit, mari
kita lihat bagaimana mengerjakan semua proses yang telah dijelaskan pada bagian
sebelumnya dengan menggunakan sebuah aplikasi.
Pada bagian pelajaran ini, kita akan menggunakan NetBeans, yang merupakan
Integrated Development Environment atau IDE. Suatu IDE adalah lingkup
pemrograman yang diintegrasikan kedalam suatu aplikasi perangkat lunak yang
menyediakan pembangun GUI, suatu text atau kode editor, suatu compiler atau
interpreter dan suatu debugger.
Langkah 1 : NetBeans
Ada dua cara untuk menjalankan NetBeans. Pertama menulis perintah menggunakan
terminal, atau hanya dengan mengklik pada tombol shortcut yang dapat ditemukan di
desktop.
Untuk menjalankan NetBeans menggunakan command-line. Bukalah terminal (lihat
langkahnya pada bagaimana menjalankan terminal didiskusi sebelumnya), dan ketiklah :
netbeans.

Gambar 12: Menjalankan NetBeans Menggunakan Command-Line

Pengenalan Pemrograman I

13

J.E.N.I.

Cara kedua untuk menjalankan NetBeans, adalah dengan mengklik shortcut icon yang
terdapat pada desktop Anda.

Gambar 13: Menjalankan NetBeans Menggunakan Shortcut Icon di Desktop

Pengenalan Pemrograman I

14

J.E.N.I.

Setelah Anda membuka NetBeans IDE, Anda akan melihat graphical user interface (GUI)
seperti yang ditunjukkan dibawah ini.

Gambar 14: Window Setelah Membuka NetBeans

Pengenalan Pemrograman I

15

J.E.N.I.

Langkah 2: Membuat sebuah Project


Pertama, mari kita buat sebuah project. Klik pada File->New Project. Setelah
melakukannya, akan ditampilkan kotak dialog project yang baru. Kemudian klik pada
Java Application dan klik tombol NEXT.

Gambar 15: Memilih Tipe Project

Pengenalan Pemrograman I

16

J.E.N.I.

Sekarang, dialog aplikasi yang baru akan ditampilkan.

Gambar 16: Mengatur Informasi Project

Pengenalan Pemrograman I

17

J.E.N.I.

Cobalah untuk mengubah lokasi aplikasi, dengan mengklik pada tombol BROWSE.
Kemudian dialog lokasi project akan muncul. Klik dua kali pada home folder Anda.

Gambar 17: Mengatur Lokasi Project

Kemudian isi dari folder root akan ditampilkan. Lalu klik dua kali pada folder
MYJAVAPROGRAMS dan klik tombol OPEN.

Pengenalan Pemrograman I

18

J.E.N.I.

Lihatlah Project Location dan Project Folder telah berubah menjadi


/home/florence/MYJAVAPROGRAMS.
Yang terakhir, pada textfield Create Main Class, tulislah Hello sebagai nama kelas utama,
dan kemudian klik tombol FINISH.

Gambar 18: Window setelah Mengatur Lokasi Project ke MYJAVAPROGRAMS/Mengatur kelas utama project
menjadi Hello

Pengenalan Pemrograman I

19

J.E.N.I.

Langkah 3 : Menulis dalam Program Anda


Sebelum menulis program Anda, pertama akan dijelaskan mengenai jendela utama
setelah membuat project.
Seperti ditunjukkan di bawah, secara otomatis NetBeans membuat kode dasar untuk
program Java Anda. Anda dapat menambah pernyataan-pernyataan Anda pada kode
yang telah di-generate. Pada sisi kiri jendela, Anda dapat melihat daftar folder dan filefile yang dihasilkan NetBeans setelah membuat sebuah project. Semua ini dapat Anda
temukan dalam folder MYJAVAPROGRAMS Anda, dimana Anda menetapkan lokasi project
tersebut.

Gambar 19: Tampilan dari Project yang telah Dibuat

Pengenalan Pemrograman I

20

J.E.N.I.

Sekarang, cobalah memodifikasi kode yang dihasilkan oleh NetBeans. Untuk saat ini
abaikan bagian-bagian lain dari program, detail dari kode tersebut akan dijelaskan pada
bagian berikutnya. Masukkan kode :
System.out.println("Hello world!");
Setelah pernyataan, //TODO code application logic here.

Gambar20: Memasukkan Kode

Pengenalan Pemrograman I

21

J.E.N.I.

Langkah 4 : Mengkompilasi Program Anda


Sekarang, untuk mengkompilasi program Anda, klik pada Build->Buid Main Project.
Atau, Anda juga dapat menggunakan tombol shortcut untuk mengkompilasi kode Anda.

Pengenalan Pemrograman I

22

J.E.N.I.

Jika tidak terdapat error pada program Anda, Anda dapat melihat pesan sukses build
pada jendela yang dihasilkan.

Gambar 21: Tampilan Setelah sukses melakukan compile

Pengenalan Pemrograman I

23

J.E.N.I.

Langkah 5 : Menjalankan Program Anda


Untuk menjalankan program Anda, klik pada Run->Run Main Project. Atau Anda juga
dapat menggunakan tombol shortcut untuk menjalankan program Anda.

Gambar 22: Menjalankan dengan NetBeans

Pengenalan Pemrograman I

24

J.E.N.I.

Hasil dari program Anda ditampilkan pada jendela.

Gambar 23: Tampilan Setelah Sukses Menjalankan Program

Pengenalan Pemrograman I

25

J.E.N.I.

3.6 Latihan
3.6.1 Hello World!
Menggunakan NetBeans, membuat class dengan nama : [NamaAnda]. Hasil dari
program yang harus tampil di layar :
Welcome to Java Programming [NamaAnda]!!!

3.6.2 The Tree


Menggunakan NetBeans, membuat class dengan nama : TheTree. Hasil dari program
yang harus tampil dilayar :
I think that I shall never see,
a poem as lovely as a tree.
A tree whose hungry mouth is pressed
Against the Earths sweet flowing breast.

Pengenalan Pemrograman I

26

J.E.N.I.

BAB 4
Dasar-Dasar Pemrograman
4.1 Tujuan
Pada bagian ini, kita akan mendiskusikan mengenai bagian dasar pemrograman Java. Kita
akan memulai dengan mencoba menjelaskan bagian dasar dari program Hello.java yang
telah diperkenalkan pada bab sebelumnya. Kita juga akan mendiskusikan beberapa
pedoman cara menulis script atau petunjuk penulisan kode dalam penulisan program yang
lebih efektif dan mudah dibaca.
Pada akhir pembahasan, diharapkan pembaca dapat :

Mengidentifikasi bagian dasar dari program Java

Membedakan mana yang termasuk ke dalam Java literals, tipe data dasar, tipe variabel,
pengidentifikasian dan operator

Mengembangkan program Java sederhana menggunakan konsep yang dipelajari pada


bab ini

4.2 Menganalisa program Java Pertama


Sekarang, kita akan mencoba untuk menganalisa program Java pertama :
public class Hello
{
/**
* My first java program
*/
public static void main(String[] args) {
//menampilkan string Hello world pada layar
System.out.println("Hello world!");
}
}
Baris pertama kode :
public class Hello
menandakan nama class yaitu Hello. Dalam Java, semua kode seharusnya ditempatkan di
dalam deklarasi class. kita melakukannya dengan menggunakan kata kunci class. Sebagai
tambahan, class menggunakan access specifier public, yang mengindikasikan bahwa class
kita mempunyai akses bebas ke class yang lain dari package yang lain pula (package
Pengenalan Pemrograman I

J.E.N.I.

merupakan kumpulan class-class). Kita akan membahas lebih dalam mengenai package dan
access specifier pada pembahasan selanjutnya.
Baris berikutnya yaitu yang terdiri atas kurung kurawal { menandakan awal blok. Pada kode
ini, kita menempatkan kurung kurawal pada baris selanjutnya setelah deklarasi class,
bagaimanapun, kita dapat juga meletakkan kurung kurawal ini setelah baris pertama dari
kode yang kita tulis. Jadi, kita dapat menulis kode kita sebagai berikut :
public class Hello
{
atau
public class Hello {
Tiga baris selanjutnya menandakan adanya komentar Java. Komentar adalah sesuatu yang
digunakan untuk mendokumentasikan setiap bagian dari kode yang ditulis. Komentar bukan
merupakan bagian dari program itu sendiri, tetapi digunakan untuk tujuan dokumentasi.
Komentar itu sendiri dapat ditambahkan pada kode yang Anda tulis sebagai petunjuk yang
dapat membantu proses pembelajaran pemrograman yang baik.
/**
* My first java program
*/
Komentar dinyatakan dengan tanda /* dan */. Segala sesuatu yang ada diantara tanda
tersebut diabaikan oleh compiler Java, dan mereka hanya dianggap sebagai komentar.
Baris selanjutnya,
public static void main(String[] args) {
atau dapat juga ditulis sebagai berikut,
public static void main(String[] args)
{
mengindikasikan nama suatu method dalam class Hello yang bertindak sebagai method
utama. Method utama adalah titik awal dari suatu program Java. Semua program kecuali
applet yang ditulis dalam bahasa Java dimulai dengan method utama. Yakinkan untuk
mengikuti kaidah penulisan tanda yang benar.
Baris selanjutnya juga merupakan komentar,
//Menampilkan string "Hello world" pada layar
Sekarang kita mempelajari 2 cara untuk membuat komentar. Cara pertama adalah dengan
menempatkan komentar dalam /* dan */, dan cara yang lain adalah dengan menuliskan
tanda // pada awal komentar

Baris selanjutnya,
Pengenalan Pemrograman I

J.E.N.I.

System.out.println("Hello world!");
menampilkan teks Hello World! pada layar. Perintah System.out.println(), menampilkan
teks yang diapit oleh tanda double pute ( ) pada layar.
Dua baris terakhir yang terdiri atas dua kurung kurawal digunakan untuk menutup method
utama dan masing-masing class secara berurutan.

Petunjuk Penulisan Program:


1. Program Java yang Anda buat harus selalu diakhiri dengan ekstensi file .java.
2. Nama File seharusnya sesuai/sama dengan nama class public nya. Sebagai contoh, jika
nama class public Anda adalah Hello, Anda harus menyimpan file tersebut dengan nama
Hello.java.
3. Anda harus menulis komentar sebagai penjelasan pada kode yang Anda tulis, yaitu
komentar yang berisi keterangan mengenai baris perintah pada class atau apa yang
dijalankan oleh method yang Anda tulis tersebut.

Pengenalan Pemrograman I

J.E.N.I.

4.3. Komentar pada Java


Komentar adalah catatan yang ditulis pada kode dengan tujuan sebagai bahan
dokumentasi. Teks tersebut bukan bagian dari program dan tidak mempengaruhi jalannya
program.
Java mendukung tiga jenis komentar : C++ style komentar satu baris, C style beberapa
baris, dan komentar javadoc khusus

4.3.1. Penulisan Komentar C++ Style


Komentar C++ style diawali dengan //. Semua teks setelah // dianggap sebagai komentar.
Sebagi contoh,
// This is a C++ style or single line comments

4.3.2. Penulisan Komentar C Style


Komentar C-style atau juga disebut komentar beberapa baris diawali dengan /* dan diakhiri
dengan */. Semua teks yang ada diantara dua tanda tersebut dianggap sebagai komentar.
Tidak seperti komentar C++ style, komentar ini dapat menjangkau beberapa baris. Sebagai
contoh,
/* this is an example of a
C style or multiline comments */

4.3.3. Komentar Khusus javadoc


Komentar javadoc khusus digunakan untuk men-generate dokumentasi HTML untuk
program Java Anda. Anda dapat menciptakan komentar javadoc dengan memulai baris
dengan /** dan mengakhirinya dengan */. Seperti Komentar C_style, dapat juga
menjangkau beberapa baris. Komentar ini juga dapat terdiri atas tag-tag untuk
menambahkan lebih banyak informasi pada komentar Anda. Sebagai contoh,
/**
This is an example of special java doc comments used for \n
generating an html documentation. It uses tags like:
@author Florence Balagtas
@version 1.2
*/

Pengenalan Pemrograman I

J.E.N.I.

4.4. Pernyataan dalam Java dan Blok


Pernyataan adalah satu atau lebih baris kode yang diakhiri dengan semicolon. Sebagai
contoh untuk pernyataan tunggal adalah
System.out.println(Hello world);
Blok adalah satu atau lebih pernyataan yang terbentang antara kurung kurawal buka dan
kurung kurawal tutup yaitu sekumpulan pernyataan sebagai satu unit kesatuan. Blok
pernyataan dapat dikumpulkan akan tetapi tidak secara pasti mempunyai keterkaitan
fungsi. Beberapa jumlah spasi kosong diijinkan terdapat didalamnya, sebagai contoh dari
suatu blok adalah :
public static void main( String[] args ){
System.out.println("Hello");
System.out.println("world");
}

Petunjuk Penulisan Program:


1. Pada saat pembuatan blok, Anda dapat meletakkan kurung kurawal buka pada baris
dengan pernyataan seperti contoh sebagai berikut ,
public static void main( String[] args ){
atau Anda dapat meletakkan kurung kurawal pada baris selanjutnya, seperti,
public static void main( String[] args )
{
2. Anda harus memberi jarak (indent) pernyataan selanjutnya setelah awal dari blok ,
seperti contoh berikut,
public static void main( String[] args ){
System.out.println("Hello");
System.out.println("world");
}

Pengenalan Pemrograman I

J.E.N.I.

4.5. Java Identifier


Java Identifier adalah suatu tanda yang mewakili nama-nama variabel, method, class, dsb.
Contoh dari Identifier adalah : Hello, main, System, out.
Pendeklarasian Java adalah case-sensitive. Hal ini berarti bahwa Identifier : Hello tidak
sama dengan hello. Identifier harus dimulai dengan salah satu huruf, underscore _, atau
tanda dollar
$. Hurufnya dapat berupa huruf besar maupun huruf kecil. Karakter
selanjutnya dapat menggunakan nomor 0 smpai 9.
Identifier tidak dapat menggunakan kata kunci dalam Java seperti class, public, void, dsb.
Selanjutnya kita akan berdiskusi lebih banyak tentang kata kunci dalam Java.

Petunjuk Penulisan Program:


1. Untuk pemberian nama dari class Java, diberikan huruf kapital untuk huruf pertama pada
nama class. Untuk nama method dan variabel, huruf pertama dari kata harus dimulai
dengan huruf kecil. Sebagi contoh:
ThisIsAnExampleOfClassName
thisIsAnExampleOfMethodName
2. Pada kasus untuk identifier lebih dari satu kata, menggunakan huruf kapital untuk
mengindikasikan awal dari kata kecuali kata pertama. Sebagai contoh, charArray,
fileNumber, ClassName.
3. Hindari menggunakan underscores pada awal identifier seperti _read atau _write.

Pengenalan Pemrograman I

J.E.N.I.

4.6. Keyword dalam Java


Kata kunci adalah identifier yang telah dipesan untuk didefinisikan sebelumnya oleh Java
untuk tujuan tertentu. Anda tidak dapat menggunakan keyword sebagai nama variabel,
class, method Anda, dsb. Berikut ini adalah daftar dari kata kunci dalam Java (Java
Keywords).

Gambar1: Java Key Word

Kita akan berdiskusi tentang semua arti dari masing-masing kata kunci dan bagaimana
mereka digunakan dalam proses penulisan program Java.
Catatan: true, false, dan null bukan termasuk kata kunci akan tetapi mereka termasuk
kata-kata khusus, jadi Anda tidak dapat menggunakan mereka sebagai nama variabel pada
program Anda.

4.7. Java Literals


Literals adalah tanda bahwa tidak terjadi perubahan atau konstan. Macam-macam literals
dalam Java adalah : Integer Literals, Floating-Point Literals, Boolean Literals, Character
Literals dan String Literals.

4.7.1. Integer Literals


Integer literals dibedakan dalam beberapa format yang berbeda: desimal (berbasis 10),
heksadesimal (berbasis 16), and oktal (berbasis 8). Dalam penggunaan tipe data integer
pada program, kita harus mengikuti aturan penggunaan beberapa notasi khusus.

Pengenalan Pemrograman I

J.E.N.I.

Untuk angka desimal, kita tidak memerlukan notasi khusus. Kita hanya menulis angka
desimal seperti apa adanya. untuk angka heksadesimal, hal itu harus ditandai oleh 0x
atau 0X. untuk oktal, ditandai oleh0.
Sebagai contoh, mewakili angka 12. Penulisan dalam bentuk desimalnya adalah 12,
Sementara dalam heksadesimal, menjadi 0xC, dan dalam oktal, nilai tersebut sama dengan
014.
Default tipe data untuk integer literals adalah int. Int adalah signed 32-bit value. Pada
kasus-kasus tertentu Anda dapat berharap untuk memaksa integer literal untuk menjadi
tipe data long dengan menambahkan karakter l or L. tipe data long ditandai oleh
ditampilkannya data dalam 64-bit. Kita akan membahas mengenai tipe data pada
kesempatan selanjutnya.

4.7.2. Floating-Point Literals


Floating point literals mewakili bentuk desimal dengan bagian yang terpisah. Sebagai
contoh adalah 3.1415. Floating point literals dapat dinyatakan dalam notasi standard atau
scientific. Sebagai contoh, 583.45 dinyatakan dalam notasi standard, Sementara 5.8345e2
dinyatakan dalam notasi scientific.
Default Floating point literals mempunyai tipe data double yang dinyatakan dalam 64-bit.
Untuk menggunakan ketelitian yang lebih kecil (32-bit) float, hanya dengan menambahkan
karakter f atau F.

4.7.3. Boolean Literals


Boolean literals hanya memiliki dua nilai, true atau false.

4.7.4. Character Literals


Character Literals diwakili oleh karakter single Unicode. Karakter Unicode adalah 16-bit
character set yang menggantikan 8-bit ASCII character set. Unicode memungkinkan
pengunaan simbol dan karakter khusus dari bahasa lain.
Untuk menggunakan character literals, karakter tersebut di dalam tanda single pute (' ')
(single quote delimiters). Sebagai contoh huruf a, diwakili sebagai a.
Untuk menggunakan karakter khusus seperti karakter baris baru, backslash digunakan
diikuti dengan karakter kode. Sebagai contoh, \n untuk karakter baris baru atau ganti
baris, \r untuk menyatakan nilai balik (carriage return), \b untuk backspace.

4.7.5. String Literals


String literals mewakili beberapa karakter dan dinyatakan dalam tanda double pute( )(
double quotes). Sebagai contoh string literal adalah, Hello World.
Pengenalan Pemrograman I

J.E.N.I.

4.8. Tipe Data Primitif


Bahasa pemrograman Java mendefinisikan delapan tipe data primitif. Mereka diantaranya
adalah boolean (untuk bentuk logika), char (untuk bentuk tekstual), byte, short, int, long
(integral), double and float (floating point).

4.8.1. logika - boolean


Tipe data boolean diwakili oleh dua pernyataan : true dan false. Sebagai contoh adalah,
boolean result = true;
Contoh yang ditunjukkan diatas, mendeklarasikan variabel yang dinamai result sebagai
tipe data boolean dan memberinya nilai true.

4.8.2. teksual char


Tipe data character (char), diwakili oleh karakter single Unicode. Tipe data ini harus
memiliki ciri berada dalam tanda single quotes( ). Sebagai contoh,
a
\t

//Huruf a
//A tab

Untuk menampilkan karakter khusus seperti ' (single quotes) atau " (double quotes),
menggunakan karakter escape \. Sebagai contoh,
'\''
'\"'

//untuk single quotes


//untuk double quotes

Meskipun String bukan merupakan tipe data primitif (namun merupakan suatu Class),kita
akan memperkenalkan mengenai pada bagian ini. String mewakili tipe data yang terdiri atas
beberapa karakter. Mereka tidak termasuk tipe data primitif, melainkan suatu class.
Mereka memiliki literal yang terdapat diantara tanda double quotes().
Sebagai contoh,
String message=Hello world!

Pengenalan Pemrograman I

J.E.N.I.

4.8.3. Integral byte, short, int & long


Tipe data integral dalam Java menggunakan tiga bentuk- yaitu desimal, oktal atau
heksadesimal. Contohnya,
2
//nilai desimal 2
077
//angka 0 pada awal pernyataan mengindikasikan nilai oktal
0xBACC
//karakter 0x mengindikasikan nilai heksadesimal
Tipe-tipe integral memiliki default tipe data yaitu int. Anda dapat merubahnya ke bentuk
long dengan menambahkan huruf l atau L. Tipe data integral memiliki range sebagai
berikut:

Integer Length

Name or Type

Range

8 bits

byte

-27

16 bits

short

-215

32 bits

int

-231 to 231-1

64 bits

long

-263

to 27-1
to 215-1

to 263-1

Tabel 1: Tipe-tipe integral dan range-nya

Petunjuk Penulisan Program:


Dalam mendefinisikan suatu nilai long, lowercase L tidak dianjurkan karena sangat sulit
untuk membedakan dari digit 1.

Pengenalan Pemrograman I

10

J.E.N.I.

4.8.4. Floating Point float dan double


Tipe Floating point memiliki double sebagai default tipe datanya. Floating-point literal
termasuk salah satunya desimal point atau salah satu dari pilihan berikut ini,
E or e //(add exponential value)
F or f //(float)
D or d //(double)
Contohnya adalah,
3.14
6.02E23
2.718F
123.4E+306D

//nilai floating-point sederhana (a double)


//A nilai floating-point yang besar
//A nilai float size sederhana
//A nilai double yang besar dengan nilai redundant D

Pada contoh yang ditunjukkan diatas, 23 setelah E pada contoh kedua bernilai positif.
Contoh tersebut sama dengan 6.02E+23. Tipe data Floating-point memiliki range sebagai
berikut:
Panjang Float

Nama atau Tipe

Range

32 bits

float

-231 to 231-1

64 bits

double

-263

to 263-1

Table 2: Tipe Floating point dan range nya

Pengenalan Pemrograman I

11

J.E.N.I.

4.9. Variabel
Variabel adalah item yang digunakan data untuk menyimpan pernyataan objek.
Variabel memiliki tipe data dan nama. Tipe data menandakan tipe nilai yang dapat
dibentuk oleh variabel itu sendiri. Nama variabel harus mengikuti aturan untuk identifier.

4.9.1. Deklarasi dan Inisialisasi Variabel


Untuk deklarasi variabel adalah sebagai berikut,

<data tipe> <name> [=initial value];


Catatan: Nilainya berada diantara <> adalah nilai yang disyaratkan, sementara nilai dalam
tanda [] bersifat optional.
Berikut ini adalah contoh program yang mendeklarasikan dan menginisialisasi beberapa
variabel,
public class VariableSamples
{
public static void main( String[] args ){
//deklarasi tipe data dengan nama variable
// result dan tipe data boolean
boolean
result;
//deklarasi tipe data dengan nama variabel
// option dan tipe data char
char
option;
option = 'C'; //menandai 'C' sebagai option
//deklarasi tipe data dengan nama variabel
//grade, double tipe data dan telah di inisialisasi
//to 0.0
double
grade = 0.0;
}
}
Petunjuk Penulisan Program:
1. Sangat baik untuk menginisialisasi variabel yang Anda buat seperti Anda
mendeklarasikannya.
2. Gunakan nama yang bersifat menggambarkan deskriptif untuk variabel yang Anda buat,
jika Anda ingin mempunyai variabel yang terdiri atas nilai siswa, beri nama dengan nama
grade dan jangan hanya beberapa huruf random yang Anda pilih.
3. Deklarasikan satu variabel tiap baris kode. Sebagai contoh , deklarasi variabel adalah
sebagai berikut,
double exam=0;
double quiz=10;

Pengenalan Pemrograman I

12

J.E.N.I.

double grade = 0;
Bentuk yang lebih disukai ketika melakukan deklarasi adalah,
double exam=0, quiz=10, grade=0;

4.9.2. Menampilkan Data Variabel


Untuk mengeluarkan nilai dari variabel yang diinginkan, kita dapat menggunakan perintah
sebagai berikut,
System.out.println()
System.out.print()
Berikut ini adalah contoh program,
public class OutputVariable
{
public static void main( String[] args ){
int value = 10;
char x;
x = A;
System.out.println( value );
System.out.println( The value of x= + x );
}

}
Program tersebut akan mengeluarkan teks berikut pada layar,
10
The value of x=A

4.9.3. System.out.println() vs. System.out.print()


Apa yang membedakan diantara perintah System.out.println() and System.out.print()?
Yang pertama menambahkan baris baru pada akhir data untuk dikeluarkan, sementara
selanjutnya tidak.
Perhatikan pernyataan tersebut,
System.out.print("Hello ");
System.out.print("world!");
Pernyataan tersebut akan menghasilkan output berikut ini pada layar,
Hello world!
Sekarang perthatikan pernyataan berikut,
System.out.println("Hello ");
System.out.println("world!");
Pengenalan Pemrograman I

13

J.E.N.I.

Pernyataan ini akan menghasilkan output sebagai berikut pada layar,


Hello
world!

Pengenalan Pemrograman I

14

J.E.N.I.

4.9.4. Variabel Reference dan Variabel Primitif


Sekarang kita akan membedakan dua tipe variabel yang dimiliki oleh program Java. Ada
variabel reference dan variabel primitif .
Variabel primitif adalah variabel dengan tipe data primitif. Mereka menyimpan data dalam
lokasi memori yang sebenarnya dimana variabel tersebut berada.
Variabel Reference adalah variabel yang menyimpan alamat dalam lokasi memori. Yang
menunjuk ke lokasi memori dimana data sebenarnya berada. Ketika Anda mendeklarasikan
variabel pada class tertentu, Anda sebenarnya mendeklarasikan reference variable dalam
bentuk objek dalam classnya tersebut.
Sebagai contoh, Apabila kita mempunyai dua variabel dengan tipe data int dan String.
int num = 10;
String name = "Hello"
Dimisalkan ilustrasi yang ditunjukkan dibawah ini adalah memori yang ada pada komputer
Anda, dimana Anda memiliki alamat dari setiap sel memorinya, nama variabel dan datanya
terbentuk sebagai berikut.

Memory
Address

Variable
Name

Data

1001

num

10

:
1563

:
:
2000

:
name

Address(2000)

:
:
"Hello"

Seperti yang dapat Anda lihat, untuk variable primitif num, datanya berada dalam lokasi
dimana variabel berada. Untuk reference variable name, variabel hanya menunjuk alamat
dimana data tersebut benar-benar ada.

Pengenalan Pemrograman I

15

J.E.N.I.

4.10 Operator
Dalam Java, ada beberapa tipe operator. Ada operator aritmatika, operator relasi, operator
logika, dan operator kondisi. Operator ini mengikuti bermacam-macam prioritas yang pasti
sehingga compilernya akan tahu yang mana operator untuk dijalankan lebih dulu dalam
kasus beberapa operator yang dipakai bersama-sama dalam satu pernyataan.

4.10.1 Operator Aritmatika


Berikut ini adalah dasar operator aritmatika yang dapat digunakan untuk membuat suatu
program Java,

Operator

Penggunaan

Keterangan

op1 + op2

Menambahkan op1 dengan op2

op1 * op2

Mengalikan op1 dengan op2

op1 / op2

Membagi op1 dengan op2

op1 % op2

Menghitung
dengan op2

op1 - op2

Mengurangkan op2 dari op1

sisa

dari

pembagian

op1

Tabel 3: Operator Aritmatika dan fungsi-fungsinya

Pengenalan Pemrograman I

16

J.E.N.I.

Berikut ini adalah contoh program dalam penggunaan operator-operator ini :


public class aritmatikaDemo
{
public static void main(String[] args)
{
//sedikit angka
int i = 37;
int j = 42;
double x = 27.475;
double y = 7.22;
System.out.println("Variable values...");
System.out.println("
i = " + i);
System.out.println("
j = " + j);
System.out.println("
x = " + x);
System.out.println("
y = " + y); //penjumlahan angka
System.out.println("Adding...");
System.out.println("
i + j = " + (i + j));
System.out.println("
x + y = " + (x + y));
//pengurangan angka
System.out.println("Subtracting...");
System.out.println("
i - j = " + (i - j));
System.out.println("
x - y = " + (x - y));
//perkalian angka
System.out.println("Multiplying...");
System.out.println("
i * j = " + (i
System.out.println("
x * y = " + (x
//pembagian angka
System.out.println("Dividing...");
System.out.println("
i / j = " + (i
System.out.println("
x / y = " + (x

* j));
* y));

/ j));
/ y));

//menghitung hasil modulus dari pembagian


System.out.println("Computing the remainder...");
System.out.println("
i % j = " + (i % j));
System.out.println("
x % y = " + (x % y));
//tipe penggabungan
System.out.println("Mixing tipes...");
System.out.println("
j + y = " + (j + y));
System.out.println("
i * x = " + (i * x));
}
}
Berikut ini adalah output program,
Variable values...
i = 37
j = 42
Pengenalan Pemrograman I

17

J.E.N.I.

x = 27.475
y = 7.22
i + j = 79
Adding...
x + y = 34.695
Subtracting...
i - j = -5
x - y = 20.255
Multiplying...
i * j = 1554
x * y = 198.37
Dividing...
i / j = 0
x / y = 3.8054
Computing the remainder...
i % j = 37
x % y = 5.815
Mixing tipes...
j + y = 49.22
i * x = 1016.58
Catatan: Ketika integer dan floating-point number digunakan sebagai operand untuk
operasi aritmatika tunggal, hasilnya berupa floating point. Integer adalah converter secara
implisit ke bentuk angka floating-point sebelum operasi berperan mengambil tempat.

Pengenalan Pemrograman I

18

J.E.N.I.

4.10.2. Operator Increment dan Decrement


Dari sisi operator dasar aritmatika, Java juga terdiri atas operator unary increment (++)
dan operator unary decrement (--). operator increment dan decrement menambah dan
mengurangi nilai yang tersimpan dalam bentuk variabel angka terhadap nilai 1.
Sebagai contoh, pernyataan,
count = count + 1;

//increment nilai count dengan nilai 1

pernyataan tersebut sama dengan,


count++;

Operator

Penggunaan

Keterangan

++

op++

Menambahkan
nilai
1
pada
op;
mengevaluasi
nilai
op
sebelum
diincrementasi/ditambahkan

++

++op

Menambahkan
nilai
1
pada
op;
mengevaluasi
nilai
op
setelah
diincrementasi/ditambahkan

--

op--

Mengurangkan
nilai
1
pada
op;
mengevaluasi
nilai
op
sebelum
didecrementasi/dikurangkan

--

--op

Mengurangkan
nilai
1
pada
op;
mengevaluasi
nilai
op
setelah
didecrementasi/dikurangkan

Tabel 4: operator Increment dan Decrement

Operator increment dan decrement dapat ditempatkan sebelum atau sesudah operand.
Ketika digunakan sebelum operand, akan menyebabkan variabel diincrement atau
didecrement dengan nilai 1, dan kemudian nilai baru digunakan dalam pernyataan dimana
dia ditambahkan. Sebagai contoh,
int i = 10,
int j = 3;
int k = 0;
k = ++j + i; //akan menghasilkan k = 4+10 = 14
Ketika operator increment dan decrement ditempatkan setelah operand, nilai variabel yang
lama akan digunakan lebih dulu dioperasikan lebih dulu terhadap pernyataan dimana dia
ditambahkan. Sebagai contoh,
Pengenalan Pemrograman I

19

J.E.N.I.

int i = 10,
int j = 3;
int k = 0;
k = j++ + i; //akan menghasilkan k = 3+10 = 13
Petunjuk Penulisan Program:
Selalu membuat pernyataan yang mengandung operator increment dan decrement untuk
tetap dipahami secara mudah dan sederhana.

4.10.3 Operator Relasi


Operator Relasi membandingkan dua nilai dan menentukan keterhubungan diantara nilainilai tersebut. Hasil keluarannya berupa nilai boolean yaitu true atau false.

Operator

Penggunaan

Keterangan

>

op1 > op2

op1 lebih besar dari op2

>=

op1 >= op2

op1 lebih besar dari atau sama dengan op2

<

op1 < op2

op1 kurang dari op2

<=

op1 <= op2

op1 kurang dari atau sama dengan op2

==

op1 == op2

op1 sama dengan op2

!=

op1 != op2

op1 tidak sama dengan op2


Table 5: Operator Relasi

Pengenalan Pemrograman I

20

J.E.N.I.

Berikut ini adalah contoh program yang menggunakan operator Relasi,


public class RelasiDemo
{
public static void main(String[] args) {
//beberapa nilai
int i = 37;
int j = 42;
int k = 42;
System.out.println("Nilai variabel...");
System.out.println("
i = " + i);
System.out.println("
j = " + j);
System.out.println("
k = " + k);
//lebih besar dari
System.out.println("Lebih
System.out.println("
i
System.out.println("
j
System.out.println("
k

besar
> j =
> i =
> j =

//lebih besar atau sama dengan


System.out.println("Lebih
System.out.println("
i
System.out.println("
j
System.out.println("
k

besar dari
>= j = " +
>= i = " +
>= j = " +

//lebih kecil dari


System.out.println("Lebih
System.out.println("
i
System.out.println("
j
System.out.println("
k
//lebih kecil atau sama dengan
System.out.println("Lebih
System.out.println("
i
System.out.println("
j
System.out.println("
k

kecil
< j =
< i =
< j =

dari...");
" + (i > j)); //false
" + (j > i)); //true
" + (k > j)); //false

atau sama dengan...");


(i >= j)); //false
(j >= i)); //true
(k >= j)); //true

dari...");
" + (i < j)); //true
" + (j < i)); //false
" + (k < j)); //false

kecil dari
<= j = " +
<= i = " +
<= j = " +

atau sama dengan...");


(i <= j)); //true
(j <= i)); //false
(k <= j)); //true

//sama dengan
System.out.println("Sama dengan...");
System.out.println("
i == j = " + (i == j)); //false
System.out.println("
k == j = " + (k == j)); //true
//tidak sama dengan
System.out.println("Tidak sama dengan...");
System.out.println("
i != j = " + (i != j)); //true
System.out.println("
k != j = " + (k != j)); //false
}
}
Berikut adalah hasil keluaran dari program ini :

Pengenalan Pemrograman I

21

J.E.N.I.

Nilai variabel...
i = 37
j = 42
k = 42
Lebih besar dari...
i > j = false
j > i = true
k > j = false
Lebih besar dari atau sama dengan...
i >= j = false
j >= i = true
k >= j = true
Lebih kecil dari...
i < j = true
j < i = false
k < j = false
Lebih kecil dari atau sama dengan...
i <= j = true
j <= i = false
k <= j = true
Sama dengan...
i == j = false
k == j = true
Tidak sama dengan...
i != j = true
k != j = false

Pengenalan Pemrograman I

22

J.E.N.I.

4.10.4 Operator logika


Operator logika memiliki satu atau lebih operand boolean yang menghasilkan nilai boolean.
Terdapat enam operator logika yaitu: && (logika AND), & (boolean logika AND), || (logika
OR), | (boolean logika inclusive OR), ^ (boolean logika exclusive OR), dan ! (logika NOT).
Pernyataan dasar untuk operasi logika adalah,

x1 op x2
Dimana x1, x2 dapat menjadi pernyataan boolean. Variabel atau konstanta, dan op adalah
salah satu dari operator &&, &, ||, | atau ^. Tabel kebenaran yang akan ditunjukkan
selanjutnya, merupakan kesimpulan dari hasil dari setiap operasi untuk semua kombinasi
yang mungkin dari x1 dan x2.

Pengenalan Pemrograman I

23

J.E.N.I.

4.10.4.1 && (logika AND) dan & (boolean logika AND)


Berikut ini adalah tabel kebenaran untuk && dan &,
x1

x2

Hasil

TRUE

TRUE

TRUE

TRUE

FALSE

FALSE

FALSE

TRUE

FALSE

FALSE

FALSE

FALSE

Tabel 6: Tabel Kebenaran untuk & dan &&

Perbedaan dasar antara operator && dan & adalah bahwa && mensupports short-circuit
evaluations (atau evaluasi perbagian), sementara operator & tidak. Apa arti dari
pernyataan tersebut?
Diberikan suatu pernyataan,
exp1 && exp2
&& akan mengevaluasi pernyataan exp1, dan segera mengembalikan nilai false dan
menyatakan bahwa exp1 bernilai false. Jika exp1 bernilai false, operator tidak akan pernah
mengevaluasi exp2 karena hasil operasi operator akan menjadi false tanpa memperhatikan
nilai dari exp2. Sebaliknya, operator & selalu mengevaluasi kedua nilai dari exp1 dan exp2
sebelum mengembalikan suatu nilai jawaban.
Berikut ini adalah suatu contoh source code yang menggunakan logika dan boolean AND,
public class TestAND
{
public static void main( String[] args ){
int
i
= 0;
int
j
= 10;
boolean test= false;
//demonstrasi &&
test = (i > 10) && (j++ > 9);
System.out.println(i);
System.out.println(j);
System.out.println(test);
//demonstrasi &
test = (i > 10) & (j++ > 9);
System.out.println(i);
System.out.println(j);
System.out.println(test);
}
}

Pengenalan Pemrograman I

24

J.E.N.I.

The output of the program is,


0
10
false
0
11
false
Catatan, bahwa j++ pada baris yang mengandung operator && tidak dievaluasi sejak
pernyataan pertama (i>10) yaitu telah bernilai sama dengan false.

Pengenalan Pemrograman I

25

J.E.N.I.

4.10.4.2 || (logika OR) dan | (boolean logika inclusive OR)


Berikut ini adalah tabel kebenaran untuk || dan |,
x1

x2

Hasil

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

TRUE

TRUE

FALSE

FALSE

FALSE

Tabel 7: Table Kebenaran untuk | dan ||

Perbedaan dasar antara operator || dan | adalah bahwa || mendukung short-circuit


evaluations (atau proses evaluasi sebagian), sementara | tidak. Apa maksud dari
pernyataan tersebut?
diberikan suatu pernyataan,
exp1 || exp2
|| akan mengevaluasi pernyataan exp1, dan segera mengembalikan nilai true dan
menyatakan bahwa exp1 bernilai true. Jika exp1 bernilai true, operator tidak akan pernah
mengevaluasi exp2 karena hasil dari operasi operator akan bernilai true tanpa
memperhatikan nilai dari exp2. Sebaliknya,operator | selalu mengevaluasi kedua nilai dari
exp1 and exp2 sebelum mengembalikan suatu jawaban suatu nilai.
Berikut ini sebuah contoh source code yang menggunakan operator logika dan boolean OR,
public class TestOR
{
public static void main( String[] args ){
int
i
= 0;
int
j
= 10;
boolean test= false;
//demonstrasi ||
test = (i < 10) || (j++ > 9);
System.out.println(i);
System.out.println(j);
System.out.println(test);
//demonstrasi |
test = (i < 10) | (j++ > 9);
System.out.println(i);
System.out.println(j);
System.out.println(test);
}
}

Pengenalan Pemrograman I

26

J.E.N.I.

Hasil keluaran dari program ini adalah,


0
10
true
0
11
true
Catatan, bahwa j++ pada baris yang terdiri atas operator || tidak dievaluasi sejak
pernyataan pertama (i<10) yaitu telah bernilai sama dengan true.

Pengenalan Pemrograman I

27

J.E.N.I.

4.10.4.3 ^ (boolean logika ExclusiveOR )


Berikut ini adalah tabel kebenaran untuk ^,
x1

x2

Hasil

TRUE

TRUE

FALSE

TRUE

FALSE

TRUE

FALSE

TRUE

TRUE

FALSE

FALSE

FALSE

Tabel 8: Tabel kebenaran untuk ^

Hasil operasi operator exclusive OR adalah TRUE, jika dan hanya jika satu operand bernilai
TRUE dan yang lain bernilai False. Catatan jika kedua operand harus selalu dievaluasi untuk
menjumlahkan hasil dari suatu exclusive OR.
Berikut ini adalah contoh source code yang menggunakan operator logika exclusive OR,
public class TestXOR
{
public static void main( String[] args ){
boolean val1 = true;
boolean val2 = true;
System.out.println(val1 ^ val2);
val1 = false;
val2 = true;
System.out.println(val1 ^ val2);
val1 = false;
val2 = false;
System.out.println(val1 ^ val2);
val1 = true;
val2 = false;
System.out.println(val1 ^ val2);
}
}
Hasil keluaran program tersebut adalah,
false
true
false
true

Pengenalan Pemrograman I

28

J.E.N.I.

4.10.4.4 ! (logika NOT)


Logika NOT digunakan dalam satu argumen, dimana argumen tersebut dapat menjadi suatu
pernyataan, variabel atau konstanta. Berikut ini adalah tabel kebenaran untuk operator
not!,
x1

Hasil

TRUE

FALSE

FALSE

TRUE
Tabel 9: Tabel Kebenaran untuk !

Berikut ini adalah contoh source code yang menggunakan operator logika NOT,
public class TestNOT
{
public static void main( String[] args ){
boolean val1 = true;
boolean val2 = false;
System.out.println(!val1);
System.out.println(!val2);
}
}
Hasil keluaran program adalah sebagai berikut,
false
true

Pengenalan Pemrograman I

29

J.E.N.I.

4.10.5 Operator Kondisi(?:)


Operator kondisi ?: adalah operator ternary. Berarti bahwa operator ini membawa tiga
argumen yang membentuk suatu ekspresi bersyarat. Struktur pernyataan yang
menggunakan operator kondisi adalah,
exp1?exp2:exp3
Dimana nilai exp1 adalah suatu pernyataan boolean yang memiliki hasil yang salah satunya
harus berupa nilai true atau false.
Jika exp1 bernilai true, exp2 merupakan hasil operasi. Jika bernilai false, kemudian exp3
merupakan hasil operasinya.
Sebagai contoh, diberikan code sebagai berikut,
public class ConditionalOperator
{
public static void main( String[] args ){
String
status = "";
int
grade = 80;
//mendapatkan status pelajar
status = (grade >= 60)?"Passed":"Fail";
//print status
System.out.println( status );
}
}
Hasil keluaran dari program ini akan menjadi,
Passed

Berikut ini adalah flowchart yang menggambarkan bagaimana operator ?: bekerja,

Pengenalan Pemrograman I

30

J.E.N.I.

Gambar 2: Flowchart

Berikut ini adalah program lain yang menggunakan operator ?: ,


class ConditionalOperator
{
public static void main( String[] args ){
int
char

score = 0;
answer = 'a';

score = (answer == 'a') ? 10 : 0;


System.out.println("Score = " + score );
}
}

Hasil keluaran program adalah,


Score = 10

Pengenalan Pemrograman I

31

J.E.N.I.

4.10.6 Operator Precedence


Operator precedence didefinisikan sebagai perintah yang dilakukan compiler ketika
melakukan evaluasi terhadap operator, untuk mengajukan perintah dengan hasil yang tidak
ambigu/ hasil yag jelas.

Gambar3: Operator Precedence

Diberikan pernyataan yang membingungkan,

6%2*5+4/2+88-10
Kita dapat menuliskan kembali pernyataan diatas dan menambahkan beberapa tanda
kurung terhadap operator precedence,

((6%2)*5)+(4/2)+88-10;

Petunjuk Penulisan Program:


Untuk menghindari kebingungan dalam evaluasi operasi matematika, buatlah pernyataan
sesederhana mungkin dan gunakan bantuan tanda kurung.

Pengenalan Pemrograman I

32

J.E.N.I.

4.11 Latihan
4.11.1 Mendeklarasikan dan mencetak variabel
Diberikan tabel dibawah ini, deklarasikan variabel yang terdapat didalamnya dengan tipe
data yang sesuai dan berikan nilai inisialisasi. Tampilkan hasil outputnya yaitu nama
variabel dan nilainya.

Nama Variabel

Tipe Data

Nilai Awal

number

integer

10

letter

character

result

boolean

true

str

String

hello

Berikut ini merupakan tampilan yang diharapkan sebagai hasil eksekusi program,
Number = 10
letter = a
result = true
str = hello

4.11.2. Mendapatkan nilai rata-rata dari tiga angka


Buatlah program yang menghasilkan output nilai rata-rata dari tiga angka. Nilai dari
masing-masing tiga angka tersebut adalah 10, 20 dan 45. Tampilan Output yang
diharapkan adalah,
number 1 = 10
number 2 = 20
number 3 = 45
Rata-rata = 25

4.11.3. Menampilkan nilai terbesar


Diberikan tiga angka, tuliskan program yang menghasilkan output angka dengan nilai
terbesar diantara tiga angka tersebut. Gunakan operator kondisi ?: yang telah kita pelajari
sebelumnya (PETUNJUK: Anda akan perlu menggunakan dua set operator ?: untuk
memecahkan permasalahan ini). Sebagai contoh, diberikan angka 10, 23 dan 5, Program
Anda akan menghasilkan output,
number 1 = 10
number 2 = 23
number 3 = 5
Nilai tertingginya adalah angka = 23

Pengenalan Pemrograman I

33

J.E.N.I.

4.11.4. Operator precedence


Diberikan pernyataan berikut ini, tulis kembali soal tersebut dengan menambahkan tanda
kurung pada urutan sesuai dengan bagaimana pernyataan tersebut akan dievaluasi.
1. a / b ^ c ^ d e + f g * h + i
2. 3 * 10 *2 / 15 2 + 4 ^ 2 ^ 2
3. r ^ s * t / u v + w ^ x y++

Pengenalan Pemrograman I

34

J.E.N.I.

BAB 5
Mendapatkan Input dari Keyboard
5.1 Tujuan
Kita telah mempelajari konsep dasar pada Java dan menulis beberapa program
sederhana. Sekarang kita akan mencoba membuat program kita lebih interaktif dengan
menggunakan input dari keyboard. Pada bab ini, kita akan mempelajari dua cara
memberikan input, yang pertama adalah menggunakan class BufferedReader dan
melalui GUI (Graphical User Interface) dengan menggunakan class JOptionPane.
Pada akhir pembahasan, diharapkan pembaca dapat :
Membuat program Java yang interaktif yang bisa mendapatkan input dari keyboard
Menggunakan class BufferedReader untuk mendapatkan input dari keyboard
melalui layar console
Menggunakan class JOptionPane untuk mendapatkan input dari keyboard
menggunakan GUI

5.2 Menggunakan BufferedReader untuk


mendapatkan input
Pada bagian ini, kita akan menggunakan class BufferedReader yang berada di package
java.io untuk mendapatkan input dari keyboard.
Berikut ini adalah langkah-langkah yang diperlukan untuk mendapatkan input dari
keyboard:
1. Tambahkan di bagian paling atas code Anda:
import java.io.*;
2. Tambahkan statement berikut:
BufferedReader dataIn = new BufferedReader(new InputStreamReader( System.in) );

3. Deklarasikan variabel String temporary untuk mendapatkan input, dan gunakan


fungsi readLine() untuk mendapatkan input dari keyboard. Anda harus
mengetikkannya di dalam blok try-catch:
try{
String temp = dataIn.readLine();
}
catch( IOException e ){
System.out.println(Error in getting input);
}

Pengenalan Pemrograman I

J.E.N.I.

Berikut ini adalah source code lengkapnya:


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class GetInputFromKeyboard


{
public static void main( String[] args ){
BufferedReader dataIn = new BufferedReader(new
InputStreamReader( System.in) );
String name = "";
System.out.print("Please Enter Your Name:");
try{
name = dataIn.readLine();
}catch( IOException e ){
System.out.println("Error!");
}
System.out.println("Hello " + name +"!");
}
}
Berikutnya akan penjelasan setiap baris dari code tersebut:
Statement,
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
menjelaskan bahwa kita akan menggunakan class BufferedReader, InputStreamReader
dan IOException yang berada di java.io package. Java Application Programming
Interface (API) berisi ratusan class yang sudah didefinisikan sebelumnya yang dapat
digunakan untuk program Anda. Class-class tersebut dikumpulkan di dalam packages.
Packages berisi class yang mempunyai fungsi yang saling berhubungan. Seperti pada
contoh di atas, java.io package mengandung class-class yang memungkinkan
program untuk melakukan input dan output data. Pernyataan di atas juga dapat ditulis
sebagai berikut,
import java.io.*;
yang akan mengeluarkan semua class yang berada dalam package, dan selanjutnya kita
bisa menggunakan class-class tersebut dalam program kita.

Pengenalan Pemrograman I

J.E.N.I.

Dua statement selanjutnya,


public class GetInputFromKeyboard
{
public static void main( String[] args ){
kita sudah mempelajari pada pelajaran sebelumnya. Pernyataan ini mendeklarasikan
class bernama GetInputFromKeyboard dan kita mendeklarasikan method main.
Dalam statement,
BufferedReader dataIn = new BufferedReader(new
InputStreamReader( System.in) );
kita mendeklarasikan sebuah variabel bernama dataIn dengan tipe class
BufferedReader. Jangan mengkhawatirkan tentang maksud dari syntax saat ini. Kita
akan menjelaskannya pada akhir pembahasan.
Sekarang, kita akan mendeklarasikan variabel String dengan identifier name,
String name = "";
Pernyataan di atas merupakan tempat untuk menyimpan input dari user. Nama variabel
diinisialisasi sebagai String kosong "". Sebaiknya kita selalu menginisialisasi sebuah
variabel setelah kita mendeklarasikannya.
Baris berikutnya adalah memberikan output sebuah String pada layar yang menanyakan
nama user.
System.out.print("Please Enter Your Name:");
Sekarang, blok di bawah ini merupakan try-catch block,
try{
name = dataIn.readLine();
}catch( IOException e ){
System.out.println("Error!");
}
Pada baris ini menjelaskan bahwa kemungkinan terjadi error pada pernyataan,
name = dataIn.readLine();
akan ditangkap. Kita akan membahas tentang penanganan exception pada bab
selanjutnya dari pembahasan ini, tetapi untuk sekarang, Anda cukup mencatat bahwa
Anda perlu menambahkan kode ini untuk menggunakan method readLine() dari
BufferedReader untuk mendapatkan input dari user.

Pengenalan Pemrograman I

J.E.N.I.

Selanjutnya kembali ke pernyataan,


name = dataIn.readLine();
method diatas memanggil dataIn.readLine(), mendapatkan input dari user dan
memberikan sebuah nilai String. Nilai ini akan disimpan ke dalam variabel name, yang
akan kita gunakan pada statement akhir untuk menyambut user,
System.out.println("Hello " + name + "!");

Pengenalan Pemrograman I

J.E.N.I.

5.1 Menggunakan JOptionPane untuk


mendapatkan input
Cara lain untuk mendapatkan input dari user adalah dengan menggunakan class
JoptionPane yang didapatkan dari javax.swing package. JoptionPane memudahkan
memunculkan dialog box standard yang memberikan kepada user sebuah nilai atau
menginformasikan sesuatu.
Diberikan kode berikut ini,
import javax.swing.JOptionPane;
public class GetInputFromKeyboard
{
public static void main( String[] args ){
String name = "";
name = JoptionPane.showInputDialog("Please enter your
name");
String msg = "Hello " + name + "!";
JOptionPane.showMessageDialog(null, msg);
}
}
Akan menghasilkan output,

Gambar 1: Mendapatkan Input menggunakan JOptionPane

Gambar 2: Input florence pada JOptionPane

Gambar 3: Menunjukkan Pesan Menggunakan JOptionPane

Pengenalan Pemrograman I

J.E.N.I.

Statement pertama,
import javax.swing.JOptionPane;
Menjelaskan bahwa kita mengimpor class JoptionPane dari package javax.swing.
Bisa juga ditulis seperti,
import javax.swing.*;
Pernyataan,
name = JOptionPane.showInputDialog("Please enter your name");
membuat sebuah input dialog JOptionPane, yang akan menampilkan dialog dengan
sebuah pesan, sebuah textfield dan tombol OK seperti pada gambar. Hasil dari dialog
tersebut adalah String dan disimpan ke dalam variabel name.
Sekarang kita membuat pesan selamat datang, yang akan disimpan ke dalam variabe
msg,
String msg = "Hello " + name + "!";
Baris selanjutnya adalah menampilkan sebuah dialog yang berisi sebuah pesan dan
tombol OK,
JOptionPane.showMessageDialog(null, msg);

Pengenalan Pemrograman I

J.E.N.I.

5.1 Latihan
5.1.1 Kata Terakhir (versi BufferedReader)
Menggunakan BufferedReader, tanyakan tiga kata dari user dan tampilkan output dari
input user tersebut ke layar. Contoh,
Enter word1:Goodbye
Enter word2:and
Enter word3:Hello
Goodbye and Hello

5.1.2 Kata Terakhir (versi JOptionPane)


Menggunakan JOptionPane, tanyakan tiga kata dari user dan tampilkan output dari input
user tersebut ke layar. Contoh

Gambar 1: Input Pertama

Gambar 2: Input Kedua

Gambar 3: Menampilkan Pesan

Pengenalan Pemrograman I

J.E.N.I.

BAB 6
Struktur Kontrol
6.1 Tujuan
Pada bab sebelumnya, kita sudah mendapatkan contoh dari program terstruktur,
dimana setiap pernyataan dieksekusi setelah pernyataan sebelumnya sesuai dengan
urutannya. Pada bagian ini, kita akan mempelajari tentang struktur kontrol dimana
kita dapat mengubah cara eksekusi pada pernyataan yang dibuat di program kita.
Pada akhir pembahasan, diharapkan pembaca dapat :

Menggunakan struktur kontrol pemilihan (if, else, switch) yang digunakan


untuk memilih blok kode yang akan dieksekusi

Menggunakan struktur kontrol pengulangan (while, do-while, for) untuk


mengeksekusi blok tertentu pada program beberapa kali.

Menggunakan pernyataan-pernyataan percabangan (break, continue, return)


yang digunakan untuk mengatur arah dari aliran program.

6.2 Struktur Kontrol Pemilihan


Struktur kontrol pemilihan adalah pernyataan dari Java yang mengijinkan user untuk
memilih dan mengeksekusi blok kode spesifik dan mengabaikan blok kode yang lain.

6.2.1 Statement if
Pernyataan if akan menentukan sebuah pernyataan (atau blok kode) yang akan eksekusi
jika dan hanya jika persyaratan bernilai benar(true).
Bentuk dari pernyataan if,
if( boolean_expression )
statement;
atau
if( boolean_expression ){
statement1;
statement2;
. . .
}
dimana, boolean_expression adalah sebuah penyataan logika (true/false) atau variabel
bertipe boolean.
Pengenalan Pemrograman 1

J.E.N.I.

Gambar 1: Flowchart Statement If

Berikut ini adalah potongan kode dari pernyataan if:


int grade = 68;
if( grade > 60 ) System.out.println("Congratulations!");
atau
int grade = 68;
if( grade > 60 ){
System.out.println("Congratulations!");
System.out.println("You passed!");
}
Petunjuk Penulisan Program :
1. Boolean_expression pada pernyataan i f harus merupakan nilai boolean).Hal ini
berarti persyaratan harus bernilai true atau false.
2. Masukkan statement di dalam blok if. Contohnya,
if( boolean_expression ){
//statement1;
//statement2;
}

Pengenalan Pemrograman 1

J.E.N.I.

6.2.2 Statement if-else


Pernyataan if-else digunakan apabila kita ingin mengeksekusi beberapa pernyataan
dengan kondisi true dan pernyataan yang lain dengan kondisi false.
Bentuk statement if-else,
if( boolean_expression )
statement;
else
statement;
dapat juga ditulis seperti,
if( boolean_expression ){
statement1;
statement2;
. . .
}
else{
statement1;
statement2;
. . .
}
Berikut ini contoh code statement if-else,
int grade = 68;
if( grade > 60 )
System.out.println("Congratulations!");
else
System.out.println("Sorry you failed");
atau
int grade = 68;
if( grade > 60 ){
System.out.println("Congratulations!");
System.out.println("You passed!");
}
else{
System.out.println("Sorry you failed");
}

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 2: Flowchart Statement If-Else

Petunjuk Penulisan Program :


1. Untuk menghindari kebingungan, selalu letakkan sebuah pernyataan atau beberapa
pernyataan di dalam blok if-else didalam tanda kurawal {},
2. Anda dapat memiliki blok if-else yang bersarang. Ini berarti anda dapat memiliki blok
if-else yang lain di dalam blok if-else. Contohnya,
if( boolean_expression ){
if( boolean_expression ){
...
}
}
else{
...
}

Pengenalan Pemrograman 1

J.E.N.I.

6.2.3 Statement if-else-if


Pernyataan pada bagian kondisi else dari blok if-else dapat menjadi struktur if-else
yang lain. Kondisi struktur seperti ini mengijinkan kita untuk membuat seleksi
persyaratan yang lebih kompleks.
Bentuk statement if-else if,
if( boolean_expression1 )
statement1;
else if( boolean_expression2 )
statement2;
else
statement3;
Sebagai catatan : anda dapat memiliki banyak blok else-if sesudah pernyataan if. Blok else
bersifat opsional dan dapat dihilangkan. Pada contoh yang ditampilkan di atas, jika
boolean_expression1 bernilai true, maka program akan mengeksekusi statement1 dan
melewati pernyataan yang lain. Jika boolean_expression2 bernilai true, maka
program akan mengeksekusi statement2 dan melewati statement3.

Gambar 3: Flowchart Statement If-Else-If

Pengenalan Pemrograman 1

J.E.N.I.

Berikut ini contoh code statement if-else-if


int grade = 68;
if( grade > 90 ){
System.out.println("Very good!");
}
else if( grade > 60 ){
System.out.println("Very good!");
}
else{
System.out.println("Sorry you failed");
}

6.2.4 Kesalahan umum ketika menggunakan statement if-else:


1. Kondisi pada statement if tidak mengevaluasi nilai logika boolean. Contohnya :
//SALAH
int number = 0;
if( number ){
//some statements here
}
Variabel number tidak memiliki nilai Boolean.
2. Menggunakan operator = sebagai operator perbandingan yang seharusnya adalah
operator == . Contohnya,
//SALAH
int number = 0;
if( number = 0 ){
//Beberapa pernyataan
}
Seharusnya kode tersebut ditulis,
//BENAR
int number = 0;
if( number == 0 ){
//beberapa pernyataan
}
3. Penulisan elseif yang seharusnya ditulis sebagai else if.

Pengenalan Pemrograman 1

J.E.N.I.

6.2.5 Contoh statement if-else-else if


public class Grade
{
public static void main( String[] args )
{
double grade = 92.0;
if( grade >= 90 ){
System.out.println( "Excellent!" );
}
else if( (grade < 90) && (grade >= 80)){
System.out.println("Good job!" );
}
else if( (grade < 80) && (grade >= 60)){
System.out.println("Study harder!" );
}
else{
System.out.println("Sorry, you failed.");
}
}
}

Pengenalan Pemrograman 1

J.E.N.I.

6.2.6 Statement switch


Cara lain untuk membuat cabang adalah dengan menggunakan kata kunci switch.
Switch mengkonstruksikan cabang untuk beberapa kondisi dari nilai.
Bentuk statement switch,
switch( switch_expression ){
case case_selector1:
statement1;
statement2;
. . .
break;
case case_selector2:
statement1;
statement2;
. . .
break;
. . .
default:
statement1;
statement2;
. . .
break;

//
//block 1
//

//
//block 2
//

//
//block n
//

}
switch_expression adalah ekspresi integer atau karakter dan case_selector1,
case_selector2 dan seterusnya
adalah
konstanta
uni k dari nilai
integer atau
karakter.
Ketika pernyataan switch ditemukan pada potongan kode program, java pertama kali akan
memeriksa switch_expression, dan menuju ke case yang akan menyamakan nilai yang
dimiliki oleh switch_expression. Selanjutnya program akan mengeksekusi pernyataan
pada dari kode setelah case yang ditemukan sampai menemui pernyataan break,
selanjutnya akan mengabaikan pernyataan yang lainnya hingga akhir dari struktur dari
pernyataan switch.
Jika tidak ditemui case yang cocok, maka program akan mengeksekusi blok default.
Sebagai catatan, bahwa bagian blok default adalah opsional. Sebuah pernyataan switch
bisa jadi tidak memiliki blok kode default.
CATATAN:
Tidak seperti pada pernyataan if, beberapa pernyataan pada struktur pernyataan switch
akan dieksekusi tanpa memerlukan tanda kurung kurawal ({}).
Ketika sebuah case pada pernyataan switch menemui kecocokan, semua pernyataan
pada case tersebut akan dieksekusi. Tidak hanya demikian, pernyataan lain
yang berada pada case yang sesuai juga akan dieksekusi.
Untuk menghindari program mengeksekusi pernyataan pada case berikutnya,
kita menggunakan pernyataan break sebagai pernyataan akhir pada setiap blok case.

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 4: Flowchart Statement Switch

Petunjuk Penulisan Program :


1. Menentukan penggunaan pernyataan if atau pernyataan switch adalah sebuah
keputusan programmer. Programmer dapat menentukan pernyataan yang mana
yang akan dipakai berdasarkan kemudahan membaca program dan faktor-faktor
yang lain.
2. Pernyataan if dapat digunakan untuk membuat keputusan berdasarkan rentang nilai
tertentu atau kondisi tertentu, sedangkan pernyataan switch membuat keputusan
hanya berdasarkan nilai unik dari tipe integer atau karakter.

Pengenalan Pemrograman 1

J.E.N.I.

6.2.7 Contoh statement switch


public class Grade
{
public static void main( String[] args )
{
int grade = 92;
switch(grade){
case 100:
System.out.println( "Excellent!" );
break;
case 90:
System.out.println("Good job!" );
break;
case 80:
System.out.println("Study harder!" );
break;
default:
System.out.println("Sorry, you failed.");
}
}
}

Pengenalan Pemrograman 1

10

J.E.N.I.

6.3 Struktur Kontrol Perulangan


Struktur kontrol pengulangan adalah berupa pernyataan dari Java yang mengijinkan kita
untuk mengeksekusi blok code berulang-ulang sesuai dengan jumlah tertentu yang
diinginkan. Ada tiga macam jenis dari struktur kontrol pengulangan yaitu while, dowhile, dan for-loops.

6.3.1 while loop


Pernyataan while loop adalah pernyataan atau blok pernyataan yang diulang-ulang
sampai mencapai kondisi yang cocok.
Bentuk pernyataan while,
while( boolean_expression ){
statement1;
statement2;
. . .
}
Pernyataan di dalam while loop akan
boolean_expression bernilai benar (true).

dieksekusi

berulang-ulang

selama

kondisi

Contoh, pada kode dibawah ini,


int i = 4;
while ( i > 0 ){
System.out.print(i);
i--;
}
Contoh diatas akan mencetak angka 4321 pada layar. Perlu dicatat jika bagian i-; dihilangkan, akan menghasilkan pengulangan yang terus menerus (infinite loop).
Sehingga, ketika menggunakan while loop atau bentuk pengulangan yang lain,
pastikan Anda memberikan pernyataan yang membuat pengulangan berhenti pada
suatu kondisi.

Pengenalan Pemrograman 1

11

J.E.N.I.

Berikut ini adalah beberapa contoh while loop,


Contoh 1:
int x = 0;
while (x<10)
{
System.out.println(x);
x++;
}
Contoh 2:
//infinite loop
while(true)
System.out.println(hello);

Contoh 3:
//no loops
// statement is not even executed
while (false)
System.out.println(hello);

Pengenalan Pemrograman 1

12

J.E.N.I.

6.3.2 do-while loop


Do-while loop mirip dengan while-loop. Pernyataan di dalam
akan dieksekusi beberapa kali selama kondisi bernilai benar(true).

do-while

loop

Perbedaan antara while dan do-while loop adalah dimana pernyataan di dalam do-while
loop akan dieksekusi sedikitnya satu kali.
Bentuk pernyataan do-while,
do{
statement1;
statement2;
. . .
}while( boolean_expression );
Pernyataan di dalam do-while loop akan dieksekusi pertama kali, dan akan dievaluasi
kondisi dari boolean_expression. Jika nilai pada boolean_expression tersebut bernilai
true, pernyataan di dalam do-while loop akan dieksekusi lagi.
Berikut ini beberapa contoh do-while loop:
Contoh 1:
int x = 0;
do
{
System.out.println(x);
x++;
}while (x<10);

Contoh ini akan memberikan output 0123456789 pada layar.


Contoh 2:
//infinite loop
do{
System.out.println(hello);
} while (true);

Contoh di atas akan melakukan pengulangan terus menerus yang menulis kat a hello
pada layar.
Contoh 3:
//one loop
// statement is executed once
do
System.out.println(hello);
while (false);
Contoh di atas akan memberikan output hello pada layar.
Pengenalan Pemrograman 1

13

J.E.N.I.

Panduan pemrograman:
1. Kesalahan pemrograman yang biasa terjadi ketika menggunakan do-while loop adalah
lupa untuk menulis titik koma (;) setelah ekspresi while.
do{
...
}while(boolean_expression)//- salah>tidak ada titik koma(;)
2. Seperti pada while loop, pastikan do-while loop anda berhenti pada suatu kondisi.

6.3.3 for loop


Pernyataan for loop memiliki kondisi hampir mirip seperti struktur pengulangan
sebelumnya yaitu melakukan pengulangan u n tu k m en g eksekusi kode yang sama
sebanyak jumlah yang telah ditentukan.
Bentuk dari for loop,
for (InitializationExpression; LoopCondition; StepExpression){
statement1;
statement2;
. . .
}
dimana,
InitializationExpression inisialisasi dari variabel loop.
LoopCondition
- membandingkan variabel loop pada nilai batas
tertentu
. StepExpression
- melakukan update pada variabel loop.
Berikut ini adalah contoh dari for loop,
int i;
for( i = 0; i < 10; i++ ){
System.out.print(i);
}
Pada contoh ini, pernyataan i=0 merupakan inisialisasi dari variabel. Selanjutnya,
kondisi i<10 diperiksa. Jika kondisi bernilai true, pernyataan di dalam for loop
dieksekusi. Kemudian,
ekspresi i++
dieksekusi, lalu akan kembali pada bagian
pemeriksaan terhadap kondisi i<10 lagi. Kondisi ini akan dilakukan berulang-ulang
sampai mencapai nilai yang salah (false).
Contoh tadi, adalah contoh yang sama dari while loop,
int i = 0;
while( i < 10 ){
System.out.print(i);
i++;
}

Pengenalan Pemrograman 1

14

J.E.N.I.

6.4 Pernyataan Percabangan


Pernyataan percabangan mengijinkan kita untuk mengatur aliran eksekusi program. Java
memberikan tiga bentuk pernyataan percabangan: break, continue dan return.

6.4.1 Pernyataan break


Pernyataan break memiliki dua bentuk: tidak berlabel (unlabeled) dan berlabel (labeled).
6.4.1.1 Pernyataan break tidak berlabel (unlabeled)
Pernyataan break tidak berlabel (unlabeled) digunakan untuk menghentikan jal annya
pern yataan switch. Sel ain itu pernyataan break unlabeled juga bi sa digunakan
untuk menghentikan pernyataan-pernyataan for, while atau do-while loop.
Contohnya,
String names[] = {"Beah", "Bianca", "Lance", "Belle",
"Nico", "Yza", "Gem", "Ethan"};
String
boolean

searchName = "Yza";
foundName = false;

for( int i=0; i< names.length; i++ ){


if( names[i].equals( searchName )){
foundName = true;
break;
}
}
if( foundName ){
System.out.println( searchName + " found!" );
}
else{
System.out.println( searchName + " not found." );
}
Pada contoh diatas, jika string Yza ditemukan, pengulangan pada for loop akan
dihentikan dan akan dilanjutkan ke pernyataan berikutnya yang terletak setelah pernyataan
for.

Pengenalan Pemrograman 1

15

J.E.N.I.

6.4.1.2

P e rn y a ta a n break berlabel

Bentuk label dari pernyataan break akan menghentikan pernyataan d i luarnya, dimana
sebelumnya harus diberikan label yang sudah di spesifikasikan pada program pada
pernyataan break. Program berikut ini akan mencari nilai dalam array dua dimensi.
Terdapat dua pengulangan bersarang (nested loop). Ketika sebuah nilai ditemukan,
brea akan menghentikan pernyataan yang diberi label searchLabel yang terletak di luar
pernyataan for loop.
int[][] numbers = {{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
int searchNum = 5;
boolean foundNum = false;
searchLabel:
for( int i=0; i<numbers.length; i++ ){
for( int j=0; j<numbers[i].length; j++ ){
if( searchNum == numbers[i][j] ){
foundNum = true;
break searchLabel;
}
}
}
if( foundNum ){
System.out.println( searchNum + " found!" );
}
else{
System.out.println( searchNum + " not found!" );
}

Pernyataan break menghentikan pern yataan yang diberi label; dan tidak menjalankan
aliran kon trol apapun pada label. Aliran kontrol pada label akan diberikan secara
otomatis pada pernyataan yang terletak dibawah label.

Pengenalan Pemrograman 1

16

J.E.N.I.

6.4.2 Pernyataan Continue


Pernyataan continue memiliki dua bentuk: berlabel dan tidak berlabel. Anda dapat
menggunakan pernyataan continue untuk melanjutkan pengulangan yang sedang
dijalankan oleh pernyataan for, while, atau do- while loop.
6.4.2.1 Pernyataan continue tidak berlabel (unlabeled)
Bentuk pernyataan continue tidak berlabel (unlabeled) akan melewati bagian pernyataan
setelah pernyataan ini dituliskan dan memeriksa eksepresi logika (boolean) yang
mengkontrol pengulangan. Jika ekspresi logika (boolean) masih bernilai true, maka
pengulangan tetap dilanjutkan. Pada dasarnya pernyataan ini akan melanjutkan bagian
pengulangan pada pernyataan loop.
Berikut ini adalah contoh dari penghitungan angka dari Beah dalam suatu array.
String names[] = {"Beah", "Bianca", "Lance", "Beah"};
int
count = 0;
for( int i=0; i<names.length; i++ ){
if( !names[i].equals("Beah") ){
continue; //skip next statement
}
count++;
}
System.out.println("There are " + count + " Beahs in the
list");
6.4.2.2 Labeled continue statement
Bentuk pernyataan continue berlabel (labeled) akan melanjutkan pengulangan yang
sedang terjadi dan dilanjuti ke pengulangan berikutnya dari pernyataan pengulangan yang
diberi label (tanda).
outerLoop:
for( int i=0; i<5; i++ ){
for( int j=0; j<5; j++ ){
System.out.println("Inside for(j) loop"); //message1
if( j == 2 )
continue outerLoop;
}
System.out.println("Inside for(i) loop"); //message2
}
Pada contoh ini, bagian message2 tidak pernah akan dicetak, karena pernyataan
continue akan melewati pengulangan.

Pengenalan Pemrograman 1

17

J.E.N.I.

6.4.3 Pernyataan Return


Pernyataan return digunakan untuk keluar dari sebuah method. Pernyataan
return memiliki dua bentuk: memberikan sebuah nilai, dan tidak memberikan nilai.
Untuk memberikan sebuah nilai, cukup berikan nilai (atau ekspresi yang menghasilkan
sebuah nilai) sesudah kata return. Contohnya,
return ++count;
atau
return "Hello";
Tipe data dari nilai yang diberikan harus sama dengan tipe dari method
yang dibuat. Ketika sebuah method void dideklariskan, gunakan bentuk return yang tidak
memberikan nilai. Contohnya,
return;
Kita akan membahas lebih lanjut tentang pernyataan return ketika mempelajari tentang
method.

Pengenalan Pemrograman 1

18

J.E.N.I.

6.5 Latihan
6.5.1 Nilai
Ambil tiga nilai ujian dari user dan hitung nilai rata-rata dari nilai tersebut.
Berikan output rata-rata dari tiga ujian. Berikan juga smiley face pada output jika nilai
rata-rata lebih besar atau sama dengan 60, selain itu beri output :-(.
1. Gunakan BufferedReader untuk mendapat input dari user, dan System.out untuk
output hasilnya.
2. Gunakan JOptionPane untuk mendapat input dari user dan output hasilnya.

6.5.2 Membaca Bilangan


Ambil sebuah angka sebagai input dari user, dan outputnya berupa kata yang sesuai
dengan angka. Angka yang dimasukkan antara 1-10. Jika user memasukkan nilai yang
tidak sesuai berikan output Invalid number.
1. Gunakan statement if-else untuk menyelesaikan
2. Gunakan statement switch untuk menyelesaikan

6.5.3 Cetak Seratus Kali


Buat sebuah program yang mencetak nama Anda selama seratus kali. Buat tiga versi
program ini menggunakan while loop, do while dan for-loop.

6.5.4 Perpangkatan
Hitung pangkat sebuah nilai berdasarkan angka dan nilai pangkatnya. Buat tiga versi
dari program ini menggunakan while loop, do-while dan for-loop.

Pengenalan Pemrograman 1

19

J.E.N.I.

BAB 7
Java Array
7.1 Tujuan
Dalam bab ini, kita akan mendiskusikan mengenai array dalam Java. Pertama, kita
akan mendefinisikan apa yang dimaksud dengan array, kemudian kita juga
akan mendiskusikan bagaimana mendeklarasikannya dan menggunakannya dalam Java.
Pada akhir pembahasan, diharapkan pembaca dapat :
-

Mendeklarasikan dan membuat array


Mengakses elemen-elemen didalam array
Menentukan jumlah element didalam sebuah array
Mendeklarasikan dan membuat array multidimensi

7.2 Pengenalan Array


Pada Bab sebelumnya, kita telah mendiskusikan bagaimana cara pendeklarasian
berbagai macam variabel dengan menggunakan tipe data primitif. Dalam pendeklarasian
variabel, kita sering menggunakan sebuah tipe data beserta nama variabel atau
identifier yang unik. Apabila kita ingin menggunakan variabel tersebut, kita akan
memanggil dengan nama identifier-nya.
Sebagai contoh, kita memiliki tiga variabel dengan tipe data int yang memiliki identifier
berbeda untuk tiap variabel.
int number1;
int number2;
int number3;
number1 = 1;
number2 = 2;
number3 = 3;
Seperti yang dapat Anda perhatikan pada contoh diatas, kode tersebut akan sia-sia
karena harus menginisialisasi dan menggunakan setiap variabel padahal sebenarnya
variabel-variabel tersebut digunakan untuk tujuan yang sama. Pada bahasa
pemrograman Java maupun di bahasa pemrograman yang lain, terdapat sebuah
kemampuan untuk menggunakan satu variabel yang dapat menyimpan beberapa data
dan memanipulasinya dengan lebih efektif. Tipe variabel inilah yang disebut sebagai
array.

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 1: Contoh dari Integer Array

Sebuah array akan menyimpan beberapa item data yang memiliki tipe data
sama didalam sebuah blok memori yang berdekatan yang kemudian dibagai menjadi
beberapa ruang. A rray adalah sebuah variabel/sebuah lokasi tertentu yang memiliki
satu nama sebagai identifier, namun identifier ini dapat menyimpan lebih dari sebuah
nilai.

7.3 Pendeklarasian Array


Array harus dideklarasikan seperti layaknya sebuah variabel. Pada
saat
mendeklarasikan array, anda harus membuat sebuah daftar dari tipe data, yang diikuti
oleh sepasang tanda kurung [], lalu diikuti oleh nama identifier-nya. Sebagai contoh,
int []ages;
atau Anda dapat menempatkan sepasang tanda kurung [] sesudah nama identifier. Sebagai
contoh,
int ages[];

Pengenalan Pemrograman 1

J.E.N.I.

Setelah pendeklarasian array , kita harus membuat array dan menentukan berapa
panjangnya dengan sebuah konstruktor. Proses ini di Java disebut sebagai
instantiation (istilah dalam Java yang berarti membuat). Untuk meng-instantiate
sebuah obyek, kita membutuhkan sebuah konstruktor. Kita akan membicarakan
lagi mengenai instantiate obyek dan pembuatan konstruktor pada bagian selanjutnya.
Sebagai catatan bahwa ukuran dari array tidak dapat diubah setelah anda
menginisialisasinya. Sebagai contoh,
//deklarasi
int ages[];
//instantiate obyek
ages = new int[100];
atau bisa juga ditulis dengan,
//deklarasi dan instantiate
obyek
int ages[] = new
int[100];
Pada
contoh diatas,
pendeklarasian
tersebut akan memberitahukan kepada
compiler Java, bahwa identifier ages akan
digunakan sebagai
nama
array
yang
berisi data bertipe integer, dan dilanjutkan
dengan membuat atau meng-instantiate
sebuah array baru yang terdiri dari 100
elemen.
Selain menggunakan sebuah pernyataan
new untuk meng-instantiate array, Anda
juga dapat mendeklarasikan, membangun,
kemudian memberikan sebuah nilai pada
array sekaligus dalam sebuah pernyataan.

Gambar 2: Inisialisasi Arrays

Sebagai contoh,
//membuat sebuah array yang berisi variabel-variabel
//boolean pada sebuah identifier. Array ini terdiri dari 4
//elemen yang diinisilisasikan sebagai value
//{true,false,true,false}
boolean results[] ={ true, false, true, false };
//Membuat sebuah array yang terdiri dari penginisialisasian
//4variabel double bagi value {100,90,80,75}
double []grades = {100, 90, 80, 75};
//Membuat sebuah array String dengan identifier days. Array
//ini terdiri dari 7 elemen.
String days[] = { Mon, Tue, Wed, Thu, Fri, Sat,
Sun};

Pengenalan Pemrograman 1

J.E.N.I.

7.4 Pengaksesan sebuah elemen array


Untuk mengakses sebuah elemen
array, Anda harus menggunakan
indeks atau subscript.

dalam array, atau mengakses sebagian dari


sebuah angka atau yang disebut sebagai

Pada saat memasukkan nilai ke dalam array, sebuah nomor indeks atau subscript
telah diberikan kepada tiap anggota array, sehingga program dan programmer
dapat mengakses setiap nilai pada array apabila dibutuhkan. Nilai indeks selalu
dalam tipe integer, dimulai dari angka nol dan dilanjutkan ke angka berikutnya
sampai akhir array. Sebagai catatan bahwa indeks didalam array dimulai dari 0
sampai dengan (ukuranArray-1).
Sebagai contoh, pada array yang kita deklarasikan tadi, kita mempunyai,
//memberikan nilai 10 kepada elemen pertama array
ages[0] = 10;
//mencetak elemen array yang terakhir
System.out.print(ages[99]);
Perlu diperhatikan bahwa sekali array dideklarasikan dan dikonstruksi, nilai
yang disimpan dalam setiap anggota array akan diinisialisasi sebagai nol. Oleh
karena itu, apabila Anda menggunakan tipe data seperti String, arr ay tidak akan
diinisalisasi menjadi string kosong . Untuk itu Anda tetap harus membuat String array
secara eksplisit.
Berikut ini adalah contoh kode untuk mencetak seluruh elemen didalam array. Dalam
contoh ini digunakanlah pernyataan for loop, sehingga kode kita menjadi lebih pendek.
public class ArraySample{
public static void main( String[] args ){
int[] ages = new int[100];
for( int i=0; i<100; i++ ){
System.out.print( ages[i] );
}
}
}
Petunjuk penulisan program:
1. Biasanya, lebih baik menginisialisasi atau meng-instantiate array
Anda mendeklarasikannya. Sebagai contoh pendeklarasiannya

setelah

int []arr = new int[100];


lebih disarankan daripada,
int []arr;
arr = new int[100];
2.

Elemen-elemen dalam n-elemen array memiliki indeks dari 0 sampai n-1.


Perhatikan disini bahwa tidak ada elemen array arr[n]. Hal ini akan menyebabkan
array-index out-of-bounds exception.

3. Anda tidak dapat mengubah ukuran dari sebuah array

Pengenalan Pemrograman 1

J.E.N.I.

7.5 Panjang Array


Untuk mengetahui berapa banyak elemen didalam sebuah array, Anda dapat
menggunakan atribut length dari array. Atribut ini akan mengembalikan ukuran dari
array itu sendiri. Sebagai contoh,
arrayName.length
Pada contoh sebelumnya, kita dapat menuliskannya kembali seperti berikut ini,
public class ArraySample
{
public static void main( String[] args ){
int[] ages = new int[100];
for( int i=0; i<ages.length; i++ ){
System.out.print( ages[i] );
}
}
}
Petunjuk penulisan program:
1. Pada saat pembuatan for loop untuk memproses elemen-elemen dalam array,
gunakanlah a t r i b u t length y a n g d i l e t a k k a n di dalam b a g i a n pengkondisian
d a r i f o r loop. Hal ini akan menyebabkan loop secara otomatis menyesuaikan
diri terhada ukuran array yang berbeda-beda.
2. Pendeklarasian ukuran array di program Java, biasanya menggunakan sebuah
konstanta untuk mempermudah. Sebagai contoh,
final int ARRAY_SIZE = 1000;
...

//pendeklarasian constant

int[] ages = new int[ARRAY_SIZE];

Pengenalan Pemrograman 1

J.E.N.I.

7.6 Array Multidimensi


Array multidimensi diimplementasikan sebagai array y an g t e r l e t a k di dalam array.
Array multidimensi dideklarasikan dengan menambahkan jumlah tanda kurung setelah
nama array. Sebagai contoh,
// Elemen 512 x 128 dari integer array
int[][] twoD = new int[512][128];
// karakter array 8 x 16 x 24
char[][][] threeD = new char[8][16][24];
// String array 4 baris x 2 kolom
String[][] dogs = {{ "terry", "brown" },
{ "Kristin", "white" },
{ "toby", "gray"},
{ "fido", "black"}
};

Untuk mengakses sebuah elemen didalam array multidimensi, sama saja


dengan mengakses array satu dimensi. Misalnya saja, untuk mengakses elemen
pertama dari baris pertama didalam array dogs, kita akan menulis,
System.out.print( dogs[0][0] );
Kode diatas akan mencetak String terry di layar.

Pengenalan Pemrograman 1

J.E.N.I.

7.7 Latihan
7.7.1 Hari dalam seminggu
Buatlah sebuah String array yang akan menginisialisasi 7 hari dalam seminggu. Sebagai
contoh,
String days[] = {Monday, Tuesday.};
Gunakan while-loop, kemudian print semua nilai dari array (Gunakan juga untuk dowhile dan for-loop)Using a while-loop.

7.7.2 Nomor terbesar


Gunakanlah BufferedReader dan JoptionPane, tanyakan kepada user untuk 10 nomor.
Kemudian gunakan array untuk menyimpan 10 nomor tersebut. Tampilkan kepada user,
input terbesar yang telah diberikan user.

7.7.3 Buku Alamat


Berikut ini adalah array multidimensi yang menyatakan isi dari sebuah buku alamat:
String entry = {{"Florence", "735-1234", "Manila"},
{"Joyce", "983-3333", "Quezon City"},
{"Becca", "456-3322", "Manila"}};
Cetak buku alamat tersebut dalam format berikut ini:
Name : Florence
Tel. #
: 735-1234
Address
: Manila
Name : Joyce
Tel. #
: 983-3333
Address
: Quezon City
Name : Becca
Tel. #
: 456-3322
Address
: Manila

Pengenalan Pemrograman 1

J.E.N.I.

BAB 8
Argumen dari Command-line
8.1 Tujuan
Pada bab ini, kita akan mempelajari bagaimana untuk memproses sebuah input dari
command-line dengan menggunakan argumen yang diberikan kepada program Java.
Pada akhir pembahasan, diharapkan pembaca dapat :

Mengetahui dan menjelaskan mengenai argumen command-line

Mendapatkan input dari user dengan menggunakan argumen command-line

Mempelajari bagaimana memberikan argumen kedalam program pada NetBeans

8.2 Argumen Command-line


Sebuah aplikasi Java dapat menerima sejumlah argumen dari command-line. Argumen
dari command line memberikan kesempatan bagi user untuk mengatur operasi dari
sebuah aplikasi dalam sekali pemanggilan program. User memasukkan argumen
command line pada saat memanggil aplikasi dan menspesifikasikan argumen tersebut
setelah nama dari class yang akan dijalankan.
Sebagai contoh, apabila Anda memiliki sebuah aplikasi Java dengan nama Sort, yang
akan mengurutkan lima nomor, Anda dapat menjalankannya seperti berikut ini:

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 1:Menjalankan argument dari Command-line

Perlu diperhatikan bahwa sebuah argumen dapat dipisahkan oleh ruang spasi. Pada
bahasa pemrogr aman Java, jika kita akan memanggil sebuah aplikasi, sistem runtime
akan memberikan argumen command-line ke method main yang dimiliki oleh aplikasi
menggunakan sebuah array dari String. Lalu, setiap String di dalam array mewakili
sebuah argumen commmand-line. Perhatikan deklarasi dari main method,
public static void main( String[] args )
Argumen yang diberikan kepada program Anda akan disimpan kedalam sebuah array
String dengan identifier args.
Pada contoh sebelumnya, argumen dari command-line yang akan diberikan
kepada aplikasi sort command adalah sebuah array dengan lima buah String yaitu
5,4,3,2, dan 1. Anda dapat mengetahaui berapa banyak argumen dari
command-line dengan cara melihat panjang dari attribute array.
Sebagai contoh,
int numberOfArgs = args.length;
Jika program Anda membutuhkan argumen command-line yang bertipe angka. Anda
harus mengkonversi argumen String tersebut untuk merepresantasikan sebuah angka,
misalnya 34 menjadi sebuah angka 34. Kode dibawah ini adalah sebuah potongan
program untuk mengkonversi sebuah argumen command-line menjadi tipe integer.
int firstArg = 0;
if (args.length > 0){
Pengenalan Pemrograman 1

J.E.N.I.

firstArg = Integer.parseInt(args[0]);
}
parseInt akan melempar eksepsi NumberFormatException (ERROR) jika format args[0]
tidak valid (bukan sebuah angka).

Petunjuk penulisan program:


Sebelum menggunakan argumen command line, harusdiperiksaterlebih dahulu berapa jumlah
argumen yang diperlukan sebelum mengakses sebuah array, sehingga tidak ada eksepsi
yang terjadi.

Pengenalan Pemrograman 1

J.E.N.I.

8.3 Argument Command-line di NetBeans


Untuk mengilustrasikan sebuah argumen yang diberikan dengan
menggunakan
NetBeans, marilah kita membuat sebuah program Java yang akan mencetak
jumlah argumen dan argumen pertama diberikan pada program tersebut.
public class CommandLineExample
{
public static void main( String[] args ){
System.out.println("Number of arguments=" +
args.length);
System.out.println("First Argument="+ args[0]);
}
}
Sekarang, jalankan NetBeans, buat sebuah project yang baru, dan beri nama project ini
CommanLineExample. Salin kode yang telah dituliskan diatas, kemudian dilakukan proses
compile. Selanjutnya, ikutilah langkah-langkah berikut untuk memberikan argumen
kepada program Anda dengan menggunakan NetBeans.
Klik di Projects (dilingkari dibawah)

Gambar 2: Membuka file project

Pengenalan Pemrograman 1

J.E.N.I.

Klik kanan icon CommanLineExample dan akan keluar sebuah pop-up menu. Lalu klik pada
properties.

Gambar 3: Membuka Properties

Dialog mengenai project properties akan tampil

Gambar 4: Properties Dialog

Pengenalan Pemrograman 1

J.E.N.I.

Kemudian, klik Run -> Running Project

Gambar 5: Klik untuk menjalankan project

Pada kolom bernama Arguments, tuliskan argumen yang Anda ingin masukkan
kedalam program. Dalam kasus ini kita akan mengetikkan 5 4 3 2 1. Kemudian, klik pada
tombol OK.

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 6: Set argument pada Command-line

Gambar 7: Jalankan program dengan tombol shortcut

Kemudian, cobalah untuk menjalankan (RUN) progam Anda

Pengenalan Pemrograman 1

J.E.N.I.

Seperti yang dapat Anda lihat, keluaran dari program Anda adalah jumlah dari argumen
yaitu 5, dimana argumen pertama juga memiliki nilai 5.

Gambar 8: Program Keluaran

Pengenalan Pemrograman 1

J.E.N.I.

8.4 Latihan
8.4.1 Mencetak Argumen
Dapatkan input dari user dengan menggunakan argumen command line dan cetak
semua argumen ke layar. Sebagai contoh, jika user memasukkan
java

Hello

world

that

is

all

program Anda haruslah mencetak


Hello
world
that
is
all

8.4.2 Operasi Aritmatik


Dapatkan dua buah bilangan yang diinputkan user dari command line dengan argumen
command line, kemudian cetak hasil penjumlahannya, hasil pengurangannya,
hasil perkalian, dan juga hasil pembagiannya.
java

ArithmeticOperation

20

program anda akan mencetak


sum = 24
difference = 16
product = 80
quotient = 5

Pengenalan Pemrograman 1

J.E.N.I.

BAB 9
Bekerja dengan Java Class Library
9.1 Tujuan
Pada bab ini, kita akan mengantarkan beberapa konsep dasar dari Pemrograman
berorientasi obyek (Object Oriented Porgramming). Selanjutnya, kita akan membahas
konsep dari class dan obyek, serta penggunaan class dan anggota-anggotanya termasuk
perbandingan, konversi dan pengubahan obyek. Untuk saat ini, kita memfokuskan dalam
penggunaan class yang telah dijabarkan dalam Java Class library, lalu akan kita lanjutkan
tentang pembuatan class anda sendiri.
Pada akhir pembahasan, diharapkan pembaca dapat :
1.
2.
3.
4.

Menjelaskan mengenai Pemrograman berorientasi Obyek dan beberapa konsepnya


Perbedaan antara class dan obyek
Pebedaan antara variabel/method yang diturunkan dan variable/method class (static)
Menjelaskan mengenai method, serta cara pemanggilan dan pemberian parameter ke
dalam method
5. Mengidentifikasi beberapa jangkauan dari sebuah variabel
6. Mengubah tipe data dan obyek primitif
7. Membandingkan obyek dan menjabarkan class dari obyek.

9.2 Pengenalan Pemrograman Berorientasi Obyek


OOP berputar pada konsep dari obyek yang merupakan elemen dasar dari program Anda.
Ketika kita membandingkan dengan dunia nyata, kita dapat menemukan beberapa obyek
disekitar kita seperti mobil, singa, manusia dan seterusnya. Obyek ini dikarakterisasi oleh
atribut dan tingkah lakunya.
Contohnya, objek sebuah mobil mempunyai atribut tipe transmisi, warna dan manufaktur.
Mempunyai tingkah laku berbelok, mengerem dan berakselerasi. Dengan cara yang sama
pula kita dapat mendefinisikan perbedaan sifat dan tingkah laku dari singa. Coba perhatikan
tabel dibawah ini sebagai contoh perbandingan :
Obyek

Atribut

Tingkah Laku

Mobil

Tipe dari transmisi


manufaktur
Warna

Berbelok
Mengerem
Mempercepat

Singa

Berat
Warna
Lapar atau tidak lapar
Jinak atau liar

roaring
Tidur
Berburu

Table 1: Example of Real-life Objects


Pengenalan Pemrograman 1

J.E.N.I.

Dengan deskripsi ini, obyek pada dunia nyata dapat secara mudah asumsikan sebagai obyek
perangkat lunak menggunakan atribut sebagai data dan tingkah laku sebagai method. Data
dan method dapat digunakan dalam pemrograman game atau perangkat lunak interaktif
untuk membuat simulasi obyek pada dunia nyata. Contohnya adalah perangkat lunak obyek
mobil dalam permainan balap mobil atau perangkat lunak obyek singa dalam sebuah
perangkat lunak pendidikan interaktif pada kebun binatang untuk anak anak.

9.3 Class dan Object


9.3.1 Perbedaan Class dan Object
Pada dunia perangkat lunak, sebuah obyek adalah sebuah komponen perangkat lunak yang
stukturnya mirip dengan obyek pada dunia nyata. Setiap obyek dibangun dari sekumpulan
data (atribut) yang disebut variabel untuk menjabarkan karakteristik khusus dari obyek, dan
juga terdiri dari sekumpulan method yang menjabarkan tingkah laku dari obyek. Bisa
dikatakan bahwa obyek adalah sebuah perangkat lunak yang berisi sekumpulan variabel dan
method yg berhubungan. Variabel dan method dalam obyek Java secara formal diketahui
sebagai variabel instance dan method instance. Hal ini dilakukan untuk membedakan dari
variabel class dan method class, dimana akan dibahas kemudian.
Class adalah sturktur dasar dari OOP. Class terdiri dari dua tipe dari anggota dimana disebut
dengan field (attribut/properti) dan method. Field merupakan tipe data yang didefinisikan
oleh class, sementara method merupakan operasi. Sebuah obyek adalah sebuah instance
(keturunan) dari class.
Untuk dapat membedakanantara class dan obyek, mari kita mendiskusikan beberapa contoh
berikut ini. Kita memiliki sebuah class mobil dimana dapat digunakan untuk medefinisikan
beberapa obyek mobil. Pada tabel dibawah, mobil A dan mobil B adalah obyek dari class
mobil. Class memiliki field nomor, plat, warna, manufaktur dan kecepatan yang diisi dengan
nilai pada obyek mobil A dan mobil B. Mobil juga dapat berakselerasi, berbelok dan
melakukan rem.
Class mobil
Nomor Plat

Obyek mobil A

Obyek Mobil B

ABC 111

XYZ 123

Biru

Merah

Manufaktur

Mitsubishi

Toyota

Kecepatan

50 km/h

100 km/h

Variabel Warna
Intsance

Method
Instance

Method Akselerasi
Method Belok
Method Rem
Table 2: Contoh class car dan object-object nya

Pengenalan Pemrograman 1

J.E.N.I.

Ketika diinisialisi, setiap obyek mendapat satu set variabel yang baru. Bagaimanapun,
implementasi dari method dibagi diantara objek pada class yang sama.
Class menyediakan keuntungan dari reusability. Programmer perangkat lunak dapat
menggunakan sebuah kelas beberapa kali untuk membuat banyak objek.

9.3.2 Instansiasi Class


Untuk membuat sebuah objek atau sebuah instance pada sebuah class. Kita menggunakan
operator new. Sebagai contoh, jika anda ingin membuat instance dari class string, kita
menggunakan kode berikut :
String str2 = new String(Hello world!);
Ini juga sama dengan,
String str2 = "Hello";
Gambar 1: Instanstiasi Class

9.3.3 Variabel Class dan Variabel Method


Selain dari variabel instance, kita juga memungkinkan untuk mendefinisikan variabel dari
class, yang nantinya variabel ini dimiliki oleh class. Ini berarti variabel ini dapat memiliki nilai
yang sama untuk semua objek pada class yang sama. Mereka juga disebut static member
variables.

9.4 Method
9.4.1 Apakah Method itu dan mengapa menggunakan Method?
Pada contoh yang telah kita diskusikan sebelumnya, kita hanya memiliki satu method, dan itu
adalah method main(). Di dalam Java, kita dapat mendefinisikan banyak method yang akan
kita panggil dari method yang berbeda.
Sebuah method adalah bagian-bagian kode yang dapat dipanggil oleh program utama atau
dari method lainnya untuk menjalankan fungsi yang spesifik.
Berikut adalah karakteristik dari method :
1. dapat mengembalikan satu nilai atau tidak sama sekali
2. dapat diterima beberapa parameter yang dibutuhkan atau tidak ada parameter sama
sekali. Parameter bisa juga disebut sebagai argumen dari fungsi
3. setelah method telah selesai dieksekusi, dia akan kembali pada method yang
memanggilnya.

Pengenalan Pemrograman 1

J.E.N.I.

Sekarang mengapa kita butuh untuk membuat banyak method? Mengapa kita tidak menuliskan
semua kode pada sebuah method? Hal ini karena penyelesaian masalah yang sangat efektif adalah
memecah masalah-masalah tersebut menjadi beberapa bagian. Kita juga dapat melakukan hal ini di
Java dengan membuat method untuk mengatasi bagian tertentu dari masalah. Sebuah
permasalahan dapat dipecah-pecah menjadi beberapa bagian kecil. Hal ini sangat baik sekali untuk
membuat program yang sangat besar.

9.4.2 Memanggil Instance dan memberikan Variabel dari Method


Sekarang, untuk mengilustrasikan bagaimana memanggil method, mari kita menggunakan class
string sebagai contoh. Anda dapat menggunakan the dokumentasi dari Java API untuk melihat
semua method yang tersedia dalam class string. Selanjutnya, kita akan membuat method, kita
sendiri. Tapi untuk saat ini, mari terlebih dahulu kita gunakan method yang sudah disediakan oleh
Java.
Untuk memanggil sebuah instance method, kita dapat menuliskan :

nameOfObject.nameOfMethod( parameters );
mari kita mengambil dua contoh method yang ditemukan dalam class String.

Deklarasi method

Definisi

public char charAt(int index)

Mengambil karakter pada indeks tertentu.

public boolean equalsIgnoreCase


(String anotherString)

Membandingkan antar String, tidak case sensitive.

Table 3: Method dari Class String

Menggunakan method :

String
str1 = "Hello";
char
x = str2.charAt(0); //will return the
character H
//simpan pada variabel x
String

str2 = "hello";

//return boolean
boolean result = str1.equalsIgnoreCase( str1 );

Pengenalan Pemrograman 1

J.E.N.I.

9.4.3 Pemberian Variabel Dalam Method


Pada contoh kita sebelumnya , kita sudah pernah mecoba melewati variabel pada method.
Walaupun kita belumdapat membedakan antara perbedaan tipe variabel yang diberikan
(passing) ke method dalam Java. Ada dua tipe data variabel passing pada method, yang
pertama adalah pass-by-value dan yang kedua adalah pass-by-reference.

9.4.3.1 Pass-by-Value
Ketika pass-by-values terjadi, method membuat sebuah salinan dari nilai variable yang
dikirimkan ke method. Walaupun demikian, method tidak dapat secara langsung
memodifikasi nilai variabel pengirimnya meskipun parameter salinannya sudah dimodifikasi
nilainya di dalam method.
Contoh :

public class TestPassByValue


{
public static void main( String[] args ){
int i = 10;
//mencetak nilai i
System.out.println( i );
//memanggil method test
//passing i pada method test
test( i );

Pass i as parameter
which is copied to j

//Mencetak nilai i
System.out.println( i );
}
public static void test( int j ){
//merubah nilai parameter j
j = 33;
}
}
Pada contoh diatas, kita memanggil method tes dan melewatkan nilai variabel i sebagai
parameter. Nilai pada i disalinkan ke variable j pada method. Pada kondisi ini variabel j
adalah merupakan variabel pengganti pada method tes, jika nilai j berubah maka nilai
variabel i yang terletak pada main tidak akan ikut berubah walaupun awalnya variabel j
merupakan salinan dari variabel i.
Secara default, semua tipe data primitif ketika dilewatkan pada sebuah method adalah
pass-by-value.

Pengenalan Pemrograman 1

J.E.N.I.

9.4.3.2 Pass-by-reference
Ketika sebuah pass-by-reference terjadi, alamat memori dari nilai pada sebuah variabel
dilewatkan pada saat pemanggilan method. Hal ini berarti bahwa method menyalin alamat
memori dari variabel yang dilewatkan pada method. Ini tidak seperti pada pass-by-value,
method dapat memodifikasi variabel asli dengan menggunakan alamat memori tersebut,
meskipun berbeda nama variabel yang digunakan dalam method dengan variabel aslinya,
kedua variabel ini menunjukkan lokasi dari data yang sama.
contoh :

class TestPassByReference
{
public static void main( String[] args ){
//membuat array integer
int []ages
= {10, 11, 12};
//mencetak nilai array
for( int i=0; i<ages.length; i++ ){
System.out.println( ages[i] );
}
test( ages );
Pass ages as parameter
which is copied to
variable arr

for( int i=0; i<ages.length; i++ ){


System.out.println( ages[i] );
}

}
public static void test( int[] arr ){
//merubah nilai array
for( int i=0; i<arr.length; i++ ){
arr[i] = i + 50;
}
}
}

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 2 : Contoh Pass By Reference

Petunjuk Penulisan Program :


Kesalahan konsep mengenai pass-by-reference pada Java adalah pada saat membuat
method untuk menukar nilai variabel menggunakan pengalamatan java. Perlu diingat bahwa
java memanipulasi obyek-obyek dengan cara by reference, akan tetapi java mengirimkan
alamat obyek ke dalam method dengan cara by value. Untuk itu, anda tidak dapat
menuliskan method penukaran standar ke dalam obyek.

9.4.4 Memanggil Method Static


Method Static adalah method yang dapat dipakai tanpa harus menginisialisasi suatu class
(maksudnya tanpa menggunakan variabel terlebih dahulu). Method static hanya dimiliki
oleh class dan tidak dapat digunakan oleh instance (atau objek) dari suatu class. Method
static dibedakan dari method yang dapat instance di dalam suatu class oleh kata kunci
static.
Untuk memanggil method static, ketik :

Classname.staticMethodName(params);

Pengenalan Pemrograman 1

J.E.N.I.

Contoh dari static method yang digunakan :

//mencetak data pada layar


System.out.println(Hello world);
//convert string menjadi integer
int i = Integer.parseInt(10);

String hexEquivalent = Integer.toHexString( 10 );

9.4.5 Lingkup Variabel


Selain nama dan tipe data yang dimiliki oleh variabel, suatu variablejuga mempunyai
jangkauan. Jangkauan ini menentukan kemampuan program dalam mengakses variable.
Jangkauan ini juga menentukan siklus hidup dari suatu variable atau berapa lama variable
itu berada dalam memori. Jangkauan ini ditentukan oleh letak pendeklarasian variabel di
dalam program.
Untuk memudahkan anda mengenai jangkauan variabel, kita bedakan variabel yang
terletak di dalam kurawal {.....}. Blok kode yang terdapat di luar kurung kurawal bisa
disebut juga dengan blok luar, dan blok kode yang terletak di dalam kurung kurawal disebut
dengan blok dalam.
Jika kamu mendeklarasikan variabel di blok luar, variabel akan dapat dipakai oleh blok
bagian dalam. Lain halnya jika kamu mendeklarasikan variabel di blok dalam, kamu tidak
bisa harapkan blok terluar untuk menggunakan variabel tersebut.
Jadi dapat disimpulkan, suatu jangkauan variable dapat terletak di dalam blok dimana
variabel tersebut sudah di deklarasikan, dimulai dari tempat dimana variable itu di
dklarasikan dan di blok-blok bagian dalam.

Pengenalan Pemrograman 1

J.E.N.I.

Sebagai Contoh, perhatikan potongan kode berikut:

public class ScopeExample


{
public static void main( String[] args ){
int i = 0;
int j = 0;

//... some code here


A

B
int k = 0;
int m = 0;
E

int n = 0;
}
}

Pengenalan Pemrograman 1

J.E.N.I.

Kode yang kita miliki disini mempunyai lima jangkauan yang ditandai oleh baris dan
keterangan yang mewakili jangkauan itu, dengan variable i,j,k,m dan n, dan 5 jangkauan
A,B,C,D dan E, kita mempunyai beberapa jangkauan variable berikut:
Jangkauan
Jangkauan
Jangkauan
Jangkauan
Jangkauan

variable i adalah A.
variable j adalah B.
variable k adalah C.
variable m adalah D.
variable n adalah E.

Contoh lain, jika terdapat dua method, yaitu main dan test,

class TestPassByReference
{
public static void main( String[] args ){
//membuat array integer
int []ages
= {10, 11, 12};
//mencetak nilai array
for( int i=0; i<ages.length; i++ ){

E
A

}
test( ages );

//mencetak kembali nilai array


for( int i=0; i<ages.length; i++ ){
System.out.println( ages[i] );
}
}

public static void test( int[] arr ){


//merubah nilai pada array
for( int i=0; i<arr.length; i++ ){
arr[i] = i + 50;
}
}

Pada method main Jangkauan variabel adalah,

ages[ ]
i in B
i in C

- scope A
- scope B
scope C

Pengenalan Pemrograman 1

10

J.E.N.I.

Pada method test, Jangkauan variabel adalah,

arr[ ]
i in E

- scope D
- scope E

Pada saat variabel di deklarasikan, hanya boleh terdapat sebuah variabel dengan
identifier/nama dapat di deklarasikan di dalam sebuah jangkauan. Hal ini maksudnya jika
kamu mempunyai deklarasi berikut,

{
int test = 10;
int test = 20;
}
Compiler akan menghasilkan error karena compiler mendeteksi nama yang lain dari variabel
di satu blok, namun compiler tidak akan menghasilkan error jika menumukan dua variabel
dengan nama yang sama jika kedua variabel tersebut tidak dideklarasikan pada blok yang
sama, Contoh :

int test = 0;
System.out.print( test );
//..some code here
{
int test = 20;
System.out.print( test );
}

Manakala System.out.print (baris 2) pertama dipanggil, dia mencetak nilai dari variabel test
pertama (nilai 0) pada saat variabel terlihat pada jangkauan. Pernyataan System.out.print
yang kedua (baris6), nilai 20 dicetak mengambil nilai variabel test terdekat (baris 6)pada
jangkauan blok kode tersebut.
Petunjuk Penulisan program :
Hindari pemberian nama yang sama kepada variabel supaya Anda tidak kebingungan.

9.5 Casting, Converting dan Comparing Objects


Pada bagian ini, kita akan belajar bagaimana mengunakan typecasting. Typecasting atau
casting adalah proses konversi data dari tipe data tertentu ke tipe data yang lain. Kita juga
akan belajar bagaimana mengkonversi tipe data primitif ke obyek dan sebaliknya. Kemudian,
pada akhirnya kita akan belajar bagaimana membandingkan sebuah obyek.

Pengenalan Pemrograman 1

11

J.E.N.I.

9.5.1 Casting Tipe data Primitif


Casting antara tipe primitif dapat mengijinkan Anda untuk mengkonversikan sebuah nilai
dari sebuah tipe data tertentu kepada tipe primitif yang lain. Hal ini biasanya terjadi
diantara tipe data angka.
Ada sebuah tipe data primitif yang tidak dapat kita casting, yaitu tipe data boolean.
Sebagai contoh dari typecasting adalah pada saat Anda menyimpan sebuah variabel dengan
tipe data integer kepada sebuah variabel dengan tipe data double. Sebagai contoh:
int numInt = 10;
double numDouble = numInt; //implicit cast
Pada contoh ini dapat kita lihat bahwa, walaupun variabel yang dituju (double) memiliki
ukuran yang lebih besar daripada nilai yang akan kita tempatkan didalamnya, data
tersebut secara implisit dapat kita casting ke tipe data double.
Contoh yang lain adalah apabila kita ingin untuk melakukan typecasting sebuah int ke char
atau sebaliknya. Sebuah karakter akan dapat digunakan sebagai nilai integer karena setiap
karakter memiliki sebuah nilai numerik yang merepresentasikan posisinya dalam satu set
karakter. Jika sebuah variable memiliki nilai 65, maka cast (char) i akan menghasilkan nilai
'A'. Kode numerik yang merepresentasikan huruf kapital A adalah 65, berdasarkan set
karakter ASCII, dan Java telah mengadopsi bagian ini untuk mendukung karakter.

char valChar = 'A';


int valInt = valChar;
System.out.print( valInt ); //casting explisit: keluaran 65

Ketika kita mengkonversi data yang bertipe besar ke tipe data yang lebih kecil, kita harus
menggunakan explicit cast. Explicit casts mengikuti bentuk sebagai berikut :
(dataType)value
dimana,
dataType, adalah nama dari tipe data yang Anda konversi
value, adalah pernyataan yang dihasilkan pada nilai dari the source type.

Sebagai contoh,
double
valDouble = 10.12;
int
valInt = (int)valDouble; //men-convert valDouble ke tipe int
double x = 10.2;
int
y = 2;
int

result = (int)(x/y); //hasil typecast operasi ke int

Pengenalan Pemrograman 1

12

J.E.N.I.

9.5.2 Casting Obyek


Instances dari class-class juga dapat di ubah ke instance-instance dari class-class yang lain
dengan satu batasan: class-class sumber dan tujuan harus terhubung
dengan mekanisme inheritance; satu class harus menjadi sebuah subclass
terhadap class yang
lain. Kita akan menjelaskan mengenai inheritance pada bab
selanjutnya.
Sejalan dengan konversi nilai primitif ke tipe yang lebih besar ukurannya, beberapa
object mungkin tidak membutuhkan untuk ubah secara explisit. Faktanya karena semua
subclass terdiri atas informasi yang sama seperti class induknya.
Sebagai contoh, jika terdapat method yang memiliki dua argumen, satu tipe object dan tipe
window yang lain. Anda dapat melewatkan instance dari class apapun untuk argumen
object karena semua class java adalah subclass dari object. Untuk argumen window,
anda dapat melewatkannya subclassnya, seperti dialog, FileDialog, dan frame. Hal ini
dapat dituliskan dalam program dan bukan hanya dalam memanggil method. Jika anda
mempunyai variabel yang didefinisikan sebagai class window, anda dapat memberikan
obyek dari class tersebut atau dari subclassnya untuk dijadikan variabel tanpa konversi.

Figure 2: Contoh Hierarchy Class

Untuk kebalikannya pun bisa dilakukan, Anda dapat menggunakan superclass ketika
sebuah
subclass
dibentuk.
Akan tetapi error akan ditemukan karena subclass
kemungkinan memiliki lebih banyak tingkah laku daripada superclassnya, maka
mungkin akan terjadi hilangnya kendali dari superclass untuk method tertentu. Superclass object
mungkin tidak memiliki semua kemungkinan tingkah laku yang dapat dilakukan subclass
object. Sebagai contoh jika anda memiliki operasi yang memanggil method dalam obyek
dari class integer, mengunakan object dari class Number tidak a k a n d i d a p a t k a n method
l e b i h b a n y a k d a r i yang dispesifikasikan dalam integer. E rror akan terjadi jika Anda
mencoba untuk memanggil method yang tidak dimiliki oleh obyek tujuan.
Untuk
mengunakan
obyek-obyek
superclass
dimana
obyek-obyek
subclass
ditentukan terlebih dahulu, anda harus mengkonversi mereka secara eksplisit. Anda
tidak
akan
kehilangan
informasi sebelumnya setelah proses konversi, tapi anda
mendapatkan semua method dan

Pengenalan Pemrograman 1

13

J.E.N.I.

variabel yang didefinisikan oleh subclass. Untuk konversi sebuah obyek ke class yang
lain, Anda dapat menggunakan operasi yang sama seperti konversi untuk tipe-tipe primitif :
Untuk memilih,
(classname)object
dimana,
classname, adalah nama dari class tujuan.
object, adalah sesuatu yang mengarah pada obyek sumber.

Catatan: casting akan membuat pengalamatan ke obyek yang lama dari classname
yang dituliskan; obyek yang lama akan dapat tetap dipakai seperti sebelumnya.

Figure 3: Class Hierarchy untuk superclass Employee

Contoh berikut konversi sebuah instance dari class VicePresident ke sabuah instance
dari class Employee; VicePresident adalah sebuah subclass dari Employee dengan
lebih banyak informasi, disini didefinisikan bahwa VicePresident memiliki akses menuju
executive washroom,
Employee emp = new Employee();
VicePresident veep = new VicePresident();
emp = veep; // tidak adah konversi yang diperlukan untuk penggunaan
yang cenderung naik
veep = (VicePresident)emp; // Harus memilih dengan pemilihan secara
eksplisit

9.5.3 Convert Tipe Primitive ke Object Dan Sebaliknya


Satu hal yang tidak dapat Anda lakukan pada beberapa keadaan yaitu konversi
dari sebuah obyek ke sebuah tipe data primitif, atau sebaliknya. Tipe-tipe data
primitif dan obyek adalah sesuatu yang sangat berbeda dalam Java, dan Anda
tidak bisa secara langsung konversi diantara keduanya.
Sebagai sebuah alternatif, package java.lang yang terdiri atas class-class yang
berhubungan untuk setiap tipe data primitif yaitu : Float, Boolean, Byte, dan
sebagainya. Kebanyakan dari class-class ini memiliki nama yang sama seperti tipe
datanya, kecuali jika nama classnya diawali dengan huruf besar (Short -> sort,
Double -> double dan sebagainya). Selain itu terdapat dua class yang memiliki nama
berbeda dari tipe data primitifnya yaitu: Character digunakan untuk variabel char dan
Integer untuk variabel int. (Disebut dengan Wrapper Classes)

Pengenalan Pemrograman 1

14

J.E.N.I.

Java merepresentasikan tipe data pri mi ti f dan versi classnya dengan sangat berbeda.
Sebuah program tidak akan berhasil tercompile jika Anda menggunakan hanya satu ketika
yang lain juga diperlukan.
Menggunakan class-class yang berhubungan untuk
membuat sebuah obyek yang memiliki nilai yang sama.

setiap

tipe

primitif,

anda

dapat

Contoh :
//Pernyataan berikut membentuk sebuah instance bertipe Integer
// class dengan nilai integer 7801 (primitif -> Object)
Integer dataCount = new Integer(7801);
//Pernyataan berikut meng-konversi sebuah obyek Integer ke
//tipe data primitif int nya. Hasilnya adalah sebuah int
//dengan nilai 7801
int newCount = dataCount.intValue();
// Anda perlu suatu translasi biasa pada program
// yang mengkonversi sebuah String ke sebuah tipe numeric,
//seperti suatu int
// Obyek->primitif
String pennsylvania = "65000";
int penn = Integer.parseInt(pennsylvania);

PERHATIAN: class Void tidak mewakili apapun dalam Java, jadi class ini tidak akan
digunakan ketika melakukan konversi antara nilai primitif dan obyek. Kata void
digunakan dalam definisi method untuk mengindikasikan bahwa method tidak memiliki
sebuah nilai yang dihasilkan.

9.5.3 Membandingkan dua Obyek


Dalam diskusi kita sebelumnya, kita mempelajari tentang operator untuk membandingkan
nilai sama dengan, tidak sama dengan, lebih kecil daripada, dan sebagainya. Operator ini
hanya bekerja pada tipe primitif, bukan pada obyek. Jika Anda berusaha untuk
menggunakan nilai selain tipe data primitif sebagai operand, compiler Java akan
menghasilkan error.
Salah satu contoh untuk aturan ini adalah operator untuk persamaan : == (sama dengan)
dan != (tidak samadengan), ketika operator ini dimasukkan ke sebuah obyek, operator ini
tidak akan melakukan apa yang sebenarnya diinginkan. Penggunaan operator ini akan
memeriksa kesamaan antara satu obyek ke obyek lain, bukan nilainya.
Untuk membandingkan instance dari sebuah, Anda harus mengimplementasikan method
khusus dalam class anda dan memanggil method tersebut. Sebuah contoh yang baik untuk
ini adalah class String.
Sangat mungkin memiliki dua object String yang memiliki nilai yang sama. Namun, jika
Anda menggunakan operator == untuk membandingkan obyek ini, kedua obyek tersebut
akan

Pengenalan Pemrograman 1

15

J.E.N.I.

menghasilkan hasil yang tidak sama. Walaupun isinya ternyata sama akan tetapi pada
kenyataannya mereka bukan merupakan obyek yang sama.
Untuk melihat jika dua object String memiliki nilai yang sama, sebuah method dari class
yaitu equals() digunakan. Method ini akan memeriksa setiap karakter dalam string dan
mengembalikan nilai true jika dua obyek string memiliki nilai yang sama.
Kode berikut mengilustrasikan hal tersebut,
class EqualsTest {
public static void main(String[] arguments) {
String str1, str2;
str1 = "Free the bound periodicals.";
str2 = str1;
System.out.println("String1: " + str1);
System.out.println("String2: " + str2);
System.out.println("Same object? " + (str1 == str2));
str2 = new String(str1);
System.out.println("String1: " + str1);
System.out.println("String2: " + str2);
System.out.println("Same object? " + (str1 == str2));
System.out.println("Same value? " + str1.equals(str2));
}
}
Output program ini adalah sebagai berikut ,
OUTPUT:
String1: Free the bound periodicals.
String2: Free the bound periodicals.
Same object? true
String1: Free the bound periodicals.
String2: Free the bound periodicals.
Same object? false
Same value? True
Sekarang mari mendiskusikan tentang dua baris kode dari program sebagai berikut.
String str1, str2;
str1 = "Free the bound periodicals.";

Pengenalan Pemrograman 1

16

J.E.N.I.

Gambar 4: Keduanya mengarah ke object yang sama

Bagian pertama dari program mendeklarasikan dua variabel (str1 dan str2), memberikan
kalimat "Free the bound periodicals." untuk str1, dan kemudian memberi nilai tersebut untuk
str2. Seperti yang Anda pelajari sebelumnya, str1 dan str2 sekarang menunjuk ke alamat
obyek yang sama, dan uji kesamaan membuktikan hal tersebut.
str2 = new String(str1);
Pada bagian yang kedua dari program ini, anda membuat obyek String baru dengan nilai
yang sama dari str1 dan memberikkanya ke str2. Sekarang Anda memiliki dua obyek string
yang berbeda yaitu str1 dan str2, keduanya memilki nilai yang sama. Ketika dilakukan
pengujian untuk melihat jika mereka obyek yang sama dengan menggunakan operator ==,
akan dihasilkan nilai: false kedua obyek bukan obyek yang sama dalam memory. ketika
dilakukan pengujian menggunakan method equals() maka akan dihasilkan : true kedua
obyek tersebut memiliki nilai yang sama.

Gambar 5: Alamat sekarang mengarah pada object yang berbeda

Catatan: Mengapa kita tidak dapat hanya menggunakan literal yang lain ketika ingin
mengubah str2, selain menggunakan new? String literals sudah dioptimasi dalam Java; jika
Anda membuat sebuah string menggunakan literal dan kemudian menggunakan literal
yang lain dengan character yang sama, Java cukup memberikan Anda obyek String yang
pertama kembali. Jadi kedua String tadi adalah obyek yang sama; Anda harus
menghidari langkah anda untuk membuat dua obyek terpisah.

J.E.N.I.

9.5.5 Menentukan Class dari sebuah Object


Jika kita ingin mengetahui class dari sebuah obyek dapat dilakukan dengan cara :
1. Method getClass() mengembalikan sebuah obyek Class (dimana Class itu
sendiri merupakan sebuah class) yang memilki sebuah method getName(). Selanjutnya
getName() akan mengembalikan sebuah string yang mewakili nama class.
Sebagai contoh,
String name = key.getClass().getName();
2. operator InstanceOf
instanceOf memiliki dua operand: obyek pada sebelah kiri dan nama class pada
sebelah kanan. Pernyataan ini mengembalikan nilai true atau false tergantung pada
benar/salah obyek adalah sebuah instance dari penamaan class atau beberapa
subclass milik class tersebut.
Sebagai contoh,
boolean ex1 = "Texas" instanceof String; // true
Object pt = new Point(10, 10);
boolean ex2 = pt instanceof String; // false

Pengenalan Pemrograman 1

18

J.E.N.I.

9.6

Latihan

9.6.1 Mendefinisikan Istilah


Dengan kata-kata Anda sendiri, definisikan istilah-istilah berikut ini :
1.
2.
3.
4.
5.
6.
7.

Class
Object
Instantiate
Instance Variable
Instance Method
Class Variables atau static member variables
Constructor

9.6.2 Java Scavanger Hunt


Pipoy adalah suatu anggota baru dalam bahasa pemrograman Java. Dia hanya
memperdengarkan bahwa telah ada
APIs siap pakai dalam Java yang salah satunya
dapat digunakan dalam program mereka, dan ia ingin sekali untuk mengusahakan mereka
keluar. Masalahnya adalah, Pipoy tidak memiliki copy dari dokumentasi Java, dan dia
juga tidak memiliki acces internet, jadi tidak ada jalan untuknya untuk menunjukkan Java
APIs.
Tugas Anda adalah untuk membantu Pipoy memperhatikan APIs (Application Programming
Interface). Anda harus menyebutkan class dimana seharusnya method berada,
deklarasi method dan penggunaan contoh yang dinyatakan method.
Sebagai contoh, jika Pipoy ingin untuk mengetahui method yang mengknversisebuah String
ke integer,jawaban Anda seharusnya menjadi:
Class: Integer
Method Declaration: public static int parseInt( String value )
Sample Usage:
String
strValue = "100";
int
value = Integer.parseInt( strValue );
yakinkan bahwa snippet dari kode yang Anda tulis dalam contoh Anda
menggunakan compiles dan
memberi
output jawaban yang benar, jadi tidak membingungkan
Pipoy.
(Hint: Semua methods adalah dalam java.lang package). Dalam kasus dimana Anda
dapat menemukan lebih banyak methods yang dapat menyelesaikan tugas, berikan hanya
satu.

Pengenalan Pemrograman 1

19

J.E.N.I.

Sekarang mari memulai pencarian!


1. Perhatikan sebuah method yang diuji jika String pasti diakhiri suffix yang pasti. Sebagai
contoh, jika diberikan string "Hello", Method harus mengembalikan nilai true suffix yang
diberikan adalah "lo", dan false jika suffix yang diberikan adalah "alp".
2. Perhatikan untuk method yang mengenali character yang mewakili sebuah digit yang
spesifik dalam radix khusus. Sebagai contoh, jika input digit adalah 15, dan the radix
adalah 16, method akan mengembalikan Character F, sejak F adalah
representasi
hexadecimal untuk angka 15 (berbasis 10).
3. Perhatikan untuk method yang mengakhiri running Java Virtual Machine yang sedang
berjalan
4. Perhatikan untuk method yang memperoleh lantai dari sebuah nilai double. Sebagai
contoh, jika Saya input a 3.13, method harus mengembalikan nilai 3.
5. Perhatikan
method yang mengenali jika character yang dipakai adalah sebuah
digit. Sebagai contoh, jika Saya input '3', dia akan mengembalikan nilai true.
untuk

Pengenalan Pemrograman 1

20

J.E.N.I.

BAB 10
Membuat Class Sendiri
Tujuan
Setelah kita mempelajari penggunaan class dari Java Class Library, kita akan mempelajari
bagaimana menuliskan sebuah class sendiri. Pada bagian ini, untuk mempermudah
pemahaman pembuatan class, kita akan membuat contoh class dimana akan ditambahkan
beberapa data dan fungsifungsi lain.
Kita akan membuat class yang mengandung informasi dari Siswa dan operasioperasi yang
dibutuhkan pada record siswa.
Beberapa hal yang perlu diperhatikan pada syntax yang digunakan pada bab ini dan bagian
lainnya :
*
<description>
[]

- Menandakan bahwa terjadi lebih dari satu kejadian dimana elemen tersebut
diimplementasikan
- Menandakan bahwa Anda harus memberikan nilai pasti pada bagian ini
- Indikasi bagian optional

Pada akhir pembahasan, diharapkan pembaca dapat :


Membuat class mereka sendiri
Mendeklarasikan atribut dan method pada class
Menggunakan referensi this untuk mengakses instance data
Membuat dan memanggil overloaded method
Mengimport dan membuat package
Menggunakan access modifiers untuk mengendalikan akses terhadap class member

Pengenalan Pemrograman 1

J.E.N.I.

Mendefinisikan Class Anda


Sebelum menulis class Anda, pertama pertimbangkan dimana Anda akan menggunakan
class dan bagaimana class tersebut akan digunakan. Pertimbangkan pula nama yang tepat
dan tuliskan seluruh informasi atau properti yang ingin Anda isi pada class. Jangan sampai
terlupa untuk menuliskan secara urut method yang akan Anda gunakan dalam class.
Dalam pendefinisian class, dituliskan :

<modifier> class <name> {


<attributeDeclaration>*
<constructorDeclaration>*
<methodDeclaration>*
}

dimana :
<modifier> adalah sebuah access modifier, yang dapat dikombinasikan dengan tipe modifier

lain.

Petunjuk Penulisan Program :


Perhatikan bahwa pada class teratas, access modifier yang diperbolehkan adalah public dan
package (bila tidak terdapat penulisan keyword access modifier pada class)

Pada bagian ini, kita akan membuat sebuah class yang berisi record dari siswa. Jika kita
telah mengidentifikasikan tujuan dari pembuatan class, maka dapat dilakukan pemberian
nama yang sesuai. Nama yang tepat pada class ini adalah StudentRecord.
Untuk mendefinisikan class, kita tuliskan :

public class StudentRecord


{
//area penulisan kode selanjutnya
}

dimana,

Public
Class

Pengenalan Pemrograman 1

Class ini dapat diakses dari luar package


Keyword yang digunakan untuk pembuatan class dalam Java

J.E.N.I.

Public
StudentRecord

Class ini dapat diakses dari luar package


Identifier yang menjelaskan class

Petunjuk Penulisan Program :


1. Pertimbangkan nama yang tepat untuk class. Jangan gunakan nama acak dan
singkat seperti XYZ.
2. Nama class harus dimulai dengan huruf KAPITAL
3. Nama file dari class harus sama dengan nama public class

Deklarasi Atribut
Dalam pendeklarasian atribut, kita tuliskan :
<modifier> <type> <name> [= <default_value>];

Langkah selanjutnya adalah mengurutkan atribut yang akan diisikan pada class. Untuk
setiap informasi, urutkan juga tipe data yang yang tepat untuk digunakan. Contohnya, Anda
tidak mungkin menginginkan untuk menggunakan tipe data integer untuk nama siswa, atau
tipe data string pada nilai siswa.
Berikut ini adalah contoh informasi yang akan diisikan pada class StudentRecord :

name
address
age
math grade
english grade
science grade
average grade

String
String
Int
double
double
double
double

Anda dapat menambahkan informasi lain jika diperlukan.

Pengenalan Pemrograman 1

J.E.N.I.

10.3.1

Instance Variable

Jika kita telah menuliskan seluruh atribut yang akan diisikan pada class, selanjutnya kita
akan menuliskannya pada kode. Jika kita menginginkan bahwa atribut atribut tersebut
adalah unik untuk setiap object (dalam hal ini untuk setiap siswa), maka kita harus
mendeklarasikannya sebagai instance variable :
Sebagai contoh :
public class StudentRecord
{
private String name;
private String address;
private int age;
private double mathGrade;
private double englishGrade;
private double scienceGrade;
private double average;
//area penulisan kode selanjutnya
}

dimana,
private disini menjelaskan bahwa variabel tersebut hanya dapat diakses oleh class itu
sendiri. Object lain tidak dapat menggunakan variabel tersebut secara langsung. Kita akan
membahas tentang kemampuan akses pada pembahasan selanjutnya.

Petunjuk Penulisan Program :


1. Deklarasikan seluruh instance variable pada awal penulisan class
2. Deklarasikan variable per baris
3. Penulisan instance variable, termasuk juga variabel lain harus dimulai dengan
huruf kecil
4. Gunakan tipe data yang tepat pada setiap variabel
5. Deklarasikan instance variable sebagai private supaya hanya method pada
class itu sendiri yang dapat mengaksesnya.

Pengenalan Pemrograman 1

J.E.N.I.

10.3.2

Class Variable atau Static Variables

Disamping instance variable, kita juga dapat mendeklarasikan class variable atau variabel
yang dimiliki class sepenuhnya. Nilai pada variabel ini sama pada semua object di class
yang sama. Anggaplah kita menginginkan jumlah dari siswa yang dimiliki dari seluruh class,
kita dapat mendeklarasikan satu static variable yang akan menampung nilai tersebut. Kita
beri nama variabel tersebut dengan nama studentCount.
Berikut penulisan static variable :
public class StudentRecord
{
//area deklarasi instance variables
private static int studentCount;
//area penulisan kode selanjutnya
}

Kita gunakan keyword : static untuk mendeklarasikan bahwa variabel tersebut adalah
static.
Maka keseluruhan kode yang dibuat terlihat sebagai berikut :
public class StudentRecord
{
private String name;
private String address;
private int
age;
private double mathGrade;
private double englishGrade;
private double scienceGrade;
private double average;
private static int studentCount;
//area penulisan kode selanjutnya
}

Pengenalan Pemrograman 1

J.E.N.I.

10.4. Deklarasi Methods


Sebelum kita membahas method apa yang akan dipakai pada class, mari kita perhatikan
penulisan method secara umum.
Dalam pendeklarasian method, kita tuliskan :
<modifier> <returnType> <name>(<parameter>*) {
<statement>*
}

dimana,
<modifier> dapat menggunakan beberapa modifier yang berbeda
<returnType> dapat berupa seluruh tipe data, termasuk void
<name> identifier atas class
<parameter> ::= <tipe_parameter> <nama_parameter>[,]

10.4.1

Accessor Methods

Untuk mengimplementasikan enkapsulasi, kita tidak menginginkan sembarang object


dapat mengakses data kapan saja. Untuk itu, kita deklarasikan atribut dari class sebagai
private. Namun, ada kalanya dimana kita menginginkan object lain untuk dapat mengakses
data private. Dalam hal ini kita gunakan accessor methods.
Accessor Methods digunakan untuk membaca nilai variabel pada class, baik berupa
instance maupun static. Sebuah accessor method umumnya dimulai dengan penulisan
get<namaInstanceVariable>. Method ini juga mempunyai sebuah return value.
Sebagai contoh, kita ingin menggunakan accessor method untuk dapat membaca nama,
alamat, nilai bahasa Inggris, Matematika, dan ilmu pasti dari siswa.
Mari kita perhatikan salah satu contoh implementasi accessor method.

public class StudentRecord


{
private String name;
:
:
public String getName(){
return name;
}
}

Pengenalan Pemrograman 1

J.E.N.I.

dimana,
public
String
getName
()

Menjelaskan bahwa method tersebut dapat diakses dari object luar class
Tipe data return value dari method tersebut bertipe String
Nama dari method
Menjelaskan bahwa method tidak memiliki parameter apapun

Pernyataan berikut,
return name;

dalam program kita menandakan akan ada pengembalian nilai dari nama instance variable
ke pemanggilan method. Perhatikan bahwa return type dari method harus sama dengan
tipe data seperti data pada pernyataan return. Anda akan mendapatkan pesan kesalahan
sebagai berikut bila tipe data yang digunakan tidak sama :
StudentRecord.java:14: incompatible types
found : int
required: java.lang.String
return age;
^
1 error

Contoh lain dari penggunaan accessor method adalah getAverage,


public class StudentRecord
{
private String name;
:
:
public double getAverage(){
double result = 0;
result = ( mathGrade+englishGrade+scienceGrade )/3;
return result;
}
}

Method getAverage() menghitung rata rata dari 3 nilai siswa dan menghasilkan nilai
return value dengan nama result.

Pengenalan Pemrograman 1

J.E.N.I.

10.4.2

Mutator Methods

Bagaimana jika kita menghendaki object lain untuk mengubah data? Yang dapat kita
lakukan adalah membuat method yang dapat memberi atau mengubah nilai variable dalam
class, baik itu berupa instance maupun static. Method semacam ini disebut dengan mutator
methods. Sebuah mutator method umumnya tertulis set<namaInstanceVariabel>.
Mari kita perhatikan salah satu dari implementasi mutator method :
public class StudentRecord
{
private String name;
:
:
public void setName( String temp ){
name = temp;
}
}

dimana,
public
void
setName
(String temp)

Menjelaskan bahwa method ini dapat dipanggil object luar class


Method ini tidak menghasilkan return value
Nama dari method
Parameter yang akan digunakan pada method

Pernyataan berikut :
name = temp;

mengidentifikasi nilai dari temp sama dengan name dan mengubah data pada instance
variable name.
Perlu diingat bahwa mutator methods tidak menghasilkan return value. Namun berisi
beberapa argumen dari program yang akan digunakan oleh method.

Pengenalan Pemrograman 1

J.E.N.I.

10.4.3

Multiple Return Statements

Anda dapat mempunyai banyak return values pada sebuah method selama mereka tidak
pada blok program yang sama. Anda juga dapat menggunakan konstanta disamping
variabel sebagai return value.
Sebagai contoh, perhatikan method berikut ini :

public String getNumberInWords( int num ){


String defaultNum = "zero";
if( num == 1 ){
return "one"; //mengembalikan sebuah konstanta
}
else if( num == 2){
return "two"; //mengembalikan sebuah konstanta
}
// mengembalikan sebuah variabel
return defaultNum;
}

10.4.4

Static Methods

Kita menggunakan static method untuk mengakses static variable studentCount.

public class StudentRecord


{
private static int studentCount;
public static int getStudentCount(){
return studentCount;
}
}

dimana,
public
static

Int

Pengenalan Pemrograman 1

- Menjelaskan bahwa method ini dapat diakses dari object luar class
- Method ini adalah static dan pemanggilannya menggunakan
[namaclass].[namaMethod]. Sebagai contoh :
studentRecord.getStudentCount
- Tipe return dari method. Mengindikasikan method tersebut harus
mempunyai return value berupa integer

J.E.N.I.

public
getStudentCount
()

- Menjelaskan bahwa method ini dapat diakses dari object luar class
- Nama dari method
- Method ini tidak memiliki parameter apapun

Pada deklarasi di atas, method getStudentCount() akan selalu menghasilkan return value 0
jika kita tidak mengubah apapun pada kode program untuk mengatur nilainya. Kita akan
membahas pengubahan nilai dari studentCount pada pembahasan constructor.

Petunjuk Penulisan Program :


1. Nama method harus dimulai dengan huruf kecil
2. Nama method harus berupa kata kerja
3. Gunakan dokumentasi sebelum mendeklarasikan sebuah method. Anda dapat
Menggunakan JavaDoc.

Pengenalan Pemrograman 1

10

J.E.N.I.

10.4.5

Contoh Kode Program dari class StudentRecord

Berikut ini adalah kode untuk class StudentRecord :


public class StudentRecord
{
private String name;
private String address;
private int age;
private double mathGrade;
private double englishGrade;
private double scienceGrade;
private double average;
private static int studentCount;
/**
* Menghasilkan nama dari Siswa
*/
public String getName(){
return name;
}
/**
* Mengubah nama siswa
*/
public void setName( String temp ){
name = temp;
}
// area penulisan kode lain
/**
* Menghitung rata rata nilai Matematik, Bahasa Inggris, * * Ilmu
Pasti
*/
public double getAverage(){
double result = 0;
result = ( mathGrade+englishGrade+scienceGrade )/3;
return result;
}
/**
* Menghasilkan jumlah instance StudentRecord
*/
public static int getStudentCount(){
return studentCount;
}
}

Pengenalan Pemrograman 1

11

J.E.N.I.

Berikut ini contoh kode dari class yang mengimplementasikan class StudentRecord :

public class StudentRecordExample


{
public static void main( String[] args ){
//membuat 3 object StudentRecord
StudentRecord annaRecord = new StudentRecord();
StudentRecord beahRecord = new StudentRecord();
StudentRecord crisRecord = new StudentRecord();
//Memberi nama siswa
annaRecord.setName("Anna");
beahRecord.setName("Beah");
crisRecord.setName("Cris");
//Menampilkan nama siswa Anna
System.out.println( annaRecord.getName() );
//Menampilkan jumlah siswa
System.out.println("Count="+StudentRecord.getStudentCount()
);
}
}

Output dari program adalah sebagai berikut :


Anna
Student Count = 0

10.5.

Reference this

Reference this digunakan untuk mengakses instance variable yang dibiaskan oleh
parameter. Untuk pemahaman lebih lanjut, mari kita perhatikan contoh pada method
setAge. Dimisalkan kita mempunyai kode deklarasi berikut pada method setAge.

public void setAge( int age ){


age = age; //SALAH!!!
}

Nama parameter pada deklarasi ini adalah age, yang memiliki penamaan yang sama
dengan instance variable age. Parameter age adalah deklarasi terdekat dari method,
sehingga nilai dari parameter tersebut akan digunakan. Maka pada pernyataan :

Pengenalan Pemrograman 1

12

J.E.N.I.

age = age;

kita telah menentukan nilai dari parameter age kepada parameter itu sendiri. Hal ini sangat
tidak kita kehendaki pada kode program kita. Untuk menghindari kesalahan semacam ini,
kita gunakan metode referensi this. Untuk menggunakan tipe referensi ini, kita tuliskan :

this.<namaInstanceVariable>

Sebagai contoh, kita dapat menulis ulang kode hingga tampak sebagai berikut :
public void setAge( int age ){
this.age = age;
}

Method ini akan mereferensikan nilai dari parameter age kepada instance variable dari
object StudentRecord.

CATATAN : Anda hanya dapat menggunakan referensi this terhadap instance


variable dan BUKAN static ataupun class variabel.

10.6. Overloading Methods


Dalam class yang kita buat, kadangkala kita menginginkan untuk membuat method dengan
nama yang sama namun mempunyai fungsi yang berbeda menurut parameter yang
digunakan. Kemampuan ini dimungkinkan dalam pemrograman Java, dan dikenal sebagai
overloading method.
Overloading method mengijinkan sebuah method dengan nama yang sama namun memiliki
parameter yang berbeda sehingga mempunyai implementasi dan return value yang berbeda
pula. Daripada memberikan nama yang berbeda pada setiap pembuatan method,
overloading method dapat digunakan pada operasi yang sama namun berbeda dalam
implementasinya.
Sebagai contoh, pada class StudentRecord kita menginginkan sebuah method yang akan
menampilkan informasi tentang siswa. Namun kita juga menginginkan operasi penampilan
data tersebut menghasilkan output yang berbeda menurut parameter yang digunakan. Jika
pada saat kita memberikan sebuah parameter berupa string, hasil yang ditampilkan adalah
nama, alamat dan umur dari siswa, sedang pada saat kita memberikan 3 nilai dengan tipe
double, kita menginginkan method tersebut untuk menampilkan nama dan nilai dari siswa.
Untuk mendapatkan hasil yang sesuai, kita gunakan overloading method di dalam deklarasi
class StudentRecord.

Pengenalan Pemrograman 1

13

J.E.N.I.

public void print( String temp ){


System.out.println("Name:" + name);
System.out.println("Address:" + address);
System.out.println("Age:" + age);
}
public void print(double eGrade, double mGrade, double sGrade)
System.out.println("Name:" + name);
System.out.println("Math Grade:" + mGrade);
System.out.println("English Grade:" + eGrade);
System.out.println("Science Grade:" + sGrade);
}

Jika kita panggil pada method utama (main) :

public static void main( String[] args )


{
StudentRecord annaRecord = new StudentRecord();
annaRecord.setName("Anna");
annaRecord.setAddress("Philippines");
annaRecord.setAge(15);
annaRecord.setMathGrade(80);
annaRecord.setEnglishGrade(95.5);
annaRecord.setScienceGrade(100);
//overloaded methods
annaRecord.print(
annaRecord.getName() );
annaRecord.print(
annaRecord.getEnglishGrade(),
annaRecord.getMathGrade(),
annaRecord.getScienceGrade());
}

Kita akan mendapatkan output pada panggilan pertama sebagai berikut :

Name:Anna
Address:Philippines
Age:15

Kemudian akan dihasilkan output sebagai berikut pada panggilan kedua :

Name:Anna
Math Grade:80.0
English Grade:95.5
Science Grade:100.0

Pengenalan Pemrograman 1

14

J.E.N.I.

Jangan lupakan bahwa overloaded method memiliki property sebagai berikut :


1. Nama yang sama
2. Parameter yang berbeda
3. Nilai kembalian (return) bisa sama ataupun berbeda

10.7.

Deklarasi Constructor

Telah tersirat pada pembahasan sebelumnya, Constructor sangatlah penting pada


pembentukan sebuah object. Constructor adalah method dimana seluruh inisialisasi object
ditempatkan.
Berikut ini adalah property dari Constructor :
1. Constructor memiliki nama yang sama dengan class
2. Sebuah Constructor mirip dengan method pada umumnya, namun hanya informasi
informasi berikut yang dapat ditempatkan pada header sebuah constructor, scope
atau identifikasi pengaksesan (misal: public), nama dari konstuktor dan parameter.
3. Constructor tidak memiliki return value
4. Constructor tidak dapat dipanggil secara langsung, namun harus dipanggil dengan
menggunakan operator new pada pembentukan sebuah class.

Untuk mendeklarasikan constructor, kita tulis,


<modifier> <className> (<parameter>*) {
<statement>*
}

Default Constructor
Setiap class memiliki default constructor. Sebuah default constructor adalah constructor
yang tidak memiliki parameter apapun. Jika sebuah class tidak memiliki constructor apapun,
maka sebuah default constructor akan dibentuk secara implisit :
Sebagai contoh, pada class StudentRecord, bentuk default constructor akan terlihat seperti
dibawah ini :

public StudentRecord()
{
//area penulisan kode

Pengenalan Pemrograman 1

15

J.E.N.I.

Overloading Constructor
Seperti telah kita bahas sebelumnya, sebuah constructor juga dapat dibentuk menjadi
overloaded. Dapat dilihat pada 4 contoh sebagai berikut :
public StudentRecord(){
//area inisialisasi kode;
}
public StudentRecord(String temp){
this.name = temp;
}
public StudentRecord(String name, String address){
this.name = name;
this.address = address;
}

public StudentRecord(double mGrade, double eGrade, double sGrade){


mathGrade = mGrade;
englishGrade = eGrade;
scienceGrade = sGrade;
}

Menggunakan Constructor
Untuk menggunakan constructor, kita gunakan kode kode sebagai berikut :

public static void main( String[] args )


{
//membuat 3 objek
StudentRecord annaRecord=new StudentRecord("Anna");
StudentRecord beahRecord=new StudentRecord("Beah","Philippines");
StudentRecord crisRecord=new StudentRecord(80,90,100);
//area penulisan kode selanjtunya
}

Sebelum kita lanjutkan, mari kita perhatikan kembali deklarasi variabel static studentCount
yang telah dibuat sebelumnya. Tujuan deklarasi studentCount adalah untuk menghitung
jumlah object yang dibentuk pada class StudentRecord. Jadi, apa yang akan kita lakukan
selanjutnya adalah menambahkan nilai dari studentCount setiap kali setiap pembentukan
object pada class StudentRecord. Lokasi yang tepat untuk memodifikasi dan menambahkan

Pengenalan Pemrograman 1

16

J.E.N.I.

nilai studentCount terletak pada constructor-nya, karena selalu dipanggil setiap kali objek
terbentuk.
Sebagai contoh :

public StudentRecord(){
//letak kode inisialisasi
studentCount++; //menambah student
}
public StudentRecord(String temp){
this.name = temp;
studentCount++; //menambah student
}
public StudentRecord(String name, String address){
this.name = name;
this.address = address;
studentCount++; //menambah student
}

public StudentRecord(double mGrade, double eGrade, double sGrade){


mathGrade = mGrade;
englishGrade = eGrade;
scienceGrade = sGrade;
studentCount++; //menambah student
}

Pemanggilan Constructor Dengan this()


Pemanggilan constructor dapat dilakukan secara berangkai, dalam arti Anda dapat
memanggil constructor di dalam constructor lain. Pemanggilan dapat dilakukan dengan
referensi this(). Perhatikan contoh kode sebagai berikut :
1: public StudentRecord(){
2:
this("some string");
3:
4: }
5:
6: public StudentRecord(String temp){
7:
this.name = temp;
8: }
9:
10: public static void main( String[] args )
11: {
12:
13:
StudentRecord annaRecord = new StudentRecord();
14: }
Pengenalan Pemrograman 1

17

J.E.N.I.

Dari contoh kode diatas, pada saat baris ke 13 dipanggil akan memanggil constructor dasar
pada baris pertama. Pada saat baris kedua dijalankan, baris tersebut akan menjalankan
constructor yang memiliki parameter String pada baris ke-6.
Beberapa hal yang patut diperhatikan pada penggunaan this() :
1. Harus dituliskan pada baris pertama pada sebuah constructor
2. Hanya dapat digunakan pada satu definisi constructor. Kemudian metode ini dapat
diikuti dengan kode kode berikutnya yang relevan

10.8.

Packages

Packages dalam JAVA berarti pengelompokan beberapa class dan interface dalam satu unit.
Fitur ini menyediakan mekanisme untuk mengatur class dan interface dalam jumlah banyak
dan menghindari konflik pada penamaan.

Mengimport Packages
Supaya dapat meggunakan class yang berada diluar package yang sedang dikerjakan, Anda
harus mengimport package dimana class tersebut berada. Pada dasarnya, seluruh program
JAVA mengimport package java.lang.*, sehingga Anda dapat menggunakan class seperti
String dan Integer dalam program meskipun belum mengimport package sama sekali.
Penulisan import package dapat dilakukan seperti dibawah ini :
import <namaPaket>;
Sebagai contoh, bila Anda ingin menggunakan class Color dalam package awt, Anda harus
menuliskan import package sebagai berikut :

import java.awt.Color;
import java.awt.*;

Baris pertama menyatakan untuk mengimport class Color secara spesifik pada package,
sedangkan baris kedua menyatakan mengimport seluruh class yang terkandung dalam
package java.awt.
Cara lain dalam mengimport package adalah dengan menuliskan referensi package secara
eksplisit. Hal ini dilakukan dengan menggunakan nama package untuk mendeklarasikan
object sebuah class :
Pengenalan Pemrograman 1

18

J.E.N.I.

java.awt.Color color;

Membuat Package
Untuk membuat package, dapat dilakukan dengan menuliskan :
package <packageName>;
Anggaplah kita ingin membuat package dimana class StudentRecord akan ditempatkan
bersama dengan class class yang lain dengan nama package schoolClasses.
Langkah pertama yang harus dilakukan adalah membuat folder dengan nama
schoolClasses. Salin seluruh class yang ingin diletakkan pada package dalam folder ini.
Kemudian tambahkan kode deklarasi package pada awal file. Sebagai contoh :

package schoolClasses;
public class StudentRecord
{
private String name;
private String address;
private int age;
}

Package juga dapat dibuat secara bersarang. Dalam hal ini Java Interpreter menghendaki
struktur direktori yang mengandung class eksekusi untuk disesuaikan dengan struktur
package.

Pengaturan CLASSPATH
Diasumsikan package schoolClasses terdapat pada direktori C:\. Langkah selanjutnya
adalah mengatur classpath untuk menunjuk direktori tersebut sehingga pada saat akan
dijalankan, JVM dapat mengetahui dimana class tersebut tersimpan.
Sebelum membahas cara mengatur classpath, perhatikan
menandakan kejadian bila kita tidak mengatur classpath.

contoh

dibawah

yang

Asumsikan kita mengkompilasi dan menjalankan class StudentRecord :


C:\schoolClasses>javac StudentRecord.java
C:\schoolClasses>java StudentRecord
Exception in thread "main" java.lang.NoClassDefFoundError: StudentRecord
(wrong name: schoolClasses/StudentRecord)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)

Pengenalan Pemrograman 1

19

J.E.N.I.

at
at
at
at
at
at
at
at
at

java.net.URLClassLoader.defineClass(Unknown Source)
java.net.URLClassLoader.access$100(Unknown Source)
java.net.URLClassLoader$1.run(Unknown Source)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(Unknown Source)
java.lang.ClassLoader.loadClass(Unknown Source)
sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
java.lang.ClassLoader.loadClass(Unknown Source)
java.lang.ClassLoader.loadClassInternal(Unknown Source)

Kita akan mendapatkan pesan kesalahan berupa NoClassDefFoundError yang berarti


JAVA tidak mengetahui dimana posisi class. Hal tersebut disebabkan oleh karena class
StudentRecord berada pada package dengan nama studentClasses. Jika kita ingin
menjalankan class tersebut, kita harus memberi informasi pada JAVA bahwa nama lengkap
dari
class
tersebut
adalah
schoolClasses.StudentRecord.
Kita
juga
harus
menginformasikan kepada JVM dimana posisi pencarian package, yang dalam hal ini berada
pada direktori C:\. Untuk melakukan langkah langkah tersebut, kita harus mengatur
classpath.
Pengaturan classpath pada Windows dilakukan pada command prompt :

C:\schoolClasses> set classpath=C:\

dimana C:\ adalah direktori dimana kita menempatkan package. Setelah mengatur
classpath, kita dapat menjalankan program di mana saja dengan mengetikkan :

C:\schoolClasses> java schoolClasses.StudentRecord

Pada UNIX, asumsikan bahwa kita memiliki class - class yang terdapat dalam direktori
/usr/local/myClasses, ketikkan :
export classpath=/usr/local/myClasses

Perhatikan bahwa Anda dapat mengatur classpath dimana saja. Anda juga dapat mengatur
lebih dari satu classpath, kita hanya perlu memisahkannya dengan menggunakan ;
(Windows), dan : (UNIX). Sebagai contoh :
set classpath=C:\myClasses;D:\;E:\MyPrograms\Java

dan untuk sistem UNIX :


export classpath=/usr/local/java:/usr/myClasses

Pengenalan Pemrograman 1

20

J.E.N.I.

10.9.

Access Modifiers

Pada saat membuat, mengatur properties dan class methods, kita ingin untuk
mengimplementasikan beberapa macam larangan untuk mengakses data. Sebagai contoh,
jika Anda ingin beberapa atribut hanya dapat diubah hanya dengan method tertentu, tentu
Anda ingin menyembunyikannya dari object lain pada class. Di JAVA, implementasi tersebut
disebut dengan access modifiers.
Terdapat 4 macam access modifiers di JAVA, yaitu : public, private, protected dan default. 3
tipe akses pertama tertulis secara ekplisit pada kode untuk mengindikasikan tipe akses,
sedangkan yang keempat yang merupakan tipe default, tidak diperlukan penulisan keyword
atas tipe.

10.9.1

Akses Default (Package Accessibility)

Tipe ini mensyaratkan bahwa hanya class dalam package yang sama yang memiliki hak
akses terhadap variabel dan methods dalam class. Tidak terdapat keyword pada tipe ini.
Sebagai contoh :
public class StudentRecord
{
//akses dasar terhadap variabel
int name;
//akses dasar terhadap metode
String getName(){
return name;
}
}

Pada contoh diatas, variabel nama dan method getName() dapat diakses dari object lain
selama object tersebut berada pada package yang sama dengan letak dari file
StudentRecord.

Pengenalan Pemrograman 1

21

J.E.N.I.

10.9.2

Akses Public

Tipe ini mengijinkan seluruh class member untuk diakses baik dari dalam dan luar class.
Object apapun yang memiliki interaksi pada class memiliki akses penuh terhadap member
dari tipe ini. Sebagai contoh :
public class StudentRecord
{
//akses dasar terhadap variabel
public int name;
//akses dasar terhadap metode
public String getName(){
return name;
}
}

Dalam contoh ini, variabel name dan method getName() dapat diakses dari object lain.

10.9.3

Akses Protected

Tipe ini hanya mengijinkan class member untuk diakses oleh method dalam class tersebut
dan elemen elemen subclass. Sebagai contoh :
public class StudentRecord
{
//akses pada variabel
protected int name;
//akses pada metode
protected String getName(){
return name;
}

}
Pada contoh diatas, variabel name dan method getName() hanya dapat diakses oleh
method internal class dan subclass dari class StudentRecord. Definisi subclass akan dibahas
pada bab selanjutnya.

Pengenalan Pemrograman 1

22

J.E.N.I.

10.9.4

Akses Private

Tipe ini mengijinkan pengaksesan class hanya dapat diakses oleh class dimana tipe ini
dibuat. Sebagai contoh :
public class StudentRecord
{
//akses dasar terhadap variabel
private int name;
//akses dasar terhadap metode
private String getName(){
return name;
}
}

Pada contoh diatas, variabel name dan method getName() hanya dapat diakses oleh
method internal class tersebut.

Petunjuk Penulisan Program :


Instance variable dari class secara default akan bertipe private sehingga class tersebut
hanya akan menyediakan accessor dan mutator methods terhadap variabel ini.

Pengenalan Pemrograman 1

23

J.E.N.I.

10.10. Latihan
Entry Buku Alamat

Tugas Anda adalah membuat sebuah class yang memuat data-data pada buku alamat.
Tabel berikut mendefinisikan informasi yang dimiliki oleh buku alamat.

Attribut

Deskripsi

Nama

Nama Lengkap perseorangan

Alamat

Alamat Lengkap

Nomor Telepon

Nomor telepon personal

Alamat E-Mail

Alamat E-Mail personal

Tabel 1: Atribut dan Deskripsi Atribut

Buat implementasi dari method sebagai berikut :


1. Menyediakan accessor dan mutator method terhadap seluruh atribut
2. Constructor

Buku Alamat

Buat sebuah class buku alamat yang dapat menampung 100 data. Gunakan class yang telah
dibuat pada nomor pertama. Anda harus mengimplementasikan method berikut pada buku
alamat :
1. Memasukkan data
2. Menghapus data
3. Menampilkan seluruh data
4. Update data

Pengenalan Pemrograman 1

24

J.E.N.I.

BAB 11
Pewarisan, Polimorfisme, dan Interface
11.1 Tujuan
Dalam bagian ini, kita akan membicarakan bagaimana suatu class dapat mewariskan sifat
dari class yang sudah ada. Class ini dinamakan subclass dan induk class dinamakan
superclass. Kita juga akan membicarakan sifat khusus dari Java dimana kita dapat secara
otomatis memakai method yand tepat untuk setiap object tanpa memperhatikan asal dari
subclass object. Sifat ini dinamakan polimorfisme. Pada akhirnya, kita akan mendiskusikan
tentang interface yang membantu mengurangi penulisan program.
Pada akhir pembahasan, diharapkan pembaca dapat :

Mendefinisikan superclasses dan subclasses

Override method dari superclasses

Membuat method final dan class final

11.2 Pewarisan
Dalam Java, semua class, termasuk class yang membangun Java API, adalah subclasses
dari superclass Object. Contoh hirarki class diperlihatkan di bawah ini.
Beberapa class di atas class utama dalam hirarki class dikenal sebagai superclass.
Sementara beberapa class di bawah class pokok dalam hirarki class dikenal sebagai
subclass dari class tersebut.

Gambar 1: Hirarki class

Pewarisan adalah keuntungan besar dalam pemrograman berbasis object karena suatu
sifat atau method didefinisikan dalam superclass, sifat ini secara otomatis diwariskan dari
semua subclasses. Jadi, Anda dapat menuliskan kode method hanya sekali dan mereka
dapat digunakan oleh semua subclass. Subclass hanya perlu mengimplementasikan
Pengenalan Pemrograman 1

J.E.N.I.

perbedaannya sendiri dan induknya.

11.2.1

Mendefinisikan Superclass dan Subclass

Untuk memperoleh suatu class, kita menggunakan kata kunci extend. Untuk
mengilustrasikan ini, kita akan membuat contoh class induk. Dimisalkan kita mempunyai
class induk yang dinamakan Person.
public class Person
{
protected String
protected String

name;
address;

/**
* Default constructor
*/
public Person(){
System.out.println(Inside Person:Constructor);
name = "";
address = "";
}
/**
* Constructor dengan dua parameter
*/
public Person( String name, String address ){
this.name = name;
this.address = address;
}
/**
* Method accessor
*/
public String getName(){
return name;
}
public String getAddress(){
return address;
}
public void setName( String name ){
this.name = name;
}
public void setAddress( String add ){
this.address = add;
}
}

Pengenalan Pemrograman 1

J.E.N.I.

Perhatikan bahwa atribut name dan address dideklarasikan sebagai protected. Alasannya
kita melakukan ini yaitu, kita inginkan atribut-atribut ini untuk bisa diakses oleh subclasses
dari superclassess. Jika kita mendeklarasikannya sebagai private, subclasses tidak dapat
menggunakannya. Catatan bahwa semua properti dari superclass yang dideklarasikan
sebagai public, protected dan default dapat diakses oleh subclasses-nya.
Sekarang, kita ingin membuat class lain bernama Student. Karena Student juga sebagai
Person, kita putuskan hanya meng-extend class Person, sehingga kita dapat mewariskan
semua properti dan method dari setiap class Person yang ada. Untuk melakukan ini, kita
tulis,
public class Student extends Person
{
public Student(){
System.out.println(Inside Student:Constructor);
//beberapa kode di sini
}
// beberapa kode di sini
}
Ketika object Student di-instantiate, default constructor dari superclass secara mutlak
meminta untuk melakukan inisialisasi yang seharusnya. Setelah itu, pernyataan di dalam
subclass dieksekusi. Untuk mengilustrasikannya, perhatikan kode berikut,
public static void main( String[] args ){
Student anna = new Student();
}
Dalam kode ini, kita membuat sebuah object dari class Student. Keluaran dari program
adalah,
Inside Person:Constructor
Inside Student:Constructor

Alur program ditunjukkan sebagai berikut.


Pengenalan Pemrograman 1

J.E.N.I.

Gambar 2: Alur Program

11.2.2

Kata Kunci Super

Subclass juga dapat memanggil constructor secara eksplisit dari superclass terdekat. Hal ini
dilakukan dengan pemanggil construktor super. Pemanggil constructor super dalam
constructor dari subclass akan menghasilkan eksekusi dari superclass constructor yang
bersangkutan, berdasar dari argumen sebelumnya.
Sebagai contoh, pada contoh class sebelumnya. Person dan Student, kita tunjukkan contoh
dari pemanggil constructor super. Diberikan kode berikut untuk Student,
public Student(){
super( "SomeName", "SomeAddress" );
System.out.println("Inside Student:Constructor");
}
Kode ini memanggil constructor kedua dari superclass terdekat (yaitu Person) dan
mengeksekusinya. Contoh kode lain ditunjukkan sebagai berikut,
public Student(){
super();
System.out.println("Inside Student:Constructor");
Pengenalan Pemrograman 1

J.E.N.I.

Kode ini memanggil default constructor dari superclass terdekat (yaitu Person) dan
mengeksekusinya.
Ada beberapa hal yang harus diingat ketika menggunakan pemanggil constuktor super:
1. Pemanggil super() HARUS DIJADIKAN PERNYATAAN PERTAMA DALAM constructor.
2. Pemanggil super() hanya dapat digunakan dalam definisi constructor.
3. Termasuk constructor this() dan pemanggil super() TIDAK BOLEH TERJADI DALAM
constructor YANG SAMA.
Pemakaian lain dari super adalah untuk menunjuk anggota dari superclass(seperti
reference this). Sebagai contoh,
public Student()
{
super.name = somename;
super.address = some address;
}

11.2.3 Overriding Method


Untuk beberapa pertimbangan, terkadang class asal perlu mempunyai implementasi
berbeda dari method yang khusus dari superclass tersebut. Oleh karena itulah, method
overriding digunakan. Subclass dapat mengesampingkan method yang didefinisikan dalam
superclass dengan menyediakan implementasi baru dari method tersebut.
Misalnya kita mempunyai implementasi berikut untuk method getName dalam superclass
Person,
public class Person
{
:
:
public String getName(){
System.out.println("Parent: getName");
return name;
}
:
}
Untuk override, method getName dalam subclass Student, kita tulis,
public class Student extends Person
{
:
:
public String getName(){
System.out.println("Student: getName");
Pengenalan Pemrograman 1

J.E.N.I.

return name;
}
:
}
Jadi, ketika kita meminta method getName dari object class Student, method overridde
akan dipanggil, keluarannya akan menjadi,
Student: getName

11.2.4

Method final dan class final

Dalam Java, juga memungkinkan untuk mendeklarasikan class-class yang tidak lama
menjadi subclass. Class ini dinamakan class final. Untuk mendeklarasikan class untuk
menjadi final kita hanya menambahkan kata kunci final dalam deklarasi class. Sebagai
contoh, jika kita ingin class Person untuk dideklarasikan final, kita tulis,
public final class Person
{
//area kode
}
Beberapa class dalam Java API dideklarasikan secara final untuk memastikan sifatnya tidak
dapat di-override. Contoh-contoh dari class ini adalah Integer, Double, dan String.
Ini memungkinkan dalam Java membuat method yang tidak dapat di-override. Method ini
dapat kita panggil method final. Untuk mendeklarasikan method untuk menjadi final, kita
tambahkan kata kunci final ke dalam deklarasi method. Contohnya, jika kita ingin method
getName dalam class Person untuk dideklarasikan final, kita tulis,
public final String getName(){
return name;
}
Method static juga secara otomatis final. Ini artinya Anda tidak dapat membuatnya
override.

Pengenalan Pemrograman 1

J.E.N.I.

11.3

Polimorfisme

Sekarang, class induk Person dan subclass Student dari contoh sebelumnya, kita
tambahkan subclass lain dari Person yaitu Employee. Di bawah ini adalah hierarkinya,

Person

Student

Employee

Gambar 3: Hirarki dari class induk Person

Dalam Java, kita dapat membuat referensi yang merupakan tipe dari superclass ke sebuah
object dari subclass tersebut. Sebagai contohnya,
public static main( String[] args )
{
Person
ref;
Student
Employee

studentObject = new Student();


employeeObject = new Employee();

ref = studentObject; //Person menunjuk kepada


// object Student
//beberapa kode di sini
}
Sekarang dimisalkan kita punya method getName dalam superclass Person kita, dan kita
override method ini dalam kedua subclasses Student dan Employee,
public class Person
{
public String getName(){
System.out.println(Person Name: + name);
return name;
}
}
public class Student extends Person
{
public String getName(){
System.out.println(Student Name: + name);
return name;
}
}
Pengenalan Pemrograman 1

J.E.N.I.

public class Employee extends Person


{
public String getName(){
System.out.println(Employee Name: + name);
return name;
}
Kembali ke method utama kita, ketika kita mencoba memanggil method getName dari
reference Person ref, method getName dari object Student akan dipanggil. Sekarang, jika
kita berikan ref ke object Employee, method getName dari Employee akan dipanggil.
public static main( String[] args )
{
Person
ref;
Student
Employee

studentObject = new Student();


employeeObject = new Employee();

ref = studentObject; //Person menunjuk kepada


// object Student
String temp = ref.getName(); //getName dari Student
//class dipanggil
System.out.println( temp );
ref = employeeObject; //Person menunjuk kepada
// object Employee
String temp = ref.getName(); //getName dari Employee
//class dipanggil
System.out.println( temp );
}
Kemampuan dari reference untuk mengubah sifat menurut object apa yang dijadikan acuan
dinamakan polimorfisme. Polimorfisme menyediakan multiobject dari subclasses yang
berbeda untuk diperlakukan sebagai object dari superclass tunggal, secara otomatis
menunjuk method yang tepat untuk menggunakannya ke particular object berdasar
subclass yang termasuk di dalamnya.
Contoh lain yang menunjukkan properti polimorfisme adalah ketika kita mencoba melalui
reference ke method. Misalkan kita punya method static printInformation yang
mengakibatkan object Person sebagai reference, kita dapat me-reference dari tipe
Employee dan tipe Student ke method ini selama itu masih subclass dari class Person.
public static main( String[] args )
{
Student
studentObject = new Student();
Employee
employeeObject = new Employee();
printInformation( studentObject );
printInformation( employeeObject );
}
Pengenalan Pemrograman 1

J.E.N.I.

public static printInformation( Person p ){


. . . .
}

11.4

Abstract Class

Misalnya kita ingin membuat superclass yang mempunyai method tertentu yang berisi
implementasi, dan juga beberapa method yang akan di-overridden oleh subclasses nya.
Sebagai contoh, kita akan membuat superclass bernama LivingThing. class ini mempunyai
method tertentu seperti breath, eat, sleep, dan walk. Akan tetapi, ada beberapa method di
dalam superclass yang sifatnya tidak dapat digeneralisasi. Kita ambil contoh, method walk.
Tidak semua kehidupan berjalan(walk) dalam cara yang sama. Ambil manusia sebagai
misal, kita manusia berjalan dengan dua kaki, dimana kehidupan lainnya seperti anjing
berjalan dengan empat kaki. Akan tetapi, beberapa ciri umum dalam kehidupan sudah
biasa, itulah kenapa kita inginkan membuat superclass umum dalam hal ini.

Gambar 4: Class abstract

Kita dapat membuat superclass yang mempunyai beberapa method dengan implementasi
sedangkan yang lain tidak. Class jenis ini yang disebut dengan class abstract.
Sebuah class abstract adalah class yang tidak dapat di-instantiate. Seringkali muncul di
atas hirarki class pemrograman berbasis object, dan mendefinisikan keseluruhan aksi yang
mungkin pada object dari seluruh subclasses dalam class.
Method ini dalam class abstract yang tidak mempunyai implementasi dinamakan method
abstract. Untuk membuat method abstract, tinggal menulis deklarasi method tanpa tubuh
class dan digunakan menggunakan kata kunci abstract. Contohnya,
public abstract void someMethod();

Pengenalan Pemrograman 1

J.E.N.I.

Sekarang mari membuat contoh class abstract.


public abstract class LivingThing
{
public void breath(){
System.out.println("Living Thing breathing...");
}
public void eat(){
System.out.println("Living Thing eating...");
}
/**
* abstract method walk
* Kita ingin method ini di-overridden oleh subclasses
*/
public abstract void walk();
}
Ketika class meng-extend class abstract LivingThing, dibutuhkan untuk override method
abstract walk(), atau lainnya, juga subclass akan menjadi class abstract, oleh karena itu
tidak dapat di-instantiate. Contohnya,
public class Human extends LivingThing
{
public void walk(){
System.out.println("Human walks...");
}
}
Jika class Human tidak dapat overridde method walk, kita akan menemui pesan error
berikut ini,
Human.java:1: Human is not abstract and does not override
abstract method walk() in LivingThing
public class Human extends LivingThing
^
1 error

Petunjuk penulisan program:


Gunakan class abstract untuk mendefinisikan secara luas sifat-sifat dari class
tertinggi pada hirarki pemrograman berbasis object, dan gunakan subclassesnya
untuk menyediakan rincian dari class abstract.

Pengenalan Pemrograman 1

10

J.E.N.I.

11.5

Interface

Interface adalah jenis khusus dari blok yang hanya berisi method signature(atau constant
). Interface mendefinisikan sebuah(signature) dari sebuah kumpulan method tanpa tubuh.
Interface mendefinisikan sebuah cara standar dan umum dalam menetapkan sifat-sifat dari
class-class. Mereka menyediakan class-class, tanpa memperhatikan lokasinya dalam hirarki
class, untuk mengimplementasikan sifat-sifat yang umum. Dengan catatan bahwa
interface-interface juga menunjukkan polimorfisme, dikarenakan program dapat memanggil
method interface dan versi yang tepat dari method yang akan dieksekusi tergantung dari
tipe object yang melewati pemanggil method interface.

11.5.1

Kenapa Kita Memakai Interface?

Kita akan menggunakan interface jika kita ingin class yang tidak berhubungan
mengimplementasikan method yang sama. Melalui interface-interface, kita dapat
menangkap kemiripan diantara class yang tidak berhubungan tanpa membuatnya seolaholah class yang berhubungan.
Mari kita ambil contoh class Line dimana berisi method yang menghitung panjang dari
garis dan membandingkan object Line ke object dari class yang sama. Sekarang, misalkan
kita punya class yang lain yaitu MyInteger dimana berisi method yang membandingkan
object MyInteger ke object dari class yang sama. Seperti yang kita lihat disini, kedua
class-class mempunyai method yang mirip dimana membandingkan mereka dari object lain
dalam tipe yang sama, tetapi mereka tidak berhubungan sama sekali. Supaya dapat
menjalankan cara untuk memastikan bahwa dua class-class ini mengimplementasikan
beberapa method dengan tanda yang sama, kita dapat menggunakan sebuah interface
untuk hal ini. Kita dapat membuat sebuah class interface, katakanlah interface Relation
dimana mempunyai deklarasi method pembanding. Relasi interface dapat dideklarasikan
sebagai,
public interface Relation
{
public boolean isGreater( Object a, Object b);
public boolean isLess( Object a, Object b);
public boolean isEqual( Object a, Object b);
}
Alasan lain dalam menggunakan interface pemrograman object adalah untuk menyatakan
sebuah interface pemrograman object tanpa menyatakan classnya. Seperti yang dapat kita
lihat nanti dalam bagian Interface vs class, kita dapat benar-benar menggunakan interface
sebagai tipe data.
Pada akhirnya, kita perlu menggunakan interface untuk pewarisan model jamak dimana
menyediakan class untuk mempunyai lebih dari satu superclass. Pewarisan jamak tidak
ditunjukkan di Java, tetapi ditunjukkan di bahasa berorientasi object lain seperti C++.

Pengenalan Pemrograman 1

11

J.E.N.I.

11.5.2

Interface vs. Class Abstract

Berikut ini adalah perbedaan utama antara sebuah interface dan sebuah class abstract:
method interface tidak punya tubuh, sebuah interface hanya dapat mendefinisikan
konstanta dan interface tidak langsung mewariskan hubungan dengan class istimewa
lainnya, mereka didefinisikan secara independent.

11.5.3

Interface vs. Class

Satu ciri umum dari sebuah interface dan class adalah pada tipe mereka berdua. Ini artinya
bahwa sebuah interface dapat digunakan dalam tempat-tempat dimana sebuah class dapat
digunakan. Sebagai contoh, diberikan class Person dan interface PersonInterface, berikut
deklarasi yang benar:
PersonInterface
Person

pi = new Person();
pc = new Person();

Bagaimanapun, Anda tidak dapat membuat instance dari sebuah interface.


Contohnya:
PersonInterface

pi = new PersonInterface(); //COMPILE


//ERROR!!!
Ciri umum lain adalah baik interface maupun class dapat mendefinisikan method.
Bagaimanapun, sebuah interface tidak punya sebuah kode implementasi sedangkan class
memiliki salah satunya.

11.5.4

Membuat Interface

Untuk membuat interface, kita tulis,


public interface [InterfaceName]
{
//beberapa method tanpa isi
}
Sebagai contoh, mari kita membuat sebuah interface yang mendefinisikan hubungan antara
dua object menurut urutan asli dari object.
public interface Relation
{
public boolean isGreater( Object a, Object b);
public boolean isLess( Object a, Object b);
public boolean isEqual( Object a, Object b);
}

Pengenalan Pemrograman 1

12

J.E.N.I.

Sekarang, penggunaan interface, kita gunakan kata kunci implements. Contohnya,


/**
* Class ini mendefinisikan segmen garis
*/
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;
}
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);
}
}

Pengenalan Pemrograman 1

13

J.E.N.I.

Ketika class Anda mencoba mengimplementasikan sebuah interface, selalu pastikan bahwa
Anda mengimplementasikan semua method dari interface, jika tidak, Anda akan
menemukan kesalahan ini,
Line.java:4: Line is not abstract and does not override abstract
method
isGreater(java.lang.Object,java.lang.Object) in
Relation
public class Line implements Relation
^
1 error

Petunjuk penulisan program:


Gunakan interface untuk mendefinisikan method standar yang sama dalam classclass berbeda yang memungkinkan. Sekali Anda telah membuat kumpulan definisi
method standar, Anda dapat menulis method tunggal untuk memanipulasi semua classclass yang mengimplementasikan interface.

11.5.5

Hubungan dari Interface ke Class

Seperti yang telah kita lihat dalam bagian sebelumnya, class dapat mengimplementasikan
sebuah interface selama kode implementasi untuk semua method yang didefinisikan dalam
interface tersedia.
Hal lain yang perlu dicatat tentang hubungan antara interface ke class-class yaitu, class
hanya dapat mengEXTEND SATU superclass, tetapi dapat mengIMPLEMENTASIkan BANYAK
interface. Sebuah contoh dari sebuah class yang mengimplementasikan interface adalah,
public class Person implements PersonInterface,
LivingThing,
WhateverInterface {
//beberapa kode di sini
}
Contoh lain dari class yang meng-extend satu superclass dan mengimplementasikan
sebuah interface adalah,
public class ComputerScienceStudent extends Student
implements PersonInterface,
LivingThing {
//beberapa kode di sini
}
Catatan bahwa sebuah interface bukan bagian dari hirarki pewarisan class. Class yang tidak
berhubungan dapat mengimplementasikan interface yang sama.

Pengenalan Pemrograman 1

14

J.E.N.I.

11.5.6

Pewarisan Antar Interface

Interface bukan bagian dari hirarki class. Bagaimanapun, interface dapat mempunyai
hubungan pewarisan antara mereka sendiri. Contohnya, misal kita punya dua interface
StudentInterface
dan
PersonInterface.
Jika
StudentInterface
meng-extend
PersonInterface, maka ia akan mewariskan semua deklarasi method dalam PersonInterface.
public interface PersonInterface {
. . .
}
public interface StudentInterface extends PersonInterface {
. . .
}

Pengenalan Pemrograman 1

15

J.E.N.I.

11.6

Latihan

11.6.1

Extend StudentRecord

Dalam latihan ini, kita ingin untuk membuat catatan siswa yang lebih khusus yang berisi
informasi tambahan tentang pengetahuan komputer siswa. Tugasnya adalah meng-extend
class StudentRecord yang mengimplementasikan pelajaran sebelumnya. Cobalah untuk
meng-override beberapa method yang ada dalam superclass StudentRecord, jika Anda
benar-benar membutuhkannya.

11.6.2

Bentuk Abstract Class

Cobalah untuk membuat class abstract yang dinamai Shape dengan method abstract
getArea() dan getName(). Tulis dua subclasses-nya yaitu Circle dan Square. Anda dapat
menambahkan method tambahan ke dalam subclasses jika diinginkan.

Pengenalan Pemrograman 1

16

J.E.N.I.

BAB 12
Dasar Exception Handling
12.1 Tujuan
Dalam bagian ini, kita akan mempelajari teknik yang dipakai dalam Java dalam menangani kondisi
yang tidak biasa dalam menjalankan operasi normal dalam program. Teknik ini dinamakan
exception handling.
Pada akhir pembahasan, diharapkan pembaca dapat :

Mendefinisikan exception

Menangani exception menggunakan blok try-catch-finally

12.2

Apa itu Exception?

Exception adalah sebuah peristiwa yang menjalankan alur proses normal pada program. Peristiwa
ini biasanya berupa kesalahan(error) dari beberapa bentuk. Ini disebabkan program kita berakhir
tidak normal.
Beberapa contoh dari exception yang Anda mungkin jumpai pada latihan-latihan sebelumnya
adalah: exception ArrayIndexOutOfBounds, yang terjadi jika kita mencoba mengakses elemen
array yang tidak ada, atau NumberFormatException, yang terjadi ketika kita mencoba melalui
parameter bukan angka dalam method Integer.parseInt.

12.3 Menangani Exception


Untuk menangani exception dalam Java, kita gunakan blok try-catch-finally. Apa yang kita
lakukan dalam program kita adalah kita menempatkan pernyataan yang mungkin menghasilkan
exception dalam blok ini.
Bentuk umum dari blok try-catch-finally adalah,
try{
//tulis pernyataan yang dapat mengakibatkan exception
//dalam blok ini
}
catch( <exceptionType1> <varName1> ){
//tulis aksi apa dari program Anda yang dijalankan jika ada
//exception tipe tertentu terjadi
}
. . .
Pengenalan Pemrograman 1

J.E.N.I.

catch( <exceptionTypen> <varNamen> ){


//tulis aksi apa dari program Anda yang dijalankan jika ada
//exception tipe tertentu terjadi
}
finally{
//tambahkan kode terakhir di sini
}

Exception dilemparkan selama eksekusi dari blok try dapat ditangkap dan ditangani dalam blok
catch. Kode dalam blok finally selalu di-eksekusi.
Berikut ini adalah aspek kunci tentang sintak dari konstruksi try-catch-finally:
Notasi blok bersifat perintah
Setiap blok try, terdapat satu atau lebih blok catch, tetapi hanya satu blok finally.
Blok catch dan blok finally harus selalu muncul dalam konjungsi dengan blok try, dan diatas
urutan
Blok try harus diikuti oleh paling sedikit satu blok catch ATAU satu blok finally, atau
keduanya.
Setiap blok catch mendefinisikan sebuah penanganan exception. Header dari blok catch
harus membawa satu argumen, dimana exception pada blok tersebut akan ditangani.
Exception harus menjadi class pelempar atau satu dari subclassesnya.

Gambar 1: Alur kejadian blok try-catch-finally

Pengenalan Pemrograman 1

J.E.N.I.

Marilah mengambil contoh kode yang mencetak argumen kedua ketika kita mencoba menjalankan
kode menggunakan argumen command-line. Perkirakan, tidak ada pengecekan dalam kode Anda
untuk angka dari argumen dan kita hanya mengakses argumen kedua args[1] segera, kita akan
mendapatkan exception berikut.

Exception in thread "main"


java.lang.ArrayIndexOutOfBoundsException: 1
at ExceptionExample.main(ExceptionExample.java:5)

Untuk mencegah kejadian ini, kita dapat menempatkan kode ke dalam blok try-catch. Blok finally
hanya sebagai pilihan lain saja. Sebagai contoh, kita tidak akan menggunakan blok finally.
public class ExceptionExample
{
public static void main( String[] args ){
try{
System.out.println( args[1] );
}catch( ArrayIndexOutOfBoundsException exp ){
System.out.println("Exception caught!");
}
}
}

Jadi kita akan menjalankan program lagi tanpa argumen, keluarannya akan menjadi,
Exception caught!

Pengenalan Pemrograman 1

J.E.N.I.

12.4 Latihan
12.4.1

Menangkap Exception 1

Diberikan kode berikut:


public class TestExceptions{
public static void main( String[] args ){
for( int i=0; true; i++ ){
System.out.println("args["+i+"]="+
args[i]);
}
}
}
Compile dan jalankan program TestExceptions. Keluarannya akan tampak seperti ini:
javac TestExceptions one two three
args[0]=one
args[1]=two
args[2]=three
Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 3
at TestExceptions.main(1.java:4)

Ubah program TestExceptions untuk menangani exception, keluaran program setelah ditangkap
exception-nya akan seperti ini:
javac TestExceptions one two three
args[0]=one
args[1]=two
args[2]=three
Exception caught:
java.lang.ArrayIndexOutOfBoundsException: 3
Quiting...

12.4.2 Menangkap Exception 2


Melakukan percobaan pada beberapa program yang telah Anda tulis adalah hal yang baik sebelum
menghadapi exception. Karena pada program di atas Anda tidak menangkap exception, maka
eksekusi dengan mudahnya berhenti mengeksekusi program Anda. Kembali kepada program
diatas dan gunakan penanganan exception.

Pengenalan Pemrograman 1

J.E.N.I

Pengenalan Pemrograman 2

Versi 1.1
Juni 2007
Sumber JEDI

Pengenalan Pemrograman 2

J.E.N.I

Penulis
Joyce Avestro

Persyaratan-persyaratan Untuk Latihan Laboratorium

Team
Joyce Avestro
Florence Balagtas
Rommel Feria
Reginald Hutcherson
Rebecca Ong
John Paul Petines
Sang Shin
Raghavan Srinivas
Matthew Thompson

NetBeans IDE 5.5 berjalan pada sistem operasi yang mendukung Java VM.
Dibawah ini merupakan daftar dari platform-platform yang digunakan:

Team Translator
Frans Thamura
Joko Pitono
Eko Subiyantoro
Cahya Kusuma Ratih
Dwi Martha Sari
Miratul Khusna Mufida
Khansa Fitriannisa
Sulistyaningtyas
Allin Junikhah
Bagus Chandra
Rizzatama N.S
Badar Agung Nugroho
Kadek Surya Pranata

Sistem Operasi yang mendukung

Mac OS X 10.4.5 atau yang terbaru


Red Hat Fedora Core 3
Sistem Operasi Solaris 10 Update 1 (SPARC and x86/x64
Platform Edition)

NetBeans Enterprise Pack juga dapat digunakan pada platform-platform


berikut ini:

Microsoft Windows 2000 Professional SP4


Solaris 8 OS (SPARC and x86/x64 Platform Edition) and Solaris 9
OS (SPARC and x86/x64 Platform Edition)
Berbagai macam distribusi LINUX

Minimum konfigurasi Hardware


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

Pengenalan Pemrograman 2

Microsoft Windows XP Professional SP2 atau yang terbaru

Sistem Operasi Microsoft Windows:


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

J.E.N.I

Konfigurasi Hardware yang direkomendasikan

Sistem Operasi Microsoft Windows:


o Prosesor: 1.4 GHz Intel Pentium III workstation atau
setaranya
o Memori: 1 GB
o Disk space: 1 GB dari free disk space

Sistem Operasi Linux:


o Prosesor: 1.4 GHz Intel Pentium III atau setaranya
o Memori: 1 GB
o Disk space: 850 MB dari free disk space

Solaris OS (SPARC):
o Prosesor: UltraSPARC IIIi 1 GHz
o Memori: 1 GB
o Disk space: 850 MB dari free disk space

Solaris OS (x86/x64 platform edition):

o
o
o

Prosesor: AMD Opteron 100 Series 1.8 GHz


Memori: 1 GB
Disk space: 850 MB dari free disk space

Sistem Operasi Macintosh OS X:


o Prosesor: PowerPC G5
o Memori: 1 GB
o Disk space: 850 MB dari free disk space

Software yang diperlukan


NetBeans Enterprise Pack 5.5 dapat diakses pada Java 2 Platform Standard
Edition Development Kit 5.0 Update 1 atau diatasnya (JDK 5.0, versi 1.5.0_01
atau diatasnya), dimana berisi Java Runtime Environment plus developer
tools untuk meng-compile, men-debug, and menjalankan aplikasi yang ditulis
dengan bahasa Java. Sun Java System Application Server Platform Edisi 9
telah diuji dengan JDK 5.0 update 6.

Untuk Solaris, Windows, dan Linux, Anda dapat mendownload JDK


untuk platform Anda pada

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

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

Pengenalan Pemrograman 2

J.E.N.I

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

Pengenalan Pemrograman 2

J.E.N.I

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

Pengenalan Pemrograman 2

J.E.N.I

4.5 Class Process dan Runtime


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

Pengenalan Pemrograman 2

J.E.N.I

7.4.3 GridLayout Manager


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

Pengenalan Pemrograman 2

J.E.N.I

9.5.3 Contoh Synchronized Pertama


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

Pengenalan Pemrograman 2

J.E.N.I

12.6 Contoh Dasar Reader/Writer


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

Pengenalan Pemrograman 2

J.E.N.I.

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

class

object

atribut

method

cnstructor

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

package

enkapsulasi

abstraksi

pewarisan

polimorfisme

interface

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

1.2 Konsep Berorientasi object


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

1.2.2 Class
Pengenalan Pemrograman 2

J.E.N.I.

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

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

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

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

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

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

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

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

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

J.E.N.I.

SuperHero

UnderwaterSuperHero

FlyingSuperHero

Gambar 1.1: Contoh Pewarisan

SuperHero adalah superclass dari class FlyingSuperHero dan UnderwaterSuperHero. Catatan


bahwa FlyingSuperHero is-a SuperHero. Sebagaimana juga UnderwaterSuperHero is-a
SuperHero

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

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

1.3 Struktur Program Java


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

1.3.1 Mendeklarasikan class Java


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

Pengenalan Pemrograman 2

J.E.N.I.

Petunjuk Penulisan Program:


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

1.3.2 Mendeklarasikan Atribut


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

Petunjuk Penulisan Program:


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

1.3.3 Mendeklarasikan Method


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

Pengenalan Pemrograman 2

J.E.N.I.

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

1.3.4 Mendeklarasikan sebuah Constructor


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

1.3.5 Meng-instantiate sebuah class


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

J.E.N.I.

ConstructObj obj = new ConstructObj();

//di-instantiate

}
}

1.3.6 Mengakses Anggota object


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

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

Dengan ini, source code Anda harus memiliki format berikut:


[<packageDeclaration>]
<importDeclaration>*
<classDeclaration>+

Petunjuk Penulisan Program:


+ menunjukkan bahwa boleh ada 1 atau lebih kejadian pada baris ini dalam pengaplikasiannya.

Pengenalan Pemrograman 2

J.E.N.I.

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

1.3.8 Acces Modifier


Tabel berikut meringkas acces modifier dalam Java.
private
class yang sama

Yes

package yang sama


package yang
berbeda (subclass)

default/package

protected

public

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

package yang
berbeda (nonsubclass)

Yes

Tabel 1.2: Acces Modifier

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

1.3.10 Pewarisan
Pengenalan Pemrograman 2

J.E.N.I.

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

1.3.11 Method Overriding


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

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

J.E.N.I.

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

1.3.12 Class Abstract dan Method


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

Pengenalan Pemrograman 2

J.E.N.I.

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

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

Anggotanya adalah public ketika interface dideklarasikan public.


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

dan

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

Contoh berikut menunjukkan bagaimana mendeklarasikan dan menggunakan sebuah interface.


Pengenalan Pemrograman 2

10

J.E.N.I.

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

1.3.14 Kata kunci this


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

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

11

J.E.N.I.

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

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

1.3.15 Kata kunci super


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

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

12

J.E.N.I.

studNum = sNum;
}
}

Petunjuk Penulisan Program:


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

Pengenalan Pemrograman 2

13

J.E.N.I.

1.3.16 Kata Kunci static


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

Keluaran dari source kode ditunjukkan di bawah ini.


This is a static block.
1
5
1
0
1
4, 4, 4

1.3.17 Kata Kunci final


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

14

J.E.N.I.

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

1.3.18 Inner Classes


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

Pengenalan Pemrograman 2

15

J.E.N.I.

1.4 Latihan
1.4.1 Tabel Perkalian
Tulis program yang mempunyai masukkan size dari user dan mencetak tabel perkalian dengan
size yang ditetapkan.
Size untuk tabel perkalian : 5
Tabel perkalian dari size 5:
1

12

16

10

15

20

25

1.4.2 Greatest Common Factor(GCF)


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

Input 1: 1

Input 1: 9

Input 2: 15

Input 2: 2

Input 2: 27

Input 3: 35

Input 3: 3

Input 3: 12

GCF: 5

GCF: 1

GCF: 3

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

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

16

J.E.N.I.

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

2.2 Apa itu Exception?


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

2.2.2 Error dan Exception Classes


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

Pengenalan Pemrograman 2

J.E.N.I.

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

2.2.3 Sebuah Contoh


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

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

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

Pengenalan Pemrograman 2

J.E.N.I.

2.3 Menangkap Exception


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

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

Petunjuk Penulisan Program :


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

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

Kesalahan pembagian dengan bilangan 0 adalah salah satu contoh dari


ArithmethicException. Tipe exception kemudian mengindikasikan klausa catch pada
class ini. Program tersebut menangani kesalahan yang terjadi dengan menampilkan
deskripsi dari permasalahan.

Pengenalan Pemrograman 2

J.E.N.I.

Output program saat eksekusi akan terlihat sebagai berikut :


java.lang.ArithmeticException: / by zero
After exception.

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

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

Pengenalan Pemrograman 2

J.E.N.I.

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

Kode berikut menggunakan try bersarang tergabung dengan penggunaan method.


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

Bagaimana output program tersebut jika diimplementasikan terhadap argument


argument berikut :
a) Tidak ada argumen
b) 15
c) 15
3
d) 15
0

2.3.2 Keyword Finally


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

Pengenalan Pemrograman 2

J.E.N.I.

Petunjuk Penulisan Program :


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

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

Pengenalan Pemrograman 2

J.E.N.I.

2.4 Melempar Exception


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

throw <exception object>;


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

2.4.2 Keyword Throws


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

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

Pengenalan Pemrograman 2

J.E.N.I.

Contoh berikut ini menunjukkan bahwa method myMethod tidak menangani


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

2.5 Kategori Exception


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

Tabel 1.4. Hirarki Exception Class

Pengenalan Pemrograman 2

J.E.N.I.

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

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

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

2.5.2 Checked dan Unchecked Exceptions


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

2.5.3 User Defined Exceptions


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

Pengenalan Pemrograman 2

J.E.N.I.

Berikut ini contohnya :


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

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

2.6.2 Mengaktifkan dan Menonaktifkan Exceptions


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

Pengenalan Pemrograman 2

10

J.E.N.I.

mereka menyadari bahwa saat menjalankannya, assertion harus dalam keadaan


aktif.

Untuk mengkompilasi file yang menggunakan assertions, sebuah


parameter perintah diperlukan seperti yang terlihat dibawah ini :

tambahan

javac source 1.4 MyProgram.java


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

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

java enableassertions MyProgram

2.6.3 Sintaks Assertions


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

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

Pengenalan Pemrograman 2

11

J.E.N.I.

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

2.7.2 Menampilkan Sebuah Berlian


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

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

Pengenalan Pemrograman 2

12

J.E.N.I.

BAB 3
Teknik Pemrograman Lanjut
3.1 Tujuan
Modul ini mengenalkan suatu teknik pemrograman yang lebih tinggi. Dalam bagian ini
Anda akan mempelajari rekursif dan tipe data abstrak.
Pada akhir pembahasan, diharapkan pembaca dapat :
1. Memahami dan menggunakan rekursif
2. Mengetahui perbedaan antara stacks dan queues
2. Mengimplementasikan suatu implementasi sequensial dari stacks dan queues
3. Mengimplementasikan suatu implementasi linked dari stacks and queues
4. Menggunakan class-class Collection yang ada

3.2 Rekursif
3.2.1 Apa yang dimaksud dengan Rekursif?
Rekursif adalah teknik pemecahan masalah yang powerful dan dapat digunakan ketika
inti dari masalah terjadi berulang kali. Tentu saja, tipe dari masalah ini dapat dipecahkan
mengunakan perkataan berulang-ulang (yaitu, menggunakan konstruksi looping seperti
for, while dan do-while).
Sesungguhnya, iterasi atau perkataan berulang-ulang merupakan peralatan yang lebih
efisien jika dibandingkan dengan rekursif tetapi rekursif menyediakan solusi yang lebih
baik untuk suatu masalah. Pada rekursif, method dapat memanggil dirinya sendiri. Data
yang berada dalam method tersebut seperti argument disimpan sementara ke dalam
stack sampai method pemanggilnya diselesaikan.

3.2.2 Rekursif Vs. Iterasi


Untuk pengertian yang lebih baik dari rekursif, mari kita lihat pada bagaimana macammacam dari teknik iterasi. Dalam teknik-teknik tersebut juga dapat kita lihat
penyelesaian sebuah loop yang lebih baik menggunakan rekursif daripada iterasi.
Penyelesaian masalah dengan perulangan menggunakan iterasi secara tegas juga
digunakan pada struktur kontrol pengulangan. Sementara itu, untuk rekursif, task
diulangi dengan memanggil sebuah method perulangan. Maksud dari hal tersebut
adalah untuk menggambarkan sebuah masalah ke dalam lingkup yang lebih kecil dari
perulangan itu sendiri. Pertimbangkan penghitungan faktorial dalam penentuan bilangan
bulat. Definisi rekursif dari hal tersebut dapat diuraikan sebagai berikut: factorial(n) =
factorial(n-1) * n; factorial(1) = 1. Sebagai contohnya, nilai faktorial dari 2 sama dengan
fatorial (1)*2, dimana hasilnya adalah 2. Faktorial dari 3 adalah 6, dimana sama dengan
faktorial dari (2)*3.

Pengenalan Pemrograman 2

J.E.N.I.

Gambar 1: Contoh Factorial

Dengan iterasi, proses diakhiri ketika kondisi loop gagal atau salah. Dalam kasus dari
penggunaan rekursif, proses yang berakhir dengan kondisi tertentu disebut
permasalahan dasar yang telah tercukupi oleh suatu pembatasan kondisi. Permasalahan
yang mendasar merupakan kejadian yang paling kecil dari sebuah masalah. Sebagai
contoh, dapat dilihat pada kondisi rekursif pada faktorial, kasus yang mudah adalah
ketika masukannya adalah 1. 1 dalam kasus ini merupakan dasar dari masalah.
Penggunaan dari iterasi dan rekursif dapat bersama-sama memandu loops jika hal ini
tidak digunakan dengan benar.
Keuntungan iterasi dibandingkan rekursif adalah performance yang lebih baik. Hal
tersebut lebih cepat untuk rekursif sejak terbentuknya sebuah parameter pada sebuah
method yang menyebabkan adanya suatu CPU time. Bagaimanapun juga, rekursif
mendorong pelatihan perancangan software yang lebih baik, sebab teknik ini biasanya
dihasilkan dalam kode yang singkat yang lebih mudah untuk dimengerti dan juga
mempromosikan reusability pada suatu solusi yang sebelumnya telah diterapkan.
Memilih antara iterasi dan rekursif merupakan permasalahan dari menjaga
keseimbangan antara baiknya sebuah performance dan baiknya perancangan software.

3.2.3 Faktorial: Contoh


Listing program berikut ini menunjukkan bagaimana menghitung faktorial menggunakan
teknik iterasi.
class FactorialIter {
static int factorial(int n) {
int result = 1;
for (int i = n; i > 1; i--) {
result *= i;
}
Pengenalan Pemrograman 2

J.E.N.I.

return result;
}
public static void main(String args[]) {
int n = Integer.parseInt(args[0]);
System.out.println(factorial(n));
}
}
Dibawah ini merupakan listing program yang sama tetapi menggunakan rekursif.
class FactorialRecur {
static int factorial(int n) {
if (n == 1) {
/* The base case */
return 1;
}
/* Recursive definition; Self-invocation */
return factorial(n-1)*n;
}
public static void main(String args[]) {
int n = Integer.parseInt(args[0]);
System.out.println(factorial(n));
}
}

3.2.4 Print n in any Base: Contoh yang lain


Sekarang, mempertimbangkan dari masalah dalam pencetakkan suatu angka desimal
yang nilai basenya telah ditetapkan oleh pengguna. Ingat bahwa solusi dalam hal ini
untuk menggunakan repetitive division dan untuk menulis sisa perhitungannya. Proses
akan berakhir ketika sisa hasil pembagian kurang dari base yang ditetapkan. Dapat
diasumsikan jika nilai input desimal adalah 10 dan kita akan mengkonversinya menjadi
base 8. Inilah solusinya dengan perhitungan menggunakan pensil dan kertas.

Dari solusi diatas, 10 adalah sama dengan 12 base 8.


Contoh berikutnya. Nilai input desimalnya adalah 165 dan akan dikonversi ke base 16.

Pengenalan Pemrograman 2

J.E.N.I.

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

Berikut ini merupakan solusi iterative untuk masalah diatas.


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

Pengenalan Pemrograman 2

J.E.N.I.

3.3 Tipe Data Abstract


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

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

n-1
...
6
5

Jayz

KC

Jojo

Toto

Kyla

DMX

top

bottom

Tabel 1.2.2: Ilustrasi Stack

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

Pengenalan Pemrograman 2

J.E.N.I.

3.3.3 Queues
Queues adalah contoh lain dari ADT. Hal ini merupakan perintah pengumpulan data yang
disebut first-in, first-out. Aplikasi ini meliputi tugas penjadwalan dalam sistem operasi,
topological sorting dan graph traversal.
Enqueue dan dequeue merupakan operasi yang berhubungan dengan queues. Enqueue
menunjuk pada memasukkan data pada akhir queue sedangkan dequeue berarti
memindahkan elemen dari queue tersebut. Untuk mengingat bagaimana queue bekerja,
ingatlah arti khusus dari queue yaitu baris. Berikut ini bagaimana cara kerja queue.
Siapa yang akan mendapatkan kesempatan pertama untuk bertemu bintang idolanya
dari mereka yang sedang menunggu dalam sebuah barisan? Seharusnya orang pertama
yang berada pada barisan tersebut. Orang ini mendapat kesempatan pertama untuk
meninggalkan barisan. Hubungkan hal tersebut dengan bagaimana queue bekerja.
Berikut ini merupakan ilustrasi dari bagaimana tampilan dari queue.
0

Eve

Jayz

KC

Jojo

Toto

Kyla

DMX

front

end

...

n-1

Insert
Delete

Tabel 1.2.3: Ilustrasi Queue

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

3.3.4 Sequential and Linked Representation


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

3.3.5 Sequential Representation dari Integer Stack


class SeqStack {
int top = -1;
int memSpace[];
int limit;
Pengenalan Pemrograman 2

/* pada permulaan, stack kosong*/


/* penyimpanan untuk integer */
/* ukuran dari memSpace */
6

J.E.N.I.

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

3.3.6 Linked Lists


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

Pengenalan Pemrograman 2

J.E.N.I.

Gambar dibawah ini menunjukkan tampilan dari node.

Gambar 2.6a: Sebuah node

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

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

Berikut ini bagaimana class node diimplementasikan. Class ini dapat digunakan untuk
membuat linked list.
class Node {
int data;
Node nextNode;
}

/* integer data diisikan dalam node */


/* node selanjutnya dalam list */

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

Pengenalan Pemrograman 2

J.E.N.I.

3.3.7 Linked Representation dari Integer Stack


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

/* head atau puncak dari stack */


/* class node */

void push(int n){


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

Pengenalan Pemrograman 2

J.E.N.I.

Gambar 1.2.7: Implementasi linked dari stack

3.3.8 Java Collections


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

<root interface>
Collection
<interface>
Set
<implementing classes>
HashSet
LinkedHashSet
TreeSet

<interface>
List
<implementing classes>
ArrayList
LinkedList
Vector

Tabel 1.2.8a: Java collections

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

10

J.E.N.I.

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

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

Pengenalan Pemrograman 2

11

J.E.N.I.

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

Pengenalan Pemrograman 2

12

J.E.N.I.

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

Gambar 1.2.8: Contoh TreeSet

Pengenalan Pemrograman 2

13

J.E.N.I.

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

3.4.2 Sequential Representation dari Integer Queue


Dengan menggunakan array, implementasikan sebuah integer queue seperti contoh
pada sequential stack.

3.4.3 Linked Representation dari Integer Queue


Dengan menggunakan ide dari linked list, implementasikan sebuah integer queue
dinamis seperti integer stack dinamis yang diperkenalkan seperti contoh berikut.

3.4.4 Address Book


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

Pengenalan Pemrograman 2

14

J.E.N.I.

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

Math

String

StringBuffer

Wrapper

Process

System

4.2 Class Math


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

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

J.E.N.I.

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

Pengenalan Pemrograman 2

J.E.N.I.

Di bawah ini adalah program yang menunjukkan bagaimana method-method tersebut


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

Pengenalan Pemrograman 2

J.E.N.I.

4.3 Class String dan StringBuffer


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

4.3.1

Constructor String

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

4.3.2

Method-method String

Di bawah ini adalah daftar dari method-method String.


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

J.E.N.I.

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

Perhatikan bagaimana method-method tersebut digunakan dalam program di bawah ini.


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

J.E.N.I.

System.out.println("Jonathan compared to jonathan (ignore


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

Pengenalan Pemrograman 2

J.E.N.I.

4.3.3

Class StringBuffer

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

Pengenalan Pemrograman 2

J.E.N.I.

Program di bawah ini menunjukkan bagaimana menggunakan method-method tersebut.


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

Pengenalan Pemrograman 2

J.E.N.I.

4.4 Class-class Wrapper


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

Tipe Data Primitive

Class Wrapper yang Sesuai

Boolean

Boolean

Char

Character

Byte

Byte

Short

Short

Int

Integer

Long

Long

Float

Float

Double

Double
Tabel 1.3: Tipe data primitif dan class wrappernya yang sesuai

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

Pengenalan Pemrograman 2

J.E.N.I.

4.5 Class Process dan Runtime


4.5.1

Class Process

class Process menyediakan method-method untuk memanipulasi proses-proses, seperti


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

4.5.2

Class Runtime

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

lingkungan

runtime

yang

public Process exec(String command) throws IOException


Disebabkan command yang ditentukan untuk dieksekusi. Memperbolehkan Anda
mengeksekusi proses baru.
Tabel 1.4.2: Beberapa method dari class Runtime

4.5.3

Membuka Registry Editor

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

10

J.E.N.I.

}
}

Gambar 1.4.3: Membuka registry editor

4.6 Class System


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

11

J.E.N.I.

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

Ini adalah demo dari beberapa method-method tersebut.


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

Pengenalan Pemrograman 2

12

J.E.N.I.

4.7 Latihan
4.7.1

Evaluasi Ekspresi

Menggunakan method-method class built-in Math, buatlah sebuah program yang


menggunakan nilai double x sebagai inputan dan evaluasilah nilai mutlak dari ekspresi
yang mengikuti.
x2 * cos(45derajat) + akar(e), e adalah angka Euler.
Input:
Output:
Input:
Output:

4.7.2

10
72.35939938935488
11
87.20864179427238

Palindrome

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

4.7.3

Notepad

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

Pengenalan Pemrograman 2

13

J.E.N.I.

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

5.2 Argument Command-Line dan System Properties


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

Pengenalan Pemrograman 2

J.E.N.I.

public static String getProperty(String key)


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

Tabel 1.1: getProperty() method dari class System

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

5.3 Membaca Standard Input


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

Pengenalan Pemrograman 2

J.E.N.I.

dalam Java. Contoh pertama mereferensikan pada keyboard, kemudian contoh


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

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

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

Cobalah contoh kode berikut :

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

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

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

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

Pengenalan Pemrograman 2

J.E.N.I.

BufferedReader br = new BufferedReader(new


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

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

5.4 Menangani File


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

5.4.1 Membaca sebuah File


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

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

Pengenalan Pemrograman 2

J.E.N.I.

Berikut ini contohnya :


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

5.4.2 Menulis sebuah file


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

Pengenalan Pemrograman 2

J.E.N.I.

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

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

Program berikut menunjukkan contoh penulisan terhadap file :

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

Pengenalan Pemrograman 2

J.E.N.I.

}
}

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

Pengenalan Pemrograman 2

J.E.N.I.

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

6.2 Insertion Sort


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

Pengenalan Pemrograman 2

J.E.N.I.

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

6.2.2 Sebuah Contoh


Data

1st Pass

2nd Pass

3rd Pass

4th Pass

Mango

Mango

Apple

Apple

Apple

Apple

Apple

Mango

Mango

Banana

Peach

Peach

Peach

Orange

Mango

Orange

Orange

Orange

Peach

Orange

Banana

Banana

Banana

Banana

Peach

Gambar 1.1.2: Contoh insertion sort

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

6.3 Selection Sort


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

Pengenalan Pemrograman 2

J.E.N.I.

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

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

6.3.2 Sebuah Contoh


Data

1st Pass

2nd Pass

3rd Pass

4th Pass

Maricar

Hannah

Hannah

Hannah

Hannah

Vanessa

Vanessa

Margaux

Margaux

Margaux

Margaux

Margaux

Vanessa

Maricar

Maricar

Hannah

Maricar

Maricar

Vanessa

Rowena

Rowena

Rowena

Rowena

Rowena

Vanessa

Figure 1.2.2: Contoh selection sort

6.4 Merge Sort


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

6.4.1 Pola Divide and Conquer


Beberapa algoritma mengimplementasikan konsep rekursif untuk menyelesaikan
permasalahan. Permasalahan utama kemudian dipecah menjadi sub-masalah,

Pengenalan Pemrograman 2

J.E.N.I.

kemudian solusi dari sub-masalah akan membimbing menuju solusi permasalahan


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

6.4.2 Memahami Merge Sort


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

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

Pengenalan Pemrograman 2

J.E.N.I.

6.4.4 Sebuah Contoh


Rangkaian data:
7

Membagi rangkaian menjadi dua bagian:


LeftArr RightArr

7 2

5 6

Membagi LeftArr menjadi dua bagian:


LeftArr RightArr

Mengkombinasikan
2

Membagi RightArr menjadi dua bagian:


LeftArr RightArr
Mengkombinasikan
5

Mengkombinasikan LeftArr dan RightArr.


2

7
Gambar 1.3.4: Contoh merge sort

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

Pengenalan Pemrograman 2

J.E.N.I.

2. Conquer
Mengurutkan elemen pada sub-rangkaian secara rekursif

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

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

6.5.2 Sebuah Contoh


Rangkaian data:
3

Pilih sebuah elemen yang akan menjadi elemen pivot.


3

Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen
akhir.
kiri
3

kanan
4

Geser elemen kiri kearah kanan sampai ditemukan nilai yang lebih besar dari elemen
pivot tersebut. Geser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen
yang tidak lebih besar dari elemen tersebut.
kiri
3

kanan
1

Tukarkan antara elemen kiri dan kanan


kiri
3

Pengenalan Pemrograman 2

kanan
1

J.E.N.I.

Geserkan lagi elemen kiri dan kanan.


kiri
3

kanan
9

Tukarkan antar elemen kembali.


kiri
3

kanan
9

Geserkan kembali elemen kiri dan kanan.


3

kanan

kiri

Terlihat bahwa titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen
kanan < elemen kiri. Dalam hal ini tukarkan elemen pivot dengan elemen kanan.
pivot
2

Gambar 1.4.2: Contoh quicksort

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

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

6.6.2 Selection Sort

Pengenalan Pemrograman 2

J.E.N.I.

Impelementasikan algoritma selection sort dalam Java untuk mengurutkan


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

6.6.3 Merge Sort


Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.

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

6.6.4 Quicksort

Pengenalan Pemrograman 2

J.E.N.I.

Gunakan implementasi quicksort berikut ini terhadap serangkaian data integer.


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

Pengenalan Pemrograman 2

J.E.N.I.

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

7.2 Abstract Windowing Toolkit (AWT) vs. Swing


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

7.3 Komponen GUI pada AWT

Pengenalan Pemrograman 2

J.E.N.I.

7.3.1 Window Classes Fundamental


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

Class AWT

Deskripsi

Komponen

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

Kontainer

Abstract Subclass dari Component Class. Sebuah komponen yang dapat


menampung komponen yang lainnya.

Panel

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

Window

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

Frame

Turunan dari window class. Window dengan judul, menubar, border dan
pengatur ukuran di pojok. Memiliki empat constructor , dua diantaranya
memiliki penulisan seperti dibawah ini :
Frame()
Frame(String title)

Tabel 1.2.1: Class kontainer AWT

Untuk mengatur ukuran window, menggunakan method setSize.


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

Pengenalan Pemrograman 2

J.E.N.I.

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

7.3.2 Grafik
Beberapa method grafik ditemukan dalam class Graphic. Dibawah ini adalah daftar dari
beberapa method.
drawLine()

drawPolyline()

setColor()

fillRect()

drawPolygon()

getFont()

drawRect()

fillPolygon()

setFont()

clearRect()

getColor()

drawString()

Tabel 1.2.2a: Beberapa metode dari kelas Graphics

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

Format Constructor

Deskripsi

Color(int r, int g, int b)

Nilai integer 0 - 255.

Color(float r, float g, float b)

Nilai float 0.0 - 1.0.

Color(int rgbValue)

Panjang nilai : 0 ke 224-1 (hitam ke putih).


Red: bits 16-23
Green: bits 8-15
Blue: bits 0-7

Dibawah ini adalah contoh program yang menggunakan beberapa method di dalam class
Graphic.
import java.awt.*;
public class GraphicPanel extends Panel {
GraphicPanel() {
setBackground(Color.black); //Konstanta dalam class Color
}
public void paint(Graphics g) {
g.setColor(new Color(0,255,0));
//hijau
g.setFont(new Font("Helvetica",Font.PLAIN,16));
g.drawString("Hello GUI World!", 30, 100);
g.setColor(new Color(1.0f,0,0));
//red
g.fillRect(30, 100, 150, 10);
}
public static void main(String args[]) {
Frame f = new Frame("Testing Graphics Panel");

Pengenalan Pemrograman 2

J.E.N.I.

GraphicPanel gp = new GraphicPanel();


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

7.3.3 Beberapa komponen AWT


Berikut ini adalah daftar dari kontrol AWT. Kontrol adalah komponen seperti tombol atau
textfield yang mengijinkan user untuk berinteraksi dengan aplikasi GUI. Berikut ini semua
subclass dari class Components.
Label

Button

Choice

TextField

Checkbox

List

TextArea

CheckboxGroup

Scrollbar

Tabel 1.2.3: Komponen AWT

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

Pengenalan Pemrograman 2

J.E.N.I.

fwc.setVisible(true);
}
}

7.4 Layout Manager


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

7.4.1 FlowLayout Manager


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

Pengenalan Pemrograman 2

J.E.N.I.

FlowLayout Constructors
FlowLayout(int align, int hgap, int vgap)
Membuat object baru FlowLayout dengan argumen pertama sebagai posisi pada komponen
dan hgap untuk horizontal dan vgap untuk vertikal pada komponen

Tabel 1.3.1: Constructor FlowLayout

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

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

Bagaimanakah output dari program berikut?


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

Tabel 13.1: Contoh hasil dalam window

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

J.E.N.I.

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

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

Tabel 1.3.2: Constructor BorderLayout

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

Untuk menambahkan komponen kedalam region yang spesifik, gunakan method


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

BorderLayout.NORTH
BorderLayout.SOUTH
BorderLayout.EAST
BorderLayout.WEST
BorderLayout.CENTER

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

J.E.N.I.

Gambar 1.3.2: hasil contoh program

7.4.3 GridLayout Manager


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

Berikut ini adalah daftar dari constructor untuk class GridLayout.


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

Cobalah program ini.


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

J.E.N.I.

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

Gambar 1.3.3: hasil contoh program

7.4.4 Panel dan Tampilan kompleks


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

Perhatikan teknik yang digunakan pada contoh berikut.


import java.awt.*;

Pengenalan Pemrograman 2

J.E.N.I.

class ComplexLayout extends Frame {


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

Berikut ini adalah output dari program.

Pengenalan Pemrograman 2

10

J.E.N.I.

Gambar 1.3.4: Hasil dari contoh program

7.5 Komponen Swing


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

Komponen
Swing

Penjelasan

JComponent

class induk untuk semua komponen Swing, tidak termasuk top-level


kontainer

JButton

Tombol push. Berhubungan dengan class button dalam package AWT

JCheckBox

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

JFileChooser

Mengijinkan pengguna untuk memilih sebuah file. Berhubungan dengan


class filechooser dalam package AWT

Pengenalan Pemrograman 2

11

J.E.N.I.

Komponen
Swing

Penjelasan

JTextField

Mengijinkan untuk mengedit text satu baris. Berhubungan dengan class


textfield dalam package AWT.

JFrame

Turunan dan Berhubungan dengan class frame dalam package AWT tetapi
keduanya sedikit tidak cocok dalam kaitannya dengan menambahkan
komponen pada kontainer. Perlu mendapatkan content pane yang terbaru
sebelum menambah sebuah komponen.

JPanel

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


Berhubungan dengan class panel dalam package AWT.

JApplet

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

JOptionPane

Turunan Jcomponent. Disediakan untuk mempermudah menampilkan popup kotak dialog.

JDialog

Turunan dan Berhubungan dengan class dialog dalam package AWT.


Biasanya digunakan untuk menginformasikan sesuatu kepada pengguna
atau prompt pengguna untuk input.

JColorChooser

Turunan Jcomponent. Memungkinkan pengguna untuk memilih warna yang


diinginkan.
Tabel 1.4: Beberapa komponen Swing

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

7.5.1 Setting Up Top-Level Containers


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

7.5.2 Contoh Jframe


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

Pengenalan Pemrograman 2

12

J.E.N.I.

panel = new JPanel();


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

Petunjuk penulisan program:


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

Gambar 1.4.2: Hasil contoh program

7.5.3 Contoh JOptionPane


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

Pengenalan Pemrograman 2

13

J.E.N.I.

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

Lihat, begitu mudahnya memasukkan input dari user.


Berikut ini adalah hasil dari contoh program diatas

Gambar 1.4.3: Hasil contoh program

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

Gambar 1.5.1: papan Tic-Tac-Toe

Pengenalan Pemrograman 2

14

J.E.N.I.

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

8.2 Delegation Event Model


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

Pengenalan Pemrograman 2

J.E.N.I.

Di bawah ini adalah delegation event model.

Gambar 8.1: Delegation Event Model

Pada awalnya, sebuah listener seharusnya diregistrasikan dengan sebuah source


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

Pengenalan Pemrograman 2

J.E.N.I.

8.2.1 Registrasi Listeners


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

8.3 Class-Class Event


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

Class Event

Deskripsi

ComponentEvent Extends
AWTEvent.
Dijalankan
ketika
sebuah
dipindahkan, di-resize, dibuat visible atau hidden.

komponen

InputEvent

Extends ComponentEvent. Abstrak root class event untuk semua


komponen-level input class-class event.

ActionEvent

Extends AWTEvent. Dijalankan ketika sebuah tombol ditekan,


melakukan double-klik daftar item, atau memilih sebuah menu.

ItemEvent

Extends AWTEvent. Dijalankan ketika sebuah item dipilih atau dideselect oleh user, seperti sebuah list atau checkbox.

KeyEvent

Extends InputEvent. Dijalankan ketika sebuah key ditekan, dilepas


atau diketikkan.

MouseEvent

Extends InputEvent. Dijalankan ketika sebuah tombol mouse


ditekan, dilepas, atau di-klik (tekan dan lepas), atau ketika sebuah
kursor mouse masuk atau keluar dari bagian visible dari komponen.

TextEvent

Extends AWTEvent. Dijalankan ketika nilai dari text field atau text
area dirubah.

WindowEvent

Extends ComponentEvent. Dijalankan sebuah object Window dibuka,


ditutup, diaktifkan, nonaktifkan, iconified, deiconified, atau ketika
focus ditransfer kedalam atau keluar window.
Tabel 1.2: Class-Class Event

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


ini:
<Type>Event
Pengenalan Pemrograman 2

J.E.N.I.

8.4 Event Listeners


Event listeners adalah class yang mengimplementasikan interfaces <Type>Listener.
Tabel di bawah menunjukkan beberapa listener interfaces yang biasanya digunakan.
Event Listeners

Deskripsi

ActionListener

Bereaksi atas perubahan mouse atau atau keyboard.

MouseListener

Bereaksi atas pergerakan mouse.

MouseMotionListener

Interface MouseMotionListener mendukung MouseListener.


Menyediakan method-method yang akan memantau pergerakan
mouse,seperti drag dan pemindahan mouse.

WindowListener

Bereaksi atas perubahan window.


Tabel 1.3: Event Listeners

8.4.1 Method ActionListener


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

8.4.2 Method MouseListener


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

Pengenalan Pemrograman 2

J.E.N.I.

8.4.3 Method-Method MouseMotionListener


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

8.4.4 Method-Method WindowListener


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

Pengenalan Pemrograman 2

J.E.N.I.

8.4.5 Petunjuk untuk Menciptakan Aplikasi Handling GUI Events


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

8.4.6 Contoh Mouse Events


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

J.E.N.I.

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

8.4.7 Contoh Menutup Window


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

class CloseFrame extends Frame implements WindowListener {


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

Pengenalan Pemrograman 2

J.E.N.I.

public static void main(String args[]) {


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

8.5 Class-class Adapter Class


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

8.5.1 Close Window Example


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

class CFListener extends WindowAdapter{


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

Pengenalan Pemrograman 2

J.E.N.I.

8.6 Inner Class dan Anonymous Inner Class


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

8.6.1 Inner Class


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

8.6.2 Contoh Menutup Window


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

Pengenalan Pemrograman 2

J.E.N.I.

8.6.3 Anonymous Inner Class


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

8.6.4 Contoh Menutup Window


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

Pengenalan Pemrograman 2

10

J.E.N.I.

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

Gambar 8.2 : Program Tic-Tac-Toe

Pengenalan Pemrograman 2

11

J.E.N.I.

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

9.2 Definisi dan dasar-dasar thread


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

Pengenalan Pemrograman 2

J.E.N.I.

Gambar 1.1: Thread

9.2.2 State dari Thread


Sebuah thread memungkinkan untuk memiliki beberapa state:
1. Running
Sebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari CPU.
2. Ready to run
Thread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk
melakukannya.
3. Resumed
Setelah sebelumnya di block atau diberhentikan sementara, state ini kemudian siap
untuk dijalankan.
4. Suspended
Sebuah thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk
menjalankan thread lain bekerja.
5. Blocked
Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu berjalan,
karena ia akan menunggu sebuah resource tersedia atau sebuah event terjadi.

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

Pengenalan Pemrograman 2

J.E.N.I.

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

9.3 Class Thread


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

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

J.E.N.I.

ini adalah rangkuman dari class Thread.


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

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

jangka

waktu

milis.

Hal

ini

dapat

menyebabkan

public void run()


Eksekusi thread dimulai dari method ini.
public void start()
Menyebabkan eksekusi dari thread berlangsung dengan cara memanggil method run.

Pengenalan Pemrograman 2

J.E.N.I.

Tabel 1.2.3: Method-method dari Thread

9.3.4 Sebuah contoh thread


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

9.4 Membuat Threads


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

9.4.1 Menurunkan (extend) class Thread


Contoh berikut ini adalah user akan mendefinisikan sebuah class Thread yang akan
menuliskan nama dari sebuah object thread sebanyak 100 kali.
class PrintNameThread extends Thread {

Pengenalan Pemrograman 2

J.E.N.I.

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

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

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

PrintNameThread("A");
PrintNameThread("B");
PrintNameThread("C");
PrintNameThread("D");

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

9.4.2 Mengimplementasikan interface Runnable


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

J.E.N.I.

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

9.4.3 Extend vs Implement


Dari dua cara untuk menciptakan thread seperti diatas, memilih salah satu dari kedua
cara tersebut bukanlah sebuah permasalahan. Implement sebuah interface Runnable
menyebabkan lebih banyak pekerjaan yang harus dilakukan karena kita harus
mendeklarasikan sebuah object Thread dan memanggil method Thread dari object ini.
Sedangkan menurunkan (extend) sebuah class Thread, bagaimanapun menyebabkan
class Anda tidak dapat menjadi turunan dari class yang lainnya karena Java tidak
memperbolehkan adanya multiple inheritance. Sebuah pilihan antara mudah tidaknya
untuk diimplementasikan (implement) dan kemungkinan untuk membuat turunan
(extend) adalah sesuatu yang harus Anda tentukan sendiri. Perhatikan mana yang lebih
penting bagi Anda karena keputusan ada ditangan Anda.

Pengenalan Pemrograman 2

J.E.N.I.

9.4.4 Sebuah contoh penggunaan method join


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

Pengenalan Pemrograman 2

J.E.N.I.

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

9.5.1 Sebuah contoh yang tidak disinkronisasi


Marilah kita perhatikan sebuah kode sederhana yang mencetak sebuah string dengan
urutan tertentu. Berikut ini adalah listing program tersebut :
class TwoStrings {
static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
class PrintStringsThread implements Runnable {
Thread thread;
String str1, str2;
PrintStringsThread(String str1, String str2) {
this.str1 = str1;
this.str2 = str2;
thread = new Thread(this);
thread.start();
}
public void run() {
TwoStrings.print(str1, str2);
}
}
class TestThread {
public static void main(String args[]) {
new PrintStringsThread("Hello ", "there.");
new PrintStringsThread("How are ", "you?");
new PrintStringsThread("Thank you ", "very much!");
}
}
Program ini diharapkan dapat mencetak dua argument object Runnable secara

Pengenalan Pemrograman 2

J.E.N.I.

berurutan. Permasalahannya adalah, pendeklarasian method sleep akan menyebabkan


thread yang lain akan dieksekusi walaupun thread yang pertama belum selesai
dijalankan pada saat eksekusi method print dari class TwoStrings. Berikut ini adalah
contoh dari keluarannya.
Hello How are Thank you there.
you?
very much!
Pada saat berjalan, ketiga thread telah mencetak argument string pertama mereka
sebelum argument kedua dicetak. Sehingga hasilnya adalah sebuah keluaran yang tidak
jelas.
Sebenarnya, pada contoh diatas, tidak menunjukkan permasalahan yang serius. Akan
tetapi pada aplikasi yang lain hal ini dapat menimbulkan exception atau permasalahanpermasalahan tertentu.

9.5.2 Mengunci Object


Untuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam
method tertentu, Java memperbolehkan penguncian terhadap sebuah object termasuk
method-method-nya dengan menggunakan monitor. Object tersebut akan menjalankan
sebuah monitor implicit pada saat object dari method sinkronisasi dipanggil. Sekali
object tersebut dimonitor, monitor tersebut akan memastikan bahwa tidak ada thread
yang akan mengakses object yang sama. Sebagai konsekuensinya, hanya ada satu
thread dalam satu waktu yang akan mengeksekusi method dari object tersebut.
Untuk sinkronisasi method, kata kunci yang dipakai adalah synchronized yang dapat
menjadi header dari pendefinisian method. Pada kasus ini dimana Anda tidak dapat
memodifikasi source code dari method, Anda dapat mensinkronisasi object dimana
method tersebut menjadi anggota. Syntax untuk mensinkronisasi sebuah object adalah
sebagai berikut:
synchronized (<object>) {
//statements yang akan disinkronisasikan
}
Dengan ini, object dari method tersebut hanya dapat dipanggil oleh satu thread pada
satu waktu.

9.5.3 Contoh Synchronized Pertama


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

Pengenalan Pemrograman 2

10

J.E.N.I.

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

9.5.4 Contoh Synchronized Kedua


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

Pengenalan Pemrograman 2

11

J.E.N.I.

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

9.6 Komunikasi antar thread (Interthread)


Pada bagian ini, Anda akan mempelajari mengenai method-method dasar yang
digunakan thread untuk berkomunikasi dengan thread lain yang sedang berjalan.
Method-method untuk komunikasi Interthread
public final void wait()
Menyebabkan thread ini menunggu sampai thread yang lain memanggil notify atau
notifyAll method dari object ini. Hal ini dapat menyebabkan InterruptedException.
public final void notify()
Membangunkan thread yang telah memanggil method wait dari object yang sama.
public final void notifyAll()
Membangunkan semua thread yang telah memanggil method wait dari object yang
sama.
Tabel 1.5: Methods untuk komunikasi Interthread

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

Pengenalan Pemrograman 2

12

J.E.N.I.

siap untuk memesan. Akan sangat mengganggu apabila pelayan


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

Gambar 1.5: Skenario Pelayan-Pelanggan

9.6.1 Contoh Produsen-Konsumen


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

Pengenalan Pemrograman 2

13

J.E.N.I.

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

Pengenalan Pemrograman 2

8
45
52
65
23
49

14

J.E.N.I.

Get 49
Generate
Get 35
Generate
Get 39
Generate
Get 85
Get 85
Get 85
Generate
Get 35
Get 35

35
39
85

35

Hasil tersebut bukanlah hasil yang kita harapkan. Kita berharap bahwa setiap nilai yang
diproduksi oleh produser dan juga kita akan mengansumsikan bahwa konsumen akan
mendapatkan nilai tersebut. Dibawah ini adalah keluaran yang kita harapkan.
Generate
Get 76
Generate
Get 25
Generate
Get 34
Generate
Get 84
Generate
Get 48
Generate
Get 29
Generate
Get 26
Generate
Get 86
Generate
Get 65
Generate
Get 38
Generate
Get 46

76
25
34
84
48
29
26
86
65
38
46

Untuk memperbaiki kode diatas, kita akan menggunakan method untuk komunikasi
interthread. Implementasi dibawah ini adalah implementasi dari permasalahan produsen
konsumen dengan menggunakan method untuk komunikasi interthread.
class SharedData {
int data;
boolean valueSet = false;
synchronized void set(int value) {
if (valueSet) { //baru saja membangkitkan sebuah nilai
try {
wait();
} catch (InterruptedException ie) {
}
}
System.out.println("Generate " + value);
data = value;

Pengenalan Pemrograman 2

15

J.E.N.I.

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

Pengenalan Pemrograman 2

16

J.E.N.I.

9.7 Kemampuan Concurrency


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

9.7.1 Interface Executor


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

Pengenalan Pemrograman 2

17

J.E.N.I.

Factory Method dari class Executor


public static ExecutorService newCachedThreadPool()
Menciptakan sebuah pool thread yang akan menciptakan thread sesuai yang
dibutuhkan, atau ia akan menggunakan kembali thread yang telah dibangun
sebelumnya, apabila tersedia. Sebuah method overloading, juga akan menggunakan
object ThreadFactory sebagai argument.
public static ExecutorService newFixedThreadPool(int nThreads)
Menciptakan sebuah pool thread yang dapat digunakan kembali untuk membetulkan
sebuah thread yang berada didalam antrian yang tidak teratur. Sebuah overloading
method, akan menggunakan object ThreadFactory sebagai tambahan parameter.
public static ScheduledExecutorService newScheduledThreadPool(int
corePoolSize)
Menciptakan sebuah pool thread yang akan menjadwalkan command yang akan
berjalan setelah diberikan sebuah delay, atau untuk mengeksekusi secara periodic.
Sebuah overloading method, akan menggunakan object ThreadFactory sebagai
tambahan parameter.
public static ExecutorService newSingleThreadExecutor()
Menciptakan sebuah Executor yang digunakan sebagai satu-satu-nya pelaksana dari
sebuah antrian thread yang tidak teratur. Sebuah overloading method, juga akan
menggunakan object ThreadFactory sebagai tambahan parameter.
public static ScheduledExecutorService newSingleThreadScheduledExecutor()
Menciptakan sebuah Executor thread yang akan menjadwalkan command untuk
dijalankan setelah delay tertentu, atau dieksekusi secara periodic. Sebuah overloading
method, juga akan menggunakan object ThreadFactory sebagai tambahan parameter
Tabel 1.1: Factory Method didalam class Executor

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

9.7.2 Interface Callable


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

18

J.E.N.I.

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

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

19

J.E.N.I.

mencetak string yang dituliskan oleh user. String ini akan ditampilkan secara terus
menerus dan program Anda harus memberikan ilustrasi bahwa string tersebut bergerak
dari kiri ke kanan. Untuk memastikan bahwa proses perpindahannya tidak terlalu cepat,
Anda sebaiknya menggunakan method sleep dari class Thread.
Berikut ini adalah sebuah contoh dimana Anda menuliskan Your name here!.

Gambar 1.6.1: Contoh pergerakan string

Pengenalan Pemrograman 2

20

J.E.N.I.

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

10.1 Konsep Dasar Jaringan


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

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

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

Pengenalan Pemrograman 2

J.E.N.I.

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

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

10.1.4 Paradigma client/server


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

Pengenalan Pemrograman 2

J.E.N.I.

Gambar1.1.4: Model Client/Server

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

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

10.2 The Java Networking Package


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

10.2.1 Class ServerSocket dan Socket


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

Pengenalan Pemrograman 2

J.E.N.I.

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

Berikut ini adalah beberapa method class pada ServerSocket :

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

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

Pengenalan Pemrograman 2

J.E.N.I.

//1234 nomor port yang belum digunakan


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

Berikut adalah beberapa dari method class pada Socket :

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

Pengenalan Pemrograman 2

J.E.N.I.

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

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

10.2.2 Class MulticastSocket dan DatagramPacket


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

Pengenalan Pemrograman 2

J.E.N.I.

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

Tabel 1.2.2a: Constructor MulticastSocket

Tabel berikutnya memberikan penjelasan beberapa method MulticastSocket.

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

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

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

Pengenalan Pemrograman 2

J.E.N.I.

Berikut adalah beberapa method dari class DatagramPacket.

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

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

Pengenalan Pemrograman 2

J.E.N.I.

InetAddress group = InetAddress.getByName("234.5.6.7");


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

10.3 Latihan
10.3.1 Trivia Server
Buatlah sebuah server yang berisi satu set pertanyaan yang mudah. Secara sederhana, akan
ada sekitar 5-10 pertanyaan.
Client yang terhubung ke server mengirim sebuah permintaan untuk sebuah pertanyaan atau
jawaban sebuah pertanyaan, Client mengirim pesan permintaan. Untuk jawaban dari sebuah
pertanyaan, client mengirim pesan jawaban. Ketika menerima pesan permintaan, secara
acak server akan memilih satu pertanyaan dari koleksi yang ada. Dia mengirimkan pertanyaan
yang dipilih sesuai dengan nomor yang bersangkutan kepada client.
Ketika server menerima pesan jawaban dari client, dia menginformasikan user bahwa user
perlu mengirimkan jawaban sesuai dengan nomor pertanyaan kepada server. Jawaban itu
harus dalam format <no pertanyaan>#<jawaban Anda>.
Berikut adalah contoh skenario :
Client: "permintaan"
Server: "3#Siapa pembuat Java?"
Client: "jawaban"
Server: "Berikan jawabanmu dengan format: <nomor pertanyaanr>#<jawaban Anda>"
Client: "3#James Gosling"
Server: Kerja yang bagus!
...

Pengenalan Pemrograman 2

J.E.N.I.

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

Pada akhir pembahasan, diharapkan pembaca dapat :


1. Mendefinisikan apa yang dimaksud dengan applet
2. Membuat applet sendiri
3. Mengetahui siklus yang terdapat pada applet

init
start
stop
destroy

4. Menggunakan method applet yang lain

paint

showStatus

Method untuk memainkan sebuah audio clip

5. Memahami tag html pada applet

11.2

Membentuk Applet

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

11.2.1 Hello World Applet


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

Pengenalan Pemrograman 2

J.E.N.I.

/* masukkan bagian ini dalam kode html


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

Gambar 1.1.1: Contoh Applet

Ketika membuat sebuah applet, diharuskan meng-extend class Applet. Sebagaimana


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

Pengenalan Pemrograman 2

J.E.N.I.

11.3 Method-Method Applet


Bagian ini membahas manfaat-manfaat method applet.

11.3.1 Siklus Applet (The Applet Life Cycle)


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

Pengenalan Pemrograman 2

J.E.N.I.

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

Pengenalan Pemrograman 2

J.E.N.I.

11.3.2 Method paint


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

11.3.3 Method ShowStatus


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

Gambar 1.2.3: contoh showStatus()

Pengenalan Pemrograman 2

J.E.N.I.

11.3.4 Memainkan Klip Audio


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

Pengenalan Pemrograman 2

J.E.N.I.

11.4 Tag-tag Applet HTML


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

Pengenalan Pemrograman 2

J.E.N.I.

Kata kunci Applet HTML Tag


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

Contoh dibawah ini mendemokan bagaimana untuk mengakses parameter tertentu pada
HTML tag.
import java.awt.*;
import java.applet.*;
/*
<applet code="ParamDemo" width=300 height=100>
<param name="myParam" value="Hello world!">
</applet>
*/
public class ParamDemo extends Applet {
public void paint(Graphics g) {
g.drawString(getParameter("myParam"), 80, 25);
}
}
Output dari program ini sama seperti applet Hello World.

Pengenalan Pemrograman 2

J.E.N.I.

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

Pengenalan Pemrograman 2

J.E.N.I.

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

12.2 Tipe-Tipe Stream yang Umum Digunakan


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

12.2.2 Input dan Output Stream


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

Pengenalan Pemrograman 2

J.E.N.I.

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

12.2.3 Node dan Stream Filter


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

Pengenalan Pemrograman 2

J.E.N.I.

12.3 Class File


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

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

Pengenalan Pemrograman 2

J.E.N.I.

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

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

Pengenalan Pemrograman 2

J.E.N.I.

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


}
}
}

12.4 Class Reader


Bagian ini menggambarkan stream karakter yang digunakan untuk membaca.

12.4.1 Method Reader


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

cbuf)- Membaca karakter dan menyimpannya dalam

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

12.4.2 Class Node Reader


Berikut ini adalah beberapa dasar class Reader:

Pengenalan Pemrograman 2

J.E.N.I.

Class-class Node Reader


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

12.4.3 Class-Class Filter Reader


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

Pengenalan Pemrograman 2

J.E.N.I.

12.5 Class-Class Writer


Pada pembahasan ini menjelaskan tentang stream karakter yang digunakan untuk
menulis.

12.5.1 Writer Method


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

12.5.2 Node Writer Classes


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

Pengenalan Pemrograman 2

J.E.N.I.

Node Writer Classes


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

12.5.3 Filter Writer Classes


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

12.6 Contoh Dasar Reader/Writer


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

Pengenalan Pemrograman 2

J.E.N.I.

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

12.7 Merubah Contoh Reader/Writer


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

Pengenalan Pemrograman 2

J.E.N.I.

12.8 Class InputStream


Bagian ini memberikan gambaran perbedaan stream byte yang digunakan membaca.

12.8.1 Method InputStream


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

12.8.2 Class-Class Node InputStream


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

Pengenalan Pemrograman 2

10

J.E.N.I.

Class-class Node InputStream


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

12.8.3 Class-class Filter InputStream


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

Pengenalan Pemrograman 2

11

J.E.N.I.

12.9 Class-Class OutputStream


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

12.9.1 Method OutputStream


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

12.9.2 Class-Class Node OutputStream


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

Pengenalan Pemrograman 2

12

J.E.N.I.

Clas-class Node OutputStream


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

12.9.3 Class-Class Filter OutputStream


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

Pengenalan Pemrograman 2

13

J.E.N.I.

12.10 Contoh Dasar InputStream/OutputStream


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

Pengenalan Pemrograman 2

14

J.E.N.I.

12.11 Contoh Modifikasi


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

Pengenalan Pemrograman 2

15

J.E.N.I.

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

12.12.1 Kata Kunci transient


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

12.12.2 Serialisasi: Menulis Suatu Object Stream


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

Pengenalan Pemrograman 2

16

J.E.N.I.

Contoh dibawah ini menuliskan sebuah object Boolean ke sebuah ObjectOutputStream.


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

12.12.3 Deserialisasi: Membaca Sebuah Object Stream


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

17

J.E.N.I.

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

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

Pengenalan Pemrograman 2

18

J.E.N.I.

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

Mengapresiasikan keuntungan dari generic types


Mendeklarasikan class generic
Menggunakan constrained generic
Mendeklarasikan method generic

13.2 Mengapa Generic?


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

Pengenalan Pemrograman 2

J.E.N.I.

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

13.3 Mendeklarasikan sebuah Class Generic


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

Pengenalan Pemrograman 2

J.E.N.I.

public class GenSample {


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

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

Pengenalan Pemrograman 2

J.E.N.I.

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

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

13.3.2 Meng-compilasi Generic


Untuk meng-compile source codes Java denagn type generic menggunakan JDK (v.

Pengenalan Pemrograman 2

J.E.N.I.

1.5.0), gunakan syntax berikut ini :


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

13.4 Constrained Generic


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

generic

Pengenalan Pemrograman 2

constrained

yang

dapat

memberikan

kita

penambahan
5

J.E.N.I.

pengecekan tipe static.


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

13.5 Mendeklarasikan sebuah Method Generic


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

Pengenalan Pemrograman 2

J.E.N.I.

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

Pengenalan Pemrograman 2

Anda mungkin juga menyukai