Anda di halaman 1dari 345

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 : • Mengindentifikasi perbedaan komponen pada
komputer • Mengetahui tentang bahasa pemrograman komputer dan kategorinya •
Mengetahui alur kerja pembuatan program dan mengaplikasikannya pemecahan masalah •
Mengetahui tentang 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

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. Memory, berdasarkan fungsinya
dibagi menjadi dua yaitu : a. Primary Memory Dipergunakan untuk menyimpan data dan
instruksi dari program yang sedang dijalankan. Biasa juga disebut sebagai RAM.
Karakteristik dari memori primer adalah : o o o Volatil (informasi ada selama
komputer bekerja. dipadamkan, informasi yang disimpannya juga hilang) Berkecepatan
tinggi Akses random (acak) Ketika komputer

b.

Secondary Memory Dipergunakan untuk menyimpan data atau program biner secara
permanen. Karakteristik dari memori sekunder adalah o o o Non volatil 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

2
J.E.N.I.

Memori Utama (RAM) Cepat Mahal Kecil Ya

Memori Sekunder (ROM) Lambat Murah Besar Tidak

Kategori Kecepatan Harga Kapasitas 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-
masingnya dapat saling berkomunikasi.
Pengenalan Pemrograman 1 3
J.E.N.I.

Tanpa ada sistem operasi maka komputer tidak dapat difungsikan sama sekali. 2.
Program Utility, seperti Norton Utility, Scandisk, PC Tools. Program utility
berfungsi untuk membantu atau mengisi kekurangan/kelemahan dari system operasi,
misalnya PC Tools dapat melakukan perintah format sebagaimana DOS, tapi PC Tools
mampu memberikan keterang 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 untuk secara
spesifik apa yang akan 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 4
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. Mendefiniskan
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
Pengenalan Pemrograman 1 5
J.E.N.I.

permasalahan, masalah – masalah yang terjadi harus dapat diketahui dan terdefinisi
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. Langkah – langkah 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?

Pengenalan Pemrograman 1

6
J.E.N.I.

Mengekspresikan cara penyelesaian melalui bahasa manusia : 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

Pengenalan Pemrograman 1

7
J.E.N.I.

1.5.3.1 Simbol Flowchart dan Artinya


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 simbol – simbol yang digunakan dalam menyusun flowchart, kegiatan
yang diwakili serta aturan yang diterapkan dalam penggunaan simbol tersebut :

Simbol

Nama

Pengertian
Simbol ini digunakan untuk melambangkan kegiatan pemrosesan 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.

Simbol Proses

Simbol Input Output (IO)

Merepresentasikan fungsi I/O yang membuat data dapat diproses (input) atau – sebuah
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 Garis Alir

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 terputus – putus dapat ditempatkan pada sisi kanan maupun kiri.

Pengenalan Pemrograman 1

8
J.E.N.I.

Simbol

Nama

Pengertian
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 harus dipilih adalah jalur yang berlabel Yes,
sedangkan jika pemeriksaan menghasilkan keadaan salah, maka jalur yang harus
dipilih adalah jalur yang berlabel No.

Simbol Percabangan

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 konektor digunakan pada waktu menghubungkan suatu langkah dengan langkah
lain dalam sebuah flowchart dengan keadaan on page atau off page. On page connector
digunakan untuk menghubungkan suatu langkah dengan langkah lain dari flowchart
dalam satu halaman, sedangkan off page connector digunakan untuk menghubungkan
suatu langkah dengan langkah lain dari flowchart dalam halaman yang berbeda.
Connector ini biasanya dipakai saat media yang kita gunakan untuk menggambar
flowchart tidak cukup luas untuk memuat gambar secara utuh, jadi perlu
dipisahpisahkan. Dalam sepasang connector biasanya diberi label tertentu yang sama
agar lebih mudah diketahui pasangannya.

Simbol Prosedur

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 Flowchar

Pengenalan Pemrograman 1

9
J.E.N.I.

1.5.4 Pengkodean, Uji Coba dan Pembuatan Dokumentasi


Setelah membentuk algoritma, maka proses pengkodean dapat dimulai. Menggunakan
algoritma sebagai pedoman, maka kode program dapat ditulis sesuai bahasa
pemrograman yang dipilih. 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 compile – time error. Compiler tidaklah sempurna sehingga tidak dapat
mengidentifikasi seluruh kemungkinan kesalahan pada waktu kompilasi. Umumnya
kesalahan yang terjadi adalah kesalahan logika seperti perulangan tak berakhir.
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 berulang – ulang 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 errors 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.

Pengenalan Pemrograman 1

10
J.E.N.I.

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.

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
bilangan – bilangan 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

Pengenalan Pemrograman 1

11
J.E.N.I.

B16
B

Heksadesimal Nilai Dalam Desimal

0 0

1 1

2 2

3 3

4 4

5 5

6 6

7 7

8 8

9 9

A 10

B 11

C 12

D 13

E 14

F 15

Tabel 3: Bilangan heksadesimal dan perbandingannya terhadap desimal

Berikut adalah perbandingan keseluruhan sistem penulisan bilangan :

Desimal 12610 1110

Biner 11111102 10112

Oktal 1768 138

Heksadesimal 7E16 B16


B

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 langkah –
langkah tersebut hingga hasil bagi akhir bernilai 0 atau 1. Kemudian susun nilai –
nilai sisa dimulai dari nilai sisa terakhir sehingga diperoleh bentuk biner dari
angka bilangan tersebut.

Sebagai Contoh : 12610 = ?


2

Hasil Bagi 126 / 2 = 63 / 2 = 31 / 2 = 15 15 / 2 = 7/2= 3/2= 1/2= 7 3 1 63 31

Nilai Sisa 0 1 1 1 1 1 1 Urutkan

Pengenalan Pemrograman 1

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 di arsir. 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 = ?
8

Hasil Bagi 126 / 8 = 15 / 8 = 1/8= 15 1 `

Nilai Sisa 6 7 1

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 126 / 16 = 7 / 16 = 7

Nilai Sisa 14 (E) 7

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 Octal Digits

2 1

1 7

0 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

1 7

0 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 0 1 2 3 4 5 6 7 Representasi
Biner 000 001 010 011 100 101 110 111

Tabel 5: Bilangan octal dan perbandingannya dalam sistem biner

Pengenalan Pemrograman 1

15
J.E.N.I.

Sebagai contoh : 11111102 = ?


8

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

0
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 0 1 2 3 4
Pengenalan Pemrograman 1

Representasi Biner 0000 0001 0010 0011 0100


16
J.E.N.I.

Digit Heksadesimal 5 6 7 8 9 A B C D E F

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 = ?

0
Pengenalan Pemrograman 1

17
J.E.N.I.

1.7 Latihan
1.7.1 Menyusun Algoritma
Dari permasalahan – permasalahan 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
rata – rata 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 fase – fase dalam
program JAVA. Pada akhir pembahasan, diharapkan pembaca dapat : 1. Menjelaskan
fitur – fitur teknologi dari Java meliputi Java Virtual Machine (JVM), garbage
collection, dan code security. 2. Menjelaskan perbedaan fase pada pemrograman JAVA

2.2 Latar Belakang 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.
Karena perangkat tersebut tidak memiliki banyak memori, bahasa harus berukuran
kecil dan mengandung kode yang liat. Juga karena manufaktur – manufaktur 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 orang – orang 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

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 bahasa – bahasa 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 bentukan – bentukan 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 hiérarchie, dimana objek adalah satu kesatuan hirarki
pewarisan 8. Dari bahasa Eiffel, fasilitas assertion yang mulai diterapkan di
sebagian JDK 1.4

Pengenalan Pemrograman 1

2
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 oada 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 serbt a 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 kelas – kelas 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

3
J.E.N.I.

2.2.5 Mengapa Mempelajari JAVA?


Berdasarkan white paper resmi dari SUN, Java memiliki karakteristik berikut : 1.
Sederhana (Simple) 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. 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.
Terdistribusi (Distributed) Java dibuat untuk membuat aplikasi terdistribusi secara
mudah dengan adanya libraries networking yang terintegrasi pada Java. Interpreted
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. 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. Secure 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. Architecture Neutral Program Java
merupakan platform independent. Program cukup mempunyai satu buah versi yang dapat
dijalankan pada platform berbeda dengan Java Virtual Machine. Portable Source code
maupun program Java dapat dengan mudah dibawa ke platform yang berbeda-beda tanpa
harus dikompilasi ulang. Performance Performance pada Java sering dikatakan kurang
tinggi. Namun performance Java dapat ditingkatkan menggunakan kompilasi Java lain
seperti buatan

2.

3.

4.

5.

6.

7.

8.

9.

Pengenalan Pemrograman 1

4
J.E.N.I.

Inprise, Microsoft ataupun Symantec yang menggunakan Just In Time Compilers (JIT).
10. Multithreaded Java mempunyai kemampuan untuk membuat suatu program yang dapat
melakukan beberapa pekerjaan secara sekaligus dan simultan. Dynamic 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.

11.

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 pemrogram 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 pemrogram yang
mutlak bertanggung jawab akan hal ini. Hal ini dapat menyulitkan bilamana pemrogram
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 objek – objek yang tidak digunakan
lagi. Fasilitas ini mengurangi beban pengelolaan memori oleh pemrogram dan
mengurangi atau mengeliminasi sumber kesalahan terbesar yang terdapat pada bahasa
yang memungkinkan alokasi dinamis.

Pengenalan Pemrograman 1

5
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 kelas – kelas yang diambil dari jaringan.
Hal ini membatasi aplikasi Trojan karena kelas – kelas yang berasal dari local disk
yang dimuat terlebih dahulu. 2. Kedua, bytecode verifier membaca bytecode sebelum
dijalankan dan menjamin bytecode memenuhi aturan – aturan 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 pemrogram 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 pemrogram 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

6
J.E.N.I.

2.2.5 Fase – fase Pemrograman JAVA


Gambar dibawah ini menjelaskan aliran proses kompilasi dan eksekusi 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 adalah 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 Menulis kode program Kompilasi program Menjalankan program Text editor

Tool

Hasil Berkas berekstensi .java Berkas berekstensi .class (Java Bytecodes) Program
Output

Java Compiler Java Interpreter

Pengenalan Pemrograman 1

7
J.E.N.I.

BAB 3 Mengenali Lingkup Pemrograman Anda


3.2 Tujuan
Dalam sesi ini, kita akan membahas tentang bagaimana menulis, meng-compile dan
menjalankan(run) program Java. erdapat ! cara dalam melakukann"a, "ang pertama
menggunakan console dan te#t editor. $edangkan cara kedua adalah dengan menggunakan
Net%eans "ang merupakan Integrated Development Environment atau "ang disebut IDE.
Diakhir pembahasan, para pelajar diharapkan dapat & • 'embuat program Java
menggunakan te#t editor dan console dalam linu# ((buntu Dapper) • 'embedakan antara
s"nta#-errors dan runtime-errors • 'embuat program Java menggunakan Net%eans

3.2 Pendahuluan
IDE adalah sebuah peralatan dalam pemrograman "ang diintegrasikan kedalam aplikasi
so)t*are "ang mendukung pembangunan +(I, te#t atau penulisan kode, compiler dan
debugger. utorial ini menggunakan (buntu Dapper sebagai sistem operasin"a. $ebelum
menggunakan tutorial ini, pastikan bah*a telah menginstal Java dan Net%eans dalam
sistem "ang anda gunakan. (ntuk instruksi dalam bagaimana cara menginstal Java dan
Net%eans, dapat dilihat pada Appendix A. (ntuk versi ,indo*s -p dalam sesi ini,
dapat dilihat pada Appendix B. $ebelum membahas lebih detail, pada a*aln"a akan
kita lihat program Java pertama "ang akan anda tulis.

3.3 Program ava Pertama


public class Hello { /** * My first java program */ public static void
main(String[] args) { //Menampil an ata !Hello "orld! dilayar System#out#println(!
Hello "orld$!)% & &

.engenalan .emrograman I

1
J.E.N.I.

$ebelum menjelaskan apa arti dari program tersebut, cobalah untuk menulis program
ini didalam )ile dan kemudian menjalankann"a.

3.! Menggunakan Text editor dan "on#ole


Dalam contoh ini, kita akan menggunakan te#t editor untuk mengedit program Java.
Juga membuka terminal *indo* untuk meng-compile dan meng-e#ecute program Java anda.
Langkah $% Memulai Text Editor (ntuk memulai te#t editor di linu# , klik pada
/pplications-0/ccessories-0 e#t Editor.

Gambar 1: Aplikasi Text Editor di Linux

.engenalan .emrograman I

2
J.E.N.I.

Langkah 2% Mem&uka Terminal (ntuk membuka terminal di linu#, klik pada


/pplications-0 /ccessories-0 erminal.

Figure 2: Terminal pada Linux

Langkah 3% Tuli#lah li#ting program ava anda dalam text editor.

Gambar 3: Menulis kode program menggunakan text editor

.engenalan .emrograman I

3
J.E.N.I.

Langkah !% 'impanlah program ava anda .rogram ini akan disimpan dalam )ile "ang
bernama 112ello.java11, dan disimpan dalam sebuah )older "ang bernama
'3J/4/.56+5/'$. (ntuk membuka 'ave dialog bo#, klik pada 7ile menu "ang terdapat
pada menubar dan kemudian klik save. $etelah melakukan instruksi tersebut, dialog
bo# akan tampil seperti gambar diba*ah ini.

Gambar 4: Menyimpan file

.engenalan .emrograman I

4
J.E.N.I.

8lik pada tombol bro*se, kemudian klik tombol 9reate 7older.

.engenalan .emrograman I

5
J.E.N.I.

Nama )older baru, '3J/4/.56+5/'$. $ekarang, klik pada )older '3J/4/.56+5/'$ untuk
mengetahui isi )older "ang ada didalamn"a. /nda akan melihat gambar "ang
ditampilkan seperti berikut ini setelah anda klik pada )older tersebut. (ntuk saat
ini )older tersebut harus kosong sampai terbuatn"a )older baru dan kita akan
men"impan semuan"a didalam )older tersebut.

$aat ini, dalam pilihan te#tbo#, ketiklah nama )ile dari program anda, "aitu
112ello.java11, kemudian klik pada tombol $/4E.

.engenalan .emrograman I

6
J.E.N.I.

$ekarang anda telah men"impan )ile anda, ingatlah cara bagaimana nama )rame dapat
berubah dari 11(ntitled Document : (modi)ied) ; gedit11 menjadi <2ello.java
(=>'3J/4/.56+5/'$) ; gedit<. Jika anda ingin melakukan perubahan pada )ile anda,
anda han"a perlu mengeditn"a, kemudian men"impann"a kembali dengan mengklik pada
7ile-0$ave.

Gambar 5: Window baru setelah penyimpanan

.engenalan .emrograman I

7
J.E.N.I.

Langkah (% Meng)*ompile program anda ?angkah berikut ini adalah meng-compile


program /nda. 'asuklah ke "ang telah kita buka sebelumn"a.

erminal ,indo*

8etika anda membuka terminal *indo*, terminal tersebut menampilkan *indo* "ang
disebut sebagai home +older /nda. (ntuk melihat isi dari )older tersebut, ketik l#
dan kemudian tekan EN E5. /pa "ang akan anda temukan adalah da)tar )ile-)ile dan )
older didalamn"a. Disinilah /nda dapat melihat )older dengan nama <'3J/4/.56+5/'$<
"ang telah kita buat sebelumn"a, dan merupakan tempat dimana kita men"impan program
2ello.java kita. 8emudian masuklah kedalam direktori tersebut. (ntuk masuk kedalam
sebuah direktori, ketiklah perintah & *d ,dire*tor- name.. .erintah 11cd11
digunakan untuk merubah direktori. Dalam hal ini, nama dari direktori kita adalah
'3J/4/.56+5/', maka anda harus mengetik & *d M/ A0AP1231AM'.

Gambar 6: Merubah

irektori

.engenalan .emrograman I

8
J.E.N.I.

$etelah berada didalam )older "ang berisi program Java /nda, sudah saatn"a untuk
memulai meng-compile program Java tersebut. $ebagai catatan, bah*a )ile "ang /nda
maksud harus ada didalam )older "ang /nda pilih. .eriksalah dengan menjalankan
perintah 11ls11 lagi untuk melihat bah*a )ile /nda ada didalam )older tersebut.

Gambar 7:

aftar File didalam

irektori yang !aru

(ntuk meng-compile program Java, gunakanlah perintah & java* ,+ilename.. Dalam hal
ini, /nda mengetikan perintah & java* 4ello. ava.

Gambar 8:Meng"#ompile File $a%a .engenalan .emrograman I 9


J.E.N.I.

$elama peng-compile-an, javac menambah )ile kedalam disk "ang disebut ,


+ilename..*la##5 atau dalam hal ini, 4ello.*la##, "ang merupakan kode sebenarn"a.
Langkah 6 % Menjalakan Program $elama proses peng-compile-an, javac menambah )ile
baru kedalam disk "ang disebut ,+ilename..*la##, dalam hal ini, 4ello.*la##, "ang
merupakan kode sebenarn"a saat ini, dengan perkiraan tidak ada permasalahan pada
saat proses compile (kita akan men"elidiki dan membahas permasalahan "ang ditemukan
selama proses compile, pada bagian berikutn"a), berarti telah siap untuk
menjalankan program anda. (ntuk menjalankan program Java /nda, dengan mengetikan
perintah & java ,+ilename 7ithout the exten#ion., maka dalam hal ini, /nda
mengetikkan perintah & java 4ello. $ekarang /nda dapat melihat dila"ar bah*a anda
telah menjalankan program Java pertama /nda, "ang menampilkan pesan, 112ello
*orld@11.

Gambar 9: Men&alankan File 'lass

.engenalan .emrograman I

10
J.E.N.I.

3.4.1 Errors
/pa "ang telah ditunjukan sejauh ini adalah program Java dimana kita tidak
menemukan berbagai masalah dalam proses compiling maupun pada saat menjalankann"a.
%agaimanapun juga, hal ini tidak selalu terjadi. $eperti "ang telah kita diskusikan
pada bagian pertama dari latihan ini, biasan"a kita juga akan menemukan
permasalahan selama proses berlangsung. (eperti yang telah didiskusikan sebelumnya)
ada * ma#am error+ ,ertama adalah #ompile"time error atau yang disebut &uga sebagai
syntax error+ -edua adalah runtime errors+ 3.!.$.$ '-ntax Error# $"nta# errors
biasan"a terjadi karena kesalahan penulisan. 'ungkin /nda kekurangan sebuah
perintah di Java atau lupa untuk menulis tanda titik-koma pada akhir pern"ataan.
Java mencoba untuk mengisolasi error tersebut dengan cara menunjukkan baris dari
kode dan terlebih dahulu menunjuk karakter "ang salah dalam baris tersebut.
%agaimanapun juga, error belum tentu berada pada titik "ang ditunjuk. 8esalahan
umum lainn"a adalah dalam kapitalisasi, ejaan, penggunaan dari karakter khusus "ang
tidak benar, dan penghilangan dari pemberian tanda baca "ang sebenarn"a. 'ari kita
mengambil contoh, pada program 2ello.java kita, dimana dengan sengaja kita
hilangkan titik-koma pada akhir pern"ataan dan juga mencoba untuk mengetikkan ejaan
"ang salah pada sebuah perintah.

Gambar 10: Listing Program yang Memiliki Error

.engenalan .emrograman I

11
J.E.N.I.

?ihatlah pesan error "ang ditampilkan setelah peng-compile-an program


dijalankan. .esan error "ang pertama memberitahu bah*a diprogram anda terdapat
error pada baris A. 2al itu menunjuk pada kata setelah #tati*5 dimana seharusn"a
dieja sebagai static. .esan error "ang kedua memberitahukan bah*a pada program
tersebut kehilangan titikkoma setelah pern"ataan anda.

Gambar 11: Peng !om"ile an listing Program yang Memiliki Error

Jika anda menemukan ban"ak pesan error, cobalah untuk mengoreksi kesalahan "ang
pertama pada da)tar error satu per satu, dan mencoba untuk meng-compile-n"a
kembali. Dengan melakukan hal tersebut maka, dapat mengurangi total error "ang ada.
3.!.$.2 1un)time Error# 5un-time error merupakan error "ang tidak akan ditampilkan
sampai anda menjalankan program anda. %ahkan program "ang dicompile dengan sukses
dapat menampilkan ja*aban "ang salah jika programmer belum berpikir sampai struktur
dan proses logis dari program tersebut.

.engenalan .emrograman I

12
J.E.N.I.

3.( Menggunakan 8etBean#


$ekarang kita mencoba mengerjakan program kita dengan jalan "ang lebih rumit, mari
kita lihat bagaimana mengerjakan semua proses "ang telah dijelaskan pada bagian
sebelumn"a dengan menggunakan sebuah aplikasi. .ada bagian pelajaran ini, kita akan
menggunakan 8etBean#5 "ang merupakan Integrated Development Environment atau IDE.
$uatu IDE adalah lingkupan pemrograman "ang mengintegrasikan kedalam suatu aplikasi
perangkat lunak "ang men"ediakan pembangun +(I, suatu te#t atau kode editor, suatu
compiler atau enterpreter dan suatu debugger. Langkah $ % 8etBean# /da dua cara
untuk menjalankan Net%eans. .ertama menulis perintah menggunakan terminal, atau
han"a dengan mengklik pada tombol shortcut "ang dapat ditemukan di desktop. (ntuk
menjalankan Net%eans menggunakan command-line. %ukalah terminal (lihat langkahn"a
pada bagaimana menjalankan terminal didiskusi sebelumn"a), dan ketiklah & net&ean#.

Gambar 12: Men&alankan .et!eans Menggunakan 'ommand"Line

.engenalan .emrograman I

13
J.E.N.I.

9ara kedua untuk menjalankan Net%eans, adalah dengan mengklik shortcut icon "ang
terdapat pada desktop /nda.

Gambar 13: Men&alankan .et!eans menggunakan short#ut i#on di desktop

.engenalan .emrograman I

14
J.E.N.I.

$etelah /nda membuka Net%eans IDE, /nda akan melihat graphical user inter)ace (+(I)
seperti "ang ditunjukkan diba*ah ini.

Gambar 14: Window (etelah Membuka .et!eans

.engenalan .emrograman I

15
J.E.N.I.

Langkah 2% Mem&uat #e&uah Proje*t .ertama, mari kita buat sebuah project. 8lik pada
7ile-0Ne* .roject. $etelah melakukann"a, akan ditampilkan kotak dialog project "ang
baru. 8emudian klik pada Java /pplication dan klik tombol NE- .

Gambar 15: Memilih Tipe ,ro&e#t

.engenalan .emrograman I

16
J.E.N.I.

$ekarang, dialog aplikasi "ang baru akan ditampilkan.

Gambar 16: Mengatur /nformasi ,ro&e#t

.engenalan .emrograman I

17
J.E.N.I.

9obalah untuk mengubah lokasi aplikasi, dengan mengklik pada tombol %56,$E.
8emudian dialog lokasi project akan muncul. 8lik dua kali pada home )older /nda.

Gambar 17: Mengatur Lokasi ,ro&e#t

8emudian isi dari )older root akan ditampilkan. ?alu klik dua kali pada )older
'3J/4/.56+5/'$ dan klik tombol 6.EN.

.engenalan .emrograman I

18
J.E.N.I.

?ihatlah lokasi project dan >home>)lorence>'3J/4/.56+5/'$.

)older

project

telah

berubah

menjadi

3ang terakhir, pada te#t)ield 9reate 'ain 9lass, tulislah 2ello sebagai nama kelas
utama, dan kemudian klik tombol 7INI$2.

Gambar 18: Window setelah Mengatur Lokasi ,ro&e#t ke M0$A1A,23G2AM(4Mengatur kelas


utama pro&e#t men&adi 5ello

.engenalan .emrograman I

19
J.E.N.I.

Langkah 3 % Menuli# Program Anda $ebelum menulis program, pertama akan dijelaskan
*indo* utama setelah membuat project. $eperti ditunjukkan diba*ah, secara otomatis
Net%eans membuat kode dasar untuk program Java /nda. /nda han"a dapat menambah
pern"ataan /nda pada kode "ang dihasilkan itu. .ada sisi kiri *indo*, /nda dapat
melihat da)tar )older dan )ile-)ile "ang dihasilkan Net%eans setelah membuat sebuah
project. $emua ini dapat /nda temukan dalam )older '3J/4/.56+5/'$ /nda, dimana /nda
menetapkan lokasi project tersebut.

.engenalan .emrograman I

20
J.E.N.I.

$ekarang, mencoba memodi)ikasi kode "ang dihasilkan oleh Net%eans. (ntuk saat ini
abaikan bagian-bagian lain dari program, detail dari kode tersebut akan dijelaskan
pada bagian berikutn"a. 'asukkan kode & System#out#println(!Hello "orld$!)% $etelah
pern"ataan, >> 6D6 code application logic here.

Gambar20: Memas#kkan $o%e

.engenalan .emrograman I

21
J.E.N.I.

Langkah ! % Meng)*ompile Program Anda $ekarang, untuk meng-compile program anda,


klik pada %uild-0%uid 'ain .roject. /tau, anda juga dapat menggunakan tombol
shortcut untuk meng-compile kode anda.

.engenalan .emrograman I

22
J.E.N.I.

Jika tidak terdapat error pada program /nda, /nda dapat melihat pesan sukses build
pada *indo* "ang dihasilkan.

Gambar 21: Tampilan (etelah sukses melakukan #ompile

.engenalan .emrograman I

23
J.E.N.I.

Langkah ( % Menjalankan Program Anda (ntuk menjalankan program /nda, klik pada 5un-
05un 'ain .roject. /tau /nda juga dapat menggunakan tombol shortcut untuk
menjalankan program /nda.

Gambar 22: Men&alankan %engan 'et(eans

.engenalan .emrograman I

24
J.E.N.I.

2asil dari program /nda ditampilkan pada *indo*.

Gambar 23: Tampilan (etelah (ukses Men&alankan ,rogram

.engenalan .emrograman I

25
J.E.N.I.

3.6 Latihan
3.6.1 Hello World!
'enggunakan Net%eans, membuat class dengan nama & BNama/ndaC. 2asil dari program
"ang harus tampil dila"ar & 'elcome to (ava )rogramming [*ama+nda]$$$

3.6.2 The Tree


'enggunakan Net%eans, membuat class dengan nama & "ang harus tampil dila"ar & he
ree. 2asil dari program

, t-in t-at , s-all never see. a poem as lovely as a tree# + tree "-ose -ungry
mout- is pressed +gainst t-e /art-0s s"eet flo"ing breast#

.engenalan .emrograman 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
lebih efektif dan mudah dibaca. Pada akhir pembelajaran ini, pelajar seharusnya
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 pembelajaran pada bab ini. Menganalisa program java pertama saya

4.2 Menganalisa program Java pertama saya


Sekarang, kita akan berusaha untuk menganalisa program java pertama anda :

public class Hello { /** * My first java program */ public static void
main(String[] args) { //menampilkan string”Hello world” pada screen
System.out.println("Hello world!"); } }

Pengenalan Pemrograman I

1
J.E.N.I.

Baris pertama kode :

public class Hello


mengindikasikan nama class yaitu Hello. Pada java semua kode seharusnya ditempatkan
didalam deklarasi class. Kita melakukannya dengan menggunakan kata kunci class.
Sebagai tambahan, class menggunakan akses khusus public, yang mengindikasikan bahwa
class kita mempunyai akses bebas ke class yang lain dari package yang lain pula
(package merupakan kumpulan class-class). Kita akan membahas lebih dalam mengenai
package dan akses khusus pada pembahasan selanjutnya. Baris berikutnya yaitu yang
terdiri atas kurung kurawal { mengindikasikan 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 mengindikasikan adanya komentar dalam bahasa 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 diindikasikan oleh 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 proram kecuali
applet yang ditulis dalam bahasa java dimulai dengan method utama. Yakinkan untuk

Pengenalan Pemrograman I

2
J.E.N.I.

mengikuti kaidah penulisan tanda yang benar. Baris selanjutnya juga merupakan
komentar,

//prints the string "Hello world" on screen


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,

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.

Pedoman 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

3
J.E.N.I.

4.3. Komentar pada Java


Komentar adalah catatan yang ditulis pada kode dengan tujuan sebagai bahan
dokumentasi. teks ini 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 pada C++


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 pada C
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, itu dapat menjangkau beberapa
baris. Sebagai contoh,

/* this is an exmaple of a C style or multiline comments */ 4.3.3. Komentar Khusus


javadoc
Komentar javadoc khusus digunakan untuk generatisasi dokumentasi HTML untuk program
java anda. Anda dapat menciptakan komentar javadoc dengan memulai baris dengan /**
dan mengakhirinya dengan */. Seperti Komentar C_style, ini dapat juga menjangkau
beberapa baris. 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

4
J.E.N.I.

4.4. Pernyataan dalamJava dan Block


pernyataan adalah satu atau lebih baris kode yang diakhiri dengan semicolon.
sebagai contoh untuk pernyataan tunggal adalah

System.out.println(“Hello world”);
Block adalah satu atau lebih pernyataan yang terbentang antara kurung kurawal buka
dan kurung kurawal tutup yaitu sekumpulan pernyataan sebagai satu unit kesatuan.
Block pernyataan dapat dikumpulkan akan tetapi tidak secara pasti mempunyai
keterkaitan fungsi. beberapa jumlah spasi kosong diijinkan terdapat didalamnya,
sebagai contoh dari suatu block adalah :

public static void main( String[] args ){ System.out.println("Hello");


System.out.println("world"); }
Pedoman Penulisan Program: 1. Pada saat pembuatan block, 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 block ,
seperti contoh berikut, public static void main( String[] args )
{ System.out.println("Hello"); System.out.println("world"); }

Pengenalan Pemrograman I

5
J.E.N.I.

4.5. Java Identifier


Java Identifier adalah suatu tanda yang mewakili nama-nama vaiabel, method, class
dsb. Contoh dari pengidentifikasi adalah : Hello, main, System, out. Pendeklarasian
Java adalah case-sensitive. Hal ini berarti bahwa pengidentifikasi : Hello tidak
sama dengan hello. Pengidentifikasi 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.
Pengidentifikasi tidak dapat menggunakan kata kunci dalam java seperti class,
public, void, dsb. Selanjutnya kita akan berdiskusi lebih banyak tentang kata kunci
dalam java.

Pedoman Penulisan Program:


1. Untuk pemberian nama dai 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 pengidentifikasi labih 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 pengidentifikasian seperti _read atau _write.

Pengenalan Pemrograman I

6
J.E.N.I.

4.6. Keyword dalam Java


Keyword adalah pengidentifikasi yang telah dipesan untuk didefinisikan sebelumnya
oleh java untuk tujuan tertentu. Anda tidak dapat menggunakan keyword sebagai nama
variabel anda, class, method dsb. Berikut ini adalah daftar dai 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.

Pengenalan Pemrograman I

7
J.E.N.I.

4.7.1. Literals Integer


literals Integer 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. 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 oleh“0”. Sebagai contoh,
mewakili angka 12. penulisan dalam bentuk desimalnya adalah 12, Sementara dalam
heksadesimal, menjdi 0xC, dan dalam oktal, nilai tersebut ekivalen dengan 014.
Default tipe data untuk integer literals adalah int. Int ditandai dengan
ditampilkannya dalam 32-bit. 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.

Pengenalan Pemrograman I

8
J.E.N.I.

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 symbol dan karakter khusus dari bahasa lain. Untuk
menggunakan character literal, 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

9
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’ //Huruf a ‘\t’ //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

10
J.E.N.I.

4.8.3. Integral – byte, short, int & long


tipe data yang terintegrasi dalam java menggunakan tiga bentuk- yaitu desimal,
oktal atau heksadesimal. Sebagai contoh,

2 //nilai desimal 2 077 //angka 0 pada awal nilai oktal 0xBACC //karakter 0x
heksadesimal

pernyataan

mengindikasikan nilai

mengindikasikan

tipe-tipe terintegrasi memiliki default tipe data yaitu int. Anda dapat merubahnya
ke bentuk long dengan menambahkan huruf l atau L. tipe data terintegrasi memiliki
range sebagai berikut :

Integer Length

Name or Type

Range

8 bits 16 bits 32 bits 64 bits


Table 1: Integral tipes and their ranges

byte short int long

-27 -215

to 27-1 to 215-1

-231 to 231-1 -263 to 263-1

Pedoman Penulisan Program:

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

Pengenalan Pemrograman I

11
J.E.N.I.

4.8.4. Floating Point – float dan double


tipe Floating point memiliki double sebagai default tipe datanya. Floating-point
literal terdiri atas 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 //nilai floating-point sederhana (a double) 6.02E23 //A nilai floating-point


yang besar 2.718F //A nilai float size sederhana 123.4E+306D //A nilai double yang
besar dengan nilai redundant D
Pada contoh yang ditunjukkan diatas, 23 setelah E pada contoh kedua bernilai
positif. Contoh tersebut ekuivalen dengan 6.02E+23.tipe data Floating-point
memiliki range sebagai berikut: Float Length 32 bits 64 bits
Table 2: Tipe Floating point dan range nya

Name or Type float double

Range

-231 to 231-1 -263 to 263-1

Pengenalan Pemrograman I

12
J.E.N.I.

4.9. Variabel
Variabel adalah item yang digunakan data untuk menyimpan pernyataan object.
variabel memiliki tipe data dan nama. tipe data mengindikasikan tipe dari nilai
yang dapat dibentuk oleh variabel itu sendiri. nama variabel harus mengikuti aturan
untuk pengidentifikasian.

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 a 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 inisialisasi //to 0.0
double grade = 0.0; } }

di

Petunjuk Penulisan Program: 1. Hal ini selalu baik untuk menginisialisasi variabel
yang anda buat seperti anda mendeklarasikannya. 2. Gunakan nama yang bersifat
menggambarkan object untuk variabel yang anda buat., jika anda ingin mempunyai
variabel yang terdiri atas nilai pelajar, beri nama dengan nama nilai dan jangan
hanya beberapa huruf random yang anda pilih.
Pengenalan Pemrograman I 13
J.E.N.I.

3. Deklarasikan satu variabel tiap baris kode. Sebagai contoh , deklarasi variabel
adalah sebagai berikut, double exam=0; double quiz=10; 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,

Pengenalan Pemrograman I

14
J.E.N.I.

Hello world!
Sekarang perthatikan pernyataan berikut,

System.out.println("Hello "); System.out.println("world!");


Pernyataan ini akan menghasilkan output sebagai berikut pada layar,

Hello world!

Pengenalan Pemrograman I

15
J.E.N.I.

4.9.4. Reference Variables vs. primitif Variables


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 mendeklarasi variabel pada class tertentu, anda
sebenarnya mendeklarasikan reference variable dalam bentuk object dalam classnya
tersebut. Sebagai contoh, Apabila kita mempunyai dua variabel dengan tipe data int
dan String.

int num = 10; String name = "Hello"


Apabila, ilustrasi yang ditunjukkan dibawah ini adalah memory yang ada pada
komputer anda, dimana anda memiliki alamat dari setiap sel memorinya, nama variabel
dan datanya terbentuk sebagai berikut.

Memory Address 1001 : 1563

Variable Name num name

Data 10 : Address(2000)

: : 2000

: : "Hello"

Seperti yang dapat anda lihat, untuk primitif variable 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

16
J.E.N.I.

4.10 Operators
Dalam Java, ada beberapa tipe operator. Ada operator arithmatika, operator relasi,
operator logika, dan operator kondisi. Operator ini mengikuti macam-macam prioritas
yang pasti jadi 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 arithmatika yang dapat digunakan untuk membuat
suatu program java,

Operator + * / % -

Use op1 + op2 op1 * op2 op1 / op2 op1 % op2 op1 - op2

Description Adds op1 and op2 Multiplies op1 by op2 Divides op1 by op2 Computes the
remainder of dividing op1 by op2 Subtracts op2 from op1

Table 3: Operator Arithmatika dan fungsi-fungsinya

Pengenalan Pemrograman I

17
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...");
Pengenalan Pemrograman I 18
J.E.N.I.

System.out.println(" System.out.println(" } }

j + y = " + (j + y)); i * x = " + (i * x));

Berikut ini adalah output program, Variable values... i = 37 j = 42 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 (a single aritmatika operation), hasilnya berupa
floating point. integer adalah converter secara implisit ke bentuk angka floating-
point sebelum operasi berperan mengambil tempat.

Pengenalan Pemrograman I

19
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 dah mengurangi nilai yang tersimpan dalm bentuk variabel angka terhadap
nilai 1. Sebagai contoh, pernyataan,

count = count + 1; //increment nilai 1


pernyataan tersebut ekivalen dengan,

nilai

count

dengan

count++;

Operator ++

Use op++

Description Increments op by 1; evaluates to the value of op before it was


incremented Increments op by 1; evaluates to the value of op after it was
incremented Decrements op by 1; evaluates to the value of op before it was
decremented Decrements op by 1; evaluates to the value of op after it was
decremented
Table 4: operator Increment dan Decrement

++

++op

--

op--

--

--op

Operator increment dan decrement dapat ditempatkan sebelum atau sesudah operand.
Ketika digunakan sebelum operand, akan menyebabkan variabel diincrement atau
didecrement oleh 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
Pengenalan Pemrograman I 20
J.E.N.I.

lama akan digunakan lebih dulu dioperasikan lebih dulu terhadap pernyataan dimana
dia ditambahkan. Sebagai contoh,

int i = 10, int j = 3; int k = 0; k = j++ + i; //akan menghasilkan k = 3+10 = 13


Pedoman Penulisan Program:

Selalu jaga pernyataan yang mengandung operator increment dan decrement untuk
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 > >= < <= == != Use op1 > op2 op1 >= op2 op1 < op2 op1 <= op2 op1 == op2
op1 != op2 Description op1 is greater than op2 op1 is greater than or equal to op2
op1 is less than op2 op1 is less than or equal to op2 op1 and op2 are equal op1 and
op2 are not equal
Table 5: Operator Relasi

Pengenalan Pemrograman I

21
J.E.N.I.

Berikut ini adalah contoh program yang menggunakan operator Relasi,

public class RelasiDemo { public static void main(String[] args) { //a few numbers
int i = 37; int j = 42; int k = 42; System.out.println("Variable values...");
System.out.println(" i = " + i); System.out.println(" j = " + j);
System.out.println(" k = " + k); //lebih besar dari System.out.println("Greater
System.out.println(" i > System.out.println(" j > System.out.println(" k >

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

//lebih besar atau sama dengan System.out.println("Greater than


System.out.println(" i >= j = System.out.println(" j >= i = System.out.println(" k
>= j =

or equal to..."); " + (i >= j)); //false " + (j >= i)); //true " + (k >= j));
//true

//lebih kecil dari System.out.println("Less than..."); System.out.println(" i < j =


" + (i < j)); //true System.out.println(" j < i = " + (j < i)); //false
System.out.println(" k < j = " + (k < j)); //false //lebih kecil atau sama dengan
System.out.println("Less than or equal to..."); System.out.println(" i <= j = " +
(i <= j)); //true System.out.println(" j <= i = " + (j <= i)); //false
System.out.println(" k <= j = " + (k <= j)); //true //sama dengan
System.out.println("Equal to..."); System.out.println(" i == j = " + (i == j));
//false System.out.println(" k == j = " + (k == j)); //true //tidak sama dengan
System.out.println("Not equal to...");
Pengenalan Pemrograman I 22
J.E.N.I.

System.out.println(" System.out.println(" } }

i != j = " + (i != j)); //true k != j = " + (k != j)); //false

Berikut adalah hasil keluaran dari program ini :

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

23
J.E.N.I.

4.10.4 Operator logika


Operator logika memiliki satu atau lebih operand boolean yang menghasilkan nilai
boolean.Ada 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

24
J.E.N.I.

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


Berikut ini adalah tabel kebenaran untuk && dan &, x1 TRUE TRUE FALSE FALSE x2 TRUE
FALSE TRUE FALSE Result TRUE FALSE FALSE FALSE

Table 6: Truth table for & and &&

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);
Pengenalan Pemrograman I 25
J.E.N.I.

System.out.println(test); } }
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

26
J.E.N.I.

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


Berikut ini adalah tabel kebenaran untuk || dan |, x1 TRUE TRUE FALSE FALSE x2 TRUE
FALSE TRUE FALSE Result TRUE TRUE TRUE FALSE

Table 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);
Pengenalan Pemrograman I 27
J.E.N.I.

System.out.println(test); } }
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

28
J.E.N.I.

4.10.4.3 ^ (boolean logika ExclusiveOR )


Berikut ini adalah tabel kebenaran untuk ^, x1 TRUE TRUE FALSE FALSE x2 TRUE FALSE
TRUE FALSE Result FALSE TRUE TRUE FALSE

Table 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

29
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
untukoperator not!, x1 TRUE FALSE Result FALSE TRUE
Table 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

30
J.E.N.I.

4.10.5 Operator Kondisi(?:)


operator kondisi ?: adalah operator ternary. Hal ini berarti bahwa operator ini
digunakan dalam tiga bentuk pernyataan condisional argumen yang digunakan bersama-
sama. 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 kondisiOperator { 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

31
J.E.N.I.

Gambar2: Flowchart

Berikut ini adalah program lain yang menggunakan operator ?: ,

class kondisiOperator { public static void main( String[] args ){ int score = 0;
char answer = 'a'; score = (answer == 'a') ? 10 : 0; System.out.println("Score = "
+ score ); } }
Hasil keluaran program adalah,

Score = 10

Pengenalan Pemrograman I

32
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;

Pedoman Penulisan Program:

Untuk menghindari kebingungan dalam evaluasi operasi matematika, buatlah pernyataan


sesederhana mungkin dan gunakan bantuan tanda kurung.

Pengenalan Pemrograman I

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

Variable name number letter result str

Data tipe integer character boolean String

Initial value 10 a true 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-ratadari tiga angka. Nilai dari
masingmasing tiga angka tersebut adalah 10, 20 dan 45. Tampilan Output yang
diharapkan adalah,

number 1 = number 2 = number 3 = Average is

10 20 45 = 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 (HINT: 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

Pengenalan Pemrograman I

34
J.E.N.I.

Nilai tertingginya adalah angka = 23 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

35
J.E.N.I.

BAB 5 Mendapatkan Input dari Keyboard


5.1 Tujuan
Kita sudah mempelajari konsep mendasar 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 kelas BufferedReader dan melalui
GUI (Graphical User Interface) dengan menggunakan kelas JOptionPane. Pada akhir bab
ini, para siswa diharapkan mampu: • Membuat program Java yang interaktif yang bisa
mendapatkan input dari keyboard • Menggunakan kelas BufferedReader untuk
mendapatkan input dari keyboard melalui layar console • Menggunakan kelas
JOptionPane untuk mendapatkan input dari keyboard melalui GUI

5.2 Menggunakan BufferedReader untuk mendapatkan input


Pada bagian ini, kita akan menggunakan kelas BufferedReader yang berada di java.io
package 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 ini: BufferedReader
dataIn = new BufferedReader(new InputStreamReader( System.in) ); 3. Deklarasikan
variabel String temporer 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

1
J.E.N.I.

Berikut ini adalah source code selengkapnya: 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 dijelaskan setiap baris dari code: Statement, import
java.io.BufferedReader; import java.io.InputStreamReader; import
java.io.IOException; menjelaskan bahwa kita akan menggunakan kelas BufferedReader,
InputStreamReader dan IOException yang berada di java.io package. Java Application
Programming Interface (API) sudah berisi ratusan kelas yang bisa digunakan untuk
program anda. Kelas-kelas tersebut dikumpulkan ke dalam packages. Packages memiliki
kelas yang mempunyai fungsi yang saling berhubungan. Seperti pada contoh di atas,
java.io package mengandung kelas-kelas yang memungkinkan program untuk melakukan
input dan output data. Statement diatas juga dapat ditulis, import java.io.*; yang
akan mengeluarkan semua kelas yang berada pada paket, dan selanjutnya kita bisa
menggunakan kelas-kelas tersebut pada program kita.

Pengenalan Pemrograman I

2
J.E.N.I.

Dua statement selanjutnya, public class GetInputFromKeyboard { public static void


main( String[] args ){ kita sudah mempelajari pada bab sebelumnya. Statement ini
menyatakan bahwa kita mendeklarasikan sebuah class bernama GetInputFromKeyboard dan
kita mendeklarasikan main method. Pada statement, BufferedReader dataIn = new
BufferedReader(new InputStreamReader( System.in) ); kita mendeklarasikan sebuah
variabel bernama dataIn dengan tipe kelas 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 = ""; Statement diatas merupakan tempat untuk menyimpan input
dari user. Variabel name diinisialisasi sebagai String kosong "". Sebaiknya kita
selalu menginisialisasi sebuah variabel setelah kita mendeklarasikannya. Baris
berikutnya adalah memberikan output string pada layar menanyakan nama user.
System.out.print("Please Enter Your Name:"); Sekarang, block 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 statement name = dataIn.readLine(); akan ditangkap. Kita akan
membahas tentang exception handling pada bab selanjutnya dari pembahasan ini,
tetapi untuk sekarang, anda cukup mencatat bahwa anda perlu menambahkan kode ini
untuk menggunakan readLine() method dari BufferedReader untuk mendapatkan input
dari user.

Pengenalan Pemrograman I

3
J.E.N.I.

Selanjutnya statement, 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

4
J.E.N.I.

5.1 Menggunakan JOptionPane untuk mendapatkan input


Cara lain untuk mendapatkan input dari user adalah dengan menggunakan kelas
JoptionPane yang didapatkan dari javax.swing package. JoptionPane membuat kemudahan
dengan memunculkan dialog box standar yang memberikan kepada user sebuah nilai atau
menginformasikan sesuatu. Berikan 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,

Pengenalan Pemrograman I

5
J.E.N.I.

Statement pertama, import javax.swing.JOptionPane; Menjelaskan bahwa kita


mengimport kelas JoptionPane dari javax.swing package. Bisa juga ditulis, import
javax.swing.*; statement selanjutnya, name = JOptionPane.showInputDialog("Please
enter your name"); membuat sebuah JOptionPane input dialog, 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 memilki sebuah pesan dan tombol OK,
JOptionPane.showMessageDialog(null, msg);

Pengenalan Pemrograman I

6
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

7
J.E.N.I.

BAB 6 Struktur Kontrol


6.1 Tujuan
Pada bab sebelumnya, kita sudah mendapatkan contah dari program sequential, dimana
statement dieksekusi setelah statement sebelumnya dengan urutan tertentu. Pada
bagian ini, kita mempelajari tentang struktur kontrol yang bertujuan agar kita
dapat menentukan urutan statement yang akan dieksekusi. Pada akhir bab, siswa
diharapkan mampu: • Menggunakan struktur kontrol keputusan (if, else, switch) yang
digunakan untuk memilih blok kode yang akan dieksekusi

Menggunakan struktur kontrol pengulangan (while, do-while, for) yang digunakan


untuk melakukan pengulangan pada blok kode yang akan dieksekusi Menggunakan
statement percabangan (break, continue, return) yang digunakan untuk mengatur
redirection dari program

6.2 Struktur Kontrol Keputusan


Struktur kontrol keputusan adalah statement dari Java yang mengijinkan user untuk
memilih dan mengeksekusi blok kode dan mengabaikan blok kode yang lain.

6.2.1 Statement if
Statement-if menentukan sebuah statement (atau blok kode) yang akan dieksekusi jika
dan hanya jika persyaratan boolean (boolean statement) bernilai true. Bentuk dari
statement if, if( boolean_expression ) statement; atau if( boolean_expression )
{ statement1; statement2; . . . }

Pengenalan Pemrograman 1

1
J.E.N.I.

Gambar 1: Flowchart Statement If

dimana, boolean_expression adalah sebuah persyaratan boolean (boolean statement)


atau boolean variabel. Berikut ini adalah contoh code statement 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 statement
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

2
J.E.N.I.

6.2.2 Statement if-else


Statement if-else digunakan apabila kita ingin mengeksekusi sebuah statement dengan
kondisi true dan statement 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

3
J.E.N.I.

Gambar 2: Flowchart Statement If-Else

Petunjuk Penulisan Program : 1. Untuk menghindari kebingungan, selalu letakkan


statement di dalam blok if-else di dalam tanda {}, 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

4
J.E.N.I.

6.2.3 Statement if-else-if


Statement pada bagian else dari blok if-else dapat menjadi struktur if-else yang
lain. 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; Bisa anda catat anda
dapat memiliki banyak blok else-if sesudah statement if. Blok else bersifat
optional dan dapat dihilangkan. Pada contoh di bawah atas, jika boolean_expression1
bernilai true, maka program akan mengeksekusi statement1 dan melewati statement
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

5
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 bukan merupakan nilai boolean. Contohnya, //BENAR int
number = 0; if( number ){ //some statements here } Variabel number tidak memiliki
nilai Boolean. 2. Using = instead of == for comparison. For example, 3. Menggunakan
= daripada == untuk operator perbandingan. Contohnya, //SALAH int number = 0;
if( number = 0 ){ //Statement Selanjutnya } Seharusnya code tersebut ditulis,
//BENAR int number = 0; if( number == 0 ){ //Statement Selanjutnya } 3. Menulis
elseif daripada else if.

Pengenalan Pemrograman 1

6
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

7
J.E.N.I.

6.2.6 Statement switch


Cara lain untuk membuat percabangan adalah dengan menggunakan kata kunci switch.
Dengan menggunakan switch kita bisa melakukan percabangan dengan persyaratan yang
beragam. Bentuk statement switch, switch( switch_expression ){ case case_selector1:
statement1; statement2; . . . break; case case_selector2: statement1; statement2; .
. . break; . . . default: statement1; statement2; . . . break; } dimana,
switch_expression adalah persyaratan integer atau character dan case_selector1,
case_selector2 dan seterusnya adalah konstanta nilai integer yang unique (unik).
Ketika statement switch ditemukan, pertama kali Java memeriksa switch_expression,
dan meloncat ke case dan mencocokkan nilai yang sama dengan persyaratannya. Program
mengeksekusi statement dari awal sampai menemui statement break, dan melewati
statement yang lain sampai akhir struktur switch. Jika tidak ditemui case yang
cocok, maka program akan mengeksekusi blok default. Bisa anda catat bahwa blok
default adalah optional. Sebuah statement switch bisa tidak memiliki blok default.
CATATAN: • Tidak seperti statement if, pada struktur switch statement dieksekusi
tanpa memerlukan tanda kurung kurawal ({}). • Ketika sebuah case pada statement
switch menemui kecocokan, semua statement pada case tersebut akan dieksekusi. Tidak
hanya demikian, statement lain yang berada pada case yang cocok juga dieksekusi. •
Untuk menghindari program mengeksekusi statement pada case berikutnya, kita
menggunakan statement break sebagai statement akhir.

// //block 1 //

// //block 2 //

// //block n //

Pengenalan Pemrograman 1

8
J.E.N.I.

Gambar 4: Flowchart Statement Switch

Petunjuk Penulisan Program : 1. Menentukan penggunaan statement if atau statement


switch adalah sebuah keputusan. Anda dapat menentukan yang mana yang akan dipakai
berdasarkan kemudahan membaca program dan faktor-faktor yang lain. 2. Statement if
dapat digunakan untuk membuat keputusan berdasarkan rentang nilai tertentu atau
kondisi tertentu, sedangkan statement switch membuat keputusan hanya berdasarkan
nilai unique (unik) dari integer atau character.

Pengenalan Pemrograman 1

9
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 statement dari Java dimana kita bisa
mengeksekusi blok code berulang-ulang dalam kurun nilai tertentu. Ada tiga macam
jenis struktur kontrol pengulangan yaitu while, do-while, dan for-loops.

6.3.1 while loop


Statement while loop adalah statement atau blok statement yang diulang-ulang sampai
mencapai kondisi yang cocok. Bentuk statement while, while( boolean_expression )
{ statement1; statement2; . . . } Statement di dalam while boolean_expression
bernilai true. Contoh, pada code 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 looping yang tidak
berhenti (infinite loop). Sehingga, ketika menggunakan while loop atau bentuk
pengulangan yang lain, pastikan Anda memberikan statement yang membuat pengulangan
berhenti pada suatu titik. loop akan dieksekusi berulang-ulang selama

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. Statement di dalam do-while loop akan
dieksekusi beberapa kali selama kondisi bernilai true. Perbedaan antara while dan
do-while loop adalah dimana statement di dalam do-while loop dieksekusi sedikitnya
satu kali. Bentuk statement do-while, do{ statement1; statement2; . . . }
while( boolean_expression ); Statement di dalam do-while loop akan dieksekusi
pertama kali, dan dilakukan pengecekan kondisi dari boolean_expression. Jika nilai
tersebut belum mencapai nilai yang diinginkan, statement 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 yang tidak berhenti untuk
menulis “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 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 titik.

6.3.3 for loop


Seperti pada struktur pengulangan sebelumnya yaitu melakukan pengulangan eksekusi
code beberapa kali. Bentuk dari for loop, for (InitializationExpression;
LoopCondition; StepExpression){ statement1; statement2; . . . } dimana,

InitializationExpression – inisialisasi dari variabel loop. LoopCondition -


membandingkan variabel loop pada nilai batas. 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, statement i=0 merupakan inisialisasi dari
variabel. Selanjutnya, kondisi i<10 diperiksa. Jika kondisi bernilai true,
statement di dalam for loop dieksekusi. Kemudian, statement i++ dieksekusi, dan
dilakukan pengecekan kondisi. 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 Branching Statements


Branching statements mengijinkan kita untuk mengatur jalannya eksekusi program.
Java memberikan tiga bentuk branching statements: break, continue dan return.

6.4.1 break statement


Statement break memiliki dua bentuk: unlabeled dan labeled. 6.4.1.1 Unlabeled break
statement Unlabeled menghentikan jalannya statement switch. Anda bisa juga
menggunakan bentuk unlabeled untuk menghentikan 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 ini, jika
string “Yza” ditemukan, pengulangan pada for loop akan dihentikan dan akan
melanjutkan ke proses berikutnya.

Pengenalan Pemrograman 1

15
J.E.N.I.

6.4.1.2 Labeled break statement


Bentuk labeled form dari statement break akan menghentikan statement luar, dimana
diidentifikasikan berupa label pada statement break. Program berikut ini akan
mencari nilai dalam array dua dimensi. Terdapat dua pengulangan bersarang (nested
loop). Ketika sebuah nilai ditemukan, labeled break akan menghentikan statement
yang diberi label searchLabel, dimana label ini berada di luar. 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!" ); }

Statement break menghentikan sementera labeled statement; ia tidak lagi menjalankan


flow control pada label. Flow control pada label akan di-transfer secara otomatis
mengikuti labeled statement.

Pengenalan Pemrograman 1

16
J.E.N.I.

6.4.2 Continue statement


Statement continue memiliki dua bentuk: unlabeled dan labeled. Anda dapat
menggunakan statement continue untuk melewati pengulangan dari for, while, atau
dowhile loop yang sedang berjalan. 6.4.2.1 Unlabeled continue statement Bentuk
unlabeled akan melewati akhir statement pada bagian yang dalam dan memeriksa
boolean expression yang mengkontrol loop, pada dasarnya akan melewati bagian
pengulangan pada 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 labeled
akan melanjutkan sebuah statement dengan melewati pengulangan yang sedang berjalan
dari loop terluar 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, pesan ke-2 tidak dicetak, karena statement continue
akan melewati pengulangan yang sedang berjalan.

Pengenalan Pemrograman 1

17
J.E.N.I.

6.4.3 Return statement


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

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 bagian ini, kita akan mendiskusikan mengenai array dalam Java. Pertama, kita
akan mendefinisikan apa yang dimaksud dengan array, kemudian kita juga akan
mendefinisikan bagaimana mendeklarasikannya dan menggunakannya dalam Java. Pada
akhir pelajaran, siswa haruslah mampu untuk : - Mendeklarasikan dan membuat array -
Mengakses elemen-elemen didalam array - Menentukan jumlah element didalam sebuah
array - Mendeklarasikan dan membuat array multidimensi

7.2 Pengenalan Array


Dibagian 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, dimana untuk menggunakan variabel tersebut, kita akan
memanggil dengan nama identifier-nya. Sebagai contoh, kita memiliki tiga variabel
dengan tipe data int yang memiliki identifier yang berbeda untuk tiap variabel. int
number1; int number2; int number3; number1 = 1; number2 = 2; number3 = 3; Seperti
yang dapat Anda perhatikan pada contoh diatas, hanya untuk menginisialisasi dan
menggunakan variabel terutama pada saat variabel-variabel tersebut memiliki tujuan
yang sama, dirasa sangat membingungkan. Di Java maupun di bahasa pemrograman yang
lain, mereka memiliki kemampuan untuk menggunakan satu variabel yang dapat
menyimpan sebuah data list dan kemudian memanipulasinya dengan lebih efektif. Tipe
variabel inilah yang disebut sebagai array.

Pengenalan Pemrograman 1

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 slot.
Bayangkanlah array adalah sebuah variabel – sebuah lokasi memori tertentu yang
memiliki satu nama sebagai identifier, akan tetapi ia dapat menyimpan lebih dari
sebuah value.

7.3 Pendeklarasian Array


Array harus dideklarasikan seperti layaknya sebuah variabel. Apabila Anda
mendeklarasikan array, Anda harus membuat sebuah list dari tipe data, yang diikuti
oleh tanda kurung buka dan kurung tutup, yang diikuti oleh nama identifier. Sebagai
contoh, int []ages; atau Anda dapat menempatkan kurung buka dan kurung tutupnya
setelah identifier. Sebagai contoh, int ages[];

Pengenalan Pemrograman 1

2
J.E.N.I.

Setelah pendeklarasian, kita harus membuat array dan menentukan berapa panjangnya
dengan sebuah konstruktor. Proses ini di Java disebut sebagai instantiation ( Kata
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. Perlu dicatat, 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, deklarasi akan memberitahukan kepada compiler Java, bahwa
identifier ages akan digunakan sebagai nama array yang berisi data-data integer,
dan kemudian untuk membuat atau meng-instantiate sebuah array baru yang terdiri
dari 100 elemen. Selain menggunakan sebuah keyword baru untuk meng-instantiate
array, Anda juga dapat secara otomatis mendeklarasikan array, membangunnya,
kemudian memberikan sebuah value. Sebagai contoh,

Gambar 2: Inisialisasi Arrays

//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 //4 variabel
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

3
J.E.N.I.

7.4 Pengaksesan sebuah elemen array


Untuk mengakses sebuah elemen dalam array, atau mengakses sebagian dari array, Anda
harus menggunakan sebuah nomor atau yang disebut sebagai index atau subscript.
Sebuah nomor index atau subscript telah diberikan kepada tiap anggota array,
sehingga program dan programmer dapat mengakses setiap value apabila dibutuhkan.
Index selalu dalam integer. Dimulai dari nol, kemudian akan terus bertambah sampai
list value dari array tersebut berakhir. Perlu dicatat, bahwa elemen-elemen 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, disimpan dalam setiap anggota array akan diinisialisasi sebagai
nol. Oleh apabila Anda menggunakan tipe data reference seperti String, ia tidak
akan ke string kosong “”, sehingga Anda tetap harus membuat String array secara
nilai yang karena itu, diinisalisasi eksplisit.

Berikut ini adalah contoh, bagaimana untuk mencetak seluruh elemen didalam array.
Dalam contoh ini digunakanlah 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 setelah Anda mendeklarasikannya. Sebagai contoh pendeklarasiannya int []arr =
new int[100]; lebih disarankan daripada, int []arr; arr = new int[100]; 2. Elemen-
elemen dalam n-elemen array memiliki index dari 0 sampai n-1. Perhatikan disini
bahwa tidak ada elemen array arr[n]. Hal ini akan menyebabkan array-index outof-
bounds exception. 3. Anda tidak dapat mengubah ukuran dari sebuah array

Pengenalan Pemrograman 1

4
J.E.N.I.

7.5 Panjang Array


Untuk mengetahui berapa banyak element didalam sebuah array, Anda dapat menggunakan
length (panjang) field dalam array. Panjang field dalam array 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 loop untuk memproses elemen-elemen dalam
array, gunakanlah length field didalam pernyataan pengkondisian dalam loop. Hal ini
akan menyebabkan loop secara otomatis menyesuaikan diri terhada ukuran array yang
berbeda-beda. 2. Pendeklarasian ukuran array di Java, biasanya digunakan constant
untuk mempermudah. Sebagai contoh, final int ARRAY_SIZE = 1000; ... int[] ages =
new int[ARRAY_SIZE]; //pendeklarasian constant

Pengenalan Pemrograman 1

5
J.E.N.I.

7.6 Array Multidimensi


Array multidimensi diimplementasikan sebagai array didalam 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 element 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

6
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

7
J.E.N.I.

BAB 8 Argumen dari Command-line


8.1 Tujuan
Pada bagian ini, kita akan mempelajari bagaimana untuk memproses sebuah input dari
command-line dengan menggunakan argumen yang diberikan kepada program Java. Pada
akhir pelajaran, siswa diharapkan 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 berbagai argumen dari command-line. Argumen
dari command line memberikan kesempatan bagi user untuk mempengaruhi operasi dari
sebuah aplikasi dalam sekali invokasi. User memasukkan argumen command line pada
saat meng-invoke aplikasi dan memberikan spesifikasi kepada aplikasi tersebut
setelah nama kelas untuk 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

1
J.E.N.I.

Gambar 1:Menjalankan argument dari Command-Line

Perhatikan bahwa sebuah argumen akan dipisahkan oleh spasi. Di bahasa Java, apabila
Anda akan memanggil sebuah aplikasi, sebuah runtime system akan memberikan argumen
command-line ke main method lewat array dari String, dimana tiap String dalam array
terdiri dari 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 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 support sebuah argumen command-line yang numeric. Anda harus
mengkonversi String argumen tersebut untuk merepresantasikan sebuah nomor, misalnya
“34” menjadi sebuah nomor. Kode dibawah ini adalah sebuah potongan untuk
mengkonversi sebuah argumen command-line menjadi integer. int firstArg = 0; if
(args.length > 0){
Pengenalan Pemrograman 1 2
J.E.N.I.

firstArg = Integer.parseInt(args[0]); } parseInt akan mendapatkan


NumberFormatException (ERROR) jika format args[0] tidak valid (bukan sebuah nomor).

Petunjuk penulisan program: Sebelum menggunakan argumen command line, selalu


telitilah terlebih dahulu berapa banyak argumen yang diperlukan untuk mengakses
sebuah array, sehingga tidak ada exception yang akan muncul.

Pengenalan Pemrograman 1

3
J.E.N.I.

8.3 Argument Command-line di NetBeans


Untuk menggambarkan bagaimana sebuah argumen diberikan pada program di NetBeans,
marilah kita membuat sebuah program Java yang akan mencetak jumlah argumen dimana
argumen pertama yang telah 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. Copy
kode yang telah dituliskan diatas, kemudian compile. Setelah itu, ikutilah langkah-
langkan berikut ini untuk memberikan argumen kepada program Anda dengan menggunakan
NetBeans. Klik di Projects (dilingkari dibawah)

Gambar 2: Membuka file project

Pengenalan Pemrograman 1

4
J.E.N.I.

Klik kanan icon CommanLineExample dan akan keluar sebuah pop-up menu.

Gambar 3: Membuka Properties

Klik pada properties-nya. Dialog mengenai project properties akan tampil

Figure 4: Properties Dialog

Pengenalan Pemrograman 1

5
J.E.N.I.

Gambar 5: Klik untuk menjalankan project

Kemudian, klik Run -> Running Project Pada argument textbox, tuliskan tipe 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

6
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

7
J.E.N.I.

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

Gambar 8: Program Keluaran

Pengenalan Pemrograman 1

8
J.E.N.I.

8.4 Latihan
8.4.1 Mencetak Argument
Dapatkan input dari user dengan menggunakan argument 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 4

program anda akan mencetak sum = 24 difference = 16 product = 80 quotient = 5

Pengenalan Pemrograman 1

9
J.E.N.I.

BAB 9 Bekerja dengan Java Class Library


9.1 Tujuan

Pada sesi ini, kita akan mengantarkan beberapa konsep dasar dari Object-Oriented
objcts, dan Programming (OOP). Selanjutnya kita akan membahas konsep dari classes
dan bagaimana menggunakan class dan anggotanya. Perubahan dan pemilihan object juga
akan dibahas. Sekarang, kita akan focus dalam menggunakan class yang telah
dijabarkan dalam Java Class library, kita akan membahas nanti tentang bagaimana
membikin class anda sendiri. Pada akhir pelajaran, siswa seharusnya dapat : 1.
menjelaskan OOP dan beberapa konsepnya 2. perbedaan antara class dan object 3.
pebedaan antara instance variables/method dan class (static) variable/method 4.
menjelaskan method apa dan bagaimana memanggil method parameter 5. mengidentifikasi
beberapa jangkauan dari sebuah variable 6. memilih tipe data primitive dan object
7. membandingkan objects dan menjabarkan class dari objects.

9.2

Pengenalan Pemrograman Berorientasi Object

OOP berputar pada konsep dari object sebagai dasar element dari program anda.
Ketika kita membandingkan dengan dunia nyata, kita dapat menemukan beberapa objek
disekitar kita, seperti mobil, singa, manusia dan seterusnya. Object ini
dikarakterisasi oleh sifat / attributnya dan tingkah lakunya. Contohnya, objek
sebuah mobil mempunyai sifat tipe transmisi, warna dan manufaktur. Mempunyai
kelakuan berbelok, mengerem dan berakselerasi. Dengan cara yang sama pula kita
dapat mendefinisikan perbedaan sifat dan tingkah laku dari singa. Coba perhatikan
table dibawah ini sebagai contoh perbandingan :
Object Car Properties type of transmission manufacturer color Weight Color hungry
or not hungry tamed or wild Table 1: Example of Real-life Objects
Pengenalan Pemrograman 1 1

Behavior turning braking accelerating roaring sleeping hunting

Lion
J.E.N.I.

Dengan deskripsi ini, objek pada dunia nyata dapat secara mudah dimodelisasi
sebagai objek software menggunakan sifat sebagai data dan tingkah laku sebagai
method. Data disini dan method dapat digunakan dalam pemrograman game atausoftware
interaktif untuk menstimulasi objek dunia nyata. Contohnya adalah sebagai software
objek mobil dalam permainan balap mobil atau software objek singadalam sebuah
software pendidikan interaktif pada kebun binatang untuk anak anak.

9.3

Class dan Object

9.3.1 Perbedaan Class dan Object


Pada dunia software, sebuah objek adalah sebuah komponen software yang stukturnya
mirip dengan objek pada dunia nyata. Setiap objek dibuat dari satu set data (sifat)
dimana variable menjabarkan esensial karakter dari objek, dan juga terdiri dari
satu set dari methode (tingkah laku) yang menjabarkan bagaimana tingkah laku dari
objek. Jadi objek adalah sebuah berkas software dari variable dan method yg
berhubungan. Variable dan methods dalam objek Java scara formal diketahui sebagai
instance variable dan instance methods untuk membedakannya dari variable klas dan
method klas, dimana akan dibahas kemudian. Klas adalah sturktur dasa dari OOP. Dia
terdiri dari dua tipe dari anggota dimana disebut dengan field (attribut/properti)
dan method. Field mespesifikasi tipe data yang didefinisikan oleh class, sementara
methode spesifikasi dari operasi. Sebuah objek adalah sebuah instance pada class.
Untuk dapat membedakanantara class dan obect, mari kita mendiskusikan beberapa
contoh. Apa yang kita miliki disini adalah sebuah class mobil dimana dapat
digunakan untuk medefinisikan beberapa object mobil. Pada table dibawah, mobil A
dan mobil B adalah objek dari kelas mobil. Kelas memiliki field plat nomer, warna,
manufaktur, dan kecepatan yang diisi dengan nilai korespondendi pada objek mobil A
dan mobil B. mobil juga dapat berakselerasi, berbelok dan mengerem. Car Class Plate
Number Inst Vari Color anc able e s Manufacturer Current Speed Inst Met anc hod e s
Object Car A ABC 111 Blue Mitsubishi 50 km/h Accelerate Method Turn Method Brake
Method
Table 2: Contoh class car dan object-object nya

Object Car B XYZ 123 Red Toyota 100 km/h

Pengenalan Pemrograman 1

2
J.E.N.I.

Ketika diinisialisi, tiap objek mendapat satu set baru dari state variable.
Bagaimanapun, implementasi dari method dibagi diantara objek pada kelas yang sama.
Kelas menyediakan keuntungan dari reusability. Software programmers dapat digunakan
dari sebuah kelas lagi dan lagi untuk membuat beberapa objek.

9.3.2 Instansiasi Class


Untuk membuat sebuah objek atau sebuah instance pada sebuah kelas. Kita menggunakan
operator baru. Sebagai contoh, jika anda ingin membuat instance dari kelas string,
kita menggunakan kode berikut : String str2 = new String(“Hello world!”); or also
equivalent to, String str2 = "Hello";
Figure 1: Classs Instantiation

9.3.3 Variabel Class dan Method


Sebagai tambahan pada contoh variable, hal ini juga memungkinkan untuk
mendefinisikan variable kelas, dimana variable milik dari seluruh kelas. Ini
berarti bahwa memiliki nilai yang sama untuk semua objek pada kelas 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 main() method. Didalam Java, kita dapat mendefinisikan beberapa
method yang akan kita panggil dari method yang berbeda. Sebuah method adalah bagian
terpisah dari kode yang akan dipanggil oleh program utama dan beberapa method
lainnya untuk menunjukkan beberapa fungsi spesifik. Berikut adalah karakteristik
dari method : 1. dapat mengembalikan satu atau tidak ada nilai 2. dia mungkin dapat
diterima sebagai beberapa parameter yang dibutuhkan atau tidak ada arameter sama
sekali. Parameter juga disebut sebagai fungsi argument 3. setelah method telah
selesai dieksekusi, dia akan kembali pada method yang memanggilnya.

Pengenalan Pemrograman 1

3
J.E.N.I.

Sekarang mengapa kita butuh untuk membuat method? Mengapa kita tidak meletakkan
semua kode pada sebuah method yang sangat besar? Pemecahan masalah disini alah
dekomposisi. Kita juga dapat melakukan ini di Java dengan mmbuat method untuk
mengatasi bagian spesifik dari masalah. Mengambil sebuah permasalahan dan
memecahkannya menjadi bagian kecil, bagian dapat diatur adalah penting untuk
menulis program yang besar.

9.4.2 Memanggil Instance dari Method dan Passing Variabel


Sekarang kita ilustrasikan bagaimana memanggil method, mari kita menggunakan kelas
string sebagai contoh. Anda dapat menggunakan the Java API documentation untuk
melihat semua method dalam kelas string yang tersedia. Selanjutnya, kita akan
membuat method kita sendiri. Tapi sekarang mari kita menggunakan apa yang tersedia.
Untuk memanggil sebuah instance method, kita menuliskan :

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

Method declaration public char charAt(int index) public boolean equalsIgnoreCase


(String anotherString)

Definition Mengambil karakter pada index. 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

4
J.E.N.I.

9.4.3 Passing Variabel Dalam Method


Pada contoh kita, kita telah mecoba melewati variable pada method. Bagaimanapun
juga kita tidak dapat membedakan antara perbedaan tipe variabel passing dalam Java.
Ada dua tipe data 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 menggunakan sebuah copy pada nilai pada variable yang dilewatkan
pada method. method tidak dapat secara langsung dimodifikasi secara argument
langsung meskipun jika dimodifikasi parameternya selama perhitungan berlangsung.
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 ); //Mencetak nilai i System.out.println( i ); } public
static void test( int j ){ //merubah nilai parameter j j = 33; } }
Pada contoh diatas yang telah diberikan, kita memanggil method tes dan melewatkan
nilai i sebagai parameter. Nilai pada i dikopikan pada variable pada method j.
sejak j adalah variable pengganti pada method tes, dia tidak akan berdampak pada
nilai variable jika i pada main semenjak memiliki perbedaan kopy pada variable.
Secara default, semua tipe data primitive ketika dilewatkan pada sebuah method
adalah pass-by-values

Pass i as parameter which is copied to j

Pengenalan Pemrograman 1

5
J.E.N.I.

9.4.3.2 Pass-by-reference Ketika sebuah pass-by-reference terjadi, referensi pada


sebuah objek dilewatkan dengan cara memanggil method. Hal ini berarti bahwa method
mengkopi referensi pada variable yang dilewatkan pada method. Bagaimanapun juga,
tidak seperti apda pass-by-value, method dapat membuat objek actual yang
menerangkan pointing to, since, meskipun berbeda keterangan yang digunakan dalam
method, lokasi dari data yang mereka tunjukkan adalah 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

6
J.E.N.I.

Gambar 2 : Contoh Pass By Reference

Petunjuk Penulisan Program : Keadaan yang salah tentang nilai oleh referensi di
java adalah ketika membuat method swap menggunakan referensi Java, mencatat tentang
manipulasi object Java ‘by reference’ tetapi nilai objeck dari referensi dari
method ‘by value,’” adalah hasil, anda tidak dapat menulis standart swap method ke
swap objek.

9.4.4 Memanggil Method Static


method Static adalah cara yang dapat dipakai tanpa inisialisasi suatu class
(maksudnya tanpa menggunakan kata kunci yang baru ), method static mempunyai class
yang lengkap dan contoh yang tidak pasti (atau objek) dari suatu class. method
static dibedakan dari contoh method di dalam suatu class oleh kata kunci static.
Untuk memanggil method static, ketik,

Classname.staticMethodName(params);

Pengenalan Pemrograman 1

7
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


Sebagai tambahan dari suatu variable nama dan tipe data, suatu variable mempunyai
jangkauan, Jangkauan menentukan dimana program dapat mengakses variable, jangkauan
juga menentukan kehidupan dari suatu variable atau berapa lama variable itu berada
dalam memory. Jangkauan ditentukan oleh dimana deklarasi variable di tempatkan di
dalam program. Untuk menyederhanakannya, coba berpikir tentang jangkauan apapun
antara kurung kurawal {.....}, diluar kurung kurawal disebut dengan blok terluar,
dan didalam kurung kurawal disebut dengan blok terdalam. Jika kamu mendeklarasikan
variable di blok luar. Mereka akan terlihat (yaitu, dapat dipakai) Oleh blok bagian
dalam, bagaimana pun, jika kamu mendeklarasikan variable di blok dalam, kamu tidak
bisa harapkan blok terluar untuk melihat itu. Suatu jangkauan variable di dalam
blok dimana jika sudah di deklarasi, dimulai dari titik dimana variable itu di
dklarasikan, dan di blokbagian dalam.

Pengenalan Pemrograman 1

8
J.E.N.I.

Contoh, yang diberi code snippet,

public class ScopeExample { public static void main( String[] args ){

int i = 0;

int j = 0; //... some code here {

D
int k = 0;

int

m = 0;

E
int } } n = 0;

Pengenalan Pemrograman 1

9
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 variable variable
variable variable i adalah A. j adalah B. k adalah C. m adalah D. n adalah E.

Sekarang, memberi kedua method utama dan menguji di contoh kita sebelumnya,

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 ); //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; } }

B A

Pada method pertama, Jangkauan variables adalah,

ages[ ] i in B i in C

- scope A - scope B – scope C


10

Pengenalan Pemrograman 1
J.E.N.I.

Pada method ujian, Jangkauan variables adalah,

arr[ ] i in E

- scope D - scope E

manakala variable di deklarasikan,hanya satu variable yang di identifikasi atau


nama dapat di identifikasi di jangkauan, maksudnya jika kamu mempunyai deklarasi
berikut,

{ int test = 10; int test = 20; }


Compilermu akan menghasilkan error karena kamu perlu mempunyai nama yang lain dari
variable di satu blok, bagaimanapun, kamu dapat mempunyai dua variable dengan nama
yang sama, jika mereka 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 pertama out.print itu memanggil, dia mencetak nilai dari variable
ujian pertama sejak terdapat pada variable jangkauan itu. Yang kedua, system.out
print, nilai 20 dicetak sejak tertutup ujian jangkauan variable itu. 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 meng-konversi tipe data primitive ke object
dan sebaliknya. Kemudian, pada akhirnya kita akan belajar bagaimana membandingkan
sebuah object.

Pengenalan Pemrograman 1

11
J.E.N.I.

9.5.1 Casting Tipe Primitiv


Casting antara tipe primitve mendukung Anda untuk mengkonversikan sebuah value dari
sebuah tipe data tertentu kepada tipe primitive yang lain. Hal ini biasanya terjadi
diantara tipe data numerik. Ada sebuah tipe data primitive yang tetap tidak dapat
kita casting, dan dia adalah tipe data boolean. Sebagai contoh dari typecasting
adalah pada saat Anda menyimpan sebuah 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, walaupu variabel yang dituju (double)
memiliki nilai 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 int 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'. Numerik kode yang merepresentasikan kapital A adalah 65,
berdasarkan karakter set 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 men-convert 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 convert 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
12

Pengenalan Pemrograman 1
J.E.N.I.

9.5.2 Casting Objects


Instances dari class-class juga dapat di pilih 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 akan menjelaskan mengenai inheritance pada kesempatan
selanjutnya. Sejalan dengan pemilihan nilai primitive untuk tipe yang lebih besar,
beberapa object mungkin tidak membutuhkan untuk dipilih secara explisit. Faktanya,
karena sebuah semua subclass terdiri atas informasi yang sama, Anda dapat
menggunakan instance dari subclass diamanpun sebuah superclass diharapkan berada.
Sebagai contoh, mempertimbangkan methode yang memiliki dua argument, satu tipe
object dan tipe window yang lain. Anda dapat melewatkan instance dari beberapa
class untuk argument object karena semua class java adalah subclass dari object.
Untuk argument window, anda dapat melewatkannya kedalam subclassnya, seperti
dialog, FileDialog, dan frame. Ini benar dimanapun dalam program, bukan hanya dalam
memanggil methode. Jika anda mempunyai variabel yang didefinisikan sebagai window
class, anda dapat memberikan object dari kelas tersebut atau dari subclassnya untuk
variabelnya tanpa pemilihan.

Figure 2: Contoh Hierarchy Class

Ini dibenarkan dalam kasus yang berkebalikan, dan Anda dapat menggunakan superclass
ketika sebuah subclass dibentuk. Ada yang didapatkan dalam kasus ini, bagaimanapun:
Karena subclass terdiri dari lebih banyak kemungkinan aksi daripada superclassnya,
terdapat kehilangan dalam keseimbangan keterlibatan. Object superclass itu mungkin
tidak memiliki semua kemungkinan aksi yang diperlukan untuk aksi pada tempat dari
object subclass berada. Sebagai contoh jika anda memiliki operasi yang memanggil
methode dalam object dari class integer, mengunakan object dari class Number tidak
akan terdiri dari benyak methode yang dispesifikasikan dalam integer. error terjadi
jika Anda mencoba untuk memanggil methode yang tidak memiliki object tujuan. Untuk
mengunakan object-object superclass dimana object-object subclass diharapkan, anda
harus memilih mereka secara eksplisit. Anda tidak akan kehilangan beberapa
informasi dalam pemilihan, tapi anda memperoleh keuntungan dari semua method dan

Pengenalan Pemrograman 1

13
J.E.N.I.

variabel yang mendefinisikan subclass. Untuk memilih sebuah object ke class yang
lain, Anda menggunakan operasi yang sama sebagaimana untuk tipe-tipe primitive :
Untuk memilih, (classname)object dimana, classname, adalah nama dari class tujuan.
object, adalah sesuatu yang mengarah pada sumber object. Catatan: pemilihan ini
membuat referensi ke object yang lama dari tipe namaclass; object yang lama
melanjutkan aksi seperti yang telah ada sebelumnya.

Figure 3: Class Hierarchy untuk superclass Employee

Contoh berikut memilih sebuah instance dari class VicePresident ke sabuah instance
dari class Employee; VicePresident adalah sebuah dari Employee dengan lebih banyak
information, dimana disini mendefinisikan bahwa VicePresident memilihi executive
washroom privileges, Employee emp = new Employee(); VicePresident veep = new
VicePresident(); emp = veep; // tidak adah pemilihan 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 pemilihan dari
sebuah objectke sebuah tipe data primitive, atau vice versa. Tipe-tipe primitive
dan objectadalah sesuatu yang sangat berbeda dalam Java, dan Anda tidak bisa secara
langsung memilih diantara dua atau saling menukar diantara keduanya. Sebagai sebuah
alternatif, package java.lang yang terdiri atas class-class yang sesuai untuk
setiap tipe data primitivenya 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 capital(Short -> sort, Double ->
double dan sebagainya). Juga dua class memiliki nama yang berbeda dari tipe data
yang sesuai : Character digunakan untuk variabel char dan Integer untuk variabel
int. (Disebut dengan Wrapper Classes)

Pengenalan Pemrograman 1

14
J.E.N.I.

Java merepresentasikan type data dan versi classnya dengan sangat berbeda, dan
sebuah program tidak akan berhasil tercompile jika Anda menggunakan hanya satu
ketika yang lain juga diperlukan. Menggunakan class-class yang sesuai untuk setiap
tipe primitive, anda dapat membuat sebuah object yang memiliki nilai yang sama.
Contoh : //Pernyataan berikut membentuk sebuah instance bertype Integer // class
dengan nilai integer 7801 (primitive -> Object) Integer dataCount = new
Integer(7801); //Pernyataan berikut meng-converts sebuah object Integer ke //tipe
data primitive int nya. Hasilnya adalah sebuah int //dengan nilai 7801 int newCount
= dataCount.intValue(); // Anda perlu suatu translasi biasa pada program // yang
meng-convert sebuah String ke sebuah tipe numeric, //seperti suatu int // Object-
>primitive String pennsylvania = "65000"; int penn =
Integer.parseInt(pennsylvania);

PERHATIAN: class Void tidak mewakili sesuatu dalam Java, jadi disini tidak ada
alasan menggunakannya ketika melakukan translasi antara nilai primitive dan object.
Ini adalah penjelasan mengenai kata kunci void, dimana digunakan dalam definisi
method untuk mengindikasikan bahwa methode tidak memiliki sebuah nilai kembalian.

9.5.3 Comparing Objects


Dalam diskusi kita sebelumnya, kita mempelajari tentang operator untuk
membandingkan nilai —sama, tidak sama, lebih kecil daripada, dan sebagainya.
Operator ini yang paling banyak bekerja hanya pada tipe primitive, bukan pada
object. Jika Anda berusaha untuk menggunakan nilai lain sebagai operands, Compiler
Java akan menghasilkan error. Pengecualian untuk aturan ini adalah operator untuk
persamaan : == (sama) dan != (tidak). Ketika dinampilkan ke object, operator ini
tidak akan melakukan apa yang sebenarnya anda inginkan. Malahan mengecheck jika
satu object memilki nilai yang sama seperti object lain, mereka mengenali jika
kedua sisi dari operator menunjuk object yang sama. Untuk membandingkan instances
dari sebuah class dan memiliki hasil yang berarti, 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. Jika Anda menggunakan operator == untuk membandingkan
object ini, bagaimanapun, kita akan

Pengenalan Pemrograman 1

15
J.E.N.I.

mempertimbangkan nilai yang tidak sama. Walaupun isinya sesuai mereka bukan
merupakan object yang sama. Untuk melihat jika dua object String memiliki nilai
yang sesuai, sebuah method dari class yang disebuat dengan equals() digunakan.
Method menguji setiap character dalam string dan mengembalikan nilai true jika dua
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
String2: Free the bound Same object? true String1: Free the bound String2: Free the
bound Same object? false Same value? True periodicals. periodicals. periodicals.
periodicals.

Sekarang mari mendiskusikan tentang kode. String str1, str2; str1 = "Free the bound
periodicals.";

Pengenalan Pemrograman 1

16
J.E.N.I.

Figure 4: Keduanya mengarah ke object yang sama

Bagian pertama dari program ini mendeklarasikan dua variabel (str1 dan str2),
memberikan literal "Free the bound periodicals." untuk str1, dan kemudian memberi
nilai tersebut untuk str2. Seperti yang Anda pelajari sebelumnya, str1 dan str2
sekarang menunjuk ke object yang sama, dan uji kesamaan membuktikan hal tersebut.
str2 = new String(str1); Padabagian yang kedua dari program ini, anda membuat
object String baru dengan nilai yang sama sebagai str1 dan memberi str2 ke object
baru String tersebut. Sekarang Anda memiliki dua object string yang berbeda yaitu
str1 dan str2, keduanya memilki nilai yang sama.Test mereka untuk melihat jika
meeka object yang sama dengan menggunakan operator == mengembalikan nilai yang
diinginkan : false—mereka buka object yang sama dalam memory. Test mereka
menggunakan method equals() juga mengembalikan jawaban yang diinginkan: true—mereka
memiliki niali yang sama.

Figure 5: Sekarang mengarah pada object yang berbeda

Catatan: Mengapa Anda tidak dapat hanya menggunakan literal yang lain ketika Anda
mengubah str2, lebih dari menggunakan new? String literals diandalkan dalam Java;
jika Anda membuat sebuah string menggunakan literal dan kemudian menggunakan
literal yang lain dengan character yang sama, Java cukup mengetahui untuk
memberikan Anda object String yang pertama kembali. kedua String adalah object yang
sama; Anda harus menghidari langkah anda untuk membuat dua object terpisah.

Pengenalan Pemrograman 1

17
J.E.N.I.

9.5.5 Menentukan Class dari sebuah Object


Ingin menemukan apakah sebuah class object itu? Disini langkah untuk melakukannya
untuk sebuah object yang diberikan sebagai kunci variabel : 1. Method getClass()
mengembalikan sebuah object Class (dimana Class itu sendiri merupakan sebuah class)
yang memilki sebuah method yang disebut getName(). Pada bagiannya, getName()
mengembalikan sebuah string yang mewakili nama class. Sebagai contoh, String name =
key.getClass().getName(); 2. operator InstanceOf instanceOf memiliki dua operands:
suatu mengarahke sebuah object pada sebelah kiri dan nama class pada sebelah kanan.
pernyataan mengembalikan nilai true atau false tergantung pada apakah object adalah
sebuah instance dari penamaan class atau beberapa dari 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 untuk method yang mengenali jika character
yang dipakai adalah sebuah digit. Sebagai contoh, jika Saya input '3', dia akan
mengembalikan nilai true.

Pengenalan Pemrograman 1

20
J.E.N.I.

BAB 10 Membuat Class Sendiri 10.1 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 fungsi – fungsi lain. Kita akan membuat class yang
mengandung informasi dari Siswa dan operasi – operasi 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 siswa dapat : • Membuat kelas 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

1
J.E.N.I.

10.2

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

Pada bagian ini, kita akan membuat sebuah class yang berisi record dari siswa. Jika
kita telah mengidentifikasikan tujuan dari pembuatan kelas, 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 StudentRecord

Class ini dapat diakses dari luar package Keyword yang digunakan di pembuatan class
Java Identifier yang menjelaskan class

Pengenalan Pemrograman 1

2
J.E.N.I.

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

10.3

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

3
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

4
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 kelas, kita dapat mendeklarasiakan 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

5
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

6
J.E.N.I.

dimana, public String getName () Menjelaskan bahwa method tersebut dapat diakses
object luar kelas Tipe data return value dari method tersebut Nama dari method
Menjelaskan bahwa method tidak memiliki parameter apapun

Pernyataan berikut,
return name;

dalam program kita menandakan akan ada pengembalian nilai dari instance variable
name pada pemanggilan method. Perhatikan bahwa return type dari method harus sama
dengan tipe data terhadap 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

7
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) Pernyataan berikut :


name = temp;

Menjelaskan bahwa method ini dapat dipanggil object luar kelas Method ini tidak
menghasilkan return value Nama dari method Parameter yang akan digunakan pada
method

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

8
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 getStudentCount - Menjelaskan bahwa method ini dapat
diakses object luar kelas - Method ini adalah static dan pemanggilannya menggunakan
[namaKelas].[namaMethod]. Sebagai contoh : studentRecord.getStudentCount - Tipe
return dari method. Mengindikasikan method tersebut harus mempunyai return value
berupa integer - Nama dari method

Pengenalan Pemrograman 1

9
J.E.N.I.

public ()

- Menjelaskan bahwa method ini dapat diakses object luar kelas - 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.

Referensi this

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

public void setAge( int age ){ age = age; //SALAH!!! }

Pengenalan Pemrograman 1

12
J.E.N.I.

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 :

age = age;

kita telah mengidentifikasi nilai dari parameter age kepada parameter itu sendiri.
Hal ini sangat tidak kita hendaki 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 tipe
ini 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.

Pengenalan Pemrograman 1

13
J.E.N.I.

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.

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()); }

Pengenalan Pemrograman 1

14
J.E.N.I.

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

Jangan dilupakan 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>* }

Pengenalan Pemrograman 1

15
J.E.N.I.

10.7.1

Default Constructor

Setiap kelas 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 terbuat secara implisit :
Sebagai contoh, pada class StudentRecord, bentuk default constructor akan terlihat
seperti dibawah ini :

public StudentRecord() { //area penulisan kode

10.7.2

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; }

Pengenalan Pemrograman 1

16
J.E.N.I.

10.7.3

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 static variable
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 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 }

Pengenalan Pemrograman 1

17
J.E.N.I.

10.7.4

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: } 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

Pengenalan Pemrograman 1

18
J.E.N.I.

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.

10.8.1

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 : java.awt.Color color;

10.8.2

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.

Pengenalan Pemrograman 1

19
J.E.N.I.

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.

10.8.3

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) at
java.net.URLClassLoader.defineClass(Unknown Source) at
java.net.URLClassLoader.access$100(Unknown Source) at
java.net.URLClassLoader$1.run(Unknown Source) at
java.security.AccessController.doPrivileged(Native Method) at
java.net.URLClassLoader.findClass(Unknown Source) at
java.lang.ClassLoader.loadClass(Unknown Source) at
sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at
java.lang.ClassLoader.loadClass(Unknown Source) at
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
Pengenalan Pemrograman 1 20
J.E.N.I.

StudentRecord berada pada package dengan nama studentClasses. Jika kita ingin
menjalankan kelas 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

21
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 mempersyaratkan 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

22
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

23
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

24
J.E.N.I.

10.10. Latihan
10.10.1 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 Nama Alamat Nomor Telepon Alamat E-Mail Alamat Lengkap Nomor telepon
personal Alamat E-Mail personal

Deskripsi Nama Lengkap perseorangan

Tabel 1: Atribut dan Deskripsi Atribut

Buat implementasi dari method sebagai berikut : 1. Menyediakan accessor dan mutator
method terhadap seluruh atribut 2. Constructor

10.10.2

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

25
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 pembelajaran ini, siswa harus mampu untuk:
• • •

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
Pengenalan Pemrograman 1 1
J.E.N.I.

dapat digunakan oleh semua subclass. Subclass hanya butuh mengimplementasikan


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

2
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 mendeklarasikan 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

Pengenalan Pemrograman 1

3
Gambar 2: Alur Program

J.E.N.I.

Alur program ditunjukkan sebagai berikut.

11.2.2

Kata Kunci Super

Subclass juga dapat memanggil constructor secara explicit 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 adalah Person) dan mengeksekusinya. Contoh kode lain ditunjukkan
sebagai berikut, public Student(){ super(); System.out.println("Inside
Student:Constructor"); }
Pengenalan Pemrograman 1

4
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
konstuktor 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 referensi this). Sebagai contoh, public Student() { super.name =
“somename”; super.address = “some address”; }

11.2.3

Overriding Method

Untuk beberapa pertimbangan, kadang-kadang 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"); return name; }
Pengenalan Pemrograman 1 5
J.E.N.I.

: } 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.
Untuk contohnya, 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

6
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 7
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 referensi 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 referensi 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 referensi ke
method. Misalkan kita punya method statis printInformation yang mengakibatkan
object Person sebagai referensi, kita dapat me-referensi 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 8
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

9
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:
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.
PersonInterface

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
11.6.1

Latihan
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 pembelajaran, siswa mampu untuk
• !ende"inisikan e#$eption • !enangani e#$eption menggunakan blok try%$at$h%"inally

12.2

Apa itu Exception?

E#$eption 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. (eberapa $ontoh dari e#$eption yang )nda
mungkin jumpai pada latihan%latihan sebelumnya adalah e#$eption )
rrayInde#*ut*"(ounds, yang terjadi jika kita men$oba mengakses elemen array yang
tidak ada, atau Number+ormatE#$eption, yang terjadi ketika kita men$oba melalui
parameter bukan angka dalam method Integer.parseInt.

12.3 Menangani Exception


,ntuk menangani e#$eption dalam Java, kita gunakan blok try%$at$h%"inally. )pa yang
kita lakukan dalam program kita adalah kita menempatkan pernyataan yang mungkin
menghasilkan e#$eption dalam blok ini. (entuk umum dari blok try%$at$h%"inally
adalah, try{ //tulis pernyataan yang dapat mengakibatkan exception //dalam blok ini
} catch( <exceptionType1> <varName1> {

} # # #

//tulis aksi apa dari program !nda yang di"alankan "ika ada //exception tipe
tertentu ter"adi

Pengenalan Pemrograman -

1
J.E.N.I.

catch( <exceptionTypen> <varNamen> { //tulis aksi apa dari program !nda yang
di"alankan "ika ada //exception tipe tertentu ter"adi } $inally{ //tambahkan kode
terakhir di sini } E#$eption dilemparkan selama eksekusi dari blok try dapat
ditangkap dan ditangani dalam blok catch. .ode dalam blok finally selalu di
%eksekusi. (erikut ini adalah aspek kun$i tentang sintak dari konstruksi try%$at$h
%"inally • Notasi blok bersi"at perintah • /etiap blok try, terdapat satu atau
lebih blok catch, tetapi hanya satu blok finally. • (lok catch dan blok finally
harus selalu mun$ul dalam konjungsi dengan blok try, dan diatas urutan • (lok try
harus diikuti oleh paling sedikit satu blok catch )T), satu blok finally, atau
keduanya. • /etiap blok catch mende"inisikan sebuah penanganan e#$eption. 0eader
dari blok catch harus membawa satu argumen, dimana e#$eption pada blok tersebut
akan ditangani. E#$eption harus menjadi $lass pelempar atau satu dari
sub$lassesnya.

Gambar 1: Alur kejadian blok try-catch-finally

Pengenalan Pemrograman -

2
J.E.N.I.

!arilah mengambil $ontoh kode yang men$etak argumen kedua ketika kita men$oba
menjalankan kode menggunakan argumen $ommand%line. Perkirakan, tidak ada penge$ekan
dalam kode )nda untuk angka dari argumen dan kita hanya mengakses argumen kedua
args1-2 segera, kita akan mendapatkan e#$eption berikut. %xception in thread &main&
"ava#lang#!rray'ndex(ut($)ounds%xception* 1 at %xception%xample#main(%xception
%xample#"ava*+

,ntuk men$egah kejadian ini, kita dapat menempatkan kode ke dalam blok try%$at$h.
(lok "inally hanya sebagai pilihan lain saja. /ebagai $ontoh, kita tidak akan
menggunakan blok "inally. public class %xception%xample { public static void
main( ,tring-. args try{

,ystem#out#println( args-1. / }catch( ArrayIndexOutOfBoundsException exp ){


,ystem#out#println(&%xception caught0& / } } } Jadi kita akan menjalankan program
lagi tanpa argumen, keluarannya akan menjadi, %xception caught0

Pengenalan Pemrograman -

3
J.E.N.I.

12.

!atihan

12.4.1 Menangkap Exception 1


Diberikan kode berikut public class Test%xceptions{ public static void main(
,tring-. args { $or( int i12/ true/ i33 { ,ystem#out#println(&args-&3i3&.1&3 args-
i. / } } } 3ompile dan jalankan program TestE#$eptions. .eluarannya akan tampak
seperti ini "avac Test%xceptions one t4o three args-2.1one args-1.1t4o args-
5.1three %xception in thread &main& "ava#lang#!rray'ndex(ut($)ounds%xception* 6 at
Test%xceptions#main(1#"ava*7 ,bah program TestE#$eptions untuk menangani e#$eption,
keluaran program setelah ditangkap e#$eption%nya akan seperti ini "avac Test
%xceptions one t4o three args-2.1one args-1.1t4o args-5.1three %xception caught*
"ava#lang#!rray'ndex(ut($)ounds%xception* 6 8uiting###

12.4.2 Menangkap Exception 2


!elakukan per$obaan pada beberapa program yang telah )nda tulis adalah hal yang
baik sebelum menghadapi e#$eption. .arena pada program di atas )nda tidak menangkap
e#$eption, maka eksekusi dengan mudahnya berhenti mengeksekusi program )nda.
.embali kepada program diatas dan gunakan penanganan e#$eption.

Pengenalan Pemrograman -

4
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 meninjau
beberapa hal yang telah Anda pelajari pada pelajaran pemograman pertama Anda.
Pelajaran ini menyajikan di ku i tentang perbedaan kon ep-kon ep berorienta i obje!
t dalam Java. Sebelum melengkapi pelajaran ini, Anda ebaiknya mampu untuk" #.
$engetahui dan menggunakan kon ep da ar beorienta i obje!t.
• • • • •

!la obje!t atribut method kon truktor tentang kon ep lanjutan berorienta i obje!t
dan menggunakannya

%. $engetahui dengan jela dengan baik


• • • • • •

pa!kage enkap ula i ab trak i pe&ari an polimorfi me interfa!e

3. $engetahui dengan jela penggunaan kata kun!i this, super, final dan static 4.
$embedakan antara method overloading dan method overridding

1.2 Konsep Berorientasi object


1.2.1 Desain Berorientasi object
'e ain berorienta i obje!t adalah ebuah teknik yang memfoku kan de ain pada obje!t
dan !la berda arkan pada kenario dunia nyata. (al ini menega kan keadaan)state*,
behaviour dan interak i dari obje!t. Selain itu juga menyediakan manfaat akan
kebeba an pengembangan, meningkatkan kualita , mempermudah pemeliharaan,
mempertinggi kemampuan dalam modifika i dan meningkatkan penggunaan kembali
oft&are.

Pengenalan Pemrograman %

1
J.E.N.I.

1.2.2 Class
+la mengi,inkan Anda dalam mendeklara ikan tipe data baru. Ia dijalankan ebagai
blueprint, dimana model dari obje!t yang Anda buat berda arkan pada tipe data baru
ini.

1.2.3 Object
Sebuah obje!t adalah ebuah entiti yang memiliki keadaan, behaviour dan identita
yang yang tuga nya dirumu kan dalam uatu lingkup ma alah dengan baik. Inilah in
tan!e ebenarnya dari ebuah !la . Ini juga dikenal ebagai instance. Instance dibuat
e&aktu Anda meng-instantiate !la menggunakan kata kun!i new. 'alam i tem regi tra i
i &a, !ontoh dari ebuah obje!t yaitu entiti Student.

1.2.4 Atribut
Atribut menunjuk pada elemen data dari ebuah obje!t. Atribut menyimpan informa i
tentang obje!t. 'ikenal juga ebagai member data, variabel in tan!e, properti atau
ebuah field data. -embali lagi ke !ontoh i tem regi tra i i &a, atribut dari ebuah
i &a adalah nomor i &a.

1.2.5 Method
Sebuah method menjela kan behaviour dari ebuah obje!t. $ethod juga dikenal ebagai
fung i atau pro edur. Sebagai !ontoh, method yang mungkin ter edia untuk entiti i
&a adalah method regi ter.

1.2.6 Konstruktor
-on truktor adalah ebuah tipe khu u dari method yang digunakan untuk membuat dan
mengini iali a i ebuah obje!t baru. Ingat bah&a kon truktor bukan member)yaitu
atribut, method atau inner !la dari ebuah obje!t*.

1.2.

!acka"e
dan.atau ubpa!kage . Strukturnya dapat

Pa!kage menunjuk pada pengelompokkan !la di amakan dengan direktorinya.

1.2.# $nka%sulasi
Enkap ula i menunjuk pada prin ip dari menyembunyikan de ain atau mengimplementa
ikan informa i yang tidak e uai pada obje!t yang ada.

1.2.& Abstraksi
Sementara enkap ula i menyembunyikan detail, ab trak i mengabaikan a pek dari ubyek
yang tidak e uai dengan tujuan yang ada upaya lebih banyak mengkon entra ikan yang
ada.

1.2.1' !e(arisan
Pe&ari an adalah hubungan antara !la dimana dalam atu !la ada uper!la atau !la
induk dari !la yang lain. Pe&ari an menunjuk pada properti dan behaviour yang
diterima dari nenek
Pengenalan Pemrograman % 2
J.E.N.I.

moyang dari !la

. Ini dikenal juga ebagai hubungan /i -a0. Perhatikan pada hirarki berikut.

SuperHero

FlyingSuperHero

UnderwaterSuperHero
1ambar #.1" +ontoh Pe&ari an

SuperHero adalah uper!la dari !la FlyingSuperHero dan UnderwaterSuperHero. +atatan


bah&a FlyingSuperHero /i -a0 SuperHero. Sebagaimana juga UnderwaterSuperHero /i -a0
SuperHero

1.2.11 !oli)or*is)e
Polimorfi me adalah kemampuan dari ebuah obje!t untuk membolehkan mengambil
beberapa bentuk yang berbeda. Se!ara harfiah, /poli0 berarti banyak ementara
/morph0 berarti bentuk. $enunjuk pada !ontoh ebelumnya pada pe&ari an, kita lihat
bah&a obje!t SuperHero dapat juga menjadi obje!t FlyingSuperHero atau obje!t
UnderwaterSuperHero.

1.2.12 +nter*ace
Sebuah interfa!e adalah ebuah contract dalam bentuk kumpulan method dan deklara i
kon tanta. -etika ebuah !la implements ebuah interfa!e, ini mengimplementa ikan
emua method yang dideklara ikan dalam interfa!e.

1.3 Struktur

ro!ram Java

Pada bagian ini meringka kan syntax da ar yang digunakan dalam pembuatan aplika i
Java.

1.3.1 Mendeklarasikan class ,a-a


<classDeclaration> ::= <modifier> class <name> { <attributeDeclaration>*
<constructorDeclaration>* <methodDeclaration>* 2 dimana 3modifier4 adalah ebuah
access modifier, yang mana boleh dikombina ikan dengan tipe yang laen dari
modifier.

Pengenalan Pemrograman %

3
J.E.N.I.

!etunjuk !enulisan !ro"ra). / 0 berarti bahwa boleh ada 0 atau lebih ke adian dari
deret tersebut yang menggunakannya uga! "description# $ menun ukkan bahwa %nda
harus mengganti nilai sebenarnya untuk bagian ini daripada menguranginya
penulisannya! Ingat bahwa untuk class teratas, acces modifier yang valid hanyalah
public dan package&yakni ika tidak ada acces modifier mengawali kata kunci class'!
+ontoh berikut ini mendeklara ikan blueprint SuperHero! Class SuperHero { String
superPowers !" #oid setSuperPowers$String superPowers !% { this&superPowers =
superPowers" ' #oid printSuperPowers$% { for $int i = (" i < superPowers&length"
i))% { S*stem&out&println$superPowers i!%" ' ' '

1.3.2 Mendeklarasikan Atribut


<attributeDeclaration> ::= <modifier> <t*pe> <name> = <default+#alue>!" <t*pe> ::=
b*te , short , int , long , char , float , double , boolean , <class>

Petunjuk Penulisan Program: [] = Menunjukkan bahwa bagian ini hanya pilihan.


Inilah !ontohnya. public class -ttributeDemo { pri#ate String stud.um" public
boolean graduating = false" protected float units/a0en = (&(f" String college" '

1.3.3 Mendeklarasikan Method


<methodDeclaration> ::= <modifier> <return/*pe> <name>$<parameter>*% { <statement>*
' <parameter> ::= <parameter+t*pe> <parameter+name> 1!
Pengenalan Pemrograman % 4
J.E.N.I.

Sebagai !ontoh" class 2ethodDemo { int data" int getData$% { return data" ' #oid
setData$int data% { this&data = data" ' #oid set2a3Data$int data41 int data5%
{ data = $data4>data5%6 data4 : data5" ' '

1.3.4 Mendeklarasikan sebuah Konstruktor


<constructorDeclaration> ::= <modifier> <class.ame> $<parameter>*% { <statement>* '
Jika tidak ada kon truktor yang di ediakan e!ara jela , kon truktor default e!ara
otomati membuatkannya untuk Anda. -on truktor default tidak memba&a argumen dan
tidak beri i pernyataan pada tubuh !la . !etunjuk !enulisan !ro"ra). (ama
konstruktor harus sama dengan nama class! "modifier# yang valid untuk konstruktor
adalah public, protected, dan private! )onstruktor tidak memiliki nilai return!
Perhatikan !ontoh berikut. class ConstructorDemo { pri#ate int data" public
ConstructorDemo$% { data = 4((" ' ConstructorDemo$int data% { this&data = data" ' '

1.3.5 Men"1instansiasi sebuah class


5ntuk meng-instantiate ebuah !la , dengan ederhana kita gunakan kata kun!i new
diikuti dengan pemanggilan ebuah kon truktor. $ari lihat lang ung ke !ontohnya.
class Construct7b8 { int data" Construct7b8$% { 9* menginisialisasi data *9
Pengenalan Pemrograman % 5
J.E.N.I.

' public static #oid main$String args !% { Construct7b8 ob8 = new Construct7b8$%" '
'

99di:instantiate

1.3.6 Men"akses An""ota object


5ntuk mengak e anggota dari ebuah obje!t, kita gunakan nota i /dot0. Penggunaanya
berikut" <ob8ect>&<member> +ontoh elanjutnya berda ar pada anggota dan method
tambahan. ebelumnya dengan pernyataan tambahan untuk mengak e eperti

class Construct7b8 { int data" Construct7b8$% { 9* inisialisasi data *9 ' #oid


setData$int data% { this&data = data" ' public static #oid main$String args !%
{ Construct7b8 ob8 = new Construct7b8$%" 99instantiation ob8&setData = 4(" 99access
setData$% S*stem&out&println$ob8&data%" 99access data ' '

1.3.

!acka"e

5ntuk menunjukkan bah&a file a al terma uk pa!kage khu u , kita gunakan syntax
berikut" <pac0ageDeclaration> ::= pac0age <pac0age.ame>" 5ntuk mengimpor pa!kage
lain, kita gunakan syntax berikut" <importDeclaration> ::= import
<pac0age.ame&element-ccessed>"

'engan ini, source code Anda haru memiliki format berikut" <pac0ageDeclaration>!
<importDeclaration>* <classDeclaration>)

Pengenalan Pemrograman %

6
J.E.N.I.

!etunjuk !enulisan !ro"ra). * menun ukkan bahwa boleh ada + atau lebih ke adian
pada baris ini dalam pengaplikasiannya! Sebagai !ontoh. pac0age
registration&reports" import registration&processing&*" import 8a#a&util&;ist"
import 8a#a&lang&*" 99imported b* default class 2*Class { 9* rincian dari 2*Class
*9

1.3.# Acces Modi*ier


6able berikut meringka acces modifier dalam Java. %ri-ate !la yang ama 7e pa!kage
yang ama pa!kage yang berbeda ) ub!la pa!kage yang berbeda )nonub!la * ,abel 1!-.
%cces /odifier * default.pa!kage 7e 7e %rotected 7e 7e 7e %ublic 7e 7e 7e 7e

1.3.& $nka%sulasi
$enyembunyikan elemen dari penggunaan ebuah !la anggota yang ingin Anda embunyikan
e!ara private. dapat dilakukan dengan pembuatan

+ontoh berikut menyembunyikan field secret. +atatan bah&a field ini tidak lang ung
diak e oleh program lain menggunakan method getter dan etter. class <ncapsulation {
pri#ate int secret" 99field tersembun*i public boolean setSecret$int secret% { if
$secret < 4 ,, secret > 4((% { return false" ' this&secret = secret" return true" '
public getSecret$% { return secret" ' '

Pengenalan Pemrograman %

7
J.E.N.I.

1.3.1' !e(arisan
5ntuk membuat !la anak atau ub!la berda arkan !la yang telah ada, kita gunakan kata
kun!i extend dalam mendeklara ikan !la . Sebuah !la hanya dapat meng-extend atu !la
induk. Sebagai !ontoh, !la 0oint di ba&ah ini adalah uper!la dari !la 1olored0oint!
import 8a#a&awt&*" class Point { int 3" int *" ' class ColoredPoint e3tends Point {
Color color" '

1.3.11 Method O-erridin"


$ethod ub!la override terhadap method uper!la ketika ub!la mendeklara ikan method
yang signaturenya erupa ke method dalam uper!la . Signature dari method hanyalah
informa i yang ditemukan dalam defini i method bagian ata . Signature mengikutkan
tipe return, nama dan daftar parameter method tetapi itu tidak terma uk acces
modifier dan tipe yang lain dari kata kun!i eperti final dan static. Inilah
perbedaan dari method overloading. $ethod overloading e!ara ingkat didi ku ikan
dalam ub bagian pada kata kun!i this. class Superclass { #oid displa*$int n%
{ S*stem&out&println$=super: = ) n%" ' ' class Subclass e3tends Superclass { #oid
displa*$int 0% { 99method o#erriding S*stem&out&println$=sub: = ) 0%" ' ' class
7#errideDemo { public static #oid main$String args !% { Subclass Sub7b8 = new
Subclass$%" Superclass Super7b8 = Sub7b8" Sub7b8&displa*$>%" $$Superclass
%Sub7b8%&displa*$?%" ' ' Ini akan mengha ilkan keluaran ebagai berikut. sub: > sub:
? Pemanggilan method ditentukan oleh tipe data ebenarnya dari obje!t yang diminta
method.

Pengenalan Pemrograman %

8
J.E.N.I.

%cces modifier untuk method yang dibutuhkan tidak haru ama. 8agaimanapun, acces
modifier dari method overridding mengharu kan alah atunya punya acces modifier yang
ama eperti itu dari method overridden atau acces modifier yang kurang dibata i.
Perhatikan !ontoh elanjutnya. Perik a yang mana dari method overridding berikut
akan menyebabkan &aktu meng-compile akan menyebabkan error. class Superclass { #oid
o#erridden2ethod$% { ' ' class Subclass4 e3tends Superclass { public #oid
o#erridden2ethod$% { ' ' class Subclass5 e3tends Superclass { #oid
o#erridden2ethod$% { ' ' class Subclass> e3tends Superclass { protected #oid
o#erridden2ethod$% { ' ' class Subclass? e3tends Superclass { pri#ate #oid
o#erridden2ethod$% { ' '

1.3.12 Class Abstract dan Method


8entuk umum dari ebuah method abstract adalah ebagai berikut" abstract <modifier>
<return/*pe> <name>$<parameter>*%" Sebuah !la yang beri i method abstract haru
dideklara ikan ebagai ebuah !la abstract!

abstract <modifier> <return/*pe> <name>$<parameter>*%"abstract class <name> { 9*


constructors1 fields and methods *9 ' -ata kun!i tidak dapat digunakan pada kon
truktor atau method static. Ini juga penting untuk diingat bah&a !la abstract tidak
dapat di-instantiate. +la yang meng-extends abstract! Jika tidak ub!la ebuah !la
abstract haru mengimplementa ikan endiri dapat dideklara ikan ebagai abstract! emua
method

!etunjuk !enulisan !ro"ra). 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&2'!
Pengenalan Pemrograman % 9
J.E.N.I.

Sebagai !ontoh" abstract class SuperHero { String superPowers !" #oid


setSuperPowers$String superPowers !% { this&superPowers = superPowers" ' #oid
printSuperPowers$% { for $int i = (" i < superPowers&length" i))%
{ S*stem&out&println$superPowers i!%" ' ' abstract #oid displa*Power$%"

'

class @nderwaterSuperHero e3tends SuperHero { #oid displa*Power$%


{ S*stem&out&println$=Communicate with sea creatures&&&=%" S*stem&out&println$=Aast
swimming abilit*&&&=%" ' ' class Al*ingSuperHero e3tends SuperHero { #oid
displa*Power$% { S*stem&out&println$=Al*&&&=%" ' '

1.3.13 +nter*ace
$endeklara ikan ebuah interfa!e pada da arnya mendeklara ikan ebuah !la tetapi
ebagai penggantinya menggunakan kata kun!i class, kata kun!i interface digunakan.
8erikut syntaxnya. <interfaceDeclaration> ::= <modifier> interface <name>
{ <attributeDeclaration>* <modifier> <return/*pe> <name>$<parameter>*%"!* '

Anggotanya adalah public ketika interfa!e dideklara ikan public!


!etunjuk !enulisan !ro"ra). Secara mutlak atribut adalah static dan final dan harus
diinisialisasi dengan nilai konstanta! Seperti mendeklarasikan class teratas, acces
modifier yang valid hanyalah public dan package&yakni ika tidak ada acces modifier
mengawali kata kunci class'! +la mengimplementa ikan ebuah interfa!e yang telah ada
dengan menggunakan kata kun!i implements! +la ini dibuat untuk mengimplementa ikan
emua method interfa!e. Sebuah !la boleh mengimplementa ikan lebih dari atu interfa!
e.

Pengenalan Pemrograman %

10
J.E.N.I.

+ontoh berikut menunjukkan bagaimana mendeklara ikan dan menggunakan ebuah interfa!
e. interface 2*Bnterface { #oid i2ethod$%" ' class 2*Class4 implements 2*Bnterface
{ public #oid i2ethod$% { S*stem&out&println$=Bnterface method&=%" ' #oid m*2ethod$
% { S*stem&out&println$=-nother method&=%" '

'

class 2*Class5 implements 2*Bnterface { public #oid i2ethod$%


{ S*stem&out&println$=-nother implementation&=%" ' ' class BnterfaceDemo { public
static #oid main$String args !% { 2*Class4 mc4 = new 2*Class4$%" 2*Class5 mc5 = new
2*Class5$%" mc4&i2ethod$%" mc4&m*2ethod$%" mc5&i2ethod$%"

' '

1.3.14 Kata kunci this


-ata kun!i this dapat digunakan untuk beberapa ala an berikut" #. Adanya ambigu
pada atribut lokal dari variabel lokal %. $enunjuk pada obje!t yang meminta method
non- tati! 9. $enunjuk pada kon truktor lain. Sebagai !ontoh pada mak ud pertama,
perhatikan kode berikut dimana variabel data di ediakan ebagai ebuah atribut dan
parameter lokal pada aat yang ama. class /hisDemo4 { int data" #oid method$int data
% { this&data = data" 9* this&data menun8u0 0e atribut sementara data menun8u0 0e
#ariabel lo0al *9 ' '

Pengenalan Pemrograman %

11
J.E.N.I.

+ontoh berikut menunjukkan bagaimana obje!t this e!ara mutlak menunjuk ketika
anggota nontati! dipanggil. class /hisDemo5 { int data" #oid method$%
{ S*stem&out&println$data%" 99this&data ' #oid method5$% { method$%" 99this&method$
%" ' Sebelum melihat ke !ontoh yang lain, mari pertama meninjau pengertian method
overloading. -on truktor eperti juga method dapat juga menjadi overload. $ethod
yang berbeda dalam !la dapat memberi nama yang ama a alkan li t parameter juga
berbeda. $ethod overloaded haru berbeda dalam nomor dan.atau tipe dari
parameternya. +ontoh elanjutnya memiliki kon truktor overloaded dan referen i this
yang dapat digunakan untuk menunjuk ver i lain dari kon truktor. class /hisDemo>
{ int data" /hisDemo>$% { this$4((%" ' /hisDemo>$int data% { this&data = data" '
' !etunjuk !enulisan !ro"ra). /emanggil this&' harus ada pernyataan pertama dalam
konstruktor!

1.3.15 Kata kunci su%er


Penggunaan kata kun!i super berhubungan dengan pe&ari an. Super digunakan untuk
meminta kon truktor uper!la . Super juga dapat digunakan eperti kata kun!i this
untuk menunjuk pada anggota dari uper!la . Program berikut mendemon tra ikan
bagaimana referen i super digunakan untuk memanggil kon truktor uper!la .

class Person { String first.ame" String last.ame" Person$String fname1 String lname
% { first.ame = fname" last.ame = lname" ' ' class Student e3tends Person { String
stud.um" Student$String fname1 String lname1 String s.um% {
Pengenalan Pemrograman % 12
J.E.N.I.

super$fname1 lname%" stud.um = s.um" ' '

!etunjuk !enulisan !ro"ra). super&' menun uk pada superclass dengan segera! Ini
harus berada pada pernyataan pertama dalam konstruktor superclass! -ata kun!i dapat
juga digunakan untuk menunjuk anggota pada !ontoh berikut. class Superclass{ int a"
#oid displa*+a$%{ S*stem&out&println$=a = = ) a%" ' ' class Subclass e3tends
Superclass { int a" #oid displa*+a$%{ S*stem&out&println$=a = = ) a%" ' #oid
set+super+a$int n%{ super&a = n" ' #oid displa*+super+a$%{ super&displa*+a$%" ' '
class SuperDemo { public static #oid main$String args !%{ Superclass Super7b8 = new
Superclass$%" Subclass Sub7b8 = new Subclass$%" Super7b8&a = 4" Sub7b8&a = 5"
Sub7b8&set+super+a$>%" Super7b8&displa*+a$%" Sub7b8&displa*+a$%"
Sub7b8&displa*+super+a$%" S*stem&out&println$Sub7b8&a%" ' ' Program ter ebut akan
menampilkan ha il berikut. a = 4 a = 5 a = > 5 uper!la eperti yang ditunjukkan

Pengenalan Pemrograman %

13
J.E.N.I.

1.3.16 Kata Kunci static


-ata kun!i static dapat digunakan untuk anggota dari ebuah !la . -ata kun!i ini
menyediakan static atau anggota !la untuk diak e ama ebelum beberapa in tan!e
dari !la dibuat. :ariabel !la ber ifat eperti variabel umum. Ini artinya bah&a
variabel dapat diak e emua in tan!e dari !la . $ethod !la mungkin dapat diambil
tanpa membuat 8agaimanapun, mereka hanya dapat mengak e anggota mereka tidak dapat
menunjuk this dan super! oleh

ebuah obje!t dari !la ter ebut. tati! dari !la . 'itambahkan juga,

-ata kun!i static dapat juga diaplika ikan pada blok. Ini dinamakan dengan blok
tati!. 8lok ini diek eku i hanya ekali, ketika !la dii i. (al ini bia anya
digunakan untuk mengini iali a i variabel !la . class Demo { static int a = ("
static #oid static2ethod$int i% { S*stem&out&println$i%" ' static { 99blo0 static
S*stem&out&println$=/his is a static bloc0&=%" a )= 4" ' ' class StaticDemo
{ public static #oid main$String args !% { S*stem&out&println$Demo&a%"
Demo&static2ethod$C%" Demo d = new Demo$%" S*stem&out&println$d&a%" d&static2ethod$
(%" Demo e = new Demo$%" S*stem&out&println$e&a%" d&a )= >"
S*stem&out&println$Demo&a)=1 = )d&a )=1 = )e&a%" ' ' -eluaran dari our!e kode
ditunjukkan di ba&ah ini. /his is a static bloc0& 4 C 4 ( 4 ?1 ?1 ?

1.3.1

Kata Kunci *inal

-ata kun!i final dapat diaplika ikan pada variabel, method dan !la . 5ntuk
mengingat fung i dari kata kun!i, ingat bah&a itu e!ara mudah dibata i apa yang
kita dapat lakukan dengan variabel, method dan !la . Nilai dari variabel final
dapat tidak lama diubah e udah nilainya telah diatur. Sebagai !ontoh,

Pengenalan Pemrograman %

14
J.E.N.I.

final int data = 4(" Pernyataan berikut akan menyebabkan terjadi compilation error"
data))" $ethod final tidak dapat di-override dalam !la anak. final #oid m*2ethod$%
{ 99in a parent class ' my/ethod tidak dapat lama di-override dalam !la !la final
tidak dapat di&ari kan tidak eperti !la final public class 2*Class { ' anak. yang
bia anya.

!etunjuk !enulisan !ro"ra). 0erintah penulisan kata kunci final dan public
memungkinkan bertukar tempat! Pernyataan ini akan menyebabkan ke alahan compilation
terjadi karena /y1lass dapat tidak lama di-extended. public DrongClass e3tends
2*Class { '

1.3.1# +nner Classes


Sebuah inner !la e!ara mudah dideklara ikan dalam !la lain.

class 7uterClass { int data = C" class BnnerClass { int data5 = 4(" #oid method$% {
S*stem&out&println$data%" S*stem&out&println$data5%" ' ' public static #oid
main$String args !% { 7uterClass oc = new 7uterClass$%" BnnerClass ic = oc&new
BnnerClass$%" S*stem&out&println$oc&data%" S*stem&out&println$ic&data5%" ic&method$
%" ' ' 5ntuk mampu mengak e anggota dari inner !la , kita butuh ebuah in tan!e dari
inner !la $ethod-method dari inner !la dapat e!ara lang ung mengak e anggota dari
outer !la . .

Pengenalan Pemrograman %

15
J.E.N.I.

1." #ati$an
1.4.1 2abel !erkalian
6uli program yang mempunyai ma ukkan si3e dari u er dan men!etak tabel perkalian
dengan si3e yang ditetapkan. Si,e untuk tabel perkalian " ; 6abel perkalian dari
i,e ;" # # % 9 < ; # % 9 < ; < = ? #@ > #% #; #= %@ %; % 9 < ;

1.4.2 3reatest Co))on 4actor53C46


6uli ebuah program yang mempunyai tiga integer dan menghitung nilai 1+A dari tiga
angka. 1+A adalah angka terbe ar yang e!ara rata dibagi ke emua angka yang
diberikan. Input #" %; Input %" #; Input 9" 9; 1+A" ; Input #" # Input %" % Input
9" 9 1+A" # Input #" > Input %" %B Input 9" #% 1+A" 9

1.4.3 7ha%e
8uatlah !la Shape. !la memiliki dua field String" name dan si3e! !la mempunyai
method printShapeInfo, dimana hanya mengeluarkan nilai name dan field si3e dari
obje!t Shape! Juga memiliki method printShape(ame dan printShapeSi3e, dimana men!
etak nama dan i,e dari obje!t, berturut-turut. $enggunakan pe&ari an, buat !la
S4uare dengan field yang ama dan method eperti itu dari !la Shape. +la ini
mempunyai dua tambahan field integer" length dan width. $ethod printShape5ength dan
printShape6idth yang men!etak panjang dan lebar obje!t yang juga terma uk dalam !la
ini. Anda juga haru meng-override printShapeInfo untuk men!etak keluaran field
tambahan dalam ub!la juga.

1.4.4 Binatan"
8uatlah interfa!e %nimal yang mempunyai tiga method"eat dan move. Semua method ini
tidak punya argumen atau nilai return. $ethod ini hanya mengeluarkan bagaimana
obje!t %nimal makan dan bergerak. Sebagai !ontoh, eekor kelin!i memakan &ortel dan
bergerak dengan melompat. 8uat !la Fish dan 7ear yang menggunakan interfa!e %nimal.
6er erah kepada Anda bagaimana menggunakan method eat dan move!

Pengenalan Pemrograman %

16
J.E.N.I.

Bab 2 Exceptions dan Assertions


2.1 Tujuan
Dasar penanganan exception telah dikenalkan pada anda di kursus pemrograman
pertama. Bab ini membahas secara lebih dalam mengenai exception dan juga sedikit
menyinggung tentang assertion. Setelah menyelesaikan pembahasan, anda diharapkan
dapat !. "enangani exception dengan menggunakan try, catch dan #inally $.
"embedakan penggunaan antara thro% dengan thro%s &. "enggunakan exception class
yang berbeda ' beda (. "embedakan antara checked exceptions dan unchecked
exceptions ). "embuat exception class tersendiri *. "enjelaskan keunggulan
penggunaan assertions +. "enggunakan 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. ,ntuk menghindari pemborosan %aktu pada
proses error-checking, Ja.a menyediakan mekanisme penanganan exception. Exception
adalah singkatan dari Exceptional E.ents. /esalahan 0errors1 yang terjadi saat
runtime, menyebabkan gangguan pada alur eksekusi program. 2erdapat beberapa tipe
error yang dapat muncul. Sebagai contoh adalah error pembagian 3, mengakses elemen
di luar jangkauan sebuah array, input yang tidak benar dan membuka #ile 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. /emudian, dalam class ini terdapat dua kategori
umum Error class dan Exception class. Exception class menunjukkan kondisi yang
dapat diterima oleh user program. ,mumnya hal tersebut disebabkan oleh beberapa
kesalahan pada kode program. 4ontoh dari exceptions adalah pembagian oleh 3 dan
error di luar jangkauan array.

5engenalan 5emrograman $

1
J.E.N.I.

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

2.2.3 Sebuah Contoh


5erhatikan contoh program berikut
class DivByZero { public static void main(String args[]) { System.out.println(3/ )!
System.out.println("#eta$.%)! & &

Jika kode tersebut dijalankan, akan didapatkan pesan kesalahan sebagai berikut
'(ception in t)read *main* +ava.lang.,rit)metic'(ception- / by .ero at
DivByZero.main(DivByZero.+ava-3)

5esan tersebut mengin#ormasikan tipe exception yang terjadi pada baris dimana
exception itu berasal. Inilah aksi de#ault yang terjadi bila terjadi exception yang
tidak tertangani. Jika tidak terdapat kode yang menangani exception yang terjadi,
aksi de#ault akan bekerja otomatis. 6ksi tersebut pertama-tama akan menampilkan
deskripsi exception yang terjadi. /emudian akan ditampilkan stack trace yang
mengindenti#ikasi method dimana exception terjadi. 5ada bagian akhir, aksi de#ault
tersebut akan menghentikan program secara paksa. Bagaimana jika anda ingin
melakukan penanganan atas exception dengan cara yang berbeda7 ,ntungnya, bahasa
pemrograman Ja.a memiliki & key%ords penting dalam penanganan exception, yaitu try,
catch dan finally.

5engenalan 5emrograman $

2
J.E.N.I.

2.3 Menangkap Exception


2.3.1 Try - Catch
Seperti yang telah dijelaskan sebelumnya, key%ord try, catch dan finally digunakan
dalam menangani bermacam tipe exception. & /ey%ord tersebut digunakan bersama,
namun finally bersi#at opsional. 6kan lebih baik jika mem#okuskan pada $ key%ord
pertama, kemudian membahas finally pada bagian akhir. Berikut ini adalah penulisan
try-catch secara umum

try { /code to be monitored 0or e(ceptions1 & catc) (/'(ception2ype31 /4b+5ame1)


{ /)andler i0 '(ception2ype3 occurs1 & ... & catc) (/'(ception2ype51 /4b+5ame1)
{ /)andler i0 '(ception2ype5 occurs1 &

Petunjuk Penulisan Progra

Blok catch dimulai setelah kurung kurawal dari kode try atau catch terkait.
Penulisan kode dalam blok mengikuti identasi

8unakan contoh kode tersebut pada program Di.By9ero yang telah dibuat sebelumnya
class DivByZero { public static void main(String args[]) { try
{ System.out.println(3/ )! System.out.println("#eta$.%)! & catc)
(,rit)metic'(ception e(c) { //6ea$si atas $e+adian System.out.println(e(c)! &
System.out.println("Setela) '(ception.%)! & &

/esalahan pembagian dengan bilangan 3 adalah salah satu contoh dari


ArithmethicException. 2ipe exception kemudian mengindikasikan klausa catch pada
class ini. 5rogram tersebut menangani kesalahan yang terjadi dengan menampilkan
deskripsi dari permasalahan.

5engenalan 5emrograman $

3
J.E.N.I.

:utput program saat eksekusi akan terlihat sebagai berikut


+ava.lang.,rit)metic'(ception- / by .ero ,0ter e(ception.

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. 5erlu dicatat bah%a blok try dapat hanya
menyebabkan sebuah exception pada satu %aktu, namun dapat pula menampikan tipe
exception yang berbeda di lain %aktu. Berikut adalah contoh kode yang menangani
lebih dari satu exception
class 7ultiple#atc) { public static void main(String args[]) { try { int den 8
9nteger.parse9nt(args[ ])! //baris : System.out.println(3/den)! //baris ; & catc)
(,rit)metic'(ception e(c) { System.out.println("5ilai <embagi .%)! & catc)
(,rray9nde(4ut40Bounds'(ception e(c=) { System.out.println("7issing argument.%)! &
System.out.println(",0ter e(ception.%)! & &

5ada contoh ini, baris ke-( akan menghasilkan kesalahan berupa Array ndex!ut!
fBoundsException bilamana seorang user alpa dalam memasukkan argument, sedang baris
ke-) akan menghasilkan kesalahan ArithmethicException jika pengguna memasukkan
nilai 3 sebagai sebuah argument. 5elajari apakah yang akan terjadi terhadap program
bila argumen ' argumen berikut dimasukkan oleh user a1 2idak ada argument b1 ! c1 3
5enggunaan try bersarang diperbolehkan dalam pemrograman Ja.a.
class 5ested2ryDemo { public static void main(String args[]){ try { int a 8
9nteger.parse9nt(args[ ])! try { int b 8 9nteger.parse9nt(args[3])!
System.out.println(a/b)! & catc) (,rit)metic'(ception e)
{ System.out.println("Divide by .ero error>*)! & & catc)
(,rray9nde(4ut40Bounds'(ception) { System.out.println("= parameters are re?
uired>*)! & &

5engenalan 5emrograman $

4
J.E.N.I.

& 5elajari apa yang akan terjadi pada program jika argument ' argument berikut
dimasukkan a1 2idak ada argumen b1 !) c1 !) & d1 !) 3

/ode berikut menggunakan try bersarang tergabung dengan penggunaan method. class
5ested2ryDemo= { static void nested2ry(String args[]) { try { int a 8
9nteger.parse9nt(args[ ])! int b 8 9nteger.parse9nt(args[3])!
System.out.println(a/b)! & catc) (,rit)metic'(ception e)
{ System.out.println(*Divide by .ero error>*)! & & public static void main(String
args[]){ try { nested2ry(args)! & catc) (,rray9nde(4ut40Bounds'(ception e)
{ System.out.println(*= parameters are re?uired>*)! & & &

Bagaimana output program tersebut jika diimplementasikan terhadap argument '


argument berikut a1 2idak ada argumen b1 !) c1 !) & d1 !) 3

2.3.2 "ey#ord $inally


Saatnya anda mengimplementasikan finally dalam blok try-cacth. Berikut ini cara
penggunaan key%ord tersebut
try { /$ode monitor e(ception1 & catc) (/'(ception2ype31 /4b+5ame1) { /penanganan
+i$a '(ception2ype3 ter+adi1 & ... & 0inally { /$ode yang a$an die$se$usi saat blo$
try bera$)ir1 &

5engenalan 5emrograman $

5
J.E.N.I.

Petunjuk Penulisan Progra

"ekali lagi, coding con#ention $uga mengatur penggunaan finally seperti halnya pada
blok catch. Penggunaan finally dimulai setelah kurung kurawal penutup blok catch
terkait. Penulisan dalam blok tersebut $uga mengalami identasi. Blok finally
mengandung kode penanganan setelah penggunaan try dan catch. Blok kode ini selalu
tereksekusi %alaupun sebuah exception terjadi atau tidak pada blok try. Blok kode
tersebut juga akan menghasilkan nilai true meskipun return, continue ataupun break
tereksekusi. 2erdapat ( kemungkinan skenario yang berbeda dalam blok try-catch-
finally. 5ertama, pemaksaan keluar program terjadi bila control program dipaksa
untuk mele%ati blok try menggunakan return, continue ataupun break. /edua, sebuah
penyelesaian normal terjadi jika try-catch-finally tereksekusi secara normal tanpa
terjadi error apapun. /etiga, kode program memiliki spesi#ikasi tersendiri dalam
blok catch terhadap exception yang terjadi. ;ang terakhir, kebalikan skenario
ketiga. Dalam hal ini, exception yang terjadi tidak terde#inisikan pada blok catch
manapun. 4ontoh dari skenario ' skenario tersebut terlihat pada kode berikut ini
class @inallyDemo { static void my7et)od(int n) t)roAs '(ception{ try { sAitc)(n) {
case 3- System.out.println(*case pertama*)! return! case 3-
System.out.println(*case $etiga*)! t)roA neA 6untime'(ception(*demo case $etiga*)!
case :- System.out.println(*case $eempat*)! t)roA neA '(ception(*demo case
$eempat*)! case =- System.out.println(*case Bedua*)! & & catc) (6untime'(ception e)
{ System.out.print(*6untime'(ception ter+adi- *)!
System.out.println(e.get7essage())! & 0inally { System.out.println(*tryCbloc$
entered.*)! & & public static void main(String args[]){ 0or (int i83! i/8:! iDD)
{ try { @inallyDemo.my7et)od(i)! & catc) ('(ception e){ System.out.print(*'(ception
ter+adi- *)! System.out.println(e.get7essage())! & System.out.println()! & & &

5engenalan 5emrograman $

6
J.E.N.I.

2.4 Melempar Exception


2.%.1 "ey#ord Thro#
Disamping menangkap exception, Ja.a juga mengijinkan seorang user untuk melempar
sebuah exception. Sintax pelemparan exception cukup sederhana.

t)roA /e(ception ob+ect1!


5erhatikan contoh berikut ini.
/E 7elempar e(ception +i$a ter+adi $esala)an input E/ class 2)roADemo { public
static void main(String args[]){ String input 8 "invalid input%! try { i0 (input.e?
uals("invalid input%)) { t)roA neA 6untime'(ception(*t)roA demo*)! & else
{ System.out.println(input)! & System.out.println(*,0ter t)roAing*)! & catc)
(6untime'(ception e) { System.out.println(*'(ception caug)t )ere.*)!
System.out.println(e)! & & &

2.%.2 "ey#ord Thro#s


Jika sebuah method dapat menyebabkan sebuah exception namun tidak menangkapnya,
maka digunakan key%ord throws. 6turan ini hanya berlaku pada checked exception.
6nda akan mempelajari lebih lanjut tentang checked exception dan unchecked
exception pada bagian selanjutnya, </ategori Exception=. Berikut ini penulisan
syntax menggunakan key%ord throws
/type1 /met)od5ame1 (/parameterFist1) t)roAs /e(ceptionFist1 { /met)odBody1 &

Sebuah method perlu untuk menangkap ataupun menda#tar seluruh exceptions yang
mungkin terjadi, namun hal itu dapat menghilangkan tipe Error, >untimeException,
ataupun subclass-nya.

5engenalan 5emrograman $

7
J.E.N.I.

4ontoh berikut ini menunjukkan bah%a method my%ethod tidak menangani


&lass'ot(oundException.
class 2)roAing#lass { static void my7et)od() t)roAs #lass5ot@ound'(ception { t)roA
neA #lass5ot@ound'(ception (*+ust a demo*)! & & class 2)roAsDemo { public static
void main(String args[]) { try { 2)roAing#lass.my7et)od()! & catc)
(#lass5ot@ound'(ception e) { System.out.println(e)! & & &

2.

!ategori Exception

2.&.1 Exception Classes dan 'ierarchy


Seperti yang disebutkan sebelumnya, root class dari seluruh exception classes
adalah 2hro%able class. ;ang disebutkan diba%ah ini adalah exception class
hierarchy. Seluruh exceptions ini terde#inisi pada package $a#a.lang.

Tabel ).*. Exception &lass +ierarchy

5engenalan 5emrograman $

8
J.E.N.I.

Sekarang anda sudah cukup #amiliar dengan beberapa exception classes, saatnya untuk
mengenalkan aturan catch lebih dari satu harus berurutan dari subclass ke
superclass.
class 7ultiple#atc)'rror { public static void main(String args[]){ try { int a 8
9nteger.parse9nt(args [ ])! int b 8 9nteger.parse9nt(args [3])!
System.out.println(a/b)! & catc) ('(ception e) { System.out.println(e)! & catc)
(,rray9nde(4ut40Bounds'(ception e=) { System.out.println(e=)! &
System.out.println(*,0ter tryCcatc)Ccatc).*)! & &

Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception
class adalah superclass dari Array ndex!ut!fBoundsException class.
7ultiple#atc)'rror.+ava-G- e(ception +ava.lang.,rray9nde(4ut40Bounds'(ception )as
already been caug)t & catc) (,rray9nde(4ut40Bounds'(ception e=) {

2.&.2 Checked dan (nchecked Exceptions


Exception terdiri atas checked dan unchecked exceptions. 4hecked exceptions adalah
exception yang diperiksa oleh Ja.a compiler. 4ompiler memeriksa keseluruhan program
apakah menangkap atau menda#tar exception yang terjadi dalam sintax throws. 6pabila
checked exception tidak dida#tar ataupun ditangkap, maka compiler error akan
ditampilkan. 2idak seperti checked exceptions, unchecked exceptions tidak berupa
compile-time checking dalam penanganan exceptions. ?ondasi dasar dari unchecked
exception classes adalah Error, >untimeException dan subclass-nya.

2.&.3 (ser )e*ined Exceptions


"eskipun beberapa exception classes terdapat pada package $a#a.lang namun tidak
mencukupi untuk menampung seluruh kemungkinan tipe exception yang mungkin terjadi.
Sehingga sangat mungkin bah%a anda perlu untuk membuat tipe exception tersendiri.
Dalam pembuatan tipe exception anda sendiri, anda hanya perlu untuk membuat sebuah
extended class terhadap >untimeException class, maupun Exception class lain.
Selanjutnya tergantung pada anda dalam memodi#ikasi class sesuai

5engenalan 5emrograman $

9
J.E.N.I.

permasalahan yang akan diselesaikan. "embers dan constructors dapat dimasukkan pada
exception class milik anda. Berikut ini contohnya
class HateString'(ception e(tends 6untime'(ception{ /E 2ida$ perlu memasu$$an
member ataupun constru$tor E/ & class 2estHateString { public static void
main(String args[]) { String input 8 *invalid input*! try { i0 (input.e?
uals(*invalid input*)) { t)roA neA HateString'(ception()! &
System.out.println(*String accepted.*)! & catc) (HateString'(ception e)
{ System.out.println(*9 )ate t)is string- * D input D *.*)! & & &

2." Assertions
2.+.1 (ser )e*ined Exceptions
6ssertions mengijinkan programmer untuk menentukan asumsi yang dihadapi. Sebagai
contoh, sebuah tanggal dengan area bulan tidak berada antara ! hingga !$ dapat
diputuskan bah%a data tersebut tidak .alid. 5rogrammer dapat menentukan bulan harus
berada diantara area tersebut. "eskipun hal itu dimungkinkan untuk menggunakan
contructor lain untuk mensimulasikan #ungsi dari assertions, namun sulit untuk
dilakukan karena #itur assertion dapat tidak digunakan. @al yang menarik dari
assertions adalah seorang user memiliki pilihan untuk digunakan atau tidak pada
saat runtime. 6ssertion dapat diartikan sebagai extensi atas komentar yang
mengin#ormasikan pembaca kode bah%a 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.+.2 ,engakti*kan dan ,enonakti*kan Exceptions


5enggunaan assertions tidak perlu melakukan import package $a#a.util.assert.
"enggunakan assertions lebih tepat ditujukan untuk memeriksa parameter dari
nonpublic methods jika public methods dapat diakses oleh class lain. @al itu
mungkin terjadi bila penulis dari class lain tidak menyadari bah%a mereka dapat
menonakti#kan assertions. Dalam hal ini program tidak dapat bekerja dengan baik.
5ada non-public methods, hal tersebut tergunakan secara langsung oleh kode yang

5engenalan 5emrograman $

10
J.E.N.I.

ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga
mereka menyadari bah%a saat menjalankannya, assertion harus dalam keadaan akti#.
,ntuk mengkompilasi #ile yang menggunakan assertions, parameter perintah diperlukan
seperti yang terlihat diba%ah ini
+avac Isource 3.: 7y<rogram.+ava

sebuah

tambahan

Jika anda ingin untuk menjalankan program tanpa menggunakan #itur assertions, cukup
jalankan program secara normal.

+ava 7y<rogram

Namun, jika anda ingin mengakti#kan parameter ,enableassertions atau ,ea.

assertions,

anda

perlu

menggunakan

+ava Ienableassertions 7y<rogram

2.+.3 Sintax -ssertions


5enulisan assertions memiliki dua bentuk. Bentuk yang paling sederhana terlihat
sebagai berikut dimana <expression1> adalah kondisi dimana assertion bernilai true.
Bentuk yang lain menggunakan dua ekspresi, berikut ini cara penulisannya
assert /e(pression31 - /e(pression=1! assert /e(pression31!

dimana <expression1> adalah kondisi assertion bernilai true dan <expression2>


adalah in#ormasi yang membantu pemeriksaan mengapa program mengalami kesalahan.

class ,ge,ssert { public static void main(String args[]) { int age 8


9nteger.parse9nt(args[ ])! assert(age1 )! /E +i$a masu$an umur benar (misalJ age1 )
E/ i0 (age 18 3K) { System.out.println("#ongrats> LouMre an adult> 8)%)! & & &

5engenalan 5emrograman $

11
J.E.N.I.

2.# $ati%an
2...1 'eksadesi al ke )esi al
2entukan sebuah angka heksadesimal sebagai input. /on.ersi angka tersebut menjadi
bilangan decimal. 2entukan exception class anda sendiri dan lakukan penanganan jika
input dari user bukan berupa bilangan heksadesimal.

2...2 ,ena

pilkan Sebuah /erlian

2entukan nilai integer positi# sebagai input. 2ampilkan sebuah berlian menggunaakan
karakter asterisk 0A1 sesuai angka yang diinput oleh user. Jika user memasukkan
bilangan integer negati#, gunakan assertions untuk menanganinya. Sebagai contoh,
jika user memasukkan integer bernilai &, program anda harus menampilkan sebuah
berlian sesuai bentuk berikut

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

5engenalan 5emrograman $

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. Setelah menyelesaikan
pelajaran ini, diharapkan Anda dapat !. Memahami dan menggunakan rekursif ".
Mengetahui perbedaan antara sta#ks dan $ueues ". Mengimplementasikan suatu
implementasi se$uensial dari sta#ks dan $ueues %. Mengimplementasikan suatu
implementasi linked dari sta#ks and $ueues

4. Menggunakan Collection #lasses yang ada

3.2 Rekursif
3.2.1 Apa yang dimaksud dengan Rekursif?
&ekursif adalah teknik peme#ahan masalah yang po'erful dan dapat digunakan ketika
inti dari masalah terjadi berulang kali. (entu saja, tipe dari masalah ini dapat
dipe#ahkan mengunakan perkataan berulang)ulang *i.e., menggunakan konstruksi
looping seperti for, while dan do-while+. Sesungguhnya, iterasi atau perkataan
berulang)ulang merupakan peralatan yang lebih efisien jika dibandingkan dengan
re#ursif tetapi re#ursion menyediakan solusi yang lebih baik untuk suatu
masalah. ,ada rekursif, method dapat memanggil dirinya sendiri. Data yang berada
dalam method tersebut seperti argument disimpan sementara kedalam sta#k sampai
method pemanggilnya diselesaikan.

3.2.2 Rekursif Vs. Iterasi


-ntuk pengertian yang lebih baik dari rekursif, mari kita lihat pada bagaimana
ma#am) ma#am dari teknik iterasi. Dalam teknik)teknik tersebut dapat juga kita
lihat penyelesaian sebuah loop yang lebih baik menggunakan rekursif dari pada
iterasi. Menyelesaikan masalah dengan perulangan menggunakan iterasi se#ara tegas
juga digunakan pada struktur kontrol pengulangan. Sementara itu, untuk rekursif,
task diulangi dengan memanggil sebuah method pengulangan. Maksud dari hal tersebut
adalah untuk menggambarkan sebuah masalah kedalam lingkup yang lebih ke#il dari
pengulangan itu sendiri. ,ertimbangan suatu perhitungan yang faktorial dalam
penentuan bilangan bulat. Definisi rekursif dari hal tersebut dapat diuraikan
sebagai berikut fa#torial*n+ . fa#torial*n)!+ / n0 fa#torial*!+ . !. Sebagai
#ontohnya, nilai faktorial dari " sama dengan fatorial *!+/", dimana hasilnya
adalah ". 1aktorial dari % adalah 2, dimana sama dengan faktorial dari *"+/%.
,engenalan ,emrograman " 1
J.E.N.I.

Gambar 1: Contoh Factorial

Dengan iterasi, proses diakhiri ketika kondisi loop gagal atau salah. Dalam kasus
dari penggunaan rekursif, proses yang berakhir dengan kondisi tertentu disebut
permasalahan dasar yang telah ter#ukupi oleh suatu pembatasan kondisi. ,ermasalahan
yang mendasar merupakan kejadian yang paling ke#il dari sebuah masalah. Sebagai
#ontohnya, dapat dilihat pada kondisi rekursif pada faktorial, kasus yang mudah
adalah ketika inputnya adalah !. ! dalam kasus ini merupakan inti dari masalah.
,enggunaan dari iterasi dan rekursif dapat bersama)sama memandu loops jika hal ini
tidak digunakan dengan benar. 3euntungan iterasi dibandingkan re#ursion adalah
performan#e yang lebih baik. 4al tersebut lebih #epat untuk re#ursion sejak
terbentuknya sebuah parameter pada sebuah method yang disebabkan oleh suatu 5,-
time. 6agaimanapun juga, rekursif mendorong pra#ti#e soft'are engineering yang
lebih baik, sebab teknik ini biasanya dihasilkan pada kode yang singkat yang lebih
mudah untuk dimengerti dan juga mempromosikan reuseability pada suatu solusi yang
telah diterapkan. Memilih antara iterasi dan rekursif merupakan masalah dari
menjaga keseimbangan antara baiknya sebuah performan#e dan baiknya soft'are
engineering.

3.2.3 Factorials: Conto


7isting 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; }
,engenalan ,emrograman " 2
J.E.N.I.

return result; } public static void main(Strin ar s!") { int n = Inte


er#parseInt(ar s!$"); S%stem#out#println(factorial(n)); }

Diba'ah ini merupakan listing program yang sama tetapi menggunakan rekursif. class
Factorial&ecur { static int factorial(int n) { if (n == 1) { '* ()e base case *'
return 1; } '* &ecursive definition; Self-invocation *' return factorial(n-1)*n; }
public static void main(Strin ar s!") { int n = Inte er#parseInt(ar s!$"); S
%stem#out#println(factorial(n)); }

3.2.! "rint n in any #ase: Conto

yang lain

Sekarang, pertimbangan dari masalah dalam pen#etakkan suatu angka desimal yang
nilai basenya telah ditetapkan oleh pengguna. Ingat bah'a solusi dalam hal ini
untuk menggunakan repetiti8e di8ision dan untuk menulis sisa perhitungannya. ,roses
akan berakhir ketika sisa hasil pembagian kurang dari base yang ditetapkan. Dapat
diasumsikan jika nilai input desimal adalah !9 dan kita akan mengkon8ersinya
menjadi base :. Inilah solusinya dengan perhitungan menggunakan pensil dan kertas.

Dari solusi diatas, !9 adalah sama dengan !" base :. 5ontoh berikutnya. Nilai input
desimalnya adalah !2; dan akan dikon8ersi ke base !2.

,engenalan ,emrograman "

3
J.E.N.I.

!2; adalah sama dengan A; base !2. 5atatan A.!9. 6erikut ini merupakan solusi
iterati8e untuk masalah diatas. class *ec(o+t)ers { public static void main(Strin
ar s!") { int num = Inte er#parseInt(ar s!$"); int base = Inte er#parseInt(ar s!
1"); print,ase(num- base); } static void print,ase(int num- int base) { int rem =
1; Strin di its = .$1/0123456abcdef.; Strin result = ..; '* t)e iterative step *'
7)ile (num8=$) { rem = num9base; num = num'base; result = result#concat(di
its#c)ar:t(rem);..); } '* printin t)e reverse of t)e result *' for(int i =
result#len t)()-1; i >= $; i--) { S%stem#out#print(result#c)ar:t(i)); } } } 6erikut
ini merupakan re#ursion untuk masalah yang sama dengan solusi sebelumnya. class
*ec(o+t)ers&ecur { static void print,ase(int num- int base) { Strin di its = .
$1/0123456abcdef.; '* &ecursive step*' if (num >= base) { print,ase(num'base-
base); } '* ,ase case< num = base *' S%stem#out#print(di its#c)ar:t(num9base)); }
public static void main(Strin ar s!") { int num = Inte er#parseInt(ar s!$"); int
base = Inte er#parseInt(ar s!1"); print,ase(num- base); } }

,engenalan ,emrograman "

4
J.E.N.I.

3.3 Abstract Data Type


3.3.1 Apa yang $imaksud dengan A%stract $ata &ype?
Abstra#t Data (ype *AD(+ adalah kumpulan dari elemen)elemen data yang disajikan
dengan satu set operasi yang digambarkan pada elemen)elemen data tersebut. Sta#ks,
$ueues dan binary trees adalah tiga #ontoh dari AD(. Dalam bab ini, Anda akan
mempelajari tentang sta#ks dan $ueues.

3.3.2 'tacks
Sta#k adalah satu set atau urutan elemen data dimana manipulasi data dari elemen)
elemen hanya diperbolehkan pada tumpukan teratas dari sta#k. 4al ini merupakan
perintah pengumpulan data se#ara linier yang disebut <last in, first out= *7I1>+.
Sta#ks berguna untuk berma#am)ma#am aplikasi seperti pattern re#ognition dan
pengkon8ersian antar notasi infi?, postfi? dan prefi? . Dua operasi yang
dihubungkan dengan sta#ks adalah operasi push dan pop. ,ush berarti memasukkan data
kedalam sta#ks yang paling atas dimana pop sebagai penunjuk@pointer untuk
memindahkan elemen ke atas sta#ks. -ntuk memahami bagaimana #ara kerja sta#ks,
pikirkan bagaimana Anda dapat menambah atau memindakan sebuah data dari tumpukan
data. ,ikiran Anda akan memberitahu Anda untuk menambah atau memindahkan data hanya
pada sta#k yang paling atas karena jika menggunakan #ara lain, dapat menyebabkan
tumpukan sta#k akan terjatuh. Diba'ah ini merupakan ilustrasi bagaimana tampilan
dari sta#ks. n)! ... 2 ; B % " ! 9 JayA 35 Jojo (oto 3yla DMC %ottom top

Tabel 1.2.2: Ilustrasi Stack

Sta#k akan berarti penuh jika jangkauan #ell teratas disimbolkan dengan n)!. Jika
nilai teratas @ top sama dengan )!, sta#k berarti kosong.

,engenalan ,emrograman "

5
J.E.N.I.

3.3.3 (ueues
Dueues adalah #ontoh lain dari AD(. 4al ini merupakan perintah pengumpulan data
yang disebut <first)in, first)out=. Aplikasi ini meliputi jad'al pekerjaan dalam
operating system, topologi#al sorting dan graph tra8ersal. En$ueue dan de$ueue
merupakan operasi yang dihubungkan dengan $ueues. En$ueu menunjuk pada memasukkan
data pada akhir $ueue dimana de$ueue berarti memindahkan elemen dari $ueue
tersebut. -ntuk mengingat bagaimana $ueue bekerja, ingatlah arti khusus dari $ueue
yaitu baris. 6erikut ini bagaimana #ara kerja $ueue. Siapa yang akan mendapatkan
kesempatan pertama untuk bertemu bintang idolanya dari mereka yang sedang menunggu
dalam sebuah barisanE Seharusnya orang pertama yang berada pada barisan tersebut.
>rang ini mendapat kesempatan pertama untuk meninggalkan barisan. 4ubungkan hal
tersebut dengan bagaimana $ueue bekerja. 6erikut ini merupakan ilustrasi dari
bagaimana tampilan dari $ueue. 9 ! " E8e fron t
(abel !.".% Ilustrasi Dueue

% JayA

B 35

; Jojo

2 (oto

F 3yla

: DMC end

G 

... Insert Delete

n)!

Dueue akan kosong jika nilai end kurang dari front. Sementara itu, akan penuh jika
end sama dengan n)!.

3.3.! 'e)uential and *inked Representation


AD(s biasanya dapat di'akilkan menggunakan se$uential dan linked representation.
4al ini memudahkan untuk membuat se$uential representation dengan menggunakan
array. 6agaimanapun juga, masalah dengan menggunakan array adalah pembatasan siAe,
yang membuatnya tidak fleksibel. Dengan menggunakan array, sering terjadi
kekurangan atau kelebihan spa#e memory. Mempertimbangkan hal tersebut, Anda harus
membuat sebuah array dan mendeklarasikannya agar mampu menyimpan ;9 elemen. Jika
user hanya memasukkan ; elemen, maka B; spa#e pada memory akan sia)sia. Disisi
lain, jika user ingin memasukkan ;! elemen, spa#e yang telah disediakan didalam
array tidak akan #ukup. Dibandingkan dengan se$uential representation, linked
representation lebih sedikit rumit tetapi lebih fleksibel. 7inked representation
menyesuaikan memory yang dibutuhkan oleh user. ,enjelasan lebih lanjut pada linked
representation akan didiskusikan pada bab berikutnya.

3.3.+ 'e)uential Representation dari Integer 'tack


class Se>Stac? { int top = -1; int memSpace!"; int limit;
,engenalan ,emrograman "

'* initiall%- t)e stac? is empt% *' '* stora e for inte ers *' '* si@e of memSpace
*'
6
J.E.N.I.

Se>Stac?() { memSpace = ne7 int!1$"; limit = 1$; } Se>Stac?(int si@e) { memSpace =


ne7 int!si@e"; limit = si@e; } boolean pus)(int value) { top;;; '* c)ec? if t)e
stac? is full *' if (top = limit) { memSpace!top" = value; } else { top--; return
false; } return true; } int pop() { int temp = -1; '* c)ec? if t)e stac? is empt%
*' if (top >= $) { temp = memSpace!top"; top--; } else { return -1; } return
temp; } public static void main(Strin ar s!") { Se>Stac? m%Stac? = ne7 Se>Stac?(0);
m%Stac?#pus)(1); m%Stac?#pus)(/); m%Stac?#pus)(0); m%Stac?#pus)(1); S
%stem#out#println(m%Stac?#pop()); S%stem#out#println(m%Stac?#pop()); S
%stem#out#println(m%Stac?#pop()); S%stem#out#println(m%Stac?#pop()); } }

3.3., *inked *ists


Sebelum mengimplementasikan linked representation dari sta#ks, pertama mari kita
pelejari bagaimana membuat linked representation. Dalam hal ini, kita akan
menggunakan linked lists. 7inked list merupakan struktur dinamis yang berla'anan
dengan array, yang merupakan struktur statis. 4al ini berarti linked list dapat
tumbuh dan berkurang dalam siAe yang bergantung pada kebutuhan user. 7inked list
digambarkan sebagai kumpulan dari nodes, Hang masing)masing berisi data dan link
atau pointer ke node berikutnya didalam list. Iambar diba'ah ini menunjukkan
tampilan dari node.

,engenalan ,emrograman "

7
J.E.N.I.

Iambar 2.2a Sebuah node

6erikut ini merupakan #ontoh dari non)empty linked list dengan % node.

Iambar 3.2b Non)empty linked list dengan tiga node

6erikut ini bagaimana #lass node diimplementasikan. 5lass ini dapat digunakan untuk
membuat linked list. class Aode { int data; Aode neBtAode; } '* inte er data
contained in t)e node *' '* t)e neBt node in t)e list *'

class (estAode { public static void main(Strin ar s!") { Aode empt%Cist = null; '*
create an empt% list *' '* )ead points to 1st node in t)e list *' Aode )ead = ne7
Aode(); '* initiali@e 1st node in t)e list *' )ead#data = 2; )ead#neBtAode = ne7
Aode(); )ead#neBtAode#data = 1$; '* null mar?s t)e end of t)e list *' )
ead#neBtAode#neBtAode = null; '* print elements of t)e list *' Aode currAode = )
ead; 7)ile (currAode 8= null) { S%stem#out#println(currAode#data); currAode =
currAode#neBtAode; } } }

,engenalan ,emrograman "

8
J.E.N.I.

3.3.- *inked Representation dari Integer 'tack


Sekarang Anda telah mempelajari tentang linked list. Maka Anda telah siap untuk
menerapkan apa yang telah Anda pelajari untuk implementasi linked representation
dari sta#k. class *%namicIntStac?{ private IntStac?Aode top; class IntStac?Aode
{ int data; IntStac?Aode neBt; IntStac?Aode(int n) { data = n; neBt = null; } }
'* )ead or top of t)e stac? *' '* node class *'

void pus)(int n){ '* no need to c)ec? for overflo7 *' IntStac?Aode node = ne7
IntStac?Aode(n); node#neBt = top; top = node; } int pop() { if (isDmpt%()) { return
-1; '* ma% t)ro7 a user-defined eBception *' } else { int n = top#data; top =
top#neBt; return n; } } boolean isDmpt%(){ return top == null; } public static void
main(Strin ar s!") { *%namicIntStac? m%Stac? = ne7 *%namicIntStac?(); m%Stac?#pus)
(2); m%Stac?#pus)(1$); '* print elements of t)e stac? *' IntStac?Aode currAode = m
%Stac?#top; 7)ile (currAode8=null) { S%stem#out#println(currAode#data); currAode =
currAode#neBt; } S%stem#out#println(m%Stac?#pop()); S%stem#out#println(m%Stac?
#pop()); } }

,engenalan ,emrograman "

9
J.E.N.I.

Iambar !.".F Implementasi linked dari sta#k

3.3.. /a0a Collections


Saat ini Anda telah diperkenalkan kepada dasar abstra#t data types. ,ada intinya,
Anda telah mempelajari tentang dasar dari linked lists, sta#ks dan $ueue. 6erita
baik bah'a abstra#t data types telah siap untuk diimplementasikan dan dimasukkan
dalam Ja8a. 5lass Stack dan LinkedList diperbolehkan digunakan tanpa pengertian
yang lengkap dari konsep ini. 6agaimanapun juga, sebagai ilmu'an komputer, sangat
penting untuk mengerti konsep dari abstra#t data types. >leh karena itu, penjelasan
terperin#i masih disampaikan dalam bagian yang terdahulu. Dengan pelun#uran dari
J"SE;.9, $ueue interfa#e telah tersedia. -ntuk detail pada #lass dan interfa#e ini,
dapat dilihat pada dokumentasi Ja8a A,I. 3epada kita, Ja8a telah menyajikan
Collection #lasses dan interfa#es yang lain, yang semuanya dapat ditemukan di a!
a.util pa#kage. 5ontoh dari Collection #lasses termasuk LinkedList, "rra#List,
$ashSet dan TreeSet. Class tersebut benar)benar implementasi dari #olle#tion
interfa#es yang berbeda. Induk hirarki dari #olle#tion interfa#es adalah #olle#tion
interfa#es itu sendiri. Sebuah #olle#tion hanya sebuah grup dari obje#t yang
diketahui sebagai elemennya sendiri. 5olle#tion memperbolehkan penggandaan@salinan
dan tidak membutuhkan pemesanan elemen se#ara spesifik. SD3 tidak menyediakan
implementasi built)in yang lain dari interfa#e ini tetapi mengarahkan
subinterfa#es, Set interfa#es dan List interfa#es diperbolehkan. Sekarang, apa
perbedaan dari kedua interfa#e tersebut. Set merupakan #olle#tion yang tidak
dipesan dan tidak ada penggandaan didalamnya. Sementara itu, list merupakan
#olle#tion yang dipesan dari elemen)elemen dimana juga diperbolehkannya
penggandaan. $ashSet, Linked$ashSet dan TreeSet suatu implementasi #lass dari Set
interfa#es. "rra#List, LinkedList dan %ector suatu implementasi #lass dari List
interfa#es. &root interface' Collection &interface' Set &im(lementin) classes'
4ashSet 7inked4ashSet (reeSet &interface' List &im(lementin) classes' Array7ist
7inked7ist Je#tor

Tabel *.2.+a: ,a!a collections

6erikut ini adalah daftar dari beberapa Collections methods yang disediakan dalam
5olle#tion A,I dari Ja8a " ,latform SE 8!.B.!. ,ada Ja8a " ,latform SE 8.!.;.9,
methods ini telah dimodifikasi untuk menampung generi# types. Sejak generi# types
masih belum selesai dibahas, sebaiknya mempertimbangkan method ini terlebih dahulu.
Disarankan bah'a Anda menga#u pada Collection methods yang terbaru dimana Anda
lebih mudah
,engenalan ,emrograman " 10
J.E.N.I.

mengerti generi# types, yang akan didiskusikan pada #hapter berikutnya.

!o""ection #et$o%s public boolean add(+bEect o) Memasukkan -b ect o kedalam


#olle#tion ini. Mengembalikan nilai true jika o telah sukse ditambahkan kedalam
#olle#tion. public void clear() Menghapus semua element dari #olle#tion ini. public
boolean remove(+bEect o) Menghapus single instan#e dari -b ect o pada #olle#tion
ini, jika hal tersebut telah diinputkan. Mengembalikan nilai true jika o telah
ditemukan dan dihapus dari #olle#tion. public boolean contains(+bEect o)
Mengembalikan nilai true jika #olle#tion ini berisi -b ect o. public boolean isDmpt
%() Mengembalikan nilai true jika #olle#tion ini tidak berisi obje#t atau element
apapun. public int si@e() Mengembalikan nomor dari elements pada #olle#tion ini.
public Iterator iterator() Mengembalikan sebuah iterator yang menunjukkan kita pada
isi #olle#tion ini. public boolean e>uals(+bEect o) Mengembalikan nilai jika -b ect
o sama dengan yang ada pada #olle#tion. public int )as)Fode() Mengembalikan nilai
hash #ode *i.e., the ID+ untuk #olle#tion ini. >bje#ts atau #olle#tions yang sama
memiliki nilai hash #ode atau ID yang sama.
Tabel *.2.+b: .ethods dari class Collection

Anda diharapkan menga#u pada dokumentasi A,I untuk mengetahui daftar lengkap dari
methods dalam Collection, List dan Set interfa#e. Saat ini kita akan melihat
beberapa #olle#tion #lasses. 4arap menga#u pada A,I untuk daftar dari methods yang
dimasukkan kedalam #lass ini. ,ada bagian sebelumnya, Anda telah melihat bagaimana
mengimplementasikan linked list dengan #ara Anda sendiri. Ja8a SD3 juga telah
menyediakan built)implementation dari linked list untuk kita. LinkedList #lass
berisi methods yang memperbolehkan linked list digunakan seperti sta#ks, $ueue atau
AD( yang lain. 7isting program berikut ini menunjukan bagaimana menggunakan #lass
LinkedList.

,engenalan ,emrograman "

11
J.E.N.I.

import Eava#util#*; class Cin?edCist*emo { public static void main(Strin ar s!")


{ Cin?edCist list = ne7 Cin?edCist(); list#add(ne7 Inte er(1)); list#add(ne7 Inte
er(/)); list#add(ne7 Inte er(0)); list#add(ne7 Inte er(1)); S%stem#out#println(list
; .- si@e = . ; list#si@e()); list#addFirst(ne7 Inte er($)); list#addCast(ne7 Inte
er(1)); S%stem#out#println(list); S%stem#out#println(list# etFirst() ; .- . ; list#
etCast()); S%stem#out#println(list# et(/) ; .- . ; list# et(0));
list#removeFirst(); list#removeCast(); S%stem#out#println(list); list#remove(ne7
Inte er(1)); S%stem#out#println(list); list#remove(0); S%stem#out#println(list);
list#set(/- .one.); S%stem#out#println(list); } } "rra#List merupakan 8ersi
fleksibel dari array biasa. Hang mengimplementasikan List interfa#e. (elitilah kode
berikut ini. import Eava#util#*; class :rra%Cist*emo { public static void
main(Strin ar s!") { :rra%Cist al = ne7 :rra%Cist(/); S%stem#out#println(al ; .-
si@e = . ; al#si@e()); al#add(.&.); al#add(.G.); al#add(.+.); S%stem#out#println(al
; .- si@e = . ; al#si@e()); al#remove(.G.); S%stem#out#println(al ; .- si@e = . ;
al#si@e()); CistIterator li = al#listIterator(); 7)ile (li#)asAeBt()) S
%stem#out#println(li#neBt()); +bEect a!" = al#to:rra%(); for (int i=$; i=a#len t);
i;;) S%stem#out#println(a!i"); } }

,engenalan ,emrograman "

12
J.E.N.I.

$ashSet merupakan sebuah implementasi dari Set interfa#e yang berguna pada hash
table. ,enggunaan suatu hash table lebih mudah dan #epat untuk melihat lebih detail
elemen)elemen yang ada. (able menggunakan suatu rumusan untuk menentukan dimana
suatu objek disimpan. (eliti program ini, yang menggunakan #lass $ashSet. import
Eava#util#*; class Has)Set*emo { public static void main(Strin ar s!") { Has)Set )s
= ne7 Has)Set(2- $#2f); S%stem#out#println()s#add(.one.)); S
%stem#out#println()s#add(.t7o.)); S%stem#out#println()s#add(.one.)); S
%stem#out#println()s#add(.t)ree.)); S%stem#out#println()s#add(.four.)); S
%stem#out#println()s#add(.five.)); S%stem#out#println()s); } } TreeSet merupakan
sebuah implementasi dari Set interfa#e yang menggunakan tree. 5lass ini memastikan
bah'a yang disortir akan diurutkan se#ara as#ending. ,ertimbangkan, bagaimana #lass
TreeSet telah digunakan dalam listing program berikut ini# import Eava#util#*;
class (reeSet*emo { public static void main(Strin ar s!") { (reeSet ts = ne7
(reeSet(); ts#add(.one.); ts#add(.t7o.); ts#add(.t)ree.); ts#add(.four.); S
%stem#out#println(ts); } }

Iambar !.".: 5ontoh (reeSet

,engenalan ,emrograman "

13
J.E.N.I.

3.& Lati$an
3.!.1 Faktor "ersekutuan &er%esar
1aktor persekutuan terbesar *1,6+ 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 Eu#lidKs method, buatlah dua kode untuk penghitungan dua angka.
Iunakan iterasi untuk kode program yang pertama dan rekursif untuk kode program
berikutnya. 5atatan pada algoritma Eu#lid !. Sebagai masukkan integers ? dan y. ".
-langi step diba'ah ini 'hile y L. 9 a. y . ? M y0 b. ? . Nilai lama y0 %.
&eturn ?. 5ontoh, ? . !B dan y . 2. y . ? M y . !B M 2 . " ?.2 y.?My.2M".9 / 0 2
1F234

3.!.2 'e)uential Representation dari Integer (ueue


Dengan menggunakan array, implementasikan sebuah integer $ueue seperti #ontoh pada
se$uential sta#k.

3.!.3 *inked Representation dari Integer (ueue


Dengan menggunakan ide dari linked list, implementasikan sebuah integer $ueue
dinamis seperti integer sta#k dinamis yang diperkenalkan seperti #ontoh berikut.

3.!.! Address #ook


Dengan menggunakan Ja8a #olle#tion, buatlah sebuah program yang memperbolehkan user
untuk insert, delete dan 8ie' address. Setiap address berisi nama , alamat dan
nomor telepon dari orang yang mengisinya. ,engisian data dimasukkan dengan #ara
$ueue tetapi penghapusan dilakukan dengan #ara sta#k. Dalam #ontoh ini, kita akan
menggunakan te?t editor untuk mengedit program Ja8a. Juga membuka terminal 'indo'
untuk meng)#ompile dan meng)e?e#ute program Ja8a anda.

,engenalan ,emrograman "

14
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 ile. Setelah menyelesaikan pembahasan ini, Anda diharapkan dapat ! ".
#endapatkan input dari comman-line $. #engetahui cara untuk memanipulasi properties
dari sistem %. #embaca standart input &. #embaca dan menulis ile

5.2 Argument Command-Line dan System Properties


Seperti yang telah Anda ketahui pada pembahasan sebelumnya, JA'A mengijinkan user
untuk memasukkan data dari command-line. Sebagai contoh, untuk meneruskan argument
" dan $ kepada program Ja(a bernama )alculate, anda dapat menuliskan baris berikut
pada command prompt
java Calculate 1 2

Pada contoh berikut ini, data " disimpan pada (ariabel args[0], begitu pula dengan
data $ yang disimpan pada args[1]. Sehingga, tujuan dari deklarasi String args[]
sebagai sebuah parameter pada method utama menjadi jelas. Selain mele*atkan
argument menuju method utama, Anda juga dapat memanipulasi system properties dari
command-line. System properties hampir menyamai en(ironment (ariables, namun tidak
memiliki ketergantungan pada spesi ikasi plat orm yang digunakan. Sebuah property
secara sederhana berupa pemetaan antara property name dan (alue yang dimilikinya.
+al ini ditunjukkan pada Ja(a dalam class Properties. )lass System menyediakan
sebuah method untuk menentukan system properties yang digunakan, method
getProperties yang menghasilkan sebuah object Properties. )lass yang sama juga
menyediakan method getProperty yang memiliki dua buah bentuk.

Pengenalan Pemrograman $

1
J.E.N.I.

public static String getProperty,String key.entuk 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 de .entuk ini juga menghasilkan
nilai String dari System Properties sesuai key yang ditentukan. Akan menghasilkan
nilai def, sebuah nilai de ault, jika tidak terdapat property dengan key yang
sesuai.

Tabel 1.1: getProperty() method dari class System

/ita 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 01 pada
perintah Ja(a 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

2ntuk menampilkan da tar system properties yang tersedia pada sistem Anda, gunakan
method getProperties seperti yang ditunjukkan sebagai berikut !
System.getProperties( .list(System.out !

Pengenalan Pemrograman $

2
J.E.N.I.

5.

!emba"a Standard #nput

1ibandingkan 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 ile atau sebuah perangkat yang mengijinkan beberapa
set item untuk dibaca atau ditulisi. Streams terhubung dengan physical de(ices
seperti keyboards, consoles dan iles. 3erdapat dua bentuk umum dari streams, byte
streams dan character streams. .yte streams digunakan pada data biner, sedangkan
character streams digunakan pada karakter 2nicode. System.in dan System.out adalah
dua contoh dari byte streams yang digunakan dalam Ja(a. )ontoh pertama mere
erensikan pada keyboard, kemudian contoh kedua mere erensikan pada console. 2ntuk
membaca karakter dari keyboard, Anda dapat menggunakan byte stream System.in yang
terdapat pada object .u ered4eader. .aris berikut menunjukkan bagaimana untuk
melakukan hal tersebut !

"u##ere$%ea$er &r = ne' "u##ere$%ea$er(ne' (nputStream%ea$er(System.in

#ethod read dari object .u ered4eader selanjutnya digunakan untuk membaca nilai
input dari perangkat input.
ch=(int &r.rea$( ! ))metho$ rea$ menghasil*an nilai integer

)obalah contoh kode berikut !

import java.io.+! class ,avoriteCharacter pu&lic static voi$ main(String args./


thro's (012ception System.out.println(34i5 'hat6s your #avorite character73 ! char
#avChar! "u##ere$%ea$er &r = ne' "u##ere$%ea$er(ne' (nputStream%ea$er(System.in
#avChar = (char &r.rea$( ! System.out.println(#avChar 8 3 is a goo$ choice93 ! : :

Jika Anda lebih memilih untuk membaca keseluruhan baris daripada membaca satu
karakter tiap *aktu, gunakan method read5ine !
str 6 br.read5ine,-7

Pengenalan Pemrograman $

3
J.E.N.I.

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

import java.io.+! class ;reet<ser pu&lic static voi$ main(String args./ thro's
(012ception System.out.println(34i5 'hat6s your name73 ! String name! "u##ere$
%ea$er &r = ne' "u##ere$%ea$er(ne' (nputStream%ea$er(System.in ! name =
&r.rea$=ine( ! System.out.println(3>ice to meet you5 3 8 name 8 39 ? 3 ! : :

Pada saat menggunakan streams, jangan lupa untuk mengimport package java.io seperti
yang ditunjukkan diba*ah ini !
import java.io.+!

Satu hal lagi yang perlu untuk diingat, pembacaan dari streams dapat menyebabkan
terjadinya e8ception. Jangan lupa untuk menangani e8ception tersebut menggunakan
perintah try-catch atau dengan mengindikasikan e8ception pada klausa thro*s dalam
method.

Pengenalan Pemrograman $

4
J.E.N.I.

5.$ !enangani %ile


Pada beberapa kasus, masukan data disimpan pada sebuah ile. Selanjutnya, terdapat
beberapa cara jika Anda ingin menyimpan output dari program pada sebuah ile. Pada
sistem terkomputerisasi, data dari Sis*a yang dapat digunakan sebagai input oleh
sistem umumnya terseimpan pada sebuah ile terpisah. /emudian, salah satu
kemungkinan output dari sistem adalah in ormasi tentang mata pelajaran yang diikuti
oleh sis*a. Sekali lagi, output dalam hal ini dapat disimpan dalam sebuah ile.
Seperti yang terlihat pada aplikasi, terdapat suatu kebutuhan untuk membaca dan
menulis sebuah ile. Anda akan mempelajari tentang ile input dan output pada bagian
ini.

5.4.1 Membaca sebuah File


2ntuk membaca sebuah ile, Anda dapat menggunakan class FileInputStream. .erikut ini
adalah salah satu constructor dari class tersebut !

,ile(nputStream(String #ilename

)onstructor tersebut membuat sebuah koneksi terhadap ile dimana nama dari ile
tersebut ditunjukkan sebagai sebuah argument. E8ception berupa FileNotFoundE !
eption akan muncul jika ile tidak ditemukan atau tidak dapat dibuka dan kemudian
dibaca. Setelah membuat sebuah input stream, Anda kemudian dapat menggunakannya
untuk membaca sebuah ile dengan menggunakan method read. #ethod read menghasilkan
sebuah nilai integer, dan akan menunjukkan nilai " jika telah mencapai batas akhir
ile.

Pengenalan Pemrograman $

5
J.E.N.I.

.erikut ini contohnya !


import java.io.+! class %ea$,ile pu&lic static voi$ main(String args./ thro's
(012ception System.out.println(3@hat is the name o# the #ile to rea$ #rom73 !
String #ilename! "u##ere$%ea$er &r = ne' "u##ere$%ea$er(ne' (nputStream
%ea$er(System.in #ilename = &r.rea$=ine( ! System.out.println(3>o' rea$ing #rom 3 8
#ilename 8 3...3 ! ,ile(nputStream #is = null! try #is = ne'
,ile(nputStream(#ilename ! : catch (,ile>ot,oun$12ception e2
System.out.println(3,ile not #oun$.3 ! : try char $ata! int temp! $o temp =
#is.rea$( ! $ata = (char temp! i# (temp 9= -1 System.out.print($ata ! : : 'hile
(temp 9= -1 ! : catch ((012ception e2 System.out.println(3Pro&lem in rea$ing #rom
the #ile.3 ! : : :

5.4.2 Menulis sebuah file


2ntuk menuliskan sebuah ile, Anda dapat menggunakan class File"utputStream. .erikut
ini salah satu constructor yang dapat Anda gunakan.
,ile0utputStream(String #ilename

)ontructor tersebut menyediakan jalur output stream terhadap sebuah ile yang akan
ditulisi. Sebuah E8ception berupa FileNotFoundE !eption akan muncul jika ile yang
dimaksud tidak dapat dibuka untuk ditulisi.

Jika output stream telah dibuat, Anda dapat menggunakannya untuk menulisi ile yang
dituju menggunakan method #rite. #ethod tersebut menggunakan penandaan sebagai
berikut !
voi$ 'rite(int &

Parameter $ mere erensikan data yang akan dituliskan pada ile sesuai dengan hasil
output stream.

Pengenalan Pemrograman $

6
J.E.N.I.

Program berikut menunjukkan contoh penulisan terhadap ile !


import java.io.+! class @rite,ile pu&lic static voi$ main(String args./ thro's
(012ception System.out.println(3@hat is the name o# the #ile to &e 'ritten to73 !
String #ilename! "u##ere$%ea$er &r = ne' "u##ere$%ea$er(ne' (nputStream
%ea$er(System.in ! #ilename = &r.rea$=ine( ! System.out.println(31nter $ata to
'rite to 3 8 #ilename 8 3...3 ! System.out.println(3Aype BC to en$.3 !
,ile0utputStream #os = null! try #os = ne' ,ile0utputStream(#ilename ! : catch
(,ile>ot,oun$12ception e2 System.out.println(3,ile cannot &e opene$ #or 'riting.3 !
: try &oolean $one = #alse! int $ata! $o $ata = &r.rea$( ! i# ((char $ata == 6B6
$ata = &r.rea$( ! i# ((char $ata == 6C6 $one = true! : else #os.'rite(6B6 !
#os.'rite($ata ! : : else #os.'rite($ata ! : : 'hile (9$one ! : catch ((012ception
e2 System.out.println(3Pro&lem in rea$ing #rom the #ile.3 ! : : :

Pengenalan Pemrograman $

7
J.E.N.I.

5.5 Lati&an
5.5.1 Spasi menjadi Underscore ( _ )
.uatlah sebuah program yang memuat dua String sebagai argument, sumber dan nama ile
tujuan. /emudian, baca ile sumber dan tuliskan isi dari ile tersebut terhadap ile
tujuan, seluruh spasi yang ada ,9 9- diubah menjadi underscore ,9 : 9-.

Pengenalan Pemrograman $

8
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. leh
karena itu! pemahaman atas algoritma – algoritma yang ada sangatlah berguna.
"etelah menyelesaikan pembahasan pada bagian ini! anda diharapkan mampu # 1.
$emahami dan men%elaskan algoritma dari insertion sort, selection sort, merge sort
dan quick sort. &. $embuat implementasi pribadi menggunakan algoritma yang ada

6.2 Insertion Sort


"alah satu algoritma sorting yang paling sederhana adalah insertion sort. Ide dari
algoritma ini dapat dianalogikan seperti mengurutkan kartu. 'en%elasan berikut ini
menerangkan bagaimana algoritma insertion sort beker%a dalam pengurutan kartu.
Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling
kecil hingga yang paling besar. "eluruh kartu diletakkan pada me%a! sebutlah me%a
ini sebagai me%a pertama! disusun dari kiri ke kanan dan atas ke ba(ah. Kemudian
kita mempunyai me%a yang lain! me%a kedua! dimana kartu yang diurutkan akan
diletakkan. Ambil kartu pertama yang terletak pada po%ok kiri atas me%a pertama dan
letakkan pada me%a kedua. Ambil kartu kedua dari me%a pertama! bandingkan dengan
kartu yang berada pada me%a kedua! kemudian letakkan pada urutan yang sesuai
setelah perbandingan. 'roses tersebut akan berlangsung hingga seluruh kartu pada me
%a pertama telah diletakkan berurutan pada me%a kedua. Algoritma insertion sort
pada dasarnya memilah data yang akan diurutkan men%adi dua bagian! yang belum
diurutkan )me%a pertama* dan yang sudah diurutkan )me%a kedua*. Elemen pertama
diambil dari bagian array yang belum diurutkan dan kemudian diletakkan sesuai
posisinya pada bagian lain dari array yang telah diurutkan. +angkah ini dilakukan
secara berulang hingga tidak ada lagi elemen yang tersisa pada bagian array yang
belum diurutkan.

'engenalan 'emrograman &

1
J.E.N.I.

6.2.1 Algoritma
void insertionSort(Object array[], int startIdx, int endIdx) { for (int i =
startIdx; i < endIdx; i++) { int k = i; for (int j = i + ; j < endIdx; j++) { if
(((!o"#arab$e) array[k])%co"#are&o(array[j])'() { k = j; ) )
s*a#(array[i],array[k]); ) )

6.2.2 Sebuah Contoh


Data $ango Apple 'each range Banana 1st Pass $ango Apple 'each range Banana 2nd
Pass Apple $ango 'each range Banana 3rd Pass Apple $ango range 'each Banana 4th
Pass Apple Banana $ango range 'each

Gambar 1.1.2: Contoh insertion sort

'ada 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. +ayaknya insertion
sort! algoritma ini sangat rapat dan mudah untuk diimplementasikan. $ari kita
kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket kartu.
Asumsikan bah(a kartu tersebut akan diurutkan secara ascending. 'ada a(alnya! kartu
tersebut akan disusun secara linier pada sebuah me%a dari kiri ke kanan! dan dari
atas ke ba(ah. 'ilih nilai kartu yang paling rendah! kemudian tukarkan posisi kartu
ini dengan kartu yang terletak pada po%ok kiri atas me%a. +alu cari kartu dengan
nilai paling rendah diantara sisa kartu yang tersedia. ,ukarkan kartu yang baru sa
%a terpilih dengan kartu pada posisi kedua. -langi langkah – langkah tersebut
hingga posisi kedua sebelum posisi terakhir dibandingkan dan dapat digeser dengan
kartu yang bernilai lebih rendah.

'engenalan 'emrograman &

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 / ke n! dimana n adalah %umlah total elemen dikurangi /.

6.3.1 Algoritma
void se$ectionSort(Object array[], int startIdx, int endIdx) { int "in; for (int i
= startIdx; i < endIdx; i++) { "in = i; for (int j = i + ; j < endIdx; j++) { if
(((!o"#arab$e)array["in])%co"#are&o(array[j])'() { "in = j; ) ) s*a#(array["in],
array[i]); ) )

6.3.2 Sebuah Contoh


Data Maricar 0anessa $argau1 Hannah 2o(ena 1st Pass Hannah Vanessa Margaux $aricar
2o(ena 2nd Pass Hannah $argau1 Vanessa Maricar 2o(ena 3rd Pass Hannah $argau1
$aricar Vanessa o!ena 4th Pass Hannah $argau1 $aricar 2o(ena 0anessa

"igure 1.2.2: Contoh selection sort

6.4 Merge Sort


"ebelum mendalami algoritma merge sort! mari kita mengetahui garis besar dari
konsep di#ide and conquer karena merge sort mengadaptasi pola tersebut.

6.4.1 Pola Divide and Con uer


Beberapa algoritma mengimplementasikan konsep rekursi untuk menyelesaikan
permasalahan. 'ermasalahan utama kemudian dipecah men%adi sub.masalah! kemudian
solusi dari sub.masalah akan membimbing menu%u solusi permasalahan utama.

'engenalan 'emrograman &

3
J.E.N.I.

'ada setiap tingkatan rekursi! pola tersebut terdiri atas 3 langkah. /. 4i5ide
$emilah masalah men%adi sub masalah &. 6on7uer "elesaikan sub masalah tersebut
secara rekursif. Jika sub.masalah tersebut cukup ringkas dan sederhana! pendekatan
penyelesaian secara langsung akan lebih efektif 3. Kombinasi $engkombinasikan
solusi dari sub.masalah! yang akan membimbing menu%u penyelesaian atas permasalahan
utama

6.4.2 Memahami Merge Sort


"eperti yang telah di%elaskan sebelumnya! Merge sort menggunakan pola di#ide and
conquer. 4engan hal ini deskripsi dari algoritma dirumuskan dalam 3 langkah berpola
di#ide$and$conquer. Berikut men%elaskan langkah ker%a dari Merge sort. /. 4i5ide
$emilah elemen – elemen dari rangkaian data men%adi dua bagian. &. 6on7uer 6on7uer
setiap bagian dengan memanggil prosedur merge sort secara rekursif 3. Kombinasi
$engkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan rangkaian
data berurutan 'roses rekursi berhenti %ika mencapai elemen dasar. Hal ini ter%adi
bilamana bagian yang akan diurutkan menyisakan tepat satu elemen. "isa pengurutan
satu elemen tersebut menandakan bah(a bagian tersebut telah terurut sesuai
rangkaian.

6.4.3 Algoritma
void "er+eSort(Object array[], int startIdx, int endIdx) { if (array%$en+t, -= )
{ ../e"ba+i ran+kaian data, ri+,t0rr dan $eft0rr "er+eSort($eft0rr, startIdx,
"idIdx); "er+eSort(ri+,t0rr, "idIdx+ , endIdx); co"bine($eft0rr, ri+,t0rr); ) )

'engenalan 'emrograman &

4
J.E.N.I.

6.4.4 Sebuah Contoh


2angkaian data# 8 & 9 :

$embagi rangkaian men%adi dua bagian# %e&t'rr ight'rr

7 2

5 6

$embagi %e&t'rr men%adi dua bagian# %e&t'rr ight'rr

7
& 8

$engkombinasikan

$embagi ight'rr men%adi dua bagian# %e&t'rr ight'rr $engkombinasikan 9 : ight'rr.

$engkombinasikan %e&t'rr dan & 9 : 8

Gambar 1.(.): Contoh merge sort

6.5 !uic"sort
*uicksort ditemukan oleh 6.A.2 Hoare. "eperti pada merge sort! algoritma ini %uga
berdasar pada pola di5ide.and.con7uer. Berbeda dengan merge sort! algoritma ini
hanya mengikuti langkah – langkah sebagai berikut # /. 4i5ide $emilah rangkaian
data men%adi dua sub.rangkaian A;p<7./= dan A;7>/<r= dimana setiap elemen A;p<7./=
adalah kurang dari atau sama dengan A;7= dan setiap elemen pada A;7>/<r= adalah
lebih besar atau sama dengan elemen pada A;7=. A;7= disebut sebagai elemen pi5ot.
'erhitungan pada elemen 7 merupakan salah satu bagian dari prosedur pemisahan.

'engenalan 'emrograman &

5
J.E.N.I.

&. 6on7uer $engurutkan elemen pada sub.rangkaian secara rekursif 'ada algoritma
quicksort! langkah ?kombinasi? tidak di lakukan karena telah ter%adi pengurutan
elemen – elemen pada sub.array

6.#.1 Algoritma
void 12ickSort(Object array[], int $eftIdx, int ri+,tIdx) { int #ivotIdx; .3
4ondisi &er"inasi 3. if (ri+,tIdx ' $eftIdx) { #ivotIdx = #artition(array, $eftIdx,
ri+,tIdx); 12ickSort(array, $eftIdx, #ivotIdx5 ); 12ickSort(array, #ivotIdx+ ,
ri+,tIdx); ) )

6.#.2 Sebuah Contoh


2angkaian data# 3 / @ / 9 A & : 9 3 9 B

'ilih sebuah elemen yang akan men%adi elemen pi5ot. 3 / @ / 9 A & : 9 3 9 B

Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen
akhir. kiri 3 / @ / 9 A & : 9 3 9 kanan B

Ceser elemen kiri kearah kanan sampai ditemukan nilai yang lebih besar dari elemen
pi5ot tersebut. Ceser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen
yang tidak lebih besar dari elemen tersebut. kiri 3 / @ / 9 A & : 9 kanan 3 9 B

,ukarkan antara elemen kiri dan kanan kiri kanan

'engenalan 'emrograman &

6
J.E.N.I.

&

Ceserkan lagi elemen kiri dan kanan. kiri 3 / 3 / 9 A kanan & : 9 @ 9 B

,ukarkan antar elemen kembali. kiri 3 / 3 / & A kanan 9 : 9 @ 9 B

Ceserkan kembali elemen kiri dan kanan. kanan 3 / 3 / & kiri A 9 : 9 @ 9 B

,erlihat bah(a titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen
kanan D elemen kiri. 4alam hal ini tukarkan elemen pi5ot dengan elemen kanan. pi5ot
2 / 3 / 3 A 9 : 9 @ 9 B

Gambar 1.).2: Contoh quicksort

Kemudian urutkan elemen sub.rangkaian pada setiap sisi dari elemen pi5ot.

6.6 $atihan
6.6.1 Insertion Sort
Impelementasikan algoritma insertion sort dalam Ja5a untuk mengurutkan serangkaian
data integer. +akukan percobaan terhadap hasil implementasi anda terhadap rangkaian
data integer yang dimasukkan oleh pengguna melalui command line.

'engenalan 'emrograman &

7
J.E.N.I.

6.6.2 Selection Sort


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

6.6.3 Merge Sort


Cunakan implementasi merge sort berikut ini terhadap serangkaian data integer.
c$ass /er+eSort { static void "er+eSort(int array[], int startIdx, int endIdx)
{ if(startIdx == 66666) { ret2rn; ) int $en+t, = endIdx5startIdx+ ; int "id =
66666; "er+eSort(array, 66666, "id); "er+eSort(array, 66666, endIdx); int *orkin+[]
= ne* int[$en+t,]; for(int i = (; i < $en+t,; i++) { *orkin+[i] =
array[startIdx+i]; ) int " = (; int "7 = "id5startIdx+ ; for(int i = (; i < $en+t,;
i++) { if("7 <= endIdx5startIdx) { if(" <= "id5startIdx) { if(*orkin+[" ] ' *orkin+
["7]) { array[i+startIdx] = *orkin+["7++]; ) e$se { array[i+startIdx] = 66666; ) )
e$se { array[i+startIdx] = 66666; ) ) e$se { array[66666] = *orkin+[" ++]; ) ) )
#2b$ic static void "ain(Strin+ ar+s[]) { int n2"0rr[] = ne* int[ar+s%$en+t,]; for
(int i = (; i < ar+s%$en+t,; i++) { n2"0rr[i] = Inte+er%#arseInt(ar+s[i]); )
"er+eSort(n2"0rr, (, n2"0rr%$en+t,5 ); for (int i = (; i < n2"0rr%$en+t,; i++)
{ Syste"%o2t%#rint$n(n2"0rr[i]); ) ) )

'engenalan 'emrograman &

8
J.E.N.I.

6.6.4 !uic"sort
Cunakan implementasi quicksort berikut ini terhadap serangkaian data integer.
c$ass 82ickSort { static void 12ickSort (int[] array, int startIdx, int endIdx)
{ .. startIdx ada$a, index ba*a, .. endIdx is index atas .. dari array yan+ akan
di2r2tkan int i=startIdx, j=endIdx, ,; ..#i$i, e$e"en #erta"a seba+ai #ivot int
#ivot=array[66666]; .. "e"i$a, do { *,i$e (array[i]66666#ivot) { i++; ) *,i$e
(array[j]'66666) { j55; ) if (i<=j) { ,=66666; array[i]=66666; array[j]=66666; i++;
j55; ) ) *,i$e (i<=j); .. rek2rsi if (startIdx<j) { 12ickSort(array, 66666, j); )
if (i<endIdx) { 12ickSort(array, 66666, endIdx); ) ) #2b$ic static void "ain(Strin+
ar+s[]) { int n2"0rr[] = ne* int[ar+s%$en+t,]; for (int i = (; i < ar+s%$en+t,; i+
+) { n2"0rr[i] = Inte+er%#arseInt(ar+s[i]); ) 12ickSort(n2"0rr, (, n2"0rr%
$en+t,5 ); for (int i = (; i < n2"0rr%$en+t,; i++) { Syste"%o2t%#rint$n(n2"0rr[i]);
) ) )

'engenalan 'emrograman &

9
J.E.N.I.

Bab 7 Abstract Windowing Toolkit dan Swing


7.1 Tujuan
Tanpa mempelajari tentang grapichal user interface (GUI) API, Anda masih tetap bisa
membuat suatu program. Tetapi, program Anda a an elihatan tida menari dan tida n!
aman diguna an bagi para user. "emili i GUI !ang bai dapat memberi e#e pada
penggunaan apli asi. Ja$a men!edia an ban!a tool seperti Abstract Windowing Toolkit
dan Swing untu mengembang an apli asi GUI !ang intera ti#. %etelah men!elesai an
bab ini, Anda diharap an untu & '. "emahami persamaan dan perbedaan antara A(T dan
%)ing 2. Perbedaan antara omponen dan ontainer. *. "endesain apli asi GUI mengguna
an A(T. +. "endesain apli asi GUI mengguna an %)ing. 5. "enjelas an tentang flow
layout, border layout, dan grid layout dalam omponen GUI ,. "embuat tampilan !ang
omple dalam mendesain apli asi GUI.

7.2 Abstract Windowing Toolkit (AWT) vs. Swing


The Java Foundation Class (J-.), merupa an bagian penting dari Ja$a %/0, !ang
termasu dalam ole si dari API dimana dapat mempermudah pengembangan apli asi JA1A
GUI. J-. termasu diantara 2 bagian utama dari API !aitu A(T dan %)ing. Tiga
bagian !ang lainn!a dari API adalah Ja$a3/, Accessibility, dan /rag dan /rop. %emua
itu membantu pengembang dalam mendesain dan mengimplementasi an apli asi $isual !
ang lebih bai . A(T dan %)ing men!edia an omponen GUI !ang dapat diguna an dalam
membuat apli asi Ja$a dan applet. Anda a an mempelajari applet pada bab beri utn!a.
Tida seperti beberapa omponen A(T !ang mengguna an native code, eseluruhan %)ing
ditulis mengguna an bahasa pemrograman Ja$a. %)ing men!edia an implementasi
plat#orm4independent dimana apli asi !ang di embang an dengan plat#orm !ang berbeda
dapat memili i tampilan !ang sama. 5egitu juga dengan A(T menjamin tampilan look
and feel pada apli asi !ang dijalan an pada dua mesin !ang berbeda menjadi terlihat
sama. %)ing API dibangun dari beberapa API !ang mengimplementasi an beberapa jenis
bagian dari A(T. 0esimpulann!a, omponen A(T dapat diguna an dengan omponen %)ing.

Pengenalan Pemrograman 3

1
J.E.N.I.

7.3 Ko

!on"n #$% !ada AWT

7.3.1 Window Classes Fundamental


/alam mengembang an apli asi GUI, omponen GUI seperti tombol atau te6t#ield dileta
an di dalam ontainer. 5eri ut ini adalah da#tar dari beberapa elas penting pada
ontainer !ang telah disedia an oleh A(T.

AWT Class
0omponen 0ontainer Panel (indo) -rame

Description
Abstra7t .lass untu obje !ang dapat ditampil an pada 7onsole dan berintera si
dengang user. 5agian utama dari semua elas A(T. Abstra7t %ub7lass dari .omponent
.lass. %ebuah menampung omponen !ang lainn!a. omponen !ang dapat

Turunan dari .ontainer .lass. %ebuah #rame atau )indo) tanpa titlebar, menubar tida
termasu border. %uper7lass dari applet 7lass. Turunan dari .ontainer 7lass. Top
le$el )indo), dimana berarti tida bisa dimasu an dalam obje !ang lainn!a.Tida
memili i border dan menubar. Turunan dari )indo) 7lass. (indo) dengan judul,
menubar, border dan pengatur u uran di pojo . "emili i empat onstru tor , dua
diantaran!a memili i penulisan seperti diba)ah ini & Frame() Frame(String title)
Tabel 1 ! 1" #elas kontainer AWT

Untu mengatur u uran )indo), mengguna an metode set%i8e.

void setSize(int width, int height)


mengubah u uran omponen ini dengan width dan height sebagai parameter. mengubah u
uran dengan d width dan d height berdasar pada spesi#i asi $i%ension d /e#ault dari
)indo) adalah not visible atau ta tampa hingga Anda mengatur visibility menjadi
true Inilah synta& untu metode set'isible

void setSize(Dimension d)

void setVisible(boolean b)
/alam mendesain apli asi GUI, 9bje7t Fra%e selalu diguna an. /iba)ah ini adalah
7ontoh bagaimana membuat sebuah apli asi. import java.awt.*; publi lass SampleFrame
e!tends Frame "

Pengenalan Pemrograman 3

2
J.E.N.I.

: perhati an bah)a tombol tutup pada #rame tida a an be erja arena tida ada me
anisme event handling !ang ditambah an di dalam apli asi. Anda a an belajar tentang
event handling pada modul selanjutn!a.

publi stati void main(String args#$) " SampleFrame s% & new SampleFrame(); s
%.setSize('((, '((); ))*oba hilang+an baris ini s%.setVisible(true); ))*oba
hilang+an baris ini ,

7.3.2 Grafik
5eberapa metode gra#i beberapa metode. dra);ine() #ill<e7t() dra)<e7t() 7lear<e7t()
ditemu an dalam (raphic 7lass. /iba)ah ini adalah da#tar dari dra)Pol!line()
dra)Pol!gon() #illPol!gon() get.olor() set.olor() get-ont() set-ont() dra)%tring()

Tabel 1 ! !a" )eberapa %etode dari kelas (raphics

=ubungan dari elas ini adalah Color 7lass, dimana memili i tiga onstru tor.

Constructor Format
.olor(int r, int g, int b) .olor(#loat r, #loat g, #loat b) .olor(int rgb1alue)
Nilai integer > 4 322. Nilai #loat >.> 4 '.>.

Description

Panjang nilai & > e 33+4' (hitam e putih). <ed& bits ',43* Green& bits ?4'2 5lue&
bits >4@

/iba)ah ini adalah 7ontoh program !ang mengguna an beberapa metode di dalam (raphic
7lass. import java.awt.*; publi lass -raphi .anel e!tends .anel " -raphi .anel() "
set/a +ground(*olor.bla +); )) onstant in *olor , publi void paint(-raphi s g) "
g.set*olor(new *olor((,011,()); ))green g.setFont(new Font(23elveti
a2,Font..4567,'8)); g.drawString(23ello -96 :orld;2, <(, '((); g.set*olor(new
*olor('.(%,(,()); ))red

lass

Pengenalan Pemrograman 3

3
J.E.N.I.

g.%ill=e t(<(, '((, '1(, '(); , publi stati void main(String args#$) " Frame % &
new Frame(2>esting -raphi s .anel2); -raphi .anel gp & new -raphi .anel();
%.add(gp); %.setSize(8((, <((); %.setVisible(true); , an didalam )indo) !ang dapat
terlihat

Agar panel dapat terlihat atau visible, dia harus dileta seperti sebuah #rame.

7.3.3 Beberapa komponen AWT


5eri ut ini adalah da#tar dari ontrol A(T. 0ontrol adalah omponen seperti tombol
atau te6t#ield !ang mengijin an user untu berintera si dengan apli asi GUI. 5eri ut
ini semua sub elas dari Co%ponents 7lass. ;abel Te6t-ield Te6tArea 5utton .he7
bo6 .he7 bo6Group
Tabel 1 ! *" #o%ponen AWT

.hoi7e ;ist %7rollbar

5eri ut adalah apli asi membuat sebuah #rame dengan dalamn!a. import java.awt.*;

ontrol !ang telah dimasu

an di

lass Frame:*ontrols e!tends Frame " publi stati void main(String args#$) "
Frame:*ontrols %w & new Frame:*ontrols(); %w .set4a?out(new Flow4a?out()); ))more
on this later %w .setSize(8((, 8((); %w .add(new /utton(2>est @e;2)); %w .add(new
4abel(24abe2)); %w .add(new >e!tField()); *he +bo!-roup bg & new *he +bo!-roup();
%w .add(new *he +bo!(2 h+'2, bg, true)); %w .add(new *he +bo!(2 h+02, bg, %alse));
%w .add(new *he +bo!(2 h+<2, bg, %alse)); 4ist list & new 4ist(<, %alse);
list.add(2@>V2); list.add(2V2); %w .add(list); *hoi e hooser & new *hoi e();
hooser.add(25vril2); hooser.add(2@oni a2);

Pengenalan Pemrograman 3

4
J.E.N.I.

hooser.add(2/ritne?2); %w .add( hooser); %w .add(new S rollbar()); %w


.setVisible(true); : ,

7.& 'a(out )anag"r


Posisi dan u uran suatu omponen ditentu an oleh la!out manager. ;a!out manager
mengatur tampilan dari omponen di dalam ontainer. 5eri ut ini beberapa la!out
manager !ang terdapat di dalam Ja$a. '.-lo);a!out 3.5order;a!out *.Grid;a!out
+.Grid5ag;a!out 2..ard;a!out ;a!out manager dapat diatur mengguna an metode
set+ayout dari Container 7lass "etode ini dapat ditulis sebagai beri ut. void
set4a?out(4a?out@anager mgr) Ji a Anda memilih untu tida mengguna an la!out
manager, Anda dapat mengisi null sebagai argumen untu metode ini. Tetapi selanjutn!
a, Anda a an mengatur posisi elemen se7ara manual dengan mengguna an metode
set)ounds dari .omponents 7lass. publi void set/ounds(int !, int ?, int width, int
height)

"etode ini mengatur posisi berdasar an pada argumen 6 dan !, dan u uran berdasar an
argumen width dan height =al ini a an 7u up men!ulit an dan membosan an untu apli
asi ji a Anda memili i beberapa obje omponen didalam obje ontainer. Anda a an
memanggil metode ini untu setiap omponen.

7.4.1 Flow a!out "ana#er


-lo);a!out "anager adalah de#ault manager untu ,anel 7lass dan sub elasn!a, termasu
applet 7lass. .ara meleta an omponen dari -lo);a!out "anager dimulai dari iri e
anan dan dari atas e ba)ah, dimulai dari pojo iri atas. %eperti pada saat Anda
mengeti mengguna an editor ata pada umumn!a. 5eri ut adalah bagaimana -lo);a!out
"anager be erja, dimana memili i tiga onstru tor seperti da#tar di ba)ah ini.
FlowLayout Constructors Flow4a?out() "embuat obje baru -lo);a!out dengan posisi di
tengah dan lima unit hori8ontal dan $erti al gap dimasu an pada omponen sebagai
de#ault. Flow4a?out(int align)

Pengenalan Pemrograman 3

5
J.E.N.I.

FlowLayout Constructors "embuat obje baru -lo);a!out dengan posisi spesi#i dan lima
unit hori8ontal dan $erti al gap dimasu an pada omponen sebagai de#ault. Flow4a?
out(int align, int hgap, int vgap) "embuat obje baru -lo);a!out dengan argumen
pertama sebagai posisi pada omponen dan hgap untu hori8ontal dan vgap untu $erti al
pada omponen

Tabel 1 * 1" #onstruktor Flow+ayout

Gap dapat di ata an sebagai jara antara omponen dan biasan!a diu ur dengan satuan
pi6el. Posisi argumen mengi uti penulisan sebagai beri ut & '.-lo);a!out.;E-T 3.-
lo);a!out..ENTE< *.-lo);a!out.<IG=T 5agaimana ah output dari program beri utA
import java.awt.*; lass Flow4a?outDemo e!tends Frame " publi stati void main(String
args#$) " Flow4a?outDemo %ld & new Flow4a?outDemo(); %ld.set4a?out(new Flow4a?
out(Flow4a?out.=6-3>, '(, '()); %ld.add(new /utton(2A7B2)); %ld.add(new
/utton(2>:A2)); %ld.add(new /utton(2>3=BB2)); %ld.setSize('((, '(();
%ld.setVisible(true); ,

Gambar beri ut adalah 7ontoh dari hasil !ang berjalan pada plat#orm (indo).

Tabel 1* 1" Contoh hasil dala% window

Pengenalan Pemrograman 3

6
J.E.N.I.

7.4.2.Border a!out "ana#er


5order;a!out membagi ontainer menjadi lima bagian diantaran!a utara, selatan,
timur, barat, dan tengah. %etiap omponen dimasu an e dalam region !ang spesi#i .
<egion utara dan selatan membentu jalur hori8ontal sedang an region timur dan barat
membentu jalur $erti al. /an region tengah berada pada perpotongan jalur hori8ontal
dan $erti al. Tampilan ini adalah bersi#at de#ault untu obje Window, termasu obje
dari sub elas Window !aitu tipe -rame dan /ialog.

$onstruktor Border a!out /order4a?out() "embuat obje 5order;a!out baru tanpa


spasi !ang diapli asi an diantara omponen !ang berbeda. /order4a?out(int hgap, int
vgap) "embuat obje 5order;a!out baru dengan spasi unit hgap hori8ontal dan unit
vgap $erti al !ang diapli asi an diantara omponen !ang berbeda.

Tabel 1 * !" #onstruktor )order+ayout

%eperti pada -lo);a!out "anager, parameter hgap dan vgap disini juga menjelas an
jara antara omponen dengan ontainer. Untu menambah an omponen edalam region !ang
spesi#i , guna an metode menambah an dan mele)at an dua argumen !aitu & omponen !
ang ingin dimasu an e dalam region dan region mana !ang ingin dipa ai untu meleta
an omponen. Perlu diperhati an bah)a han!a satu omponen !ang dapat dimasu an dalam
satu region. "enambah an lebih dari satu omponen pada ontainer !ang bersang utan,
ma a omponen !ang tera hir ditambah an !ang a an ditampil an. 5eri ut ini adalah
da#tar dari elima region. '. 3. *. +. 2. 5order;a!out.N9<T= 5order;a!out.%9UT=
5order;a!out.EA%T 5order;a!out.(E%T 5order;a!out..ENTE< an bagaimana )order+ayout
be erja.

5eri ut ini adalah 7ontoh program !ang menunju import java.awt.*;

lass /order4a?outDemo e!tends Frame " publi stati void main(String args#$) "
/order4a?outDemo bld & new /order4a?outDemo(); bld.set4a?out(new /order4a?out('(,
'()); ))ma? remove bld.add(new /utton(27A=>32), /order4a?out.7A=>3); bld.add(new
/utton(2SA9>32), /order4a?out.SA9>3); bld.add(new /utton(2B5S>2), /order4a?
out.B5S>); bld.add(new /utton(2:BS>2), /order4a?out.:BS>); bld.add(new
/utton(2*B7>B=2), /order4a?out.*B7>B=); bld.setSize(0((, 0(();
bld.setVisible(true);

Pengenalan Pemrograman 3

7
J.E.N.I.

, : 5eri ut ini adalah hasil dari 7ontoh program tersebut. Gambar mengubah bentu
dari #rame.

edua menunju

an e#e

dari

(a%bar 1 * !" hasil contoh progra%

7.4.3 Grid a!out "ana#er


/engan (rid+ayout %anager, omponen juga diposisi an dari iri e anan dan dari atas e
ba)ah seperti pada Flow+ayout %anager (rid+ayout %anager membagi ontainer menjadi
baris dan olom. %emua region memili i u uran !ang sama. =al tersebut tida mempeduli
an u uran sebenarn!a dari omponen. 5eri ut ini adalah da#tar dari onstru tor untu
(rid+ayout 7lass. $onstruktor Grid a!out -rid4a?out() "embuat obje Grid;a!out baru
dengan satu baris dan satu olom sebagai de#ault -rid4a?out(int rows, int ols)

"embuat obje Grid;a!out baru dengan jumlah baris dan olom sesuai dengan einginan
-rid4a?out(int rows, int ols, int hgap, int vgap)

"embuat obje Grid;a!out baru dengan jumlah baris dan olom !ang ditentu an. Unit
spasi hgap hori8ontal dan $gap $erti al diapli asi an e dalam omponen.
Tabel 1 * *" #onstruktor (rid+ayout

.obalah program ini. import ja$a.a)t.BC 7lass Grid;a!out/emo e6tends -rame D publi7
stati7 $oid main(%tring argsEF) D Grid;a!out/emo gld G ne) Grid;a!out/emo()C
Pengenalan Pemrograman 3 8
J.E.N.I.

gld.set;a!out(ne) Grid;a!out(3, *, +, +))C gld.add(ne) 5utton(H9NEH))C gld.add(ne)


5utton(HT(9H))C gld.add(ne) 5utton(HT=<EEH))C gld.add(ne) 5utton(H-9U<H))C
gld.add(ne) 5utton(H-I1EH))C gld.set%i8e(3>>, 3>>)C gld.set1isible(true)C : : 5eri
ut ini adalah hasil dari program.

(a%bar 1 * *" hasil contoh progra%

7.4.4 %anel dan Tampilan kompleks


Untu membuat tampilan !ang lebih omple , Anda dapat menggabung an la!out manager !
ang berbeda dengan mengguna an panel. Ingatlah bah)a panel adalah ontainer dan
omponen pada saat !ang sama. Anda dapat memasu an omponen e dalam panel dan emudian
menambah an panel e dalam region !ang Anda ingin an di dalam ontainer.

Pengenalan Pemrograman 3

9
J.E.N.I.

Perhati an te ni !ang diguna an pada 7ontoh beri ut. import java.awt.*; lass
*omple!4a?out e!tends Frame " publi stati void main(String args#$) " *omple!4a?out
l & new *omple!4a?out(); .anel panel7orth & new .anel(); .anel panel*enter & new
.anel(); .anel panelSouth & new .anel(); )* 7orth .anel *) )).anels use Flow4a?out
b? de%ault panel7orth.add(new /utton(2A7B2)); panel7orth.add(new /utton(2>:A2));
panel7orth.add(new /utton(2>3=BB2)); )* *enter .anel *) panel*enter.set4a?out(new
-rid4a?out(C,C)); panel*enter.add(new >e!tField(2'st2)); panel*enter.add(new >e!
tField(20nd2)); panel*enter.add(new >e!tField(2<rd2)); panel*enter.add(new >e!
tField(2Cth2)); )* South .anel *) panelSouth.set4a?out(new /order4a?out());
panelSouth.add(new *he +bo!(2*hoose me;2), /order4a?out.*B7>B=); panelSouth.add(new
*he +bo!(26Dm here;2), /order4a?out.B5S>); panelSouth.add(new *he +bo!(2.i + me;2),
/order4a?out.:BS>); )* 5dding the .anels to the Frame ontainer *) ))Frames use
/order4a?out b? de%ault l.add(panel7orth, /order4a?out.7A=>3);
l.add(panel*enter, /order4a?out.*B7>B=); l.add(panelSouth, /order4a?out.SA9>3);
l.setSize(<((,<((); l.setVisible(true); , :

Pengenalan Pemrograman 3

10
J.E.N.I.

5eri ut ini adalah hasil dari program.

(a%bar 1 * -" .asil dari contoh progra%

7.* Ko

!on"n Swing

%eperti pada pa7 age A(T, pa7 age dari %)ing men!edia an ban!a elas untu membuat
apli asi GUI. Pa7 age tersebut dapat ditemu an di /ava& swing. Perbedaan utama
antara eduan!a adalah omponen %)ing ditulis men!eluruh mengguna an Ja$a mengingat !
ang bela angan tida . 0esimpulann!a, program GUI ditulis mengguna an ban!a elas
dari pa7 age %)ing !ang mempun!ai tampilan loo and #eel !ang sama mes i dijalan an
pada beda palt#orm. ;ebih dari itu, %)ing men!edia an omponen !ang lebih menari
seperti color chooser dan option pane Nama dari omponen GUI mili %)ing hampir sama
persis dengan omponen GUI mili A(T. Perbedaan jelas terdapat pada penamaan omponen.
Pada dasarn!a, nama omponen %)ing sama dengan nama omponen A(T tetapi dengan
tambahan huru# J pada pre#i6n!a. %ebagai 7ontoh, satu omponen dalam A(T adalah
button 7lass. %edang an pada %)ing, nama omponen tersebut menjadi Jbutton 7lass.
5eri ut adalah da#tar dari omponen %)ing.

Komponen Swing
J.omponent J5utton J.he7 5o6

Penjelasan
0elas indu untu semua omponen %)ing, tida termasu top4le$el ontainer Tombol IpushJ.
0orespondesi pada button 7lass dalam pa7 age A(T Item !ang dapat dipilih atau tida
oleh pengguna. 0orespondensi pada 7he7 bo6 7lass dalam pa7 age A(T

Pengenalan Pemrograman 3

11
J.E.N.I.

Komponen Swing
J-ile.hooser JTe6t-ield J-rame

Penjelasan
"engijin an pengguna untu memilih sebuah #ile. 0orespondensi pada #ile7hooser 7lass
dalam pa7 age A(T "engijin an untu mengedit te6t satu baris. 0orespondensi pada
te6t#ield 7lass dalam pa7 age A(T. Turunan dan orepondensi pada #rame 7lass dalam
pa7 age A(T tetapi eduan!a sedi it tida 7o7o dalam aitann!a dengan menambah an
omponen pada ontainer. Perlu mendapat an 7ontent pane !ang terbaru sebelum menambah
sebuah omponen. Turunan J7omponent. 0ontainer 7lass sederhana tetapi bu an
top4le$el. 0orespondensi pada panel 7lass dalam pa7 age A(T. Turunan dan
orepondensi e Applet 7lass dalam pa7 age A(T. Juga sedi it tida 7o7o dengan applet
7lass dalam aitann!a dengan menambah an omponen pada ontainer Turunan
J7omponent. /isedia an untu mempermudah menampil an pop4 up ota dialog. Turunan dan
orespondensi pada dialog 7lass dalam pa7 age A(T. 5iasan!a diguna an untu
mengin#ormasi an sesuatu epada pengguna atau prompt pengguna untu input. Turunan
J7omponent. "engijin an pengguna untu memilih )arna
Tabel 1 -" )eberapa ko%ponen Swing

JPanel JApplet

J9ptionPane J/ialog

J.olor.hooser

Untu da#tar !ang leng ap dari omponen %)ing, Anda dapat melihatn!a di do umentasi
API.

7.&.1 'ettin# (p Top) e*el Containers


%eperti disebut an diatas, top4le$el 7ontainers seperti Jfra%e dan Japplet dalam
%)ing sangat tida 7o7o dengan A(T. Ini adalah s!arat menambah an omponen e dalam
ontainer. Ji a Anda ingin menambah an langsung sebuah omponen edalam ontainer
sebagai ontainer A(T, pertama4tama Anda telah mendapat an 7ontent pane dari
ontainer. Untu mela u an hal tersebut, Anda a an mengguna an metode getContent,ane
dari ontainer.

7.&.2 Conto+ ,frame


import java!.swing.*; import java.awt.*; lass SwingDemo " EFrame %rame; E.anel
panel; E>e!tField te!tField; E/utton button; *ontainer ontent.ane; void laun
hFrame() "
Pengenalan Pemrograman 3 12
J.E.N.I.

)* initialization *) %rame & new EFrame(2@? First Swing 5ppli ation2); panel & new
E.anel(); te!tField & new E>e!tField(2De%ault te!t2); button & new E/utton(2*li +
me;2); ontent.ane & %rame.get*ontent.ane(); )* add omponents to panelF uses Flow4a?
out b? de%ault *) panel.add(te!tField); panel.add(button); )* add omponents to
ontent.aneF uses /order4a?out *) ontent.ane.add(panel, /order4a?out.*B7>B=);
%rame.pa +(); )) auses size o% %rame to be based on the omponents
%rame.setVisible(true); , publi stati void main(String args#$) " SwingDemo sd & new
SwingDemo(); sd.laun hFrame(); ,

Perlu diperhati an pada pa7 age /ava awt masih saja diimpor arena la!out manager !
ang diguna an terdapat pada pa7 age tersebut. Juga, memberi judul pada #rame dan
mengepa7 omponen di dalam #rame dapat juga dila u an untu #rame A(T.

Petunjuk penulisan program:


,erhatikan penulisan kode yang digunakan pada contoh ini ta%pak berlawanan dengan
contoh untuk AWT #o%ponen dideklarasikan sebagai fields, %etode launchFra%e
ditentukan, dinisialisasikan dan pena%bahan se%ua ko%ponen dilaksanakan di dala%
%etode launchFra%e #ita tidak lagi %eng0e&tend Fra%e class #euntungan penggunaan
gaya ini akan lebih berguna ketika sa%pai pada event handling 5eri ut adalah
eluaran dari program diatas.

(a%bar 1 - !" .asil contoh progra%

7.&.3 Conto+ ,-ption%ane


import java!.swing.*; lass EAption.aneDemo " EAption.ane option.ane; void laun
hFrame() " option.ane & new EAption.ane(); String name &
option.ane.show6nputDialog(23i, whatDs ?our nameG2);
option.ane.show@essageDialog(null, 27i e to meet ?ou, 2 H name H 2.2, 2-
reeting...2, option.ane..4567I@BSS5-B);

Pengenalan Pemrograman 3

13
J.E.N.I.

S?stem.e!it((); , publi stati void main(String args#$) " new EAption.aneDemo().laun


hFrame(); ,

;ihat, begitu mudahn!a memasu an input dari user. 5eri ut ini adalah hasil dari
7ontoh program diatas

(a%bar 1 - *" .asil contoh progra%

7.+ 'ati,an
7...1 Ti/)Ta/)Toe
5uatlah tampilan GUI untu program ti74ta74toe. Papann!a terdiri dari enam ota .
Ingatlah bah)a Anda a an menambah an ode ini pada tahap a hir untu mengatasi intera
si antar pengguna. Jadi, desainlah papan Anda dengan benar. Pasti anlah Anda
memilih omponen !ang pantas untu papan tersebut. eluar an semua sisi artisti Anda.
Anda dapat mengguna an A(T atau %)ing untu latihan ini.

(a%bar 1 1 1" papan Tic0Tac0Toe

Pengenalan Pemrograman 3

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 men elesaikan modul ini, Anda
akan dapat mengembangkan aplikasi GUI ang merespon interaksi user. Setelah men
elesaikan modul ini, Anda diharapkan mampu! ". #enerangkan komponen$komponen
delegation event model %. #engerti bagaimana delegation event model bekerja &.
#en'iptakan aplikasi GUI ang berinteraksi dengan user (. #endiskusikan man)aat dari
'lass$'lass adapter *. #endiskusikan keuntungan$keuntungan dari menggunakan inner
dan anonymous class

8.2 Delegation Event Model


+elegasi event model menguraikan bagaimana program Anda dapat merespon interaksi
dari user. Untuk memahami model, mari kita pelajari pertama$tama dengan tiga
komponen utaman a. ". Event Sour'e ,he event sour'e menga'u pada komponen GUI ang
men$generate event. Sebagai 'ontoh, jika user menekan tombol, event sour'e dalam
hal ini adalah tombol. %. Event -istener./andler ,he event listener menerima berita
dari event$event dan proses$proses interaksi user. 0etika tombol ditekan, listener
akan mengendalikan dengan menampilkan sebuah in)ormasi ang berguna untuk user. &.
Event 1bje't 0etika sebuah event terjadi 2misal, ketika user berinteraksi dengan
komponen GUI3, sebuah objek event di'iptakan. 1bjek berisi semua in)ormasi ang
perlu tentang event ang telah terjadi. In)ormasi meliputi tipe dari event ang telah
terjadi, seperti ketika mouse telah di$klik. Ada beberapa 'lass event untuk
kategori ang berbeda dari user action. Sebuah event object mempun ai tipe data
tentang salah satu dari 'lass ini.

Pengenalan Pemrograman %

"
J.E.N.I.

+i ba4ah ini adalah delegation event model.

Gambar 8.1: Delegation Event Model

Pada a4aln a, sebuah listener seharusn a diregistrasikan dengan sebuah sour'e


sehingga dapat menerima in)ormasi tentang event$event ang terjadi pada sour'e
tersebut. /an a listeners ang sudah teregistrasi ang dapat menerima pemberitahuan
event$event. 0etika telah teregistrasi, sebuah listener han a tinggal menunggu
sampai event terjadi. 0etika sesuatu terjadi dengan event sour'e, sebuah event
obje't akan menguraikan event ang di'iptakan. Event kemudian ditembak oleh sour'e
pada listeners ang teregistrasi. Saat listener menerima sebuah event obje't
2pemberitahuan3 dari sour'e, dia akan bekerja. #enerjemahkan pemberitahuan dan
memproses event ang terjadi.

Pengenalan Pemrograman %

%
J.E.N.I.

8.2.1 Registrasi Listeners


Event sour'e menda)tarkan sebuah listener melalui method add<Type> istener. void
add<Type>Listener(<Type>Listener listenerObj) <Type> tergantung pada tipe dari
event sour'e. +apat berupa !ey, Mouse, "ocus, #omponent, $ction dan lainn a.
5eberapa listeners dapat diregistrasi dengan satu event sour'e untuk menerima
pemberitahuan event. -istener ang telah teregistrasi dapat juga tidak
diregistrasikan lagi menggunakan remove<Type> istener methods. void
remove<Type>Listener(<Type>Listener listenerObj)

8.3 Class-Class Event


Sebuah event obje't mempun ai sebuah 'lass event sebagai tipe data a'uann a. Akar
dari hirarki 'lass event adalah 'lass Event%bject, ang dapat ditemukan pada paket
java.util. Immediate sub'lass dari 'lass Event%bject adalah 'lass $&TEvent. 6lass
$&TEvent dide)inisikan pada paket java.a4t. Itu merupakan akar dari semua A7,$
based events. 5erikut ini beberapa dari 'lass$'lass A7, event.

Class Event

Deskripsi komponen

6omponentEvent E8tends $&TEvent. +ijalankan ketika sebuah dipindahkan, di$resi'e,


dibuat visible atau (idden. InputEvent A'tionEvent ItemEvent 0e Event #ouseEvent

E8tends #omponentEvent. Abstrak root 'lass event untuk semua komponen$level input
'lass$'lass event. E8tends $&TEvent. +ijalankan ketika sebuah tombol ditekan,
melakukan double$klik da)tar item, atau memilih sebuah menu. E8tends $&TEvent.
+ijalankan ketika sebuah item dipilih atau di$ deselect oleh user, seperti sebuah
list atau 'he'kbo8. E8tends )nputEvent. +ijalankan ketika sebuah *ey ditekan,
dilepas atau diketikkan. E8tends )nputEvent. +ijalankan ketika sebuah tombol mouse
ditekan, dilepas, atau di$klik 2tekan dan lepas3, atau ketika sebuah kursor mouse
masuk atau keluar dari bagian visible dari komponen. E8tends $&TEvent. +ijalankan
ketika nilai dari te8t )ield atau te8t area dirubah. E8tends #omponentEvent.
+ijalankan sebuah objek &indo+ dibuka, ditutup, diakti)kan, nonakti)kan, iconi,ied,
deiconi,ied, atau ketika ,ocus ditrans)er kedalam atau keluar 4indo4.
Tabel 1.-: #lass.#lass Event

,e8tEvent 7indo4Event

6atatan, bah4a semua sub'lass$sub'lass $&TEvent mengikuti konvensi nama ini!


<Type>Event

Pengenalan Pemrograman %

&
J.E.N.I.

8.4 Event Listeners


Event listeners adalah 'lass ang mengimplementasikan inter)a'es <Type> istener.
,abel di ba4ah menunjukkan beberapa listener inter)a'es ang biasan a digunakan.
Event Listeners A'tion-istener #ouse-istener #ouse#otion-istener Deskripsi 5ereaksi
atas perubahan mouse atau atau ke board. 5ereaksi atas pergerakan mouse. Inter)a'e
#ouse#otion-istener mendukung #ouse-istener. #en ediakan method$method ang akan
memantau pergerakan mouse,seperti drag dan pemindahan mouse. 5ereaksi atas
perubahan 4indo4.
Tabel 1./: Event isteners

7indo4-istener

8.4.1 Method ActionListener


Inter)a'e A'tion-istener han a terdiri dari satu method. ActionListener Method
public void actionPerformed(ActionEvent e) #engendalikan $ctionEvent e ang terjadi.
Tabel 1./.1: Met(od $ction istener

8.4.2 Method MouseListener


+i ba4ah ini adalah method$method Mouse istener penerapan 'lass. MouseListener
Methods public void mouseClic ed(!ouseEvent e) +ipanggil pada saat tombol mouse di
'li'k 2seperti tekan dan lepas3. public void mouseEntered(!ouseEvent e) +ipanggil
pada saat kursor mouse memasuki area komponen. public void mouseE"ited(!ouseEvent
e) +ipanggil pada saat kursor mouse meninggalkan area komponen. public void
mousePressed(!ouseEvent e) +ipanggil pada saat tombol mouse ditekan di atas
komponen public void mouse#eleased(!ouseEvent e) +ipanggil pada saat tombol mouse
dilepas di atas komponen
Tabel 1./.-: Met(od.Met(od Mouse istener

ang seharusn a digunakan dalam

Pengenalan Pemrograman %

(
J.E.N.I.

8.4.3 Method Method MouseMotionListener


MouseMotion istener mempun ai dua method untuk diimplementasikan. MouseListener
Methods public void mouse$ra%%ed(!ouseEvent e) +igunakan untuk memantau pergerakan
mouse ang melintasi objek pada saat tombol mouse ditekan. ,indakan ini persis sama
dengan tindakan pada saat memindahkan sebuah 4indo4. public void mouse!oved(!
ouseEvent e) +igunakan untuk memantau pergerakan mouse pada saat mouse melintasi
area suatu objek. Pada saat ini tidak ada mouse ang ditekan, han a memindahkan
pointer mouse melalui objek.
Tabel 1././: T(e MouseMotion istener met(ods

8.4.4 Method Method !indo"Listener


+i ba4ah ini method$method dari inter)a'e &indo+ istener. !indo"Listener Methods
public void &indo&Opened('indo&Event e) +ipanggil pada saat objek 4indo4 dibuka
2pertama kali 4indo4 dibuat tampil3. public void &indo&Closin%('indo&Event e)
+ipanggil pada saat user men'oba untuk menutup objek &indo+ dari menu sistem objek.
public void &indo&Closed('indo&Event e) +ipanggil pada saat objek &indo+ ditutup
setelah memanggil penempatan 2misal, release dari resour'e$resour'e ang digunakan
oleh sour'e3 pada objek. public void &indo&Activated('indo&Event e) +ilibatkan
ketika objek &indo+ adalah 4indo4 ang akti) 24indo4 masih dipakai3. public void
&indo&$eactivated('indo&Event e) +ilibatkan ketika objek &indo+ tidak lagi
merupakan 4indo4 ang akti). public void &indo&(conified('indo&Event e) +ipanggil
ketika objek &indo+ di$minimi9e. public void &indo&$eiconified('indo&Event e)
+ipanggil ketika objek &indo+ kembali setelah di$minimi9e ke keadaan normal.
Tabel 1./.0: Met(od.Met(od &indo+ istener

Pengenalan Pemrograman %

*
J.E.N.I.

8.4.# $etun%uk untuk Menciptakan Aplikasi &andling '() Events


5erikut ini langkah$langkah ang Anda butuhkan untuk mengingat ketika ingin membuat
aplikasi GUI dengan event handling. ". 5uatlah sebuah 'lass ang menguraikan dan
menampilkan tampilan dari aplikasi GUI Anda. %. 5uatlah sebuah 'lass ang menerapkan
inter)a'e listener ang sesuai. 6lass ini boleh menga'u pada 'lass ang sama seperti
pada langkah a4al. &. +alam menerapkan 'lass, gunakan semua methods dengan
inter)a'e listener ang sesuai. Uraikan masing$masing method bagaimana Anda ingin
mengendalikan event$ event. Anda dapat memberikan implementasi kosong untuk method
ang tidak ingin Anda gunakan. (. +a)tarkan objek listener, instansiasi dari 'lass
listener pada langkah %, dengan source component menggunakan method add<Type>
istener.

8.4.* Contoh Mouse Events


import java)a&t)*+ import java)a&t)event)*+ public class !ouseEvents$emo e"tends
,rame implements !ouseListener- !ouse!otionListener . Te"t,ield tf+ public !
ouseEvents$emo(/trin% title). super(title)+ tf 0 ne& Te"t,ield(12)+ add!
ouseListener(t3is)+ 4 public void launc3,rame() . 5* !enamba3 omponen e frame *5
add(tf- 6orderLayout)/O7T8)+ set/i9e(:22-:22)+ set;isible(true)+ 4 public void
mouseClic ed(!ouseEvent me) . /trin% ms% 0 <!ouse clic ed)<+ tf)setTe"t(ms%)+ 4
public void mouseEntered(!ouseEvent me) . /trin% ms% 0 <!ouse entered component)<+
tf)setTe"t(ms%)+ 4 public void mouseE"ited(!ouseEvent me) . /trin% ms% 0 <!ouse
e"ited component)<+ tf)setTe"t(ms%)+ 4 public void mousePressed(!ouseEvent me) .
/trin% ms% 0 <!ouse pressed)<+ tf)setTe"t(ms%)+ 4 public void mouse#eleased(!
ouseEvent me) . /trin% ms% 0 <!ouse released)<+ tf)setTe"t(ms%)+
Pengenalan Pemrograman % :
J.E.N.I.

4 public void mouse$ra%%ed(!ouseEvent me) . /trin% ms% 0 <!ouse dra%%ed at < = me)
%et>() = <-< = me)%et?()+ tf)setTe"t(ms%)+ 4 public void mouse!oved(!ouseEvent
me) . /trin% ms% 0 <!ouse moved at < = me)%et>() = <-< = me)%et?()+ tf)setTe"t(ms%)
+ 4 public static void main(/trin% ar%s@A) . !ouseEvents$emo med 0 ne& !
ouseEvents$emo(<!ouse Events $emo<)+ med)launc3,rame()+ 4 4

8.4.+ Contoh Menutup !indo"


import java)a&t)*+ import java)a&t)event)*+ class Close,rame e"tends ,rame
implements 'indo&Listener . Label label+ Close,rame(/trin% title) . super(title)+
label 0 ne& Label(<Close t3e frame)<)+ t3is)add'indo&Listener(t3is)+ 4 void
launc3,rame() . set/i9e(:22-:22)+ set;isible(true)+ 4 public void
&indo&Activated('indo&Event e) . 4 public void &indo&Closed('indo&Event e) . 4
public void &indo&Closin%('indo&Event e) . set;isible(false)+ /ystem)e"it(2)+ 4
public void &indo&$eactivated('indo&Event e) . 4 public void
&indo&$eiconified('indo&Event e) . 4 public void &indo&(conified('indo&Event e) . 4
public void &indo&Opened('indo&Event e) . 4

Pengenalan Pemrograman %

;
J.E.N.I.

public static void main(/trin% ar%s@A) . Close,rame cf 0 ne& Close,rame(<Close


'indo& E"ample<)+ cf)launc3,rame()+ 4

8.5

da!ter Classes

#enerapkan semua method dari inter)a'e ang semuan a akan membutuhkan ban ak
pekerjaan. +i satu sisi, Anda terkadang lebih sering tertarik menerapkan han a
beberapa method dari inter)a'e saja. Untungn a, Java men ediakan untuk kita 'lass$
'lass adapter ang menerapkan semua method dari masing$masing listener inter)a'e
dengan lebih dari satu method. Implementasi dari method$method semuan a adalah
kosong.

8.#.1 Close !indo" E,a-ple


import java)a&t)*+ import java)a&t)event)*+ class Close,rame e"tends ,rame. Label
label+ C,Listener & 0 ne& C,Listener(t3is)+ Close,rame(/trin% title) . super(title)
+ label 0 ne& Label(<Close t3e frame)<)+ t3is)add'indo&Listener(&)+ 4 void
launc3,rame() . set/i9e(:22-:22)+ set;isible(true)+ 4 public static void main(/trin
% ar%s@A) . Close,rame cf 0 ne& Close,rame(<Close 'indo& E"ample<)+
cf)launc3,rame()+ 4 4 class C,Listener e"tends 'indo&Adapter. Close,rame ref+
C,Listener( Close,rame ref ). t3is)ref 0 ref+ 4 public void &indo&Closin%
('indo&Event e) . ref)dispose()+ /ystem)e"it(B)+ 4 4

Pengenalan Pemrograman %

<
J.E.N.I.

8." Inner Class dan

n#n$%#us Inner Class

5agian ini memberi Anda tinjauan ulang atas konsep ang sudah Anda pelajari di
kursus pemrograman pertama. )nner class dan anonymous inner class sangatlah
berman)aat untuk GUI event handling.

8.*.1 )nner Class


Inner 'lass, seperti naman a, adalah sebuah 'lass ang dideklarasikan di dalam 'lass
lain. 0egunaan inner 'lasses akan dapat membantu Anda men ederhanakan program,
terutama dalam event handling seperti ang ditunjukkan pada 'ontoh.

8.*.2 Contoh Menutup !indo"


import java)a&t)*+ import java)a&t)event)*+ class Close,rame e"tends ,rame. Label
label+ Close,rame(/trin% title) . super(title)+ label 0 ne& Label(<Close t3e
frame)<)+ t3is)add'indo&Listener(ne& C,Listener())+ 4 void launc3,rame() .
set/i9e(:22-:22)+ set;isible(true)+ 4 class C,Listener e"tends 'indo&Adapter .
public void &indo&Closin%('indo&Event e) . dispose()+ /ystem)e"it(B)+ 4 4 public
static void main(/trin% ar%s@A) . Close,rame cf 0 ne& Close,rame(<Close 'indo&
E"ample<)+ cf)launc3,rame()+ 4 4

Pengenalan Pemrograman %

=
J.E.N.I.

8.*.3 Anon.-ous )nner Class


$nonymous inner class adalah inner class ang tanpa nama. 0egunaan dari anonymous
inner class akan men ederhanakan kode$kode Anda lebih lanjut. +i ba4ah ini
merupakan modi)ikasi dari 'ontoh bagian sebelumn a.

8.*.4 Contoh Menutup !indo"


import java)a&t)*+ import java)a&t)event)*+ class Close,rame e"tends ,rame. Label
label+ Close,rame(/trin% title) . super(title)+ label 0 ne& Label(<Close t3e
frame)<)+ t3is)add'indo&Listener(ne& 'indo&Adapter() . public void &indo&Closin%
('indo&Event e). dispose()+ /ystem)e"it(B)+ 4 4)+ 4 void launc3,rame() .
set/i9e(:22-:22)+ set;isible(true)+ 4 public static void main(/trin% ar%s@A) .
Close,rame cf 0 ne& Close,rame(<Close 'indo& E"ample<)+ cf)launc3,rame()+ 4

Pengenalan Pemrograman %

">
J.E.N.I.

8.& Lati'an
8.+.1 /ic /ac /oe
E8tend program papan ,i'$,a'$,oe ang telah Anda kembangkan sebelumn a dan tambahkan
event handlers ke kode tersebut untuk membuat program ber)ungsi penuh. Permainan
,i'$,a'$,oe dimainkan dengan dua pemain. Pemain mengambil giliran mengubah. Setiap
giliran, pemain dapat memilih kotak pada papan. 0etika kotak dipilih, kotak
ditandai oleh simbol pemain 21 dan ? biasan a digunakan sebagai simbol3. Pemain ang
sukses menaklukkan & kotak membentuk garis horisontal, vertikal, atau diagonal,
memenangkan permainan. Permainan akan berakhir ketika pemain menang atau ketika
semua kotak telah terisi.

Gambar 8.- : 1rogram Tic.Tac.Toe

Pengenalan Pemrograman %

""
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. agaimanapun !uga, di dunia nyata,
pasti dibutuhkan sesuatu yang dapat mengatur proses yang ter!adi dan ber!alan
bersama-sama."leh karena itu, thread hadir untuk men!adi solusi dalam mengatasi
permasalahan tersebut. Setelah menyelesaikan pela!aran ini, Anda diharapkan dapat#
$. %ende&iniskan threads '. %engerti perbedaan state dalam threads (. %engerti
konsep prioritas dalam threads ). %engetahui bagaimana menggunakan method didalam
*lass +hread ,. %embuat sendiri sebuah thread -. %enggunakan sinkronisasi pada
thread yang beker!a bersama-sama dan saling bergantung satu dengan yang lainya ..
%emperbolehkan thread untuk berkomunikasi dengan thread lain yang sedang ber!
alan /. %engerti dan menggunakan kemampuan *on*uren*y

9.2 Definisi dan dasar-dasar thread


9.2.1 Definisi Thread
Sebuah thread merupakan sebuah pengontrol aliran program. 0ntuk lebih mudahnya,
bayangkanlah thread sebagai sebuah proses yang akan dieksekusi didalam sebuah
program tertentu. Penggunaan sistem operasi modern saat ini telah mendukung
kemampuan untuk men!alankan beberapa program. %isalnya, pada saat Anda mengetik
sebuah dokumen di komputer Anda dengan menggunakan te1t editor, dalam waktu yang
bersamaan Anda !uga dapat mendengarkan musik, dan sur&ing lewat internet di P2
Anda. Sistem operasi yang telah terinstal dalam *omputer Anda itulah yang
memperbolehkan Anda untuk men!alankan multitaskting. Seperti itu !uga sebuah
program 3ibaratkan di P2 Anda4, ia !uga dapat mengeksekusi beberapa proses se*ara
bersama-sama3ibaratkan beberapa aplikasi berbeda yang beker!a pada P2 Anda4. Sebuah
*ontoh aplikasi adalah 5otJa6a browser yang memperbolehkan Anda untuk browsing
terhadap suatu page, bersamaan dengan mendownload ob!e*t yang lain, misalnya
gambar, memainkan animasi, dan !uga &ile audio pada saat yang bersamaan.

Pengenalan Pemrograman '

$
J.E.N.I.

Gambar 1.1: Thread

9.2.2 State dari Thread


Sebuah thread memungkinkan untuk memiliki beberapa state# $. 7unning Sebuah thread
yang pada saat ini sedang dieksekusi dan didalam *ontrol dari 2P0. '. 7eady to run
+hread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk
melakukannya. (. 7esumed Setelah sebelumnya di blo*k atau diberhentikan sementara,
state ini kemudian siap untuk di!alankan. ). Suspended Sebuah thread yang berhenti
sementara, dan kemudian memperbolehkan 2P0 untuk men!alankan thread lain beker!
a. ,. lo*ked Sebuah thread yang di-blo*k merupakan sebuah thread yang tidak mampu
ber!alan, karena ia akan menunggu sebuah resour*e tersedia atau sebuah e6ent ter!
adi.

9.2.3 Prioritas
0ntuk menentukan thread mana yang akan menerima *ontrol dari 2P0 dan akan
dieksekusi pertama kali, setiap thread akan diberikan sebuah prioritas. Sebuah
prioritas adalah sebuah nilai integer dari angka $ sampai dengan $8, dimana semakin
tinggi prioritas dari sebuah thread, berarti semakin besar kesempatan dari thread
tersebut untuk dieksekusi terlebih dahulu. Sebagai *ontoh, asumsikan bahwa ada dua
buah thread yang ber!alan bersama-sama. +hread pertama akan diberikan prioritas
nomor ,, sedangkan thread yang kedua memiliki prioritas $8. Anggaplah bahwa thread
pertama telah ber!alan pada saat thread kedua di!alankan. +hread kedua akan
menerima *ontrol dari 2P0 dan akan dieksekusi pada saat thread kedua tersebut
memiliki prioritas yang lebih tinggi dibandingkan thread yang pada saat itu tengah
ber!alan. Salah satu *ontoh dari skenario ini adalah *onte1t swit*h.

Pengenalan Pemrograman '

'
J.E.N.I.

Sebuah *onte1t swit*h ter!adi apabila sebagian dari thread telah dikontrol oleh 2P0
dari thread yang lain. Ada beberapa skenario mengenai bagaimana *ara ker!a dari
*onte1t swit*h. Salah satu skenario adalah sebuah thread yang sedang ber!alan
memberikan kesempatan kepada 2P0 untuk mengontrol thread lain sehingga ia dapat
ber!alan. 9alam kasus ini, prioritas tertinggi dari thread adalah thread yang siap
untuk menerima kontrol dari 2P0. 2ara yang lain dari *onte1t swit*h adalah pada
saat sebuah thread yang sedang ber!alan diambil alih oleh thread yang memiliki
prioritas tertinggi seperti yang telah di*ontohkan sebelumnya. 5al ini !uga mungkin
dilakukan apabila lebih dari satu 2P0 tersedia, sehingga lebih dari satu prioritas
thread yang siap untuk di!alankan. 0ntuk menentukan diantara dua thread yang
memiliki prioritas sama untuk menerima kontrol dari 2P0, sangat bergantung kepada
sistem operasi yang digunakan. :indows ;,/;//N+ menggunakan time-sli*ing dan round-
robin untuk menangani kasus ini. Setiap thread dengan prioritas yang sama akan
diberikan sebuah !angka waktu tertentu untuk dieksekusi sebelum 2P0 mengontrol
thread lain yang memiliki prioritas yang sama. Sedangkan Solaris, ia akan
membiarkan sebuah thread untuk dieksekusi sampai ia menyelesaikan tugasnya atau
sampai ia se*ara suka rela membiarkan 2P0 untuk mengontrol thread yang lain.

9.3 Class Thread


9.3.1 Constructor
+hread memiliki delapan *onstru*tor. %arilah kita lihat bersama beberapa
*onstru*tor tersebut. Thread Constructors Thread() %embuat sebuah ob!e*t Thread
yang baru. Thread(String name) %embuat sebuah ob!e*t thread dengan memberikan
penamaan yang spesi&ik. Thread(Runnable target) %embuat sebuah ob!e*t Thread yang
baru berdasar pada ob!e*t Runnable. +arget menyatakan sebuah ob!e*t dimana method
run dipanggil. Thread(Runnable target, String name) %embuat sebuah ob!e*t Thread
yang baru dengan nama yang spesi&ik dan berdasarkan pada ob!e*t Runnable.
Tabel 1.2.1: Constructor dari Thread

Pengenalan Pemrograman '

(
J.E.N.I.

9.3.2 Constants
2lass Thread !uga menyediakan beberapa *onstants sebagai nilai prioritas. +abel
berikut ini adalah rangkuman dari *lass Thread. Thread Constants public final
static int MAX_PRIORIT Nilai prioritas maksimum, $8 public final static int MI!
_PRIORIT Nilai prioritas minimum, $. public final static int !ORM_PRIORIT Nilai
de&ault prioritas, ,.
Tabel 1.2.2:Konstanta dalam Thread

9.3.3 Methods
%ethod- method inilah yang disediakan dalam *lass Thread. Thread Methods public
static Thread currentThread() %engembalikan sebuah re&eren*e kepada thread yang
sedang ber!alan. public final String get!ame() %engembalikan nama dari thread.
public final "#id set!ame(String name) %engulang pemberian nama thread sesuai
dengan argument name. 5al ini dapat menyebabkan SecurityException. public final int
getPri#rit$() %engembalikan nilai prioritas yang telah diberikan kepada thread
tersebut. public final b##lean isAli"e() %enun!ukkan bahwa thread tersebut sedang
ber!alan atau tidak. public final "#id %#in(&l#ng millis, &int nan#s'') Sebuah
o6erloading method. Sebuah thread yang sedang ber!alan, harus menunggu sampai
thread tersebut selesai 3!ika tidak ada parameter-parameter spesi&ik4, atau sampai
waktu yang telah ditentukan habis. public static "#id sleep(l#ng millis) %enunda
thread dalam InterruptedException. public "#id run() Eksekusi thread dimulai dari
method ini. !angka waktu milis. 5al ini dapat menyebabkan

Pengenalan Pemrograman '

)
J.E.N.I.

Thread Methods public "#id start() %enyebabkan eksekusi dari thread berlangsung
dengan *ara memanggil method run.
Tabel 1.2. : !ethod"method dari Thread

9.3.4 Sebuah contoh thread


2ontoh dari thread pertama Anda adalah sebuah *ounter yang sederhana. imp#rt
%a"a()s*ing)+, imp#rt %a"a)a*t)+, class -#unt.#*n/0I e(tends 12rame 3 14abel label,
-#unt.#*n/0I(String title) 3 super(title), label 5 ne* 14abel(6Start c#unt76),
set.efault-l#seOperati#n(12rame)8XIT_O!_-4OS8), get-#ntentPane())add(ne* Panel(),
9#rder4a$#ut):8ST), get-#ntentPane())add(label), setSi;e(<==,<==),
set>isible(true), ? "#id start-#unt() 3 tr$ 3 f#r (int i 5 @=, i A =, iBB) 3
Thread)sleep(@===), label)setTe(t(i C 66), ? Thread)sleep(@===), label)setTe(t(6-
#unt d#*n c#mplete)6), Thread)sleep(@===), ? catch (Interrupted8(cepti#n ie) 3 ?
label)setTe(t(Thread)currentThread())t#String()), ? public static "#id main(String
args&') 3 -#unt.#*n/0I cdg 5 ne* -#unt.#*n/0I(6-#unt d#*n /0I6), cdg)start-
#unt(), ? ?

9.4 Membuat Threads


Sebuah thread dapat di*iptakan dengan *ara menurunkan 3e1tend4 *lass Thread atau
dengan mengimplementasikan sebuah inter&a*e Runnable.

Pengenalan Pemrograman '

,
J.E.N.I.

9.4.1 Menurunkan (extend) c ass Thread


2ontoh berikut ini adalah user akan mende&inisikan sebuah *lass +hread yang akan
menuliskan nama dari sebuah ob!e*t thread sebanyak $88 kali. class Print!ameThread
e(tends Thread 3 Print!ameThread(String name) 3 super(name), DD men%alanEan thread
dengan satu Eali instantiate start(), ? public "#id run() 3 String name 5 get!
ame(), f#r (int i 5 =, i F @==, iCC) 3 S$stem)#ut)print(name), ? ? ? class
TestThread 3 public static "#id Print!ameThread Print!ameThread Print!ameThread
Print!ameThread ? ? main(String args&') 3 pnt@ 5 ne* Print!ameThread(6A6), pntG 5
ne* Print!ameThread(696), pnt< 5 ne* Print!ameThread(6-6), pntH 5 ne* Print!
ameThread(6.6),

Perhatikan bahwa 6ariable re&eren*e pnt$, pnt', pnt(, dan pnt) hanya digunakan satu
kali. 0ntuk aplikasi ini, 6ariabel yang menun!uk pada tiap thread pada dasarnya
tidak dibutuhkan. Anda dapat mengganti body dari main tersebut dengan pernyataan
berikut ini# ne* ne* ne* ne* Print!ameThread(6A6), Print!ameThread(696), Print!
ameThread(6-6), Print!ameThread(6.6), erikut ini

Program akan memberikan keluaran yang berbeda pada setiap eksekusi. adalah *ontoh
dari keluarannya.

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9-.A9-.A9-.A
9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.
A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9.A9-.A9-.A9-.A9-.A9-.
A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.A9-.9.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-
.9-.9-.9-.9-.9-.9-.9.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9-.9.
9-.9-.9-.9-.9-.9-.9-.

9.4.2 Men!i"# e"entasikan interface $unnab e


2ara lain untuk membuat sendiri sebuah thread adalah dengan mengimplementasikan
inter&a*e Runnable. 5anya satu method yang dibutuhkan oleh inter&a*e Runnable yaitu
method run. ayangkanlah bahwa method run adalah method utama dari thread yang Anda
*iptakan. 2ontoh dibawah ini hampir sama dengan *ontoh terakhir yang telah Anda
pela!ari, tapi
Pengenalan Pemrograman ' -
J.E.N.I.

pada *ontoh ini Anda akan mengimplement inter&a*e Runnable. class Print!ameThread
implements Runnable 3 Thread thread, Print!ameThread(String name) 3 thread 5 ne*
Thread(this, name), thread)start(), ? public "#id run() 3 String name 5 thread)get!
ame(), f#r (int i 5 =, i F @==, iCC) 3 S$stem)#ut)print(name), ? ? ? class
TestThread 3 public static "#id main(String args&') 3 ne* Print!ameThread(6A6), ne*
Print!ameThread(696), ne* Print!ameThread(6-6), ne* Print!ameThread(6.6), ? ?

9.4.3 %xtend &s '"# e"ent


9ari dua *ara untuk men*iptakan thread seperti diatas, memilih salah satu dari
kedua *ara tersebut bukanlah sebuah permasalahan. Implement sebuah inter&a*e
Runnable menyebabkan lebih banyak peker!aan yang harus dilakukan karena kita harus
mendeklarasikan sebuah ob!e*t Thread dan memanggil method Thread dari ob!e*t ini.
Sedangkan menurunkan 3e1tend4 sebuah *lass +hread, bagaimanapun menyebabkan *lass
Anda tidak dapat men!adi turunan dari *lass yang lainnya karena Ja6a tidak
memperbolehkan adanya multiple inheritan*e. Sebuah pilihan antara mudah tidaknya
untuk diimplementasikan 3implement4 dan kemungkinan untuk membuat turunan 3e1tend4
adalah sesuatu yang harus Anda tentukan sendiri. Perhatikan mana yang lebih penting
bagi Anda karena keputusan ada ditangan Anda.

Pengenalan Pemrograman '

.
J.E.N.I.

9.4.4 Sebuah contoh #en!!unaan "ethod (oin


Sekarang, pada saat Anda telah mempela!ari bagaimana membuat sebuah thread, marilah
kita lihat bagaimana method #oin beker!a. 2ontoh dibawah ini adalah salah satu
*ontoh penggunaan method !oin tanpa argument. Seperti yang dapat Anda lihat, bahwa
method tersebut 3yang dipanggil tanpa argumen4 akan menyebabkan thread yang sedang
beker!a saat ini menungggu sampai thread yang memanggil method ini selesai
dieksekusi. class Print!ameThread implements Runnable 3 Thread thread, Print!
ameThread(String name) 3 thread 5 ne* Thread(this, name), thread)start(), ? public
"#id run() 3 String name 5 thread)get!ame(), f#r (int i 5 =, i F @==, iCC) 3
S$stem)#ut)print(name), ? ? ? class TestThread 3 public static "#id main(String
args&') 3 Print!ameThread pnt@ 5 ne* Print!ameThread(6A6), Print!ameThread pntG 5
ne* Print!ameThread(696), Print!ameThread pnt< 5 ne* Print!ameThread(6-6), Print!
ameThread pntH 5 ne* Print!ameThread(6.6), S$stem)#ut)println(6Running
threads)))6), tr$ 3 pnt@)thread)%#in(), pntG)thread)%#in(), pnt<)thread)%#in(),
pntH)thread)%#in(), ? catch (Interrupted8(cepti#n ie) 3 ?
S$stem)#ut)println(6Threads Eilled)6), DDdicetaE teraEhir ? ? 2obalah untuk men!
alan program diatas. Apa yang Anda dapat< %elalui pemanggilan method !oin, kita
memastikan bahwa pernyataan terakhir akan dieksekusi pada saatsaat terakhir.
Sekarang, berilah *omment dilua blok try-*at*h dimana !oin dipanggil. Apakah ada
perbedaan pada keluarannya<

Pengenalan Pemrograman '

/
J.E.N.I.

9.5 Sinkr nisasi


Sampai se!auh ini, Anda telah melihat *ontoh-*ontoh dari thread yang ber!alan
bersamasama tetapi tidak bergantung satu dengan yang lainnya. +hread tersebut
adalah thread yang ber!alan sendiri tanpa memperhatikan status dan akti&itas dari
thread lain yang sedang ber!alan. Pada *ontoh tersebut, setiap thread tidak
membutuhkan resour*e atau method dari luar sehingga ia tidak membutuhkan komunikasi
dengan thread lain. 9idalam situasi-situasi tertentu, bagaimanapun sebuah thread
yang ber!alan bersamasama kadang-kadang membutuhkan resour*e atau method dari luar.
"leh karena itu, mereka butuh untuk berkomunikasi satu dengan yan lain sehingga
dapat mengetahui status dan akti&itas mereka. 2ontohnya adalah pada permasalahan
produsen-konsumen. =asus ini membutuhkan dua ob!e*t utama, yaitu produsen dan
konsumen. =ewa!iban yang dimiliki oleh produsen adalah untuk membangkitkan nilai
atau stream data yang konsumen inginkan.

9.).1 Sebuah contoh *an! tidak disinkronisasi


%arilah kita perhatikan sebuah kode sederhana yang men*etak sebuah string dengan
urutan tertentu. Inilah programnya. class T*#Strings 3 static "#id print(String
str@, String strG) 3 S$stem)#ut)print(str@), tr$ 3 Thread)sleep(I==), ? catch
(Interrupted8(cepti#n ie) 3 ? S$stem)#ut)println(strG), ? ? class
PrintStringsThread implements Runnable 3 Thread thread, String str@, strG,
PrintStringsThread(String str@, String strG) 3 this)str@ 5 str@, this)strG 5 strG,
thread 5 ne* Thread(this), thread)start(), ? public "#id run() 3
T*#Strings)print(str@, strG), ? ? class TestThread 3 public static "#id main(String
args&') 3 ne* PrintStringsThread(6Jell# 6, 6there)6), ne* PrintStringsThread(6J#*
are 6, 6$#uK6), ne* PrintStringsThread(6ThanE $#u 6, 6"er$ much76), ? ?

Pengenalan Pemrograman '

;
J.E.N.I.

Program ini diharapkan dapat men*etak dua argument ob!e*t Runnable se*ara
berurutan. Permasalahannya adalah, pendeklarasian method sleep akan menyebabkan
thread yang lain akan dieksekusi walaupun thread yang pertama belum selesai di!
alankan pada saat eksekusi method print dari *lass T$oStrin%s. erikut ini adalah
*ontoh dari keluarannya. Jell# J#* are ThanE $#u there) $#uK "er$ much7 Pada saat
ber!alan, ketiga thread telah men*etak argument string pertama mereka sebelum
argument kedua di*etak. Sehingga hasilnya adalah sebuah keluaran yang tidak !elas.
Sebenarnya, pada *ontoh diatas, tidak menun!ukkan permasalahan yang serius. Akan
tetapi pada aplikasi yang lain hal ini dapat menimbulkan e1*eption atau
permasalahanpermasalahan tertentu.

9.).2 Men!unci +b(ect


0ntuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam method
tertentu, Ja6a memperbolehkan pengun*ian terhadap sebuah ob!e*t termasuk method-
method-nya dengan menggunakan monitor. "b!e*t tersebut akan men!alankan sebuah
monitor impli*it pada saat ob!e*t dari method sinkronisasi dipanggil. Sekali ob!e*t
tersebut dimonitor, monitor tersebut akan memastikan bahwa tidak ada thread yang
akan mengakses ob!e*t yang sama. Sebagai konsekuensinya, hanya ada satu thread
dalam satu waktu yang akan mengeksekusi method dari ob!e*t tersebut. 0ntuk
sinkronisasi method, keyword-nya adalah synchroni&ed yang dapat men!adi header dari
pende&inisian method. Pada kasus ini dimana Anda tidak dapat memodi&ikasi sour*e
*ode dari method, Anda dapat mensinkronisasi ob!e*t dimana method tersebut men!adi
anggota. Synta1 untuk mensinkronisasi sebuah ob!e*t adalah sebagai berikut#
s$nchr#ni;ed (F#b%ectA) 3 DDstatements $ang aEan disinEr#nisasiEan ? 9engan ini,
ob!e*t dari method tersebut hanya dapat dipanggil oleh satu thread pada satu waktu.

9.).3 Contoh S*nchroni,ed Perta"a


9ibawah ini adalah kode yang telah dimodi&ikasi dimana method print dari *lass
T$oStrin%s saat ini sudah disinkronisasi. class T*#Strings 3 s$nchr#ni;ed static
"#id print(String str@, String strG) 3 S$stem)#ut)print(str@), tr$ 3
Thread)sleep(I==), ? catch (Interrupted8(cepti#n ie) 3 ?

Pengenalan Pemrograman '

$8
J.E.N.I.

S$stem)#ut)println(strG), ? ?

class PrintStringsThread implements Runnable 3 Thread thread, String str@, strG,


PrintStringsThread(String str@, String strG) 3 this)str@ 5 str@, this)strG 5 strG,
thread 5 ne* Thread(this), thread)start(), ? public "#id run() 3
T*#Strings)print(str@, strG), ? ? class TestThread 3 public static "#id main(String
args&') 3 ne* PrintStringsThread(6Jell# 6, 6there)6), ne* PrintStringsThread(6J#*
are 6, 6$#uK6), ne* PrintStringsThread(6ThanE $#u 6, 6"er$ much76), ? ? Program
tersebut saat ini memberikan keluaran yang benar. Jell# there) J#* are $#uK ThanE
$#u "er$ much7

9.).4 Contoh S*nchroni,ed -edua


9ibawah ini adalah 6ersi yang lain dari kode diatas. Sekali lagi, method print dari
*lass T$oStrin%s telah disinkronisasi. Akan tetapi selain syn*hroni>ed keyword
diimplementasikan pada method,ia !uga diaplikasikan pada ob!e*t-nya. class
T*#Strings 3 static "#id print(String str@, String strG) 3 S$stem)#ut)print(str@),
tr$ 3 Thread)sleep(I==), ? catch (Interrupted8(cepti#n ie) 3 ?
S$stem)#ut)println(strG), ? ? class PrintStringsThread implements Runnable 3 Thread
thread, String str@, strG, T*#Strings ts, PrintStringsThread(String str@, String
strG, T*#Strings ts) 3
Pengenalan Pemrograman ' $$
J.E.N.I.

this)str@ 5 str@, this)strG 5 strG, this)ts 5 ts, thread 5 ne* Thread(this),


thread)start(), ? public "#id run() 3 s$nchr#ni;ed (ts) 3 ts)print(str@, strG), ? ?
? class TestThread 3 public static "#id main(String args&') 3 T*#Strings ts 5 ne*
T*#Strings(), ne* PrintStringsThread(6Jell# 6, 6there)6, ts), ne*
PrintStringsThread(6J#* are 6, 6$#uK6, ts), ne* PrintStringsThread(6ThanE $#u 6,
6"er$ much76, ts), ? ? Program ini !uga memiliki keluaran pernyataan-pernyataan
yang benar.

9.! " munikasi antar thread #$nterthread%


Pada bagian ini, Anda akan mempela!ari mengenai method-method dasar yang digunakan
thread untuk berkomunikasi dengan thread lain yang sedang ber!alan. Methods untuk
ko"unikasi 'nterthread public final "#id *ait() %enyebabkan thread ini menunggu
sampai thread yang lain memanggil noti'y atau noti'y(ll method dari ob!e*t ini. 5al
ini dapat menyebabkan InterruptedException. public final "#id n#tif$() %embangunkan
thread yang telah memanggil method $ait dari ob!e*t yang sama. public final "#id
n#tif$All() %embangunkan semua thread yang telah memanggil method $ait dari ob!e*t
yang sama.
Tabel 1.): !ethods untu* *omuni*asi Interthread

0ntuk mendapatkan pen!elasan 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 restaurat tersebut. Atau !uga bisa kita !uga bisa kita
nyatakan bahwa pelanggan yang memasuki restaurant mengindikasikan 3noti'y4 bahwa
pelayan dibutuhkan untuk memberikan pelayanan. Akan tetapi,dalam kondisi sepert
ini, seorang
Pengenalan Pemrograman ' $'
J.E.N.I.

pelanggan belum siap untuk memesan. Akan sangat mengganggu apabila pelayan terus-
menerus bertanya kepada pelanggan apakah ia telah siap untuk memesan atau tidak.
"leh karena itu, pelayan akan menunggu 3$ait4 sampai pelanggan memberikan tanda
3noti'ies4 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 3noti'ies4 dan kemudian menya!ikan makanan. Perhatikan
pada skenario berikut, setiap anggota yang menunggu, hanya akan ber!alan sampai
anggota yang lain memberi tanda yang memerintahkan untuk ber!alan. 5al ini sama
dengan yang ter!adi pada thread.

Gambar 1.): S*enario +elayan"+elan%%an

9...1 Contoh Produsen/-onsu"en


2ontoh dibawah ini adalah salah satu implementasi dari permasalahan
produsenkonsumen. Sebuah kelas yang menyediakan method untuk membangkitkan dan
mengurangi nilai dari integer yang dipisahkan dari *lass Produsen dan =onsumen
thread.

Pengenalan Pemrograman '

$(
J.E.N.I.

class Shared.ata 3 int data, s$nchr#ni;ed "#id set(int "alue) 3


S$stem)#ut)println(6/enerate 6 C "alue), data 5 "alue, ? s$nchr#ni;ed int get() 3
S$stem)#ut)println(6/et 6 C data), return data, ? ? class Pr#ducer implements
Runnable 3 Shared.ata sd, Pr#ducer(Shared.ata sd) 3 this)sd 5 sd, ne* Thread(this,
6Pr#ducer6))start(), ? public "#id run() 3 f#r (int i 5 =, i F @=, iCC) 3
sd)set((int)(Math)rand#m()+@==)), ? ? ? class -#nsumer implements Runnable 3
Shared.ata sd, -#nsumer(Shared.ata sd) 3 this)sd 5 sd, ne* Thread(this, 6-
#nsumer6))start(), ? public "#id run() 3 f#r (int i 5 =, i F @= , iCC) 3
sd)get(), ? ? ? class TestPr#ducer-#nsumer 3 public static "#id main(String args&')
thr#*s 8(cepti#n 3 Shared.ata sd 5 ne* Shared.ata(), ne* Pr#ducer(sd), ne*
-#nsumer(sd), ? ? 9ibawah ini adalah *ontoh dari keluaran program # /enerate
/enerate /enerate /enerate /et MI /enerate /et G< /enerate L HI IG MI G< HN

Pengenalan Pemrograman '

$)
J.E.N.I.

/et HN /enerate /et <I /enerate /et <N /enerate /et LI /et LI /et LI /enerate /et
<I /et <I

<I <N LI

<I

5asil tersebut bukanlah hasil yang kita harapkan. =ita berharap bahwa setiap nilai
yang diproduksi oleh produser dan !uga kita akan mengansumsikan bahwa konsumen akan
mendapatkan 6alue tersebut. 9ibawah ini adalah keluaran yang kita harapkan.
/enerate /et OM /enerate /et GI /enerate /et <H /enerate /et LH /enerate /et HL
/enerate /et GN /enerate /et GM /enerate /et LM /enerate /et MI /enerate /et <L
/enerate /et HM OM GI <H LH HL GN GM LM MI <L HM

0ntuk 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
Shared.ata 3 int data, b##lean "alueSet 5 false, s$nchr#ni;ed "#id set(int "alue) 3
if ("alueSet) 3 DDbaru sa%a membangEitEan sebuah nilai tr$ 3 *ait(), ? catch
(Interrupted8(cepti#n ie) 3 ? ? S$stem)#ut)println(6/enerate 6 C "alue), data 5
"alue,
Pengenalan Pemrograman ' $,
J.E.N.I.

? s$nchr#ni;ed int get() 3 if (7"alueSet) 3 DDpr#dusen belum menBset sebuah nilai


tr$ 3 *ait(), ? catch (Interrupted8(cepti#n ie) 3 ? ? S$stem)#ut)println(6/et 6 C
data), "alueSet 5 false, n#tif$(), return data, ? ? D+ 9agian E#de ini tidaE ada
$ang berubah+D class Pr#ducer implements Runnable 3 Shared.ata sd,
Pr#ducer(Shared.ata sd) 3 this)sd 5 sd, ne* Thread(this, 6Pr#ducer6))start(), ?
public "#id run() 3 f#r (int i 5 =, i F @=, iCC) 3 sd)set((int)(Math)rand#m()
+@==)), ? ? ? class -#nsumer implements Runnable 3 Shared.ata sd,
-#nsumer(Shared.ata sd) 3 this)sd 5 sd, ne* Thread(this, 6-#nsumer6))start(), ?
public "#id run() 3 f#r (int i 5 =, i F @= , iCC) 3 sd)get(), ? ? ? class
TestPr#ducer-#nsumer 3 public static "#id main(String args&') thr#*s 8(cepti#n 3
Shared.ata sd 5 ne* Shared.ata(), ne* Pr#ducer(sd), ne* -#nsumer(sd), ? ?

"alueSet 5 true, n#tif$(),

Pengenalan Pemrograman '

$-
J.E.N.I.

9.& "emam'uan C n(urren()


9engan dirilisnya J'SE ,.8, telah tersedia kontrol threading yang baru dan !uga
tambahan &itur yang disebut *on*urren*y. ?itur baru ini dapat ditemukan didalam
pa*kage !a6a.util.*on*urrent. 9idalam sub bab ini, ada dua !enis &itur *on*urren*y
yang akan di!elaskan.

9.0.1 'nterface %xecutor


Salah satu penambahan &itur mutakhir yang telah dibangun dalam aplikasi multithread
adalah &ramework Executor. Inter&a*e ini termasuk didalam pa*kage !
a6a.util.*on*urrent, dimana ob!e*t dari tipe ini akan mengeksekusi tugas-tugas dari
Runnable. +anpa penggunaan inter&a*e ini, kita akan mengeksekusi tugas dari
Runnable dengan *ara men*iptakan instan*e dari Thread dan memanggil method start
dari ob!e*t Thread. =ode dibawah ini mendemonstrasikan hal tersebut# ne*
Thread(FaRunnableOb%ectA))start(), 9engan kemampuan dari inter&a*e yang baru ini,
ob!e*t Runnable yang telah diberikan akan dieksekusi menggunakan kode berikut ini#
Fan8(ecut#rOb%ectA)e(ecute(FaRunnableOb%ectA), ?ramework E1e*utor ini berguna untuk
aplikasi multithread, karena thread membutuhkan pengaturan dan penumpukan di suatu
tempat, sehingga thread bisa sa!a sangat mahal. Sebagai hasilnya, pembangunan
beberapa thread dapat mengakibatkan error pada memori. Salah satu solusi untuk
mengatasi hal tersebut adalah dengan pooling thread. 9idalam sebuah pooling thread,
sebuah thread tidak lagi berhenti sementara akan tetapi ia akan berada dalam
antrian didalam sebuah pool, setelah ia selesai melaksanakan tugasnya. agaimanapun,
mengimplementasikan sebuah skema thread pooling dengan desain yang baik, tidaklah
mudah dilakukan. Permasalahan yang lain adalah kesulitan untuk membatalkan atau
mematikan sebuah thread. ?ramework E1e*utor merupakan salah satu solusi dari
permasalahan ini dengan *ara me*hani* de*oupling task submission mengenai bagaimana
setiap tugas di!alankan, termasuk detail dari penggunaan thread, pen!adwalan, dan
sebagainya. @ebih disarankan untuk membuat thread se*ara eksplisit daripada membuat
thread dan men!alankannya lewat method start yang telah diset untuk setiap task.
"leh karena itu lebih disarankan untuk menggunakan potongan kode berikut ini#
8(ecut#r Fe(ecut#r!ameA 5 Fan8(ecut#rOb%ectA, Fe(ecut#r!ameA)e(ecute(ne*
FRunnableTasE@A()), Fe(ecut#r!ameA)e(ecute(ne* FRunnableTasEGA()), ))) 9ikarenakan
Executor adalah sebuah inter&a*e, ia tidak dapat di-instantiate. 0ntuk men*iptakan
sebuah ob!e*t Executor, ia harus membuat sebuah *lass yang mengimplementasikan
inter&a*e ini atau dengan menggunakan &a*tory method yang telah disediakan *lass
Executor. 2lass ini !uga tersedia didalam pa*kage yang sama seperti Executor
inter&a*e. 2lass E1e*utors !uga menyediakan &a*tory method untuk memanage thread
pool sederhana. erikut ini adalah rangkuman dari beberapa &a*tory

Pengenalan Pemrograman '

$.
J.E.N.I.

methods# *a(t r) Meth d dari (lass +,e(ut r public static 8(ecut#rSer"ice ne*-
achedThreadP##l() %en*iptakan sebuah pool thread yang akan men*iptakan thread
sesuai yang dibutuhkan, atau ia akan menggunakan kembali thread yang telah dibangun
sebelumnya, apabila tersedia. Sebuah method o6erloading, !uga akan menggunakan ob!
e*t Thread,actory sebagai argument. public static 8(ecut#rSer"ice
ne*2i(edThreadP##l(int nThreads) %en*iptakan sebuah pool thread yang dapat
digunakan kembali untuk membetulkan sebuah thread yang berada didalam antrian yang
tidak teratur. Sebuah o6erloading method, akan menggunakan ob!e*t Thread,actory
sebagai tambahan parameter. public static Scheduled8(ecut#rSer"ice
ne*ScheduledThreadP##l(int c#reP##lSi;e) %en*iptakan sebuah pool thread yang akan
men!adwalkan *ommand yang akan ber!alan setelah diberikan sebuah delay, atau untuk
mengeksekusi se*ara periodi*. Sebuah o6erloading method, akan menggunakan ob!e*t
Thread,actory sebagai tambahan parameter. public static 8(ecut#rSer"ice
ne*SingleThread8(ecut#r() %en*iptakan sebuah E1e*utor yang digunakan sebagai satu-
satu-nya pelaksana dari sebuah antrian thread yang tidak teratur. 2reates an
E1e*utor that uses a single worker thread operating o&& an unbounded Aueue. Sebuah
o6erloading method, !uga akan menggunakan ob!e*t Thread,actory sebagai tambahan
parameter. public static Scheduled8(ecut#rSer"ice
ne*SingleThreadScheduled8(ecut#r() %en*iptakan sebuah E1e*utor thread yang akan
men!adwalkan *ommand untuk di!alankan setelah delay tertentu, atau dieksekusi
se*ara periodi*. Sebuah o6erloading method, !uga akan menggunakan ob!e*t
Thread,actory sebagai tambahan parameter
Tabel 1.1: ,actory !ethods didalam class Executor

Pada saat sebuah tugas dari Runnable telah dieksekusi dan diselesaikan dengan
*ontrol sebuah inter&a*e Executor. 0ntuk memberhentikan thread ini, kita dapat
dengan mudah memanggil method shutdown dari inter&a*e tersebut seperti berikut ini#
e(ecut#r)shutd#*n(),

9.0.2 'nterface Ca ab e
Ingatlah kembali, bahwa ada dua *ara untuk men*iptakan sebuah thread. =ita dapat
meng-e1tend sebuah *lass +hread atau meng-implement sebuah inter&a*e Runnable.
0ntuk menentukan teknik mana yang akan digunakan, kita akan melihat se*ara spesi&ik
&ungsi dari masing-masing teknik dengan *ara meng-o6erride method run. Penulisan
method tersebut ditun!ukkan seperti berikut ini# public "#id run() =elemahan-
kelemahan dari men*iptakan thread dengan *ara tersebut adalah# $. %ethod run tidak
dapat melakukan pengembalian hasil selama ia memiliki -oid sebagai nilai
kembaliannya. '. %ethod run mewa!ibkan Anda untuk menge*ek setiap e1*eption karena
o6erriding method tidak dapat menggunakan klausa thro$s. Inter&a*e Callable pada
dasarnya adalah sama dengan inter&a*e 7unnable tanpa kelemahan-kelemahan yang telah
disebutkan diatas. 0ntuk mendapatkan hasil dari
Pengenalan Pemrograman ' $/
J.E.N.I.

sebuah peker!aan yang telah diselesaikan oleh 7unnable, kita harus melakukan suatu
teknik untuk mendapatkan hasilnya. +eknik yang paling umum adalah dengan membuat
sebuah instan*e 6ariable untuk menyimpan hasilnya. =ode berikut ini akan menun!
ukkan bagaimana hal tersebut dilakukan. public M$Runnable implements Runnable 3
pri"ate int result 5 =, public "#id run() 3 ))) result 5 s#me>alue, ? D+ Jasil dari
attribute ini di%aga dari segala sesuatu perubahan $ang dilaEuEan #leh E#deBE#de
lain $ang mengaEses class ini +D public int getResult() 3 return result, ? ?
+ulislah inter&a*e 2allable, kemudian dapatkanlah hasil sesederhana yang
ditampilkan pada *ontoh dibawah ini. import #a-a.util.concurrent../ public class !
yCallable implements Callable 0 public Inte%er call12 thro$s #a-a.io.I3Exception
0 ... return some4alue/ 5 5 %ethod *all memiliki penulisan seperti berikut ini# >
call thr#*s 8(cepti#n 4 adalah sebuah tipe generi* yang berarti nilai pengembalian
dari pemanggilan method tersebut adalah tipe data re&eren*e apapun. Anda akan
mempela!ari tentang tipe data generi* di bab selan!utnya. %asih ada lagi &itur-
&itur *on*urren*y dalam J'SE ,.8. @ihatlah lagi didalam dokumentasi API untuk
mendapatkan in&ormasi lebih detail lagi mengenai &itur-&itur yang lain.

Pengenalan Pemrograman '

$;
J.E.N.I.

9.- .atihan
9.1.1 2anner
9engan menggunakan A:+ atau Swing, buatlah sebuah banner sederhana yang akan
men*etak string yang dituliskan oleh user. String ini akan ditampilkan se*ara terus
menerus dan program Anda harus memberikan ilustrasi bahwa string tersebut bergerak
dari kiri ke kanan. 0ntuk memastikan bahwa proses perpindahannya tidak terlalu
*epat, Anda sebaiknya menggunakan method sleep dari *lass +hread. erikut ini adalah
sebuah *ontoh dimana Anda menuliskan BCour name hereDB.

Gambar 1.6.1: Contoh per%era*an strin%

Pengenalan Pemrograman '

'8
J.E.N.I.

Bab 10 Jaringan
Java mengijinkan anda untuk mempermudah mengembangkan aplikasi yang mengerjakan
berbagai pekerjaan melalui jaringan. Ini adalah suatu cita-cita pembuatan Java yang
menjadi salah satu kekuatan Java sejak dibuat dengan internet di dalam cita-cita.
Sebelum mempelajari tentang jaringan dalam Java. Pertama-tama anda akan
diperkenalkan kepada beberapa konsep dasar jaringan. Setelah menyelesaikan bab ini,
anda diharapkan dapat !."engerti konsep dasar jaringan
● ● ● ●

IP addres protokol ports client#server

● socket $."embuat aplikasi menggunakan paket jaringan Java ● ● ● ●

ServerSocket Socket MulticastSocket DatagramPacket

10.1 Konsep dasar jaringan


Jika sebelumnya anda suda mengetahui, internet adalah jaringan global dengan
berbagai jenis komputer yang berbeda yang tersambung dalam berbagai jalan. %alaupun
terdapat perbedaan dalam so&t'are dan hard'are yang disambung bersama, hal tersebut
sangatlah bagus dimana internet masih ber&ungsi. (al ini memungkinkan karena
standar komunikasi memiliki ketetapan dan juga keselarasan. Standar ini menjamin
kesesuaian dan kekuatan komunikasi diantara luasnya sistem pada internet. "ari kita
melihat beberapa standar yang berlaku.

10.1.1 IP Adress
Pada setiap komputer yang terkoneksi dengan internet memiliki alamat IP unik. )
lamat IP secara logika hampir sama dengan alamat pengiriman surat tradisional
dimana memiliki arti bah'a alamat yang bersi&at unik tersebut me'akili dari
keterangan sebuah objek. )lamat tersebut di'akilkan dalam *$-bit nomor yang
digunakan sebagai pengenal yang bersi&at unik dari setiap komputer yang tersambung
dengan internet. 192.1.1.1 adalah contoh dari sebuah alamat IP. "ereka juga bisa
ditulis dengan bentuk simbol seperti docs.rinet.ru.

10.1.2 Protokol
Sejak terdapat jenis komunikasi yang berbeda-beda yang mungkin terjadi pada
internet,disana harus pula ada suatu jumlah yang sama untuk mekanisme penangangan
mereka . Setiap jenis komunikasi membutuhkan protokol yang spesi&ik dan unik.
Protokol mengatur peraturan dan standar dimana menetapkan jenis komunikasi internet
yang khusus. (al tersebut menjelaskan &ormat data yang dikirim le'at internet,
seiring dengan bagaimana dan kapan itu dikirim.
Pengenalan Pemrograman $

1
J.E.N.I.

+onsep dari protokol tentunya tidak terlalu asing untuk kita. "engingat sudah
beberapa kali anda telah menggunakan jenis percakapan ini

"Hallo." "Hallo. Selamat siang. Bolehkah saya berbicara dengan oan!" ""kay# 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. "ari
kita lihat beberapa protokol penting yang digunakan pada internet. ,anpa banyak
kata, (yperte-t ,rans&er Protocol .(,,P/ adalah salah satu protokol yang sering
digunakan. 0igunakan untuk mentrans&er dokumen (,"1 pada %eb. +emudian, ada juga
2ile ,rans&er Protocol .2,P/ dimana lebih umum dibandingkan dengan (,,P dan
mengijinkan anda untuk mentrans&er &ile biner pada intenet. +edua protokol tersebut
memiliki peraturan masing-masing dan standar dalam pengiriman data. Java juga dapat
mendukung kedua protokol tersebut.

10.1.3 Port
Sekarang, protokol hanya bisa dipertimbangkan manakala digunakan dalam konteks
suatu jasa. Sebagai contoh, protokol (,,P digunakan ketika anda menyediakan isi %eb
melalui layanan (,,P. Setiap komputer pada internet dapat menyediakan berbagai
jenis layanan melalui berbagai jenis protokol yang mendukung. "asalahnya,
bagaimanapun, kita harus mengetahui jenis layanan sebelum sebuah in&ormasi dapat
ditrans&er. 3ntuk itulah port digunakan. Port adalah !4-bit nomor dimana mengenal
setiap layanan yang dita'arkan oleh server jaringan. 3ntuk menggunakan layanan
khusus dan oleh karena itu, jalur komunikasi yang mele'ati protokol tertentu, anda
perlu untuk menyambungkan pada port yang sesuai. Port dihubungkan dengan nomor dan
beberapa nomor bersi&at spesi&ik yang berhubungan dengan jenis layanan khusus. Port
dengan layanan pekerjaan tertentu disebut port standar. Sebagai contoh, layanan 2,P
terletak pada port $! sedangkan layanan (,,P terletak pada port 56. Jika anda ingin
menggunakan &ile trans&er 2,P, anda perlu terhubung dengan port $! pada komputer
anda. Sekarang, semua standar layanan tertentu diberikan nilai port diba'ah !6$7.
port dengan nilai diatas !6$7 disediakan untuk komunikasi custom. Jika terdapat
kasus dimana port dengan nilai diatas !6$7 telah digunakan oleh beberapa komunikasi
custom, anda harus mencari nilai lainnya yang tidak digunakan.

10.1.4 Paradigma client/server


Paradigma client#server adalah dasar untuk Java net'orking &rame'ork. ,entunya,
penetapan ini terdiri dari dua elemen besar, yaitu client dan server. 8lient adalah
mesin yang membutuhkan beberapa jenis in&ormasi sedangkan server adalah mesin yang
menyimpan in&ormasi dan menunggu untuk menyampaikannya pada client. Paradigma ini
menjelaskan sebuah skenario sederhana. ,entunya, client terhubung dengan sever dan
meminta in&ormasi. +emudian server mengingat permintaan dan mengembalikan in&ormasi
yang tersedia kepada client.

Pengenalan Pemrograman $

2
J.E.N.I.

$ambar1.1.%& 'lient(Server model

10.1.5 sockets
+onsep umum jaringan yang terakhir sebelum kita membahas lebih dalam tentang Java
net'orking adalah dengan memperhatikan sockets. +ebanyakan pemrograman Java net'ork
menggunakan jenis khusus dari komunikasi jaringan yang diketahui sebagai sockets.
Socket adalah so&t'are abstrak untuk media input atau output komunikasi. Socket
digunakan oleh Java untuk mengatasi komunikasi pada jaringan level rendah. Jalur
komunikasi ini memungkinkan untuk mentrans&er data melalui port khusus. Singkatnya,
socket adalah point terkahir untuk komunikasi antara dua mesin.

10.2 The Java Networking Package


package dari java.net menyediakan banyak class yang berguna untuk pengembangan
aplikasi jaringan. 3ntuk da&tar lengkap dari class jaringan dan inter&ace, dapat
merujuk ke dokumentasi )PI. +ita akan &okus pada empat class yaitu ServerSocket,
Socket, "ulticastSocket, dan 0atagramPacket class.

10.2.1 ServerSocket and the Socket class


class ServerSocket menyediakan &ungsi-&ungsi dasar dari sebuah server. ,abel
berikut menjelaskan dua dari empat konstruktor pada ServerSocket class

Pengenalan Pemrograman $

3
J.E.N.I.

Konstruktor ServerSocket ServerSocket(int port) +etika sebuah server menetapkan


suatu port tertentu. Sebuah port 6 menugaskan sebuah server kepada port bebas
manapun. Panjang antrian maksimun untuk koneksi yang akan datang diatur sebanyak 96
sebagai de&aultnya. ServerSocket(int port, int backlog) +etika sebuah server
menetapkan suatu port tertentu.Panjang antrian maksimum untuk koneksi yang akan
datang berdasarkan pada parameter backlog.
)abel 1.2.1a& *onstruktor ServerSocket

:erikut adalah beberapa dari class method

etode ServerSocket public Socket accept() "enyebabkan server untuk menunggu dan
mendengarkan dari koneksi client, lalu menerimanya. public void close() "enutup
socket server. 8lient tidak dapat lagi terhubung ke server hingga dibuka kembali
public int getLocalPort() "engembalikan port dimana socket juga membatasi public
boolean isClosed() "endeteksi apakah socket tertutup atau belum
)abel 1.2.1b& Metode ServerSocket

8ontoh yang berhasil melakukan implementasi sebuah server sederhana, dimana sebuah
in&ormasi sederhana dikirim oleh client. import java.net.*; import java.io.*;
public class Ec oingServer ! public static void main(String "# args) ! ServerSocket
server $ null; Socket client; tr% ! server $ ne& ServerSocket('()*);

Pengenalan Pemrograman $

4
J.E.N.I.

++'()* is an unused port number , catc (-.E/ception ie) ! S


%stem.out.println(0Cannot open socket.0); S%stem.e/it('); , & ile(true) ! tr% !
client $ server.accept(); .utputStream client.ut $ client.get.utputStream();
Print1riter p& $ ne& Print1riter(client.ut, true); -nputStream client-n $
client.get-nputStream(); 2u33ered4eader br $ ne& 2u33ered4eader(ne&
-nputStream4eader(client-n)); p&.println(br.readLine()); , catc (-.E/ception
ie) ! , , ; ,

+etika ServerSocket class mengimplementasikan server socket, Socket class


mengimplementasikan client socket. Socket class memiliki delapan konstruktor, dua
diantaranya siap dipanggil. 1angsung saja kita lihat dua konstruktor tersebut.
Konstruktor Socket Socket(String ost, int port)

"embuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada
host tertentu. Socket(-net5ddress address, int port) "embuat sebuah socket client
dimana dihubungkan dengan diberikan nomor port pada alamat IP tertentu.
)abel 1.2.1c& *onstruktor Socket

:erikut adalah beberapa dari class method

etode Socket public void close() "enutup socket client public -nputStream get-
nputStream() "enerima kembali input stream yang berhubungan dengan socket ini.
public .utputStream get.utputStream() "enerima kembali output stream yang
berhubungan dengan socket ini. public -net5ddress get-net5ddress()

Pengenalan Pemrograman $

5
J.E.N.I.

etode Socket "engembalikan alamat IP kepada socket ini pada saat masih terhubung.
public int getPort() "engembalikan remote port kepada socket ini pada saat masih
terhubung. public boolean isClosed() "endeteksi apakah socket telah tertutup atau
tidak
)abel 1.2.1d& Metode Socket

8ontoh yang berhasil melakukan implementasi sebuah client sederhana, dimana


mengirim data kepada server.
import java.io.*; import java.net.*; public class 6%Client ! public static void
main(String args"#) ! tr% ! ++Socket client $ ne& Socket(0')).7.7.'0, '()*); Socket
client $ ne& Socket(-net5ddress.getLocal8ost(), '()*); -nputStream client-n $
client.get-nputStream(); .utputStream client.ut $ client.get.utputStream();
Print1riter p& $ ne& Print1riter(client.ut, true); 2u33ered4eader br $ ne&
2u33ered4eader(ne& -nputStream4eader(client-n)); 2u33ered4eader std-n $ ne&
2u33ered4eader(ne& -nputStream4eader(S%stem.in)); S%stem.out.println(09%pe a
message 3or t e server: 0); p&.println(std-n.readLine()); S
%stem.out.println(0Server message: 0); S%stem.out.println(br.readLine());
p&.close(); br.close(); client.close(); , catc (ConnectE/ception ce) ! S
%stem.out.println(0Cannot connect to t e server.0); , catc (-.E/ception ie) ! S
%stem.out.println(0-+. Error.0); , , ;

10.2.2

ulticastSocket dan !atagramPacket class

class "ulticastSocket sangat berguna untuk aplikasi yang mengimplementasikan


komunikasi secara berkelompok. )lamat IP untuk kelompok multicast berkisar diantara
$$7.6.6.6 hingga $*<.$99.$99.$99. "eskipun begitu, alamat $$7.6.6.6 telah dipesan
dan seharusnya tidak digunakan. class ini memiliki tiga konstruktor tetapi kita
akan membahas satu dari ketiga konstruktor ini.

Pengenalan Pemrograman $

6
J.E.N.I.

Konstruktor 6ulticastSocket(int port)

ulticastSocket

"embuat multicast socket dibatasi dengan pemberian nomor port


)abel 1.2.2a& *onstruktor MulticastSocket

,abel berikutnya memberikan penjelasan beberapa metode "ulticastSocket.

etode

ulticastSocket

public void join;roup(-net5ddress mcastaddr) :ergabung dengan kelompok multicast


pada alamat tertentu public void leave;roup(-net5ddress mcastaddr) "eninggalkan
kelompok multicast pada alamat tertentu public void send(<atagramPacket p) "etode
turunan dari class 0atagramSocket. "engirim p dari socket ini.
)abel 1.2.2b&Metode MulticastSocket

Sebelum seorang dapat mengirim pesan kepada kelompok, pertama kali seorang tersebut
seharusnya menjadi anggota dari multicast kelompok dengan menggunakan metode
join=roup. Sekarang seorang anggota dapat mengirim pesan melalui metode send. Jika
anda telah selesai berbicara dengan kelompok, anda dapat menggunakan metode
leavekelompok untuk melepaskan keanggotaan anda. Sebelum melihat contoh dalam
menggunakan class multicastSocket, pertama-tama mari kita lihat ke class
0atagramPacket. Perhatikan bah'a dalam metode send dari class multiSocket,
dibutuhkan parameter yaitu objek 0atagramPacket. Sehingga, kita harus mengerti
objek jenis ini sebelum menggunakan metode send. 8lass 0atagramPacket digunakan
untuk mengirim data melalui conectionless protokol seperti multicast. "asalah yang
ditimbulkan bah'a pengiriman packet tidak terjamin. "ari kita perhatikan dua dari
enam konstruktor.

Konstruktor !atagramPacket <atagramPacket(b%te"# bu3, int lengt ) +onstruktor dari


datagramPacket untuk menerima paket dengan panjang length. Seharusnya kurang dari
atau sama dengan ukuran dari bu&&er bu+. <atagramPacket(b%te"# bu3, int lengt ,
-net5ddress address, int port) +onstruktor dari datagramPacket untuk mengirim paket
dengan panjang length dengan nomor port tertentu dan host tertentu.
)abel 1.2.2c&*onstruktor DatagramPacket

Pengenalan Pemrograman $

7
J.E.N.I.

:erikut adalah beberapa metode menarik dari class 0atagramPacket.

etode !atagramPacket public b%te"# get<ata() "engembalikan bu&&er dimana data telah
disimpan public -net5ddress get5ddress() "engembalikan alamat IP mesin dimana paket
yang dikirim atau yang diterima public int getLengt () "engembalikan panjang data
yang dikirim atau diterima public int getPort() "engembalikan nomor port pada
remote host dimana paket yang dikirim atau yang diterima
)able 1.2.2d& Metode DatagramPacket

8ontoh multicast kita juga mengandung dua class, server dan client. Server menerima
pesan dari client dan mencetak pesan tersebut. :erikut adalah class server import
java.net.*; public class C atServer ! public static void main(String args"#) t ro&s
E/ception ! 6ulticastSocket server $ ne& 6ulticastSocket('()*); -net5ddress group $
-net5ddress.get2%=ame(0()*.>.?.@0); ++get2%=ame A 6engembalikan alamat -P %ang
diberikan ole 8ost server.join;roup(group); boolean in3inite $ true; +* Server
terusBmenerus menerima data dan mencetak mereka *+ & ile(in3inite) ! b%te bu3"# $
ne& b%te"'7(*#; <atagramPacket data $ ne& <atagramPacket(bu3, bu3.lengt );
server.receive(data); String msg $ ne& String(data.get<ata()).trim(); S
%stem.out.println(msg); , server.close(); , ; :erikut adalah class client import
java.net.*; import java.io.*; public class C atClient ! public static void
main(String args"#) t ro&s E/ception ! 6ulticastSocket c at $ ne&
6ulticastSocket('()*);
Pengenalan Pemrograman $ 8
J.E.N.I.

, ;

-net5ddress group $ -net5ddress.get2%=ame(0()*.>.?.@0); c at.join;roup(group);


String msg $ 00; S%stem.out.println(09%pe a message 3or t e server:0);
2u33ered4eader br $ ne& 2u33ered4eader(ne& -nputStream4eader(S%stem.in)); msg $
br.readLine(); <atagramPacket data $ ne& <atagramPacket(msg.get2%tes(), 7,
msg.lengt (), group, '()*); c at.send(data); c at.close();

10.3 Latihan
10.3.1 "rivia Server
:uatlah sebuah server yang berisi satu set pertanyaan yang mudah. Secara sederhana,
akan ada sekitar 9-!6 pertanyaan. 8lient yang terhubung ke server mengirim sebuah
permintaan untuk sebuah pertanyaan atau ja'aban sebuah pertanyaan, 8lient mengirim
pesan >permintaan?. 3ntuk ja'aban dari sebuah pertanyaan, client mengirim pesan
>ja'aban?. +etika menerima pesan >permintaan?, secara acak server akan memilih satu
pertanyaan dari koleksi yang ada. 0ia mengirimkan pertanyaan yang dipilih sesuai
dengan nomor yang bersangkutan kepada client. +etika server menerima pesan
>ja'aban? dari client, dia mengin&ormasikan user bah'a user perlu mengirimkan
ja'aban sesuai dengan nomor pertanyaan kepada server. Ja'aban itu harus dalam
&ormat @no pertanyaanAB@ja'aban andaA. :erikut adalah contoh skenario 8lient
CpermintaanC Server C*BSiapa pembuat JavaDC 8lient Cja'abanC Server C:erikan
ja'abanmu dengan &ormat @nomor pertanyaanrAB@ja'aban andaAC 8lient C*BJames
=oslingC Server +erja yang bagusE ...

Pengenalan Pemrograman $

9
J.E.N.I.

Bab 11 Applet
11.1 Tujuan
Applets adalah satu dari fitur yang paling menarik dalam java. Applet merupakan
program yang Anda jalankan melalui web browser. Anda akan belajar tentang membentuk
applet pada pembelajaran ini. Setelah melengkapi pembelajaran ini, anda harus dapat
!. mendefinisikan apa yang dimaksud dengan applet ". #embentuk applet anda sendiri
$. #engetahui siklus yang terdapat pada applet
• • • •

init start stop destroy paint showStatus #ethods untuk memainkan sebuah audio &lip

%. menggunakan methods applet yang lain


• • •

'. #emahami html tag pada applet

11.2 Membentuk Applets


Sebuah applet adalah tipe yang spesial dari program java yang dieksekusi melalui
internet. Se&ara khusus berjalan pada suatu web browser seperti Nets&ape Navigator,
#o(illa, atau #i&rosoft Internet E)plorer. *agaimanapun, jika dibandingkan dengan
aplikasi Java yang normal, tidak diijinkan mengakses applet pada komputer yang mana
dijalankan untuk alasan keamanan. Applet ini &ukup terbatas jika dibandingkan
dengan aplikasi java. +ada module ini, Anda akan mempelajari tentang membuat applet
menggunakan A,-.

11.2.1 Hello World Applet


.lass Applet adalah sebuah sub&lass dari &lass Panel yang didefinisikan dalam A,-.
Jalan terbaik untuk memahami bagaimana untuk membentuk Applet adalah dengan &ontoh.
Jadi, berikut ini adalah &ontoh applet sederhana yang menampilkan /0ello world1/.
import java.awt.*;
+engenalan +emrograman " !
J.E.N.I.

import java.applet.*; /* masukkan bagian ini dalam kode html <applet


code="AppletDemo" width= !! height="!!# </applet# */ public class AppletDemo
e$tends Applet % public void paint&'raphics g( % g.draw)tring&"*ello world+",
-!, ./(; 0 0 Setelah proses kompilasi, usahakan jalankan &ontoh ini menggunakan
baris perintah java. Apa yang terjadi2 Ingat bahwa applet adalah aplikasi java yang
spesial. #ereka tidak dieksekusi menggunakan perintah java. *ahkan applet berjalan
pada web browser atau menggunakan applet viewer. 3ntuk membuka applet melalui
sebuah web browser, se&ara sederhana buka dokumen 0-#4 dimana applet terintegrasi
kedalamnya menggunakan applet 0-#4 tag 5+erintah mengeluarkan kode pada &ontoh
0ello ,orld6. .ara lain untuk menjalankan sebuah applet adalah melalui perintah
appletviewer. 3ntuk memudahkan ikuti synta) berikut ini appletviewer <java
1ilename# Sebagai &ontoh, untuk menjalankan &ontoh applet yang dijalankan ,
menggunakan appletviewer AppletDemo.java -ag 0-#4 pada &ontoh yang diberikan
mengindikasikan bahwa sebuah applet dibuat dengan lebar $77 pi)el dan tinggi !77
pi)el. kemudian, method drawString menggambar string /0ello world1/ pada posisi
pi)el 587,"'6 menghitung kebawah dari bagian kanan.

Gambar 1.1.1: contoh Applet

9etika membuat sebuah applet, dibutuhkan suatu e)tend &lass Applet. Sebagaimana
yang disebutkan sebelumnya, &lassnya dapat ditemukan dalam java.applet pa&kage.
:leh karena itu, mengimport the java.applet pa&kage merupakan suatu keharusan.
Juga, telah disebutkan sebelumnya bahwa &lass Applet adalah sub&lass dari &lass
+anel. 0al ini mengimplikasikan bahwa beberapa methods dari &lass applet ditemukan
dalam &lass Panel.3ntuk mengakses methods atau fields dalam &lass Panel atau
&lass;&lass induk, diperlukan suatu aksi untuk import pa&kage java.awt .
+engenalan +emrograman " "
J.E.N.I.

11.3 Method-Method Applet


*agian ini membahas methods applet yang akan Anda temukan manfaatnya.

11.3.1 Siklus Applet (The Applet Life Cycle)


*ahkan untuk memulai eksekusi pada main method 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. <ang sebenarnya berisi
permintaan pertama ketika applet di load. ". start ! Setelah meminta method init,
mulai dengan method yang dipangil selanjutnya. method ini meminta dokumen 0-#4 yang
ditampilkan applet setiap waktu. Eksekusi ringkasan dengan method ini dilakukan
ketika applet ditampilkan kembali. #. stop ! 9etika web browser meninggalkan
dokumen 0-#4 applet,method ini dipanggil untuk menginformasikan applet bahwa dia
harus menghentikan proses eksekusinya. $. destroy ! method ini dipanggil ketika
applet perlu dihapus dari kelangkapan memory. methode stop selalu dipanggil sebelum
method ini diminta untuk dijalankan.

+engenalan +emrograman "

$
J.E.N.I.

9etika membuat applet, sedikitnya beberapa dari method ini telah menolaknya. &ontoh
applet berikut menolak method berikut. import java.applet.*; import java.awt.*; /*
<applet code="2i1e34cleDemo" width= !! height="!!# </applet# */ class 2i1e34cleDemo
e$tends Applet % )tring msg =""; public void init&( % msg 5= "initiali6ing... ";
repaint&(; 0 public void start&( % msg 5= "starting... "; repaint&(; 0 public void
stop&( % msg 5= "stopping... "; repaint&(; 0 public void destro4&( % msg 5=
"preparing 1or unloading..."; repaint&(; 0 public void paint&'raphics g( %
g.draw)tring&msg, "/, "/(; 0 0 .ontoh dokumen html berikut tergabung dalam applet
4ife.y&le=emo . <*782# <7972:#2i1e 34cle Demo</7972:# <applet code="2i1e34cleDemo"
width= !! height="!!# </applet# </*782#

+engenalan +emrograman "

%
J.E.N.I.

11.3.2 Method pai t


#ethod lain yang tidak kalah penting adalah method paint, yang mana &lass Applet
menurunkannya dari &lass induknya yaitu &lass %omponent& <ang meminta output applet
setiap waktu yang diperlukan untuk dapat digambar kembali. Sebagai &ontoh dari
setiap instan&e adalah ketika sebuah applet tersembunyi oleh window lain dapat
dibuat terlihat lagi. #ethod ini selalu menolak ketika anda ingin membuat bagaimana
applet yang Anda buat harus terlihat seperti yag anda inginkan. +ada &ontoh
0ello ,orld, applet memiliki string /0ello world1/pada ba&kground setelah menolak
method paint.

11.3.3 Sho!Status Method


Applet memiliki window status, dimana memberi informasi kepada Anda tentang apa
yang sebenarnya dilakukan applet. Jika anda ingin memberi output ke window status,
se&ara sederhana memanggil method showStatus. .ontoh berikut ini sama seperti
&ontoh 0ello ,orld tapi dengan pernyataan tambahan yang memodifikasi isi dari
window status. import java.awt.*; import java.applet.*; /* <applet
code="AppletDemo" width= !! height="!!# </applet# */ public class AppletDemo
e$tends Applet % public void paint&'raphics g( % g.draw)tring&"*ello world+",
-!, ./(; show)tatus&"7his is an important in1ormation."(; 0 0 *erikut ini adalah
&ontoh hasil outputnya

Gambar 1.".#: contoh showStatus !

+engenalan +emrograman "

'
J.E.N.I.

11.3." Me#ai ka

Audio Clips

Applets juga menyediakan layanan melalui adanya suatu method yang memungkinkan Anda
untuk memainkan file audio. #emainkan audio &lips dalam sebuah applet melibatkan
dua langkah dasar !. =apatkan audio &lip menggunakan method getAudio.lip. ". 3ntuk
memainkan audio &lip, menggunakan method play atau loop pada obje&t audio &lip.
play memungkinkan Anda untuk memainkan audio satu kali mengingat loop berulang pada
audio &lip dan berhenti hanya ketika method stop dipanggil. .ontoh berikutnya
memainkan file audio se&ara terus;menerus hingga method stop applet dipanggil.
import java.awt.*; import java.applet.*; /* <applet code="AudioApplet" width= !!
height="!!# </applet# */ public class AudioApplet e$tends Applet % Audio3lip ac;
public void init&( % tr4 % /*audio clip tersimpan dalam direktori 4ang sama seperti
kode javan4a*/ /* space8usic telah terdownload dari java.sun.com */ ac =
getAudio3lip&get3ode;ase&(, "space8usic.au"(; ac.loop&(; 0 catch &:$ception e( % )
4stem.out.println&e(; 0 0 public void stop&( % ac.stop&(; 0 public void
paint&'raphics g( % g.draw)tring&"<la4ing space music+", -!, ./(; 0 0

+engenalan +emrograman "

>
J.E.N.I.

11.4 Applet HTML Tags


=alam &ontoh terdahulu, Anda sudah melihat bagaimana applet 0-#4 tags digunakan
dalam dokumen 0-#4 atau sour&e &ode java. Sekarang, Anda akan dikenalkan pada versi
applet 0-#4 tags yang lebih lengkap. <A<<2:7 =3>D:;A): = codebase?@2A 3>D: =
appletBile =A72 = alternate7e$tA =CA8: = applet9nstanceCameA D9D7* = width9n<i$els
*:9'*7 = height9n<i$els =A29'C = alignmentA =E)<A3: = vspace9n<i$elsA =*)<A3: =
hspace9n<i$elsA # =<<A@A8 CA8: = parameterCame" EA2?: = parameterEalue"#A =<<A@A8
CA8: = parameterCame. EA2?: = parameterEalue.#A ... =<<A@A8 CA8: = parameterCamen
EA2?: = parameterEaluen#A =*782 that will be dsipla4ed in the absence o1 FavaA
</A<<2:7# $ata ku ci Applet HTML Ta% 3>D:;A): =ire&tory dimana &lass applet
diletakkan. 3ntuk dokumen 0-#4, dire&tory 3?4 sesuai dengan setting
awalnya@defaultnya. 3>D: Nama file yang berisi kode applet applet. =engan atau
tanpa nama ekstensi .java atau .class . A27 -e)t ditampilkan jika browser mengerti
applet tags tapi applet tidak dapat dieksekusi se&ara langsung. #ungkin terjadi
jika Javanya disabled. CA8: Nama dari applet. =igunakan untuk mwmungkinkan applets
yang lain untuk berkomunikasi dengan applet ini dengan menunjukkan suatu applet
berdasarkan namanya. D9D7*, *:9'*7 ,idth dan height dari window applet. =inyatakan
dalam pi)el. A29'C

+engenalan +emrograman "

A
J.E.N.I.

$ata ku ci Applet HTML Ta% Alignment atau pengaturan posisi dari applet. satu
diantara /left/, /right/, /top/, /bottom/, /middle/, /baseline/, /te)ttop/,
/absmiddle/, atau /absbottom/. +eletakan posisi se&ara =efault tergantung pada
lingkungan. /top/ B posisi atas dari applet diratakan dengan item tertinggi dalam
baris yang ada. /bottom/, baseline B posisi bawah dari applet diratakan dengan
bawah dari &ontent lain dalam baris yang sama. /middle/ B tengah dari applet
diratakan dengan bawah dari &ontent yang lain dalam baris yang sama. /te)ttop/ B
posisi atas dari applet diratakan dengan posisi atas dari applet diratakan dengan
posisi tertinggi dari posisi atas pada baris yang sama. /absmiddle/ B tengah dari
applet diratakan dengan verti&al middle dari &ontent lain pada baris yang sama.
/absbottom/ B posisi bawah dari applet diratakan dengan posisi bawah dari &ontent
lain dalam baris yang sama. E)<A3:, *)<A3: Spasi diatas dan dibawah 5CS+A.E6 dan
pada sisi 50S+A.E6 dari applet.. <A@A8 CA8:, EA2?: 3ntuk mengelompokkan parameter
yang dapat menampilkan appletD applet dapat meminta method getParameter String
param'ame!.
(able 1.#: Applet )(*+ (ags

.ontoh dibawah ini mendemokan bagaimana untuk mengakses parameter tertentu pada 0-
#4 tag. import java.awt.*; import java.applet.*; /* <applet code="<aramDemo" width=
!! height="!!# <param name="m4<aram" value="*ello world+"# </applet# */ public
class <aramDemo e$tends Applet % public void paint&'raphics g( %
g.draw)tring&get<arameter&"m4<aram"(, -!, ./(; 0 0 :utput dari program ini hanya
sama seprti applet 0ello ,orld.

+engenalan +emrograman "

8
J.E.N.I.

11.5 Latihan
11.&.1 Tic'Tac'Toe Applet satu'player
*uat game satu;player -i&;-a&;-oe. 3ser memainkannya melawan komputer. 3ntuk setiap
giliran, pemain harus menggeser kotak dari papan. Sekali sebuah kotak terpilih,
kotak tersebut ditandai oleh symbol pemain 5: dan E yang selalu digunakan sebagai
symbol6. pemain yang berhasil mengatasi $ kotak membentuk baris hori(ontal,
verti&al atau diagonal memenangkan game ini. Fame ini berakhir ketika pemain menang
atau ketika semua kotak sudah berhasil dibentuk. =esain dan gerakan komputer
seakan;akan user akan memengkan pertandingan melawan komputer.

+engenalan +emrograman "

G
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 lass- lass stream yang lain. !etelah melengkapi
pembahasan ini, Anda harus dapat " #. $ahu tipe-tipe stream yang umum digunakan %.
&enggunakan lass 'ile dan methodnya • Karakter dan !tream byte • Input dan (utput !
treams • Node dan 'ilter !treams ). &enggunakan lass- lass Input*(utput yang
berbeda • Reader • Writer • InputStream • OutputStream +. &emahami konsep dari
stream haining ,. &endefinisikan serialisasi -. &emahami penggunaan dari kata kun i
transient .. &enulis dan memba a dari sebuah obje t stream

12.2 Tipe-Tipe Stream yang Umum Digunakan


12.2.1 Stream Karakter dan Byte
!eperti yang elah disebutkan sebelumnya, se ara umum ada dua tipe dari stream,
yaitu stream karakter dan byte. Kita hanya mengulang perbedaan mendasar antara
keduanya. !tream byte adalah abstraksi file atau alat untuk data biner sedangkan
stream karakter adalah untuk karakter /ni ode. 0lass InputStream adalah abstraksi
lass root untuk semua input stream byte sedangkan lass OutputStream adalah lass
root abstraksi dari semua output stream byte. /ntuk stream karakter, super lasss
yang sesuai dari semua lass- lass se ara berturut-turut adalah lass Reader dan the
Writer. Kedua lass- lass ini adalah abstraksi lass- lass untuk memba a dan menulis
stream karakter.

12.2.2 Input dan Output Stream


!tream juga dikategorikan berdasarkan apakah mereka digunakan untuk memba a atau
menulis stream.1alaupun ini sudah ukup nyata, i2inkan saya untuk mendefinisikan
tipe
3engenalan 3emrograman % #
J.E.N.I.

stream ini. Anda diijinan untuk memba a dari input stream tapi tidak menulisnya. Di
lain pihak, Anda diijinkan untuk menulis output streams tapi tidak memba anya.
0lass InputStream dan lass Reader adalah super lass-super lass dari semua input
stream. 0lass OutputStream dan lass Writer adalah lass- lass root dari semua output
stream. Input stream juga dikenal sebagai stream sumber 4sour e stream5 sejak kita
memperoleh informasi dari stream ini. sementara itu output stream disebut juga
stream hasil4sink stream5.

12.2.3 Node dan Stream Filter


Kini pa kage java.io membedakan antara node dan stream filter. !ebuah stream node
adalah sebuah stream dengan fungsi dasar berupa fungsi memba a atau menulis dari
sebuah lokasi khusus seperti pada disk atau dari jaringan. $ipe-tipe dari stream
node terdiri atas file, memory dan jalur data. !tream 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. 3enambahan lapisan pada sebuah stream node disebut dengan stream
haining. !esi ini berturut-turut mempunyai sebuah tujuan dari lass- lass stream
yang berbeda. /ntuk melengkapi daftar dari lass- lass ini, silahkan melihat
dokumentasi Ja6a7s A3I.

3engenalan 3emrograman %

%
J.E.N.I.

12.3 Cla

!ile

1alaupun lass File bukan merupakan lass stream, ini sesuatu yag penting bah8a kita
mempelajari ini sejak lass- lass stream merupakan file-file yang telah
dimanipulasi. 0lass adalah sebuah per8akilan dari abstraksi dari file-file nyata
dan nama path direktori. /ntuk meng-instantiate sebuah obje t File, Anda dapat
menggunakan berikut ini" Sebuah Constructor File File(String pathname) Instantiate
sebuah obje t File dengan nama path khusus sebagai nama filenya. Nama filenya
mungkin salah satu menjadi penuh4 sebagai ontoh, isi dengan path yang lengkap5 atau
mungkin terdiri atas namafile itu sendiri dan diasumsikan menjadi diisi dalam
direktori tersebut.
Table 1.2a: File constructor

onstru tor

0lass File menyediakan beberapa method untuk memanipulasi file dan direktori.
9erikut ini beberapa dari method-method tersebut. ethod!method File public String
getName() &engembalikan nilai nama file atau nama direktori dari obje t File ini.
public boolean exists() &enguji apakah sebuah file atau sebuah direktori masih ada
atau tidak public long length() &engembalikan nilai ukuran dari file. public long
lastModified() &engembalikan nilai tanggal dalam milidetik ketika file terakhir
kali dimodifikasi. public boolean canRead() &engembalikan nilai true jika dijinkan
untuk memba a dari file. !ebaliknya, nilai pengembaliannya bernilai false. public
boolean canWrite() mengembalikan nilai true jika diijinkan untuk menulis ke sebuah
file. !ebaliknya, nilai pengembaliannya bernilai false. public boolean isFile()
&enguji apakah obje t ini berupa sebuah file, yaitu persepsi normal kita tentang
apa itu sebuah file 4bukan sebuah direktori5 atau bukan. public boolean
isDirectory() menguji apakah obje t ini adalah sebuah direktori atau bukan.

3engenalan 3emrograman %

)
J.E.N.I.

ethod!method File public String[ list() &engembalikan nilai daftar file dan
subdirektori yang ada dalam obje t ini. (bje t ini haruslah berupa sebuah
direktori. public !oid m"dir() &embuat sebuah direktori yang merupakan abstraksi
nama path ini. public !oid delete() &embuang file atau direktori yang sebenarnya
di8akili oleh obje t 'ile tersebut.
Table 1.2a: method-method File

&ari kita melihat bagaimana method ini bekerja berdasarkan ontoh berikut ini "
import #a!a$io$%& public class File'nfo(lass ) public static !oid main(String args[
) ) String fileName * args[+ & File fn * ne, File(fileName)& System$out$println(-
Name. - / fn$getName())& if (0fn$exists()) ) System$out$println(fileName / - does
not exists$-)& 1% membuat sebuah temporary directory $ %1 System$out$println(-
(reating temp directory$$$-)& fileName * -temp-& fn * ne, File(fileName)&
fn$m"dir()& System$out$println(fileName / (fn$exists()2 -exists-. -does not
exist-))& System$out$println(-Deleting temp directory$$$-)& fn$delete()&
System$out$println(fileName / (fn$exists()2 -exists-. -does not exist-))& return& 3
System$out$println(fileName / - is a - / (fn$isFile()2 -file$- .-directory$-))& if
(fn$isDirectory()) ) String content[ * fn$list()& System$out$println(-4he content
of this directory.-)& for (int i * +& i 5 content$length& i//) )
System$out$println(content[i )& 3 3 if (0fn$canRead()) )
System$out$println(fileName / - is not readable$-)& return& 3
System$out$println(fileName / - is - / fn$length() / - bytes long$-)&
System$out$println(fileName / - is - / fn$lastModified() / - bytes long$-)&
3engenalan 3emrograman % +
J.E.N.I.

if (0fn$canWrite()) ) System$out$println(fileName / - is not ,ritable$-)& 3 3 3

12." Cla

#ea$er

9agian ini menggambarkan stream karakter yang digunakan untuk memba a.

12.".1

ethod #eader

0lass Reader terdiri atas beberapa method untuk memba a karakter. berikut ini
adalah beberapa method lass " ethod #eader public int read(6) thro,s '78xception !
ebuah method o6erload, yang mana memiliki tiga 6ersi. &emba a karakter, segala
karakter array atau sebuah porsi untuk sebuah karakter array. public int read() -
memba a sebuah karakter tunggal. public int read(char[ karakter array cbu . cbuf)-
&emba a karakter dan menyimpannya dalam

public abstract int read(char[ cbuf9 int offset9 int length)- &emba a karakter
sejumlah panjang karakter tertentu dan menyimpannya dalam karakter cbu dimulai pada
tanda o set khusus yang telah ditentukan. public abstract !oid close() thro,s
'78xception &enutup !tream ini. &emanggil method Reader yang lain setelah menutup
stream akan menyebabkan suatu IO!"ception dijalankan. public !oid mar"(int
read:head;imit) thro,s '78xception &enandai posisi tertentu pada stream. !etelah
menandai, panggil untuk melakukan reset45 kemudian stream akan men oba mengatur
posisinya kembali pada titik ini. $idak semua stream input karakter mendukung
operasi ini. public boolean mar"Supported() mengindikasikan apakah sebuah stream
mendukung operasi pemberian tanda 4mark5 atau tidak $idak didukung oleh default. !
eharusnya bersifat o6erid sub lass. public !oid reset() thro,s '78xception :eposisi
stream ke posisi akhir stream yang telah ditandai
Table 1.#.1: Reader methods

3engenalan 3emrograman %

,
J.E.N.I.

12.".2 Class Node #eader


9erikut ini adalah beberapa dasar lass Reader" Class!class Node #eader
FileReader /ntuk memba a file-file karakter. (har:rrayReader &engimplementasikan
suatu karakter buffer yang dapat diba a. StringReader /ntuk memba a dari sebuah
sumber string. <ipedReader Digunakan untuk pasangan 4dengan sebuah $ipedWriter yang
sesuai5 oleh dua urutan yang ingin berkomunikasi. !alah satu dari urutan tersebut
memba a karakter dari sumber tertentu.
Table 1.#.2: %lass-class &ode Reader %lasses

12.".3 Class!Class Filter #eader


/ntuk menambah fungsi ke lass- lass dasar Reader, Anda dapat menggunakan stream
filter. 9erikut ini adalah beberapa dari lass- lass tersebut " Class!Class Filter
#eader =ufferedReader mengi2inkan penyimpanan sementara karakteryang bertujuan
untuk menyediakan fasilitas pemba aan karakter, arrays, dan bais yang lebih
efisien. FilterReader /ntuk memba a stream karakter yang telah terfilter.
'nputStreamReader &enkon6ersi pemba aan byte ke bentuk karakter. ;ineNumberReader !
ebuah sub lass dari lass 'u eredReader yang dapat menjaga memori penyimpanan untuk
nomor baris. <ushbac"Reader !ebuah sub lass dari lass FilterReader yang
memungkinkan karakter dikembalikan atau tidak terba a oleh stream.
Table 1.#.#: %lass-class Filter Reader

lass

3engenalan 3emrograman %

-
J.E.N.I.

12.% Cla
12.$.1 %riter

-Cla
ethod

&riter

!esi ini menggambarkan stream karakter yang digunakan untuk menulis.

0lass Writer terdiri atas beberapa method untuk menulis karakter. 9erikut ini
adalah beberapa method lass " ethod %riter public !oid ,rite(6) thro,s
'78xception !ebuah method o6erloading dalam lima 6ersi" public !oid ,rite(int c) ;
&enulis sebuah karakter tunggal yang di8akili oleh pemberian nilai integer.
public !oid ,rite(char[ cbuf) ; &enulis isi dari karakter array cbu . public
abstract !oid ,rite(char[ cbuf9 int offset9 int length) ; &enulis sejumlah len(th
karakter dari aaray cbu , dimulai pada o set tertentu. public !oid ,rite(String
str) ; &enulis string strin(. public !oid ,rite(String str9 int offset9 int length)
; &enulis sejumlah len(th )ara)ter dari string str, dimulai pada o set tertentu.
public abstract !oid close() thro,s '78xception &enutup stream ini setelah
lushin( beberapa karaktr yang tidak tertulis. Invocation method lain setelah
menutup stream ini akan menyebabkan terjadinya I(E< eption. public abstract !oid
flush() &engganti stream4yaitu karakter yang disimpan dalam buffer dengan segera
ditulis ke tujuan yang dimaksud5.
Table 1.*.1: +ethod Writer

12.$.2 Node %riter Classes


9erikut ini beberapa dasar lass Writer" Node %riter Classes FileWriter /ntuk
menulis karakter ke sebuah file. (har:rrayWriter &enggunakan karakter penyangga
yang dapat dituliskan juga. StringWriter /ntuk menulis sour e string <ipedWriter

3engenalan 3emrograman %

.
J.E.N.I.

Node %riter Classes Digunakan dengan berpasangan4dengan menghubungkan $ipedReader5


oleh dua thread yang ingin berkomunikasi. !atu dari thread ini menulis karakter ke
stream ini.
&able 1.".2' Node %riter classes

12.$.3 Filter %riter Classes


/ntuk menambah fungsionalitas ke dasar lass 1riter, Anda dapat menggunakan lass
stream filter.$erdapat beberapa lass- lass" Filter %riter Classes =ufferedWriter
&enyediakan penyangga karakter bertujuan untuk menyediakan efisiensi penulisan
karakter, array, dan garis. FilterWriter /ntuk menulis stream karakter yang
difilter. 7utputStreamWriter &engkodekan karakter yang ditulis ke dalam byte.
<rintWriter &en etak representasi yang diformat dari obje t ke dala stream te<t-
output.
Table 1.*.#: Filter Writer classes

12.' C(nt() Da ar #ea$er/&riter


0ontoh penggantian menggunakan lass FileReader dan FileWriter. Dalam ontoh ini,
program memba a dari file yang khusus oleh user dan mengkopi isi dari file ke file
lain. import #a!a$io$%& class (opyFile ) !oid copy(String input9 String output) )
FileReader reader& FileWriter ,riter& int data& try ) reader * ne,
FileReader(input)& ,riter * ne, FileWriter(output)& ,hile ((data * reader$read())
0* 6>) ) ,riter$,rite(data)& 3 reader$close()& ,riter$close()& 3 catch ('78xception
ie) ) ie$printStac"4race()& 3
3engenalan 3emrograman % =
J.E.N.I.

3 public static !oid main(String args[ ) ) String inputFile * args[+ & String
outputFile * args[> & (opyFile cf * ne, (opyFile()& cf$copy(inputFile9 outputFile)&
3

0obalah program tersebut sendiri dan amatilah apa ang terjadi pada file yang
dimanipulasi.

12.* +eruba) C(nt() #ea$er/&riter


0ontoh pengganti hampir sama dengan ontoh sebelumnya tetapi lebih efisien. 1alaupun
memba a dan menulis ke stream sekali saja, karakter memba a yang pertama disimpan
dalam buffer sebelum penulisan karakter baris per baris. 3rogram menggunakan teknik
dari perangkaian stream dimana las FileReader dan FileWriter didekorasi dengan lass
'u eredReader dan 'u eredWriter, berurutan. import #a!a$io$%& class (opyFile ) !oid
copy(String input9 String output) ) =ufferedReader reader& =ufferedWriter ,riter&
String data& try ) reader * ne, =ufferedReader(ne, FileReader(input))& ,riter * ne,
=ufferedWriter(ne, FileWriter(output))& ,hile ((data * reader$read;ine()) 0*
null) ) ,riter$,rite(data9 +9 data$length())& 3 reader$close()& ,riter$close()& 3
catch ('78xception ie) ) ie$printStac"4race()& 3 3 public static !oid main(String
args[ ) ) String inputFile * args[+ & String outputFile * args[> & (opyFile cf *
ne, (opyFile()& cf$copy(inputFile9 outputFile)& 3 3 9andingkan kode ini dengan
sebelumnya. Apakah hasil dari menjalankan program ini>

3engenalan 3emrograman %

?
J.E.N.I.

12., Cla
12.(.1

InputStream

9agian ini memberikan gambaran perbedaan stream byte yang digunakan memba a.

ethod InputStream

0lass InputStream terdiri atas beberapa method untuk memba a byte. 9eberapa method
lass" ethod InputStream public int read(6) thro,s '78xception &ethod o6erloaded,
juga memiliki tiga 6ersi seperti lass :eader tersebut. public abstract int read() -
&emba a byte selanjutnya dari data dari stream ini. public int read(byte[ byta
array b'u . b=uf)- &emba a sejumlah byte dan menyimpannya dalam

public abstract int read(char[ cbuf9 int offset9 int length)- &emba a panjang
sejumlah len(th byte dan menyimpannya dalam array byte b'u dimulai dari o set
tertentu. public abstract !oid close() thro,s '78xception &enutup stream in.
&emanggil method InputStream yang lain setelah menutup streamnya akan menyebabkan
sebuah IO!"ception dijalankan. public !oid mar"(int read:head;imit) thro,s
'78xception &enandai posisi tertentu dalam stream. !etelah menandainya, panggil
untuk menjalankan fungsi reset45 akan men oba untuk mengatur posisi streamnya pada
titik tertentu kembali. $idak semua stream input-byte mendukung operasi ini. public
boolean mar"Supported() &engindikasikan apakah suatu stream mendukung operasi
pemberian tanda 4mark5 dan reset. @ang tidak didukung se ara default. !eharusnya
diubah menjadi o6eride oleh sub lass. public !oid reset() thro,s '78xception
&erubah posisi stream pada posisi akhir yang diberi tanda 4mark5
Table 1.-.1: +ethod InputStream

12.(.2 Class!Class Node InputStream


9erikut ini merupakan beberapa lass- lass dasar InputStream " Class!class Node
InputStream File'nputStream /ntuk memba a baris byte dari sebuah file
=uffered:rray'nputStream

3engenalan 3emrograman %

#A
J.E.N.I.

Class!class Node InputStream &engimplementasikan sebua penimpan sementara yang


terdiri atas data byte, yang mungkin dpat diba a dari streamnya. <iped'nputStream !
eharusnya terhubung ke sebuah $ipedOutputStream. !tream ini se ara khusus digunakan
oleh dua urutan yang didalamnya satu dari urutan tersebut memba a data dari sumber
ini sementara urutan yang lain menulis ke $ipedOutputStream tujuan.
Table 1.-.2: class-class &ode InputStream

12.(.3 Class!class Filter InputStream


/ntuk menambah fungsi ke lass dasar InputStream, Anda dapat menggunakan stream
filter. 9erikut ini adalah beberapa dari lass- lass tersebut " Class!class Filter
InputStream =uffered'nputStream !ebuah sub lass dari FilterInputStream yang
memungkinkan penyimpanan input sementara untuk menyediakan pemba aan byte yang
lebih efisien. Filter'nputStream /ntuk memba a byte stream yang telah terfilter,
yang mungkin memindahkan sour e dasar dari data sepanjang proses dan menyediakan
fungsi tambahan. 7b#ect'nputStream Digunakan untuk serialisasi obje t.
Deserialisasi obje t dan data primitif yang telah tertulis sebelumnya menggunakan
sebuahObjectOutputStream. Data'nputStream !ebuah sub lass dari FilterInputStream
yang memerintahkan sebuah aplikasi memba a data primitif Ja6a dari sebuah input
stream dasar dalam sebuah &esin yang berjalan se ara bebas4ma hine-independent
8ay5. ;ineNumber'nputStream !ebuah sub lass FilterInputStream yang memungkinkan
pemeriksaan posisi dari nomor baris tertentu. <ushbac"'nputStream !ebuah sub lass
dari lass FilterInputStream yang memungkinkan byte diproses balik atau tidak diba a
ke bentuk sreamnya.
Table 1.-.#: %lass-class Filter InputStream

lass

3engenalan 3emrograman %

##
J.E.N.I.

12.- Cla

-Cla

OutputStream

!esi ini memberikan sebuah pandangan tentang byte stream yang berbeda yang
digunakan dalam proses penulisan.

12.).1

ethod OutputStream

0lass OutputStream terdiri atas beberapa method untuk menulis data byte. 9erikut
ini adalah beberapa dari lass methodnya " ethod OutputStream public !oid ,rite(6)
thro,s '78xception !ebuah method o6erloaded untuk menulis bentuk byte ke bentuk
stream. Ada tiga 6ersi " public abstract !oid ,rite(int b) ; &enulis nilai byte
khusus b ke bentuk output stream nya. public !oid ,rite(byte[ nya. b=uf) ; &enulis
isi dari array byte b'u ke bentuk stream

public !oid ,rite(byte[ b=uf9 int offset9 int length) ; &enulis sejumlah len(th
byte dari array b'u ke bentuk streamnya, dimulai pada o set khusus ke streamnya.
public abstract !oid close() thro,s '78xception &enutup stream ini dan mengeluarkan
beberapa sumber dari sistem digabungkan dengan streamnya. 3enggunaan method lain
setelah memanggil method ini akan menyebabkan sebuahIO!"ception dijalankan. public
abstract !oid flush() &engganti stream 4sebagai ontoh, data byte tersimpan dalam
buffer akan segera ditulis dalam tujuan yang diamksud5.
Table 1...1: +ethod OutputStream

12.).2 Class!Class Node OutputStream


9erikut ini adalah beberapa dari lass dasar OutputStream " Clas!class Node
OutputStream File7utputStream /ntuk menulis byte ke sebuah file.
=uffered:rray7utputStream &engimplementasikan sebuah penyimpan sementara berupa
byte, yang mana mungkin akan dituliskan ke bentuk streamnya. <iped7utputStream

3engenalan 3emrograman %

#%
J.E.N.I.

Clas!class Node OutputStream !eharusnya tersambung ke sebuah $ipedInputStream. !


tream ini se ara khusus digunakan oleh dua urutan dimana didalamnya satu dari
urutan tersebut menulis data ke bentuk streamnya sementara urutan yang lain memba a
dari $ipedInputStream tujuan.
Table 1...2: %lass-class &ode OutputStream

12.).3 Class!Class Filter OutputStream


/ntuk menambah fungsi ke lass dasar OutputStream, Anda dapat menggunakan lass
stream filter.berikut ini beberapa dari lass tersebut " Class!Class Filter
OutputStream =uffered7utputStream !ebuah sub lass dari FilterOutputStream yang
memungkinkan penyimpanan output sementara untuk proses penulisan byte yang lebih
efisien. &emungkinkan penulisan byte ke bentuk dasar output stream tanpa
menyebabkan diperlukannya pemanggilan dasar sistem untuk setiap penulisan byte.
Filter7utputStream /ntuk menulis stream byte yang telah difilter, yang mana mungkin
dipindahkan ke sour e dasar dari data sepanjang proses dan menyediakan fungsi
tambahan. 7b#ect7utputStream Digunakan untuk serialisasi obje t. !erialisasi obje t
dan data primitif untuk sebuah OutputStream. Data7utputStream !ebuah sub lass dari
FilterOutputStream yang menjalankan aplikasi penulisan data primitif ke output
stream dasar ke dalam sebuah mesin yang bebas berjalan 4ma hineindependent 8ay5.
<rintStream !ebuah sub lass dari FilterOutputStream yang menyediakan kemampuan
untuk men etak representasi dari nilai data yang berma am-ma am dengan tepat.
Table 1...#: %lass-%lass Filter OutputStream

3engenalan 3emrograman %

#)
J.E.N.I.

12.1. C(nt() Da ar InputStream/OutputStream


0ontoh berikut ini menggunakan lass FileInputStream dan FileOutputStream untuk
memba a dari sebuah file khusus dan meng opy isi dari file ini ke file yang lain.
import #a!a$io$%& class (opyFile ) !oid copy(String input9 String output) )
File'nputStream inputStr& File7utputStream outputStr& int data& try ) inputStr *
ne, File'nputStream(input)& outputStr * ne, File7utputStream(output)& ,hile ((data
* inputStr$read()) 0* 6>) ) outputStr$,rite(data)& 3 inputStr$close()&
outputStr$close()& 3 catch ('78xception ie) ) ie$printStac"4race()& 3 3 public
static !oid main(String args[ ) ) String inputFile * args[+ & String outputFile *
args[> & (opyFile cf * ne, (opyFile()& cf$copy(inputFile9 outputFile)& 3

3engenalan 3emrograman %

#+
J.E.N.I.

12.11 C(nt() +($i/ika i InputStream/OutputStream


0ontoh berikutnya menggunakan lass $ushbac)InputStream yang memanfaatkan sebuah
obje t FileInputStream dan lass $rintStream. import #a!a$io$%& class (opyFile ) !
oid copy(String input) ) <ushbac"'nputStream inputStr& <rintStream outputStr& int
data& try ) inputStr * ne, <ushbac"'nputStream(ne, File'nputStream(input))&
outputStr * ne, <rintStream(System$out)& ,hile ((data * inputStr$read()) 0* 6>) )
outputStr$println(-read data. - / (char) data)& inputStr$unread(data)& data *
inputStr$read()& outputStr$println(-unread data. - / (char) data)& 3
inputStr$close()& outputStr$close()& 3 catch ('78xception ie) )
ie$printStac"4race()& 3 3 public static !oid main(String args[ ) ) String inputFile
* args[+ & (opyFile cf * ne, (opyFile()& cf$copy(inputFile)& 3

/ji kode ini pada sebuah file yang mengandung sedikit baris atau karakter.

3engenalan 3emrograman %

#,
J.E.N.I.

12.12 Seriali a i
Ja6a Birtual &a hine 4JB&5 mendukung kemampuan untuk memba a atau menulis sebuah
obje t ke bentuk stream. kemampuan ini disebut dengan serialisasi, proses
CflatteningC sebuah obje t sehinnga data tersebut dapat disimpan ke beberapa
penyimpanan permanen atau dile8atkan ke obje t lain melalui lass OutputStream.
Ketika menulis sebuah obje t, ini merupakan hal yang penting bah8a keadaan tersebut
sudah tertulis dan telah diserialisasi dari setiap obje tnya dapat dibangun kembali
sebagaimana dtaa tersebut diba a. &enyimpan sebuah obje tke beberapa tipe
penyimpanan permanen yang dikenal sebagai persisten e. !tream yang digunakan untuk
deserialisasi dan serialisasi se ara berurutan adalah lass ObjectInputStream dan
ObjectOutputStream . /ntuk memungkinkan sebuah obje t diserialisasi 4sebagai ontoh
dapat disimpan dan diurutkan5, 0lass tersebut harus mengimplementasikan interfa e
yang dapat diserialisasi. 0lass ini seharusnya juga menyediakan default onstru tor
atau sebuah onstru tor tanpa argumen. !atu hal yang baik mengenai kemampuan untuk
melakukan serialisasiyang dapat diturunkan, yang berarti kita tidak memiliki
implementasi serialisasi pada setiap lass. Ini berarti mengurangi pekrjaan untuk
programmer. Anda hanya dapat mengimplementasikan serialisasi sekali sepanjang
hirarki lass.

12.12.1 Kata Kunci transient


Ketika suatu obje t diserialisasi, tempat hanya disediakan untuk data obje t.
&ethod dan 0onstru tor bukan merupakan bagian dari stream serialisasi. Ada beberapa
obje t yang tidak diserialisasi kaena data yang di8akilinya berubah se ara konstan.
9eberapa ontoh dari setiap obje t adalah obje t FileInputStream dan (bje t
Thread. !ebuah &otSeriali/able!"ception dijalankan jika operasi serialisasi gagal
karena beberapa alasan. Jangan berputus asa. !ebuah lass yang mengandung obje t
yang tidak diserialisasi dapat tetap diserialisasi jika penunjuk ke obje t non-
serialisasi ditandai dengan katakun i transient. 3ertimbangkan ontoh berikut ini "
class My(lass implements Seriali?able ) transient 4hread thread& 11try remo!ing
transient int data& 1% beberapa data yang lain%1 3 Kata kun i transient men agah
data dari proses serialisasi. (bje t instantiasi dari lass ini sekarang dapat
ditulis ke sebuah OutputStream.

12.12.2 Serialisasi'

enulis Suatu Ob*ect Stream

/ntuk menulis obje t ke sebuah stream, Anda perlu menggunakan


lassObjectOutputStream lass dan methodnya yaitu method 0riteObject. &ethod
0riteObject memiliki tanda sebagai berikut " public final !oid ,rite7b#ect(7b#ect
ob#) thro,s '78xception dimana obj adalah obje t yang ditulis ke stream.
3engenalan 3emrograman % #-
J.E.N.I.

0ontoh diba8ah ini menuliskan sebuah obje t 'oolean ke sebuah ObjectOutputStream.


0lass 'oolean mengimplementasikan interfa e yang dapat di Serialisasi. !elanjutnya,
Instantiasi obje t dari lass ini dapat ditulis ke dan diba a dari sebuah stream.
import #a!a$io$%& public class Seriali?e=oolean ) Seriali?e=oolean() ) =oolean
booleanData * ne, =oolean(-true-)& try ) File7utputStream fos * ne,
File7utputStream(-boolean$ser-)& 7b#ect7utputStream oos * ne,
7b#ect7utputStream(fos)& oos$,rite7b#ect(booleanData)& oos$close()& 3 catch
('78xception ie) ) ie$printStac"4race()& 3 3 public static !oid main(String args[ )
) Seriali?e=oolean sb * ne, Seriali?e=oolean()& 3

12.12.3 +eserialisasi'

embaca Sebuah Ob*ect Stream

/ntuk memba a sebuah obje t dari sebuah stream, Anda perlu menggunakan lass
ObjectInputStream dan methodnya yaitu method readObject. &ethod readObject memiliki
tanda sebagai berikut " public final 7b#ect read7b#ect() thro,s '78xception9
(lassNotFound8xception dimana 8here obj adalah obje t yang diba a dari stream. tipe
Object dikembalikan harus melalui proses type ast ke nama lass yang sesuai sebelum
method pada lass tersebut dapat dieksekusi. 0ontoh diba8ah ini memba a sebuah obje
t 'oolean dari sebuah ObjectInputStream. Ini merupakan kesinambungan dari ontoh
sebelumnya pada serialisasi. import #a!a$io$%& public class @nseriali?e=oolean )
@nseriali?e=oolean() ) =oolean booleanData * null& try ) File'nputStream fis * ne,
File'nputStream(-boolean$ser-)& 7b#ect'nputStream ois * ne, 7b#ect'nputStream(fis)&
booleanData * (=oolean) ois$read7b#ect()& ois$close()& 3 catch (8xception e) )
3engenalan 3emrograman % #.
J.E.N.I.

e$printStac"4race()& 3 System$out$println(-@nseriali?ed =oolean from - /


-boolean$ser-)& System$out$println(-=oolean data. - / booleanData)&
System$out$println(-(ompare data ,ith true. - / booleanData$eAuals(ne, =oolean(-
true-)))& 3 public static !oid main(String args[ ) ) @nseriali?e=oolean usb * ne,
@nseriali?e=oolean()& 3

12.13 Lati)an
12.13.1 ,nkripsi Sederhana
9a a dari sebuah file khusus oleh user dan en rypt isi file menggunakan teknik
penggeseran yang sederhana. Juga, tanyakan pada user untuk menginput ukuran
pergeseran. (utput dari pesan yang telah di en rypt pada file yang lain yang
memiliki nama yang juga dibuat oleh user sendiri. !ebagai ontoh, /kuran pergeseran"
# 3esan yang diba a dari file" Dello 3esan ter-en rypt" Ifmmp

3engenalan 3emrograman %

#=
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. odul ini mengenalkan !nda konsep dasar mengenai Java
generic types. "etelah melengkapi pembahasan ini# anda harus dapat $ %.
engapresiasikan keuntungan dari generic types &. endeklarasikan class generic '.
enggunakan constrained generics (. endeklarasikan method generic

13.2 Mengapa Generics?


"atu dari penyebab adanya bugs yang paling signifikan dalam Bahasa pemrograman Java
adalah keperluan akan pernyataan typecast atau do)ncast untuk lebih mengkhususkan
tipe data dari tipe staticnya secara terus-menerus. "ebagai contoh# "ebuah ob*ect
arraylist memungkinkan kita untuk menambahkan beberapa referensi tipe ob*ect pada
list tapi ketika kita mendapatkan kembali elemet ini # kita perlu untuk typecast
ob*ect ke tipe referensi khusus yang sesuai dengan keperluan kita. +o)ncasting
adalah hotspot yang potensial untuk ClassCastException. ,ang *uga membuat kode kita
men*adi lebih pan*ang# *adi# men*adi lebih sedikit dapat terbaca. -ebih dari itu#
do)ncasting *uga efektif merusak manfaat dari sebuah kekuatan bahasa yang
diketikkan se*ak dia menghapuskan keamanan yang disediakan perusahaan berupa
pemeriksaan tipe.type checking/. 0u*uan utama dari penambahan generics pada Java
adalah untuk memecahkan masalah ini. tipe 1eneric memungkinkan subuah single class
untuk beker*a dengan pilihan tipe yang beraneka ragam. Ini adalah *alan yang alami
untuk mengeliminasi keperluan untuk pemilihan .casting/. ari pertama-tama
mempertimbangkan sebuah ob*ect ArrayList dan lihat bagaimana type generic akan
membantu dalam peningkatan kode kita. "eperti yang sudah !nda ketahui# sebuah
ob*ect arraylist memiliki kemampuan untuk menyimpan elemen-elemen dari beberapa
tipe referensi untuk list ini. "ebuah instance arraylist# bagaimanapun# selalu
memaksa kita untuk men-do)ncast ob*ect-ob*ect kita membantu mendapatkan kembali
dari list. 2ertimbangkan pernyataan berikut $ String myString = (String)
myArrayList.get(0); 3ersi generic dari class ArrayList didesain untuk beker*a
secara asli dengan beberapa tipe class. "ama seperti# dia *uga mempertahankan
manfaat dari pengecekan tipe .type
2engenalan 2emrograman & %
J.E.N.I.

checking/. 4ita dapat melan*utkannya dengan keperluan memiliki typecast elemen yang
kita dapatkan dari list dan memiliki pernyataan berikut terhadap pernyataan
sebelumnya $ String myString = myArrayList.get(0); 5alaupun do)ncasting sudah
terhapus# ini bukan berarti bah)a !nda dapat menandai segala sesuatu sebagai return
value dari method get dan melan*utkannya dengan typecasting semuanya. Jika !nda
menandai sesuatu yang lain disamping sebuah String untuk output dari method get# !
nda akan menghadapi sebuah )aktu mengcompile type tidak sesuai seperti pesan
berikut ini $ found: java.lang.String required: java.lang.Integer Integer data =
myArrayList.get(0); 6ntuk !nda agar hanya memiliki ide bagaimana type-type generic
digunakan sebelum materi ini digali lebih dalam# pertimbangkan potongan kode
berikut ini $ ArrayList <String genArrList = ne! ArrayList <String ();
genArrList.add("A generi# string"); String myString = genArrList.get(0); $o
%tion&ane.s'o!(essage)ialog(t'is* myString); !matilah melalui pernyataan# anda
mungkin mengamati kata <String> segera terlihat setelah referensi tipe data
arraylist. !nda dapat mener*emahkan pernyataan pertama sebagai instantiasi sebuah
versi generic dari class ArrayList dan versi generic ini terdiri dari ob*ect-ob*ect
dari tipe String. genArrList adalah batas dari tipe String. 7leh sebab itu#
mengikat sebuah Integer atau beberapa tipe lain bukan "tring untuk hasil dari get
function akan men*adi illegal. 2ernyataan berikut ini adalah illegal. int myInt =
genArrList.get();

13.3 Mendeklarasikan sebuah Class Generic


6ntuk men*alankan potongan code sebelumnya# kita harus sudah mendefinisikan versi
generic dari class ArrayList. 6ntungnya# versi *ava terbaru sudah menyediakan user
dengan versi generic dari semua class-class Java Collection. 2ada sesi ini# !nda
akan mempela*ari bagaimana untuk mendeklarasikan class generic anda sendiri.
+ripada berdiskusi lebihpan*ang lagi tentang bagaimana untuk mendeklarasikan sebuah
class generic # anda akan diberikan sebuah contoh sederhana tentang class generic
untuk dipela*ari bentuknya. #lass +asi#,eneri# <A %rivate A data; %u.li#
+asi#,eneri#(A data) t'is.data = data; / %u.li# A get)ata() return data; / /

2engenalan 2emrograman &

&
J.E.N.I.

%u.li# #lass ,enSam%le %u.li# String met'od(String in%ut) String data0 = in%ut;
+asi#,eneri# <String .asi#,eneri# = ne! +asi#,eneri# <String (data0); String data1
= .asi#,eneri#.get)ata(); return data1; / %u.li# Integer met'od(int in%ut) Integer
data0 = ne! Integer(in%ut); +asi#,eneri# <Integer .asi#,eneri# = ne! +asi#,eneri#
<Integer (data0); Integer data1 = .asi#,eneri#.get)ata(); return data1; / %u.li#
stati# void main(String args23) ,enSam%le sam%le = ne! ,enSam%le(); System.out.
%rintln(sam%le.met'od("Some generi# data")); System.out.%rintln(sam
%le.met'od(0145)); / /

"ekarang mari kita melalui bagian dari kode yang menggunakan syntax untuk type
generic. 6ntuk deklarasi dari class BasicGeneric# #lass +asi#,eneri# <A nama class
diikuti oleh sepasang kurung yang didalamnya terdapat huruf kapital A$ <A>. Ini
disebut dengan sebuah parameter tipe. 2enggunaan kurung ini mengindikasikan bah)a
class yang dideklarasikan adalah class generic. Ini berarti bah)a class tidak
beker*a dengan beberapa type referensi khusus. kemudian# amati bah)a sebuah field
dari class dideklarasikan men*adi tipe ! %rivate A data; +eklarasi ini
mengelompokkan bah)a field data adalah dari tipe generic# tergantung pada tipe data
yang telah didesain untuk beker*a dengan ob*ect BasicGeneric. 4etika
mendeklarasikan sebuah instance dari class# anda harus mengelompokkan tipe
referensi dengan yang mana yang anda inginkan untuk beker*a sama. +asi#,eneri#
<String .asi#,eneri# = ne! +asi#,eneri# <String (data0);

"yntax <String> setelah mendeklarasi BasicGeneric mengelompokkan bah)a instance


dari class ini akan beker*a dengan variabel-variabel bertipe String. !nda *uga
dapat beker*a denga variabel-variabel bertipe Integer atau referensi tipe yang
lain. 6ntuk bekr*a dengan Integer# potongan kode memiliki pernyataan berikut ini $
+asi#,eneri# <Integer .asi#,eneri# = ne! +asi#,eneri# <Integer (data0);
'

2engenalan 2emrograman &


J.E.N.I.

!nda mungkin dapat mener*emahkan sisa dari kode dengan pemahaman anda sendiri.
empertimbangkan deklarasi dari method getData . %u.li# A get)ata() return data; /
ethod getData mengembalikan sebuah nilai dari tipe A# "ebuah 0ipe type. Ini bukan
berarti bah)a method tidak akan memiliki tipe data runtime# atau even pada )aktu
meng-compile. "etelah !nda mendeklarasikan sebuah ob*ect yang bertipe BasicGeneric#
A adalah pengikat ke sebuah tipe data yang spesifik. Instance ini akan berlaku
sebagai *ika ini dideklarasikan untuk memiliki tipe data spesifik ini dan tipe ini
hanya dari bagian sangat a)al. 2ada kode yang diberikan# dua instances dari class
BasicGeneric terbentuk. +asi#,eneri# <String .asi#,eneri# = ne! +asi#,eneri#
<String>(data0); String data1 = .asi#,eneri#.get)ata(); +asi#,eneri# <Integer
.asi#,eneri# = ne! +asi#,eneri# <Integer>(data0); Integer data1 =
.asi#,eneri#.get)ata(); 2erlu diperhatikan perhatian bah)a instantiasi dari class
generic adalah hanya sama dengan instantiasi sebuah class normal kecuali bah)a tipe
data khusus berada dalam <> menggantikan nama konstruktor. Informasi tambahan ini
mengindikasikan tipe dari data anda akan beker*a dengan siapa untuk bagian instance
ini dari class BasicGeneric."etelah instantiasi# anda dapat mengakses anggota dari
class melalui instance sekarang. 0idak ada yang lebih diperlukan untuk typecast
nilai pengembalian dari method getData se*ak diputuskan bah)a ini akan beker*a
dengan sebuah referensi tipe data yang spesifik.

13.3.1 Pembatasan"Primitive"
"ebuah pembatasan type generic dalam Java adalah mereka dibatasi oleh tipe
referensi dan tidak akan beker*a dengan tipe data primitive. "ebagai contoh#
pernyataan berikut akan men*adi illegal se*ak int adalah sebuah tipe data
primitive. +asi#,eneri# <int .asi#,eneri# = ne! +asi#,eneri# <int (data0);

2etama-tama !nda akan menyelesaikan type primitive sebelum menggunakan mereka


sebagai arguments ke sebuah type generic.

13.3.2 Meng-compilasi Generics


6ntuk meng-compile source codes Java denagn type generic menggunakan J+4 .v.
%.8.9/# gunakan syntax berikut ini $

2engenalan 2emrograman &

(
J.E.N.I.

java# 6version 6sour#e "0.7" 6sour#e%at' sr# 6d #lasses sr#8S!a%9lass.java +imana


src mengarah pada lokasi dari source code *ava sementara class mengarah pada lokasi
dimana file class akan disimpan. Beriut ini sebuah contoh $ java# 6version 6sour#e
"0.7" 6sour#e%at' #::tem% 6d #::tem% #:8tem%8S!a%9lass.java

13.4 Constrained Generics


+alam contoh yang diberikan terdahulu# type parameter dari class BasicGeneric dapat
memiliki beberapa referensi tipe data. !da beberapa kasus# bagaimanapun# dimana
anda ingin untuk membatasi tipe instantiasi yang potensial dari class generic. Java
*uga memungkinkan kita untuk membatasi set argument type yang mungkin untuk
subtypes dari sebuah batas type yang diberikan. "ebagai contoh# kita mungkin ingin
untuk mendefinisikan sebuah class generic ScrollPane yang merupakan sebuah template
untuk sebuah Container asli yang telah dilengkapi dengan fungsi scrolling. 0ipe
runtime dari sebuah instance dari class ini akan sering men*adi sebuah subclass
dari Container# tapi tipe static atau general adalah Container yang lebih
sederhana. 6ntuk membatasi instantiasi tipe dari sebuah class# kita menggunakan
kata kunci extends diikuti oleh class yang membatasi tipe generic sebagai bagian
dari tipe parameter. :ontoh berikut ini membatasi instantiasi tipe dari class
ScrollPane ke subtipe dari class Container. #lass S#roll&ane <(y&ane e;tends
9ontainer ... / -

#lass <estS#roll&ane %u.li# stati# void main(String args23) S#roll&ane <&anel


s#roll&ane0 = ne! S#roll&ane <&anel (); 88 %ernyataan .eri=utnya adala' illegal
S#roll&ane <+utton s#roll&ane1 = ne! S#roll&ane <+utton (); / / Instantiasi dari
scrollPane1 bernilai valid se*ak Panel men*adi sebuah subclass dari class Container
sedangkan kreasi dari scrollPane2 akan menyebabkan munculnya compile time error
se*ak B tton bukan merupakan sebuah subclass dari Container. menggunakan generic
constrained yang dapat memberikan kita penambahan pengecekan tipe static. "ebagai
sebuah hasil# kita akan men*amin bah)a setiap
2engenalan 2emrograman & 8
J.E.N.I.

instantiasi dari tipe generic yang melekat pada batas yang kita miliki. "e*ak kita
yakin bah)a setiap tipe instantiasi adalah sebuah subclass dari batas yang
dimiliki# kita dapat memanggil beberapa method secara aman yang ditemukan dalam
ob*ek static tipe. Jika kita belum menempatkan beberapa batas eksplisit pada
parameternya# default batas adalah !"#ect. Ini berarti bah)a kita tidak dapat
men*alankan method pada sebuah instance dari batas yang tidak ditampilkan dalam
class !"#ect.

13.

Mendeklarasikan sebuah Method Generic

+isamping mendeklarasikan sebuah class generic# Java *uga memberi kita perlakuan
khusus untuk mendeklarasikan sebuah method generic. ini disebut dengan method
polymorphic# yang mana didefinisikan men*adi 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. "ebagai contoh# !ndaikata kita menginginkan untuk menambahkan sebuah method
$a%e untuk sebuah class ArrayList. ethod static ini akan diambil dalam sebuah
argument tunggal# yang mana akan men*adi satu-satunya elemen dari ob*ect ArrayList.
6ntuk membuat generic ArrayList kita# sebagai penampung beberapa tipe elemen#
argumen tunggal dalam method $a%e harus memiliki sebuah tipe generic sebagai sebuah
argumen dan sebagai sebuah tipe nilai kembalian. 6ntuk mendeklarasikan tipe generic
pada level method# pertimbangkan contoh berikut ini $ #lass >tilities 8? < se#ara
im%lisit e;tends ter'ada% @.je#t ?8 %u.li# stati# << ArrayList<< ma=e(< first)
return ne! ArrayList<< (first); / / Java *uga menggunakan sebuah mekanisme type-
inference untuk secara otomatis menyimpulkan tipe method polymorphic berdasarkan
pada tipe-tipe argumennya. Ini mengurangi pan*ang dan kompleksitas dari sebuah alur
untuk men*alankan suatu method. 6ntuk membangun sebuah instance baru dari
ArrayList<Integer># kita mempunyai cara yang cukup sederhana yaitu pernyataan
berikut $ >tilities.ma=e(Integer(0));

2engenalan 2emrograman &

;
J.E.N.I.

13.! "atihan
13.6.1 Swapping
embentuk sebuah class dengan sebuah versi generic dari method print"&apped. ethod
ini menukar secara sederhana nilai dari parameternya secara lokal dan mencetak
nilainya. :atatan bah)a pencetakan harus dilakukan pada method ini. encetak nilai
dari argument dalam method lain tidak akan beker*a karena Java mele)atkan ob*ect ke
method melalui suatu nilai. 6*i method ini pada ob*ect Integer' ob*ect String dan
ob*ect ArrayList.

2engenalan 2emrograman &

<

Anda mungkin juga menyukai