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.
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 :
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.1 HARDWARE
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 Volatil (informasi ada selama komputer bekerja. Ketika komputer
dipadamkan, informasi yang disimpannya juga hilang)
o Berkecepatan tinggi
o Akses random (acak)
b. Secondary Memory
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.
1.3.2 Software
Pengenalan Pemrograman 1 3
J.E.N.I.
Tanpa ada sistem operasi maka komputer tidak dapat difungsikan sama sekali.
4. Program Paket
Merupakan program yang dikembangkan untuk kebutuhan umum, seperti :
o Pengolah kata /editor naskah : Wordstar, MS Word, Word Perfect, AmiPro
o Pengolah angka / lembar kerja : Lotus123, MS Excell, QuattroPro, dll
o Presentasi : MS PowerPoint
o 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.
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.
Pengenalan Pemrograman 1 4
J.E.N.I.
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
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.
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.
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.
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.
”Buatlah sebuah program yang akan menampilkan berapa kali sebuah nama
tampil pada sebuah daftar”
Setelah sebuah permasalahan terdefinisi secara memadai, langkah paling ringkas dan
efisien dalam penyelesaian harus dirumuskan.
Contoh masalah :
Menampilkan jumlah kemunculan sebuah nama pada daftar
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.
Pengenalan Pemrograman 1 6
J.E.N.I.
Pengenalan Pemrograman 1 7
J.E.N.I.
Flowchart adalah representasi grafis dari langkah – langkah yang harus diikuti dalam
menyelesaikan suatu permasalahan yang terdiri atas sekumpulan simbol, dimana
masing – masing simbol merepresentasikan kegiatan tertentu. Flowchart diawali dengan
penerimaan input dan diakhiri dengan penampilan output.
Berikut ini akan dibahas tentang simbol – simbol yang digunakan dalam menyusun
flowchart, kegiatan yang diwakili serta aturan yang diterapkan dalam penggunaan
simbol tersebut :
Pengenalan Pemrograman 1 8
J.E.N.I.
Pengenalan Pemrograman 1 9
J.E.N.I.
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.
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.
Pengenalan Pemrograman 1 10
J.E.N.I.
Bilangan dapat disajikan dalam beberapa cara. Cara penyajiannya tergantung pada Basis
(BASE) bilangan tersebut. Terdapat 4 cara utama dalam penyajian bilangan.
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
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
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 0 1 2 3 4 5 6 7 8 9 A B C D E F
1.6.5 Konversi
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
Pengenalan Pemrograman 1 12
J.E.N.I.
Dengan menuliskan nilai sisa mulai dari bawah ke atas, didapatkan angka biner
11111102.
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.
12610 = ? 8
Dengan menuliskan nilai sisa dari bawah ke atas, kita peroleh bilangan oktal 1768
Pengenalan Pemrograman 1 13
J.E.N.I.
12610 = ? 16
Dengan menuliskan nilai sisa dari bawah ke atas, kita peroleh bilangan Heksadesimal
7E16
Konversi bilangan Oktal dan Heksadesimal sama dengan konversi bilangan Biner ke
Desimal. Perbedaanya hanya terdapat pada penggunaan angka basis. Jika sistem Biner
menggunakan basis 2, maka pada bilangan Oktal, basis yang digunakan adalah 8 dan
pada bilangan Heksadesimal adalah angka 16.
1768 = ? 10
Posisi 2 1 0
Octal Digits 1 7 6
6 x 80 = 6
7 x 81 = 56
1 x 82 = 64
TOTAL: 126
Pengenalan Pemrograman 1 14
J.E.N.I.
7E16 = ? 10
Posisi 1 0
Digit Heksadesimal 7 E
14 x 160 = 14
7 x 161 = 112
TOTAL: 126
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 :
Pengenalan Pemrograman 1 15
J.E.N.I.
Sebagai contoh :
11111102 = ? 8
0 0 1 1 1 1 1 1 0
1 7 6
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
1 7 6
0 0 1 1 1 1 1 1 0
Pengenalan Pemrograman 1 16
J.E.N.I.
Sebagai contoh :
11111102 = ? 16
0 1 1 1 1 1 1 0
7 E
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 = ? 2
7 E
0 1 1 1 1 1 1 0
Pengenalan Pemrograman 1 17
J.E.N.I.
1.7 Latihan
1. Memasak Roti
2. Menggunakan Komputer di Laboratorium
3. Menghitung rata – rata dari 3 buah bilangan
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 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.
3HQJHQDODQ3HPURJUDPDQ
19
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.
Pengenalan Pemrograman 1 20
J.E.N.I.
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.
Aplikasi dengan teknologi Java secara umum adalah aplikasi serbt a guna yang dapat
dijalankan pada seluruh mesin yang memiliki Java Runtime Environment (JRE).
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
21
J.E.N.I.
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.
3. Terdistribusi (Distributed)
Java dibuat untuk membuat aplikasi terdistribusi secara mudah dengan adanya
libraries networking yang terintegrasi pada Java.
4. 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.
5. Robust
Java mempuyai reliabilitas yang tinggi. Compiler pada Java mempunyai
kemampuan mendeteksi error secara lebih teliti dibandingkan bahasa
pemrograman lain. Java mempunyai runtime-Exception handling untuk
membantu mengatasi error pada pemrograman.
6. 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.
7. Architecture Neutral
Program Java merupakan platform independent. Program cukup mempunyai
satu buah versi yang dapat dijalankan pada platform berbeda dengan Java
Virtual Machine.
8. Portable
Source code maupun program Java dapat dengan mudah dibawa ke platform
yang berbeda-beda tanpa harus dikompilasi ulang.
9. Performance
Performance pada Java sering dikatakan kurang tinggi. Namun performance
Java dapat ditingkatkan menggunakan kompilasi Java lain seperti buatan
Pengenalan Pemrograman 1
22
J.E.N.I.
10. Multithreaded
Java mempunyai kemampuan untuk membuat suatu program yang dapat
melakukan beberapa pekerjaan secara sekaligus dan simultan.
11. 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.
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.
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
23
J.E.N.I.
Pengenalan Pemrograman 1
24
J.E.N.I.
Gambar dibawah ini menjelaskan aliran proses kompilasi dan eksekusi sebuah
program 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.
Pengenalan Pemrograman 1
25
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. Terdapat 2 cara dalam melakukannya, yang pertama
menggunakan console dan text editor. Sedangkan cara kedua adalah dengan
menggunakan NetBeans yang merupakan Integrated Development Environment
atau yang disebut IDE.
3.2 Pendahuluan
IDE adalah sebuah peralatan dalam pemrograman yang diintegrasikan kedalam aplikasi
software yang mendukung pembangunan GUI, text atau penulisan kode, compiler dan
debugger.
Sebelum membahas lebih detail, pada awalnya akan kita lihat program Java pertama
yang akan anda tulis.
}
}
Pengenalan Pemrograman I 1
J.E.N.I.
Sebelum menjelaskan apa arti dari program tersebut, cobalah untuk menulis program
ini didalam file dan kemudian menjalankannya.
Pengenalan Pemrograman I 2
J.E.N.I.
Pengenalan Pemrograman I 3
J.E.N.I.
Program ini akan disimpan dalam file yang bernama ''Hello.java'', dan disimpan dalam
sebuah folder yang bernama MYJAVAPROGRAMS.
Untuk membuka Save dialog box, klik pada File menu yang terdapat pada menubar dan
kemudian klik save.
Setelah melakukan instruksi tersebut, dialog box akan tampil seperti gambar dibawah
ini.
Pengenalan Pemrograman I 4
J.E.N.I.
Pengenalan Pemrograman I 5
J.E.N.I.
Saat ini, dalam pilihan textbox, ketiklah nama file dari program anda, yaitu ''Hello.java'',
kemudian klik pada tombol SAVE.
Pengenalan Pemrograman I 6
J.E.N.I.
Sekarang anda telah menyimpan file anda, ingatlah cara bagaimana nama frame dapat
berubah dari ''Untitled Document 1 (modified) – gedit'' menjadi "Hello.java
(~/MYJAVAPROGRAMS) – gedit". Jika anda ingin melakukan perubahan pada file anda,
anda hanya perlu mengeditnya, kemudian menyimpannya kembali dengan mengklik
pada File->Save.
Pengenalan Pemrograman I 7
J.E.N.I.
Ketika anda membuka terminal window, terminal tersebut menampilkan window yang
disebut sebagai home folder Anda. Untuk melihat isi dari folder tersebut, ketik ls dan
kemudian tekan ENTER. Apa yang akan anda temukan adalah daftar file-file dan folder
didalamnya.
Disinilah Anda dapat melihat folder dengan nama "MYJAVAPROGRAMS" yang telah kita
buat sebelumnya, dan merupakan tempat dimana kita menyimpan program Hello.java
kita. Kemudian masuklah kedalam direktori tersebut.
Pengenalan Pemrograman I 8
J.E.N.I.
Setelah berada didalam folder yang berisi program Java Anda, sudah saatnya untuk
memulai meng-compile program Java tersebut. Sebagai catatan, bahwa file yang Anda
maksud harus ada didalam folder yang Anda pilih. Periksalah dengan menjalankan
perintah ''ls'' lagi untuk melihat bahwa file Anda ada didalam folder tersebut.
Untuk meng-compile program Java, gunakanlah perintah : javac [filename]. Dalam hal
ini, Anda mengetikan perintah : javac Hello.Java.
Pengenalan Pemrograman I 9
J.E.N.I.
Untuk menjalankan program Java Anda, dengan mengetikan perintah : java [filename
without the extension], maka dalam hal ini, Anda mengetikkan perintah : java Hello.
Sekarang Anda dapat melihat dilayar bahwa anda telah menjalankan program Java
pertama Anda, yang menampilkan pesan, ''Hello world!''.
Pengenalan Pemrograman I 10
J.E.N.I.
3.4.1 Errors
Apa yang telah ditunjukan sejauh ini adalah program Java dimana kita tidak menemukan
berbagai masalah dalam proses compiling maupun pada saat menjalankannya.
Bagaimanapun juga, hal ini tidak selalu terjadi. Seperti yang telah kita diskusikan pada
bagian pertama dari latihan ini, biasanya kita juga akan menemukan permasalahan
selama proses berlangsung.
Seperti yang telah didiskusikan sebelumnya, ada 2 macam error. Pertama adalah
compile-time error atau yang disebut juga sebagai syntax error. Kedua adalah runtime
errors.
Kesalahan umum lainnya adalah dalam kapitalisasi, ejaan, penggunaan dari karakter
khusus yang tidak benar, dan penghilangan dari pemberian tanda baca yang
sebenarnya.
Mari kita mengambil contoh, pada program Hello.java kita, dimana dengan sengaja kita
hilangkan titik-koma pada akhir pernyataan dan juga mencoba untuk mengetikkan ejaan
yang salah pada sebuah perintah.
Pengenalan Pemrograman I 11
J.E.N.I.
Pesan error yang kedua memberitahukan bahwa pada program tersebut kehilangan titik-
koma setelah pernyataan anda.
Jika anda menemukan banyak pesan error, cobalah untuk mengoreksi kesalahan yang
pertama pada daftar error satu per satu, dan mencoba untuk meng-compile-nya
kembali. Dengan melakukan hal tersebut maka, dapat mengurangi total error yang ada.
Pengenalan Pemrograman I 12
J.E.N.I.
Pada bagian pelajaran ini, kita akan menggunakan NetBeans, yang merupakan
Integrated Development Environment atau IDE. Suatu IDE adalah lingkupan
pemrograman yang mengintegrasikan kedalam suatu aplikasi perangkat lunak yang
menyediakan pembangun GUI, suatu text atau kode editor, suatu compiler atau
enterpreter dan suatu debugger.
Langkah 1 : NetBeans
Ada dua cara untuk menjalankan NetBeans. Pertama menulis perintah menggunakan
terminal, atau hanya dengan mengklik pada tombol shortcut yang dapat ditemukan di
desktop.
Pengenalan Pemrograman I 13
J.E.N.I.
Cara kedua untuk menjalankan NetBeans, adalah dengan mengklik shortcut icon yang
terdapat pada desktop Anda.
Pengenalan Pemrograman I 14
J.E.N.I.
Setelah Anda membuka NetBeans IDE, Anda akan melihat graphical user interface (GUI)
seperti yang ditunjukkan dibawah ini.
Pengenalan Pemrograman I 15
J.E.N.I.
Pengenalan Pemrograman I 16
J.E.N.I.
Pengenalan Pemrograman I 17
J.E.N.I.
Cobalah untuk mengubah lokasi aplikasi, dengan mengklik pada tombol BROWSE.
Kemudian dialog lokasi project akan muncul. Klik dua kali pada home folder Anda.
Kemudian isi dari folder root akan ditampilkan. Lalu klik dua kali pada folder
MYJAVAPROGRAMS dan klik tombol OPEN.
Pengenalan Pemrograman I 18
J.E.N.I.
Yang terakhir, pada textfield Create Main Class, tulislah Hello sebagai nama kelas
utama, dan kemudian klik tombol FINISH.
Gambar 18: Window setelah Mengatur Lokasi Project ke MYJAVAPROGRAMS/Mengatur kelas utama project
menjadi Hello
Pengenalan Pemrograman I 19
J.E.N.I.
Seperti ditunjukkan dibawah, secara otomatis NetBeans membuat kode dasar untuk
program Java Anda. Anda hanya dapat menambah pernyataan Anda pada kode yang
dihasilkan itu. Pada sisi kiri window, Anda dapat melihat daftar folder dan file-file yang
dihasilkan NetBeans setelah membuat sebuah project. Semua ini dapat Anda temukan
dalam folder MYJAVAPROGRAMS Anda, dimana Anda menetapkan lokasi project
tersebut.
Pengenalan Pemrograman I 20
J.E.N.I.
Sekarang, mencoba memodifikasi kode yang dihasilkan oleh NetBeans. Untuk saat ini
abaikan bagian-bagian lain dari program, detail dari kode tersebut akan dijelaskan pada
bagian berikutnya. Masukkan kode :
System.out.println("Hello world!");
Pengenalan Pemrograman I 21
J.E.N.I.
Pengenalan Pemrograman I 22
J.E.N.I.
Jika tidak terdapat error pada program Anda, Anda dapat melihat pesan sukses build
pada window yang dihasilkan.
Pengenalan Pemrograman I 23
J.E.N.I.
Pengenalan Pemrograman I 24
J.E.N.I.
Pengenalan Pemrograman I 25
J.E.N.I.
3.6 Latihan
3.6.1 Hello World!
Menggunakan NetBeans, membuat class dengan nama : TheTree. Hasil dari program
yang harus tampil dilayar :
Pengenalan Pemrograman I 26
J.E.N.I.
BAB 4
Dasar-Dasar Pemrograman
4.1 Tujuan
Pada bagian ini, kita akan mendiskusikan mengenai bagian dasar pemrograman java. Kita
akan memulai dengan mencoba menjelaskan bagian dasar dari program Hello.java yang
telah diperkenalkan pada bab sebelumnya.Kita juga akan mendiskusikan beberapa
pedoman cara menulis script atau petunjuk penulisan kode dalam penulisan program 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
System.out.println("Hello world!");
}
}
Pengenalan Pemrograman I 1
J.E.N.I.
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 :
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,
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.
Baris selanjutnya,
System.out.println("Hello world!");
Dua baris terakhir yang terdiri atas dua kurung kurawal digunakan untuk menutup method
utama dan masing-masing class secara berurutan.
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.
/* this is an exmaple of a
C style or multiline comments */
/**
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.
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 :
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,
Pengenalan Pemrograman I 5
J.E.N.I.
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.
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.
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.
Pengenalan Pemrograman I 7
J.E.N.I.
Untuk angka desimal, kita tidak memerlukan notasi khusus. Kita hanya menulis angka
desimal seperti apa adanya. untuk angka heksadesimal, hal itu harus ditandai oleh “0x”
atau “0X”. untuk oktal, ditandai 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.
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”.
Pengenalan Pemrograman I 8
J.E.N.I.
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.
Pengenalan Pemrograman I 9
J.E.N.I.
Contoh yang ditunjukkan diatas, mendeklarasikan variabel yang dinamai result sebagai
tipe data boolean dan memberinya nilai true.
‘a’ //Huruf a
‘\t’ //A tab
Untuk menampilkan karakter khusus seperti ' (single quotes) atau " (double quotes),
menggunakan karakter escape \. Sebagai contoh,
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,
Pengenalan Pemrograman I 10
J.E.N.I.
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 :
Pengenalan Pemrograman I 11
J.E.N.I.
Contohnya adalah,
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:
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.
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,
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;
System.out.println( value );
System.out.println( “The value of x=“ + x );
}
}
10
The value of x=A
System.out.print("Hello ");
System.out.print("world!");
Pengenalan Pemrograman I 14
J.E.N.I.
Hello world!
System.out.println("Hello ");
System.out.println("world!");
Hello
world!
Pengenalan Pemrograman I 15
J.E.N.I.
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.
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.
: :
:
:
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.
Pengenalan Pemrograman I 17
J.E.N.I.
//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 * j));
System.out.println(" x * y = " + (x * y));
//pembagian angka
System.out.println("Dividing...");
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.
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.
count++;
Operator increment dan decrement dapat ditempatkan sebelum atau sesudah operand.
int i = 10,
int j = 3;
int k = 0;
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;
Pengenalan Pemrograman I 21
J.E.N.I.
//sama dengan
System.out.println("Equal to...");
System.out.println(" i == j = " + (i == j)); //false
System.out.println(" k == j = " + (k == j)); //true
Pengenalan Pemrograman I 22
J.E.N.I.
}
}
Nilai variabel...
i = 37
j = 42
k = 42
Lebih besar dari...
i > j = false
j > i = true
k > j = false
Lebih besar dari atau sama dengan...
i >= j = false
j >= i = true
k >= j = true
Lebih kecil dari...
i < j = true
j < i = false
k < j = false
Lebih kecil dari atau sama dengan...
i <= j = true
j <= i = false
k <= j = true
Sama dengan...
i == j = false
k == j = true
Tidak sama dengan...
i != j = true
k != j = false
Pengenalan Pemrograman I 23
J.E.N.I.
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.
x1 x2 Result
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
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?
&& 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,
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);
}
}
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.
x1 x2 Result
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
Table 7: Table Kebenaran untuk | dan ||
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,
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.
x1 x2 Result
TRUE TRUE FALSE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE 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,
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.
x1 Result
TRUE FALSE
FALSE TRUE
Table 9: Tabel Kebenaran untuk !
Berikut ini adalah contoh source code yang menggunakan operator logika NOT,
false
true
Pengenalan Pemrograman I 30
J.E.N.I.
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.
//print status
System.out.println( status );
}
}
Passed
Pengenalan Pemrograman I 31
J.E.N.I.
Gambar2: Flowchart
class kondisiOperator
{
public static void main( String[] args ){
int score = 0;
char answer = 'a';
Score = 10
Pengenalan Pemrograman I 32
J.E.N.I.
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;
Pengenalan Pemrograman I 33
J.E.N.I.
4.11 Latihan
Berikut ini merupakan tampilan yang diharapkan sebagai hasil eksekusi program,
Number = 10
letter = a
result = true
str = hello
number 1 = 10
number 2 = 20
number 3 = 45
Average is = 25
number 1 = 10
number 2 = 23
number 3 = 5
Pengenalan Pemrograman I 34
J.E.N.I.
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.
import java.io.*;
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.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
try{
name = dataIn.readLine();
}catch( IOException e ){
System.out.println("Error!");
}
Statement,
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
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.
kita sudah mempelajari pada bab sebelumnya. Statement ini menyatakan bahwa kita
mendeklarasikan sebuah class bernama GetInputFromKeyboard dan kita
mendeklarasikan main method.
Pada statement,
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.
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();
Pengenalan Pemrograman I 4
J.E.N.I.
import javax.swing.JOptionPane;
JOptionPane.showMessageDialog(null, msg);
}
}
Pengenalan Pemrograman I 5
J.E.N.I.
Statement pertama,
import javax.swing.JOptionPane;
import javax.swing.*;
statement selanjutnya,
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,
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
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.
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.
if( boolean_expression )
statement;
atau
if( boolean_expression ){
statement1;
statement2;
. . .
}
Pengenalan Pemrograman 1 1
J.E.N.I.
atau
Pengenalan Pemrograman 1 2
J.E.N.I.
if( boolean_expression )
statement;
else
statement;
if( boolean_expression ){
statement1;
statement2;
. . .
}
else{
statement1;
statement2;
. . .
}
atau
Pengenalan Pemrograman 1 3
J.E.N.I.
Pengenalan Pemrograman 1 4
J.E.N.I.
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.
Pengenalan Pemrograman 1 5
J.E.N.I.
//BENAR
int number = 0;
if( number ){
//some statements here
}
//SALAH
int number = 0;
if( number = 0 ){
//Statement Selanjutnya
}
//BENAR
int number = 0;
if( number == 0 ){
//Statement Selanjutnya
}
Pengenalan Pemrograman 1 6
J.E.N.I.
Pengenalan Pemrograman 1 7
J.E.N.I.
switch( switch_expression ){
case case_selector1:
statement1; //
statement2; //block 1
. . . //
break;
case case_selector2:
statement1; //
statement2; //block 2
. . . //
break;
. . .
default:
statement1; //
statement2; //block n
. . . //
break;
}
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.
Pengenalan Pemrograman 1 8
J.E.N.I.
Pengenalan Pemrograman 1 9
J.E.N.I.
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.
while( boolean_expression ){
statement1;
statement2;
. . .
}
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.
Pengenalan Pemrograman 1 11
J.E.N.I.
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.
Perbedaan antara while dan do-while loop adalah dimana statement di dalam do-while
loop dieksekusi sedikitnya satu kali.
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.
Contoh 1:
int x = 0;
do
{
System.out.println(x);
x++;
}while (x<10);
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);
Pengenalan Pemrograman 1 13
J.E.N.I.
Panduan pemrograman:
do{
...
}while(boolean_expression)//-Æ salah>tidak ada titik koma(;)
2. Seperti pada while loop, pastikan do-while loop anda berhenti pada suatu titik.
dimana,
InitializationExpression – inisialisasi dari variabel loop.
LoopCondition - membandingkan variabel loop pada nilai batas.
StepExpression - melakukan update pada variabel 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).
int i = 0;
while( i < 10 ){
System.out.print(i);
i++;
}
Pengenalan Pemrograman 1 14
J.E.N.I.
Contohnya,
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.
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!" );
}
Pengenalan Pemrograman 1 16
J.E.N.I.
Berikut ini adalah contoh dari penghitungan angka dari “Beah” dalam suatu array.
if( !names[i].equals("Beah") ){
continue; //skip next statement
}
count++;
}
outerLoop:
for( int i=0; i<5; i++ ){
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.
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.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.
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.
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.
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];
Sebagai contoh,
Pengenalan Pemrograman 1 3
J.E.N.I.
Sebagai contoh, pada array yang kita deklarasikan tadi, kita mempunyai,
Perlu diperhatikan bahwa sekali array dideklarasikan dan dikonstruksi, nilai yang
disimpan dalam setiap anggota array akan diinisialisasi sebagai nol. Oleh karena itu,
apabila Anda menggunakan tipe data reference seperti String, ia tidak akan diinisalisasi
ke string kosong “”, sehingga Anda tetap harus membuat String array secara eksplisit.
Berikut ini adalah contoh, bagaimana untuk mencetak seluruh elemen didalam array.
Dalam contoh ini digunakanlah loop, sehingga kode kita menjadi lebih pendek.
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 out-
of-bounds exception.
Pengenalan Pemrograman 1 4
J.E.N.I.
arrayName.length
Pada contoh sebelumnya, kita dapat menuliskannya kembali seperti berikut ini,
Pengenalan Pemrograman 1 5
J.E.N.I.
// karakter array 8 x 16 x 24
char[][][] threeD = new char[8][16][24];
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] );
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,
Gunakan while-loop, kemudian print semua nilai dari array (Gunakan juga untuk do-
while dan for-loop)Using a while-loop.
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.
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.
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,
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 firstArg = 0;
if (args.length > 0){
Pengenalan Pemrograman 1 2
J.E.N.I.
firstArg = Integer.parseInt(args[0]);
}
Pengenalan Pemrograman 1 3
J.E.N.I.
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.
Pengenalan Pemrograman 1 4
J.E.N.I.
Klik kanan icon CommanLineExample dan akan keluar sebuah pop-up menu.
Pengenalan Pemrograman 1 5
J.E.N.I.
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.
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.
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
Hello
world
that
is
all
java ArithmeticOperation 20 4
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.
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 :
Pengenalan Pemrograman 1 1
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.
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.
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.
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!”);
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.
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.
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.
nameOfObject.nameOfMethod( parameters );
mari kita mengambil dua contoh yang ditemukan dalam kelas String.
Menggunakan method :
//return boolean
boolean result = str1.equalsIgnoreCase( str1 );
Pengenalan Pemrograman 1 4
J.E.N.I.
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 :
//Mencetak nilai i
System.out.println( i );
}
Secara default, semua tipe data primitive ketika dilewatkan pada sebuah method adalah
pass-by-values
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};
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] );
}
}
Pengenalan Pemrograman 1 6
J.E.N.I.
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.
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.
Classname.staticMethodName(params);
Pengenalan Pemrograman 1 7
J.E.N.I.
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.
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.
int i = 0;
int j = 0;
C
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:
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};
test( ages );
ages[ ] - scope A
i in B - scope B
i in C – scope C
Pengenalan Pemrograman 1 10
J.E.N.I.
arr[ ] - scope D
i in E - 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.
Hindari pemberian nama yang sama kepada variabel supaya Anda tidak
kebingungan.
Pengenalan Pemrograman 1 11
J.E.N.I.
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.
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 x = 10.2;
int y = 2;
Pengenalan Pemrograman 1 12
J.E.N.I.
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.
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.
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.
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,
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 :
• 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.
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.
class EqualsTest {
public static void main(String[] arguments) {
String str1, str2;
str1 = "Free the bound periodicals.";
str2 = str1;
OUTPUT:
String1: Free the bound periodicals.
String2: Free the bound periodicals.
Same object? true
String1: Free the bound periodicals.
String2: Free the bound periodicals.
Same object? false
Same value? True
Pengenalan Pemrograman 1 16
J.E.N.I.
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.
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.
• 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.
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,
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,
Pengenalan Pemrograman 1 18
J.E.N.I.
9.6 Latihan
9.6.1 Mendefinisikan Istilah
1. Class
2. Object
3. Instantiate
4. Instance Variable
5. Instance Method
6. Class Variables atau static member variables
7. Constructor
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.
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 :
* - Menandakan bahwa terjadi lebih dari satu kejadian dimana elemen tersebut
diimplementasikan
<description> - Menandakan bahwa Anda harus memberikan nilai pasti pada bagian ini
[] - Indikasi bagian optional
Pengenalan Pemrograman 1 1
J.E.N.I.
dimana :
<modifier> adalah sebuah access modifier, yang dapat dikombinasikan dengan tipe modifier
lain.
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.
dimana,
Pengenalan Pemrograman 1 2
J.E.N.I.
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
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 - String
address - String
age - Int
math grade - double
english grade - double
science grade - double
average grade - double
Pengenalan Pemrograman 1 3
J.E.N.I.
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 :
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.
Pengenalan Pemrograman 1 4
J.E.N.I.
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.
Kita gunakan keyword : ’static’ untuk mendeklarasikan bahwa variabel tersebut adalah
static.
Pengenalan Pemrograman 1 5
J.E.N.I.
dimana,
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.
Pengenalan Pemrograman 1 6
J.E.N.I.
dimana,
public - Menjelaskan bahwa method tersebut dapat diakses object luar kelas
String - Tipe data return value dari method tersebut
getName - 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 :
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.
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>.
dimana,
public - Menjelaskan bahwa method ini dapat dipanggil object luar kelas
void - Method ini tidak menghasilkan return value
setName - Nama dari method
(String temp) - Parameter yang akan digunakan pada method
Pernyataan berikut :
name = temp;
mengidentifikasi nilai dari temp sama dengan name dan mengubah data pada instance
variable name.
Perlu diingat bahwa mutator methods tidak menghasilkan return value. Namun berisi
beberapa argumen dari program yang akan digunakan oleh method.
Pengenalan Pemrograman 1 8
J.E.N.I.
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.
if( num == 1 ){
return "one"; //mengembalikan sebuah konstanta
}
else if( num == 2){
return "two"; //mengembalikan sebuah konstanta
}
// mengembalikan sebuah variabel
return defaultNum;
}
dimana,
public - Menjelaskan bahwa method ini dapat diakses object luar kelas
static - Method ini adalah static dan pemanggilannya menggunakan
[namaKelas].[namaMethod]. Sebagai contoh :
studentRecord.getStudentCount
Int - Tipe return dari method. Mengindikasikan method tersebut harus
mempunyai return value berupa integer
getStudentCount - 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.
Pengenalan Pemrograman 1 10
J.E.N.I.
/**
* Menghasilkan nama dari Siswa
*/
public String getName(){
return name;
}
/**
* Mengubah nama siswa
*/
public void setName( String temp ){
name = temp;
}
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 :
Anna
Student Count = 0
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.
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 :
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.
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.
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.
Name:Anna
Address:Philippines
Age:15
Name:Anna
Math Grade:80.0
English Grade:95.5
Science Grade:100.0
Pengenalan Pemrograman 1 15
J.E.N.I.
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
}
Seperti telah kita bahas sebelumnya, sebuah constructor juga dapat dibentuk menjadi
overloaded. Dapat dilihat pada 4 contoh sebagai berikut :
public StudentRecord(){
//area inisialisasi kode;
}
Pengenalan Pemrograman 1 16
J.E.N.I.
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
}
Pengenalan Pemrograman 1 17
J.E.N.I.
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.
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.
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.
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;
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;
Package juga dapat dibuat secara bersarang. Dalam hal ini Java Interpreter menghendaki
struktur direktori yang mengandung class eksekusi untuk disesuaikan dengan struktur
package.
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)
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.
dimana C:\ adalah direktori dimana kita menempatkan package. Setelah mengatur
classpath, kita dapat menjalankan program di mana saja dengan mengetikkan :
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
export classpath=/usr/local/java:/usr/myClasses
Pengenalan Pemrograman 1 21
J.E.N.I.
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.
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 :
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.
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 :
Dalam contoh ini, variabel name dan method getName() dapat diakses dari object lain.
Tipe ini hanya mengijinkan class member untuk diakses oleh method dalam class tersebut
dan elemen – elemen subclass. Sebagai contoh :
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.
Tipe ini mengijinkan pengaksesan class hanya dapat diakses oleh class dimana tipe ini
dibuat. Sebagai contoh :
Pada contoh diatas, variabel name dan method getName() hanya dapat diakses oleh
method internal class tersebut.
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
Tugas Anda adalah membuat sebuah class yang memuat data-data pada buku alamat.
Tabel berikut mendefinisikan informasi yang dimiliki oleh buku alamat.
Attribut Deskripsi
Nama Nama Lengkap perseorangan
Alamat Alamat Lengkap
Nomor Telepon Nomor telepon personal
Alamat E-Mail Alamat E-Mail personal
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.
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.
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.
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.
/**
* 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;
}
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
}
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.
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:
Pemakaian lain dari super adalah untuk menunjuk anggota dari superclass(seperti referensi
this). Sebagai contoh,
public Student()
{
super.name = “somename”;
super.address = “some address”;
}
Misalnya kita mempunyai implementasi berikut untuk method getName dalam superclass
Person,
:
}
Jadi, ketika kita meminta method getName dari object class Student, method overridde
akan dipanggil, keluarannya akan menjadi,
Student: getName
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,
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,
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
Dalam Java, kita dapat membuat referensi yang merupakan tipe dari superclass ke sebuah
object dari subclass tersebut. Sebagai contohnya,
Sekarang dimisalkan kita punya method getName dalam superclass Person kita, dan kita
override method ini dalam kedua subclasses Student dan Employee,
Pengenalan Pemrograman 1 7
J.E.N.I.
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.
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.
printInformation( studentObject );
printInformation( employeeObject );
}
Pengenalan Pemrograman 1 8
J.E.N.I.
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.
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,
Pengenalan Pemrograman 1 9
J.E.N.I.
/**
* 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,
Jika class Human tidak dapat overridde method walk, kita akan menemui pesan error
berikut ini,
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.
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 seolah-
olah 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,
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.
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.
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:
Pengenalan Pemrograman 1 12
J.E.N.I.
/**
* Class ini mendefinisikan segmen garis
*/
public class Line implements Relation
{
private double x1;
private double x2;
private double y1;
private double y2;
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,
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.
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.
Pengenalan Pemrograman 1 15
J.E.N.I.
11.6 Latihan
11.6.1 Extend StudentRecord
Dalam latihan ini, kita ingin untuk membuat catatan siswa yang lebih khusus yang berisi
informasi tambahan tentang pengetahuan komputer siswa. Tugasnya adalah meng-extend
class StudentRecord yang mengimplementasikan pelajaran sebelumnya. Cobalah untuk
meng-override beberapa method yang ada dalam superclass StudentRecord, jika Anda
benar-benar membutuhkannya.
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.
Exception adalah sebuah peristiwa yang menjalankan alur proses normal pada program. Peristiwa
ini biasanya berupa kesalahan(error) dari beberapa bentuk. Ini disebabkan program kita berakhir
tidak normal.
Beberapa contoh dari exception yang Anda mungkin jumpai pada latihan-latihan sebelumnya
adalah: exception ArrayIndexOutOfBounds, yang terjadi jika kita mencoba mengakses elemen
array yang tidak ada, atau NumberFormatException, yang terjadi ketika kita mencoba melalui
parameter bukan angka dalam method Integer.parseInt.
try{
//tulis pernyataan yang dapat mengakibatkan exception
//dalam blok ini
}
catch( <exceptionType1> <varName1> ){
//tulis aksi apa dari program Anda yang dijalankan jika ada
//exception tipe tertentu terjadi
}
. . .
Pengenalan Pemrograman 1 1
J.E.N.I.
Exception dilemparkan selama eksekusi dari blok try dapat ditangkap dan ditangani dalam blok
catch. Kode dalam blok finally selalu di-eksekusi.
Berikut ini adalah aspek kunci tentang sintak dari konstruksi try-catch-finally:
• Notasi blok bersifat perintah
• Setiap blok try, terdapat satu atau lebih blok catch, tetapi hanya satu blok finally.
• Blok catch dan blok finally harus selalu muncul dalam konjungsi dengan blok try, dan
diatas urutan
• Blok try harus diikuti oleh paling sedikit satu blok catch ATAU satu blok finally, atau
keduanya.
• Setiap blok catch mendefinisikan sebuah penanganan exception. Header dari blok catch
harus membawa satu argumen, dimana exception pada blok tersebut akan ditangani.
Exception harus menjadi class pelempar atau satu dari subclassesnya.
Pengenalan Pemrograman 1 2
J.E.N.I.
Marilah mengambil contoh kode yang mencetak argumen kedua ketika kita mencoba menjalankan
kode menggunakan argumen command-line. Perkirakan, tidak ada pengecekan dalam kode Anda
untuk angka dari argumen dan kita hanya mengakses argumen kedua args[1] segera, kita akan
mendapatkan exception berikut.
Untuk mencegah kejadian ini, kita dapat menempatkan kode ke dalam blok try-catch. Blok finally
hanya sebagai pilihan lain saja. Sebagai contoh, kita tidak akan menggunakan blok finally.
try{
System.out.println( args[1] );
}catch( ArrayIndexOutOfBoundsException exp ){
System.out.println("Exception caught!");
}
}
}
Jadi kita akan menjalankan program lagi tanpa argumen, keluarannya akan menjadi,
Exception caught!
Pengenalan Pemrograman 1 3
J.E.N.I.
12.4 Latihan
12.4.1 Menangkap Exception 1
Diberikan kode berikut:
public class TestExceptions{
public static void main( String[] args ){
for( int i=0; true; i++ ){
System.out.println("args["+i+"]="+
args[i]);
}
}
}
Compile dan jalankan program TestExceptions. Keluarannya akan tampak seperti ini:
javac TestExceptions one two three
args[0]=one
args[1]=two
args[2]=three
Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 3
at TestExceptions.main(1.java:4)
Ubah program TestExceptions untuk menangani exception, keluaran program setelah ditangkap
exception-nya akan seperti ini:
Pengenalan Pemrograman 1 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
diskusi tentang perbedaan konsep-konsep berorientasi object dalam Java.
Desain berorientasi object adalah sebuah teknik yang memfokuskan desain pada object dan class
berdasarkan pada skenario dunia nyata. Hal ini menegaskan keadaan(state), behaviour dan
interaksi dari object. Selain itu juga menyediakan manfaat akan kebebasan pengembangan,
meningkatkan kualitas, mempermudah pemeliharaan, mempertinggi kemampuan dalam
modifikasi dan meningkatkan penggunaan kembali software.
Pengenalan Pemrograman 2 1
J.E.N.I.
1.2.2 Class
Class mengizinkan Anda dalam mendeklarasikan tipe data baru. Ia dijalankan sebagai blueprint,
dimana model dari object yang Anda buat berdasarkan pada tipe data baru ini.
1.2.3 Object
Sebuah object adalah sebuah entiti yang memiliki keadaan, behaviour dan identitas yang yang
tugasnya dirumuskan dalam suatu lingkup masalah dengan baik. Inilah instance sebenarnya dari
sebuah class. Ini juga dikenal sebagai instance. Instance dibuat sewaktu Anda meng-instantiate
class menggunakan kata kunci new. Dalam sistem registrasi siswa, contoh dari sebuah object
yaitu entiti Student.
1.2.4 Atribut
Atribut menunjuk pada elemen data dari sebuah object. Atribut menyimpan informasi tentang
object. Dikenal juga sebagai member data, variabel instance, properti atau sebuah field data.
Kembali lagi ke contoh sistem registrasi siswa, atribut dari sebuah siswa adalah nomor siswa.
1.2.5 Method
Sebuah method menjelaskan behaviour dari sebuah object. Method juga dikenal sebagai fungsi
atau prosedur. Sebagai contoh, method yang mungkin tersedia untuk entiti siswa adalah method
register.
1.2.6 Konstruktor
Konstruktor adalah sebuah tipe khusus dari method yang digunakan untuk membuat dan
menginisialisasi sebuah object baru. Ingat bahwa konstruktor bukan member(yaitu atribut,
method atau inner class dari sebuah object).
1.2.7 Package
1.2.8 Enkapsulasi
1.2.9 Abstraksi
Sementara enkapsulasi menyembunyikan detail, abstraksi mengabaikan aspek dari subyek yang
tidak sesuai dengan tujuan yang ada supaya lebih banyak mengkonsentrasikan yang ada.
1.2.10 Pewarisan
Pewarisan adalah hubungan antara class dimana dalam satu class ada superclass atau class induk
dari class yang lain. Pewarisan menunjuk pada properti dan behaviour yang diterima dari nenek
Pengenalan Pemrograman 2 2
J.E.N.I.
moyang dari class. Ini dikenal juga sebagai hubungan “is-a”. Perhatikan pada hirarki berikut.
SuperHero
FlyingSuperHero UnderwaterSuperHero
Gambar 1.1: Contoh Pewarisan
1.2.11 Polimorfisme
Polimorfisme adalah kemampuan dari sebuah object untuk membolehkan mengambil beberapa
bentuk yang berbeda. Secara harfiah, “poli” berarti banyak sementara “morph” berarti bentuk.
Menunjuk pada contoh sebelumnya pada pewarisan, kita lihat bahwa object SuperHero dapat juga
menjadi object FlyingSuperHero atau object UnderwaterSuperHero.
1.2.12 Interface
Sebuah interface adalah sebuah contract dalam bentuk kumpulan method dan deklarasi
konstanta. Ketika sebuah class implements sebuah interface, ini mengimplementasikan semua
method yang dideklarasikan dalam interface.
Pada bagian ini meringkaskan syntax dasar yang digunakan dalam pembuatan aplikasi Java.
<classDeclaration> ::=
<modifier> class <name> {
<attributeDeclaration>*
<constructorDeclaration>*
<methodDeclaration>*
}
dimana <modifier> adalah sebuah access modifier, yang mana boleh dikombinasikan dengan tipe
yang laen dari modifier.
Pengenalan Pemrograman 2 3
J.E.N.I.
Class SuperHero {
String superPowers[];
void setSuperPowers(String superPowers[]) {
this.superPowers = superPowers;
}
void printSuperPowers() {
for (int i = 0; i < superPowers.length; i++) {
System.out.println(superPowers[i]);
}
}
}
<attributeDeclaration> ::=
<modifier> <type> <name> [= <default_value>];
<type> ::=
byte | short | int | long | char | float | double | boolean
| <class>
Inilah contohnya.
Pengenalan Pemrograman 2 4
J.E.N.I.
Sebagai contoh:
class MethodDemo {
int data;
int getData() {
return data;
}
void setData(int data) {
this.data = data;
}
void setMaxData(int data1, int data2) {
data = (data1>data2)? data1 : data2;
}
}
<constructorDeclaration> ::=
<modifier> <className> (<parameter>*) {
<statement>*
}
Jika tidak ada konstruktor yang disediakan secara jelas, konstruktor default secara otomatis
membuatkannya untuk Anda. Konstruktor default tidak membawa argumen dan tidak berisi
pernyataan pada tubuh class.
class ConstructorDemo {
private int data;
public ConstructorDemo() {
data = 100;
}
ConstructorDemo(int data) {
this.data = data;
}
}
Untuk meng-instantiate sebuah class, dengan sederhana kita gunakan kata kunci new diikuti
dengan pemanggilan sebuah konstruktor. Mari lihat langsung ke contohnya.
class ConstructObj {
int data;
ConstructObj() {
/* menginisialisasi data */
Pengenalan Pemrograman 2 5
J.E.N.I.
}
public static void main(String args[]) {
ConstructObj obj = new ConstructObj(); //di-instantiate
}
}
Untuk mengakses anggota dari sebuah object, kita gunakan notasi “dot”. Penggunaanya seperti
berikut:
<object>.<member>
Contoh selanjutnya berdasar pada sebelumnya dengan pernyataan tambahan untuk mengakses
anggota dan method tambahan.
class ConstructObj {
int data;
ConstructObj() {
/* inisialisasi data */
}
void setData(int data) {
this.data = data;
}
public static void main(String args[]) {
ConstructObj obj = new ConstructObj(); //instantiation
obj.setData = 10; //access setData()
System.out.println(obj.data); //access data
}
}
1.3.7 Package
Untuk menunjukkan bahwa file asal termasuk package khusus, kita gunakan syntax berikut:
<packageDeclaration> ::=
package <packageName>;
<importDeclaration> ::=
import <packageName.elementAccessed>;
[<packageDeclaration>]
<importDeclaration>*
<classDeclaration>+
Pengenalan Pemrograman 2 6
J.E.N.I.
Sebagai contoh.
package registration.reports;
import registration.processing.*;
import java.util.List;
import java.lang.*; //imported by default
class MyClass {
/* rincian dari MyClass */
1.3.9 Enkapsulasi
Menyembunyikan elemen dari penggunaan sebuah class dapat dilakukan dengan pembuatan
anggota yang ingin Anda sembunyikan secara private.
Contoh berikut menyembunyikan field secret. Catatan bahwa field ini tidak langsung diakses oleh
program lain menggunakan method getter dan setter.
class Encapsulation {
private int secret; //field tersembunyi
public boolean setSecret(int secret) {
if (secret < 1 || secret > 100) {
return false;
}
this.secret = secret;
return true;
}
public getSecret() {
return secret;
}
}
Pengenalan Pemrograman 2 7
J.E.N.I.
1.3.10 Pewarisan
Untuk membuat class anak atau subclass berdasarkan class yang telah ada, kita gunakan kata
kunci extend dalam mendeklarasikan class. Sebuah class hanya dapat meng-extend satu class
induk.
Sebagai contoh, class Point di bawah ini adalah superclass dari class ColoredPoint.
import java.awt.*;
class Point {
int x;
int y;
}
Method subclass override terhadap method superclass ketika subclass mendeklarasikan method
yang signaturenya serupa ke method dalam superclass. Signature dari method hanyalah informasi
yang ditemukan dalam definisi method bagian atas. Signature mengikutkan tipe return, nama dan
daftar parameter method tetapi itu tidak termasuk acces modifier dan tipe yang lain dari kata
kunci seperti final dan static.
Inilah perbedaan dari method overloading. Method overloading secara singkat didiskusikan dalam
sub bagian pada kata kunci this.
class Superclass {
void display(int n) {
System.out.println("super: " + n);
}
}
class OverrideDemo {
public static void main(String args[]) {
Subclass SubObj = new Subclass();
Superclass SuperObj = SubObj;
SubObj.display(3);
((Superclass)SubObj).display(4);
}
}
Pengenalan Pemrograman 2 8
J.E.N.I.
Acces modifier untuk method yang dibutuhkan tidak harus sama. Bagaimanapun, acces modifier
dari method overridding mengharuskan salah satunya punya acces modifier yang sama seperti itu
dari method overridden atau acces modifier yang kurang dibatasi.
Perhatikan contoh selanjutnya. Periksa yang mana dari method overridding berikut akan
menyebabkan waktu meng-compile akan menyebabkan error.
class Superclass {
void overriddenMethod() {
}
}
Sebuah class yang berisi method abstract harus dideklarasikan sebagai sebuah class abstract.
Kata kunci tidak dapat digunakan pada konstruktor atau method static. Ini juga penting untuk
diingat bahwa class abstract tidak dapat di-instantiate.
Class yang meng-extends sebuah class abstract harus mengimplementasikan semua method
abstract. Jika tidak subclass sendiri dapat dideklarasikan sebagai abstract.
Pengenalan Pemrograman 2 9
J.E.N.I.
Sebagai contoh:
1.3.13 Interface
Mendeklarasikan sebuah interface pada dasarnya mendeklarasikan sebuah class tetapi sebagai
penggantinya menggunakan kata kunci class, kata kunci interface digunakan. Berikut syntaxnya.
<interfaceDeclaration> ::=
<modifier> interface <name> {
<attributeDeclaration>*
[<modifier> <returnType> <name>(<parameter>*);]*
}
Class mengimplementasikan sebuah interface yang telah ada dengan menggunakan kata kunci
implements. Class ini dibuat untuk mengimplementasikan semua method interface. Sebuah class
boleh mengimplementasikan lebih dari satu interface.
Pengenalan Pemrograman 2 10
J.E.N.I.
interface MyInterface {
void iMethod();
}
class MyClass1 implements MyInterface {
public void iMethod() {
System.out.println("Interface method.");
}
void myMethod() {
System.out.println("Another method.");
}
}
class InterfaceDemo {
public static void main(String args[]) {
MyClass1 mc1 = new MyClass1();
MyClass2 mc2 = new MyClass2();
mc1.iMethod();
mc1.myMethod();
mc2.iMethod();
}
}
Sebagai contoh pada maksud pertama, perhatikan kode berikut dimana variabel data disediakan
sebagai sebuah atribut dan parameter lokal pada saat yang sama.
class ThisDemo1 {
int data;
void method(int data) {
this.data = data;
/* this.data menunjuk ke atribut
sementara data menunjuk ke variabel lokal */
}
}
Pengenalan Pemrograman 2 11
J.E.N.I.
Contoh berikut menunjukkan bagaimana object this secara mutlak menunjuk ketika anggota non-
static dipanggil.
class ThisDemo2 {
int data;
void method() {
System.out.println(data); //this.data
}
void method2() {
method(); //this.method();
}
Sebelum melihat ke contoh yang lain, mari pertama meninjau pengertian method overloading.
Konstruktor seperti juga method dapat juga menjadi overload. Method yang berbeda dalam class
dapat memberi nama yang sama asalkan list parameter juga berbeda. Method overloaded harus
berbeda dalam nomor dan/atau tipe dari parameternya. Contoh selanjutnya memiliki konstruktor
overloaded dan referensi this yang dapat digunakan untuk menunjuk versi lain dari konstruktor.
class ThisDemo3 {
int data;
ThisDemo3() {
this(100);
}
ThisDemo3(int data) {
this.data = data;
}
}
class Person {
String firstName;
String lastName;
Person(String fname, String lname) {
firstName = fname;
lastName = lname;
}
}
Pengenalan Pemrograman 2 12
J.E.N.I.
super(fname, lname);
studNum = sNum;
}
}
Kata kunci dapat juga digunakan untuk menunjuk anggota superclass seperti yang ditunjukkan
pada contoh berikut.
class Superclass{
int a;
void display_a(){
System.out.println("a = " + a);
}
}
class SuperDemo {
public static void main(String args[]){
Superclass SuperObj = new Superclass();
Subclass SubObj = new Subclass();
SuperObj.a = 1;
SubObj.a = 2;
SubObj.set_super_a(3);
SuperObj.display_a();
SubObj.display_a();
SubObj.display_super_a();
System.out.println(SubObj.a);
}
}
Pengenalan Pemrograman 2 13
J.E.N.I.
class StaticDemo {
public static void main(String args[]) {
System.out.println(Demo.a);
Demo.staticMethod(5);
Demo d = new Demo();
System.out.println(d.a);
d.staticMethod(0);
Demo e = new Demo();
System.out.println(e.a);
d.a += 3;
System.out.println(Demo.a+", " +d.a +", " +e.a);
}
}
Keluaran dari source kode ditunjukkan di bawah ini.
This is a static block.
1
5
1
0
1
4, 4, 4
Kata kunci final dapat diaplikasikan pada variabel, method dan class. Untuk mengingat fungsi dari
kata kunci, ingat bahwa itu secara mudah dibatasi apa yang kita dapat lakukan dengan variabel,
method dan class.
Nilai dari variabel final dapat tidak lama diubah sesudah nilainya telah diatur. Sebagai contoh,
Pengenalan Pemrograman 2 14
J.E.N.I.
class final tidak dapat diwariskan tidak seperti class yang biasanya.
final public class MyClass {
}
Pernyataan ini akan menyebabkan kesalahan compilation terjadi karena MyClass dapat tidak lama
di-extended.
public WrongClass extends MyClass {
}
class OuterClass {
int data = 5;
class InnerClass {
int data2 = 10;
void method() {
System.out.println(data);
System.out.println(data2);
}
}
public static void main(String args[]) {
OuterClass oc = new OuterClass();
InnerClass ic = oc.new InnerClass();
System.out.println(oc.data);
System.out.println(ic.data2);
ic.method();
}
}
Untuk mampu mengakses anggota dari inner class, kita butuh sebuah instance dari inner class.
Method-method dari inner class dapat secara langsung mengakses anggota dari outer class.
Pengenalan Pemrograman 2 15
J.E.N.I.
1.4 Latihan
1.4.1 Tabel Perkalian
Tulis program yang mempunyai masukkan size dari user dan mencetak tabel perkalian dengan
size yang ditetapkan.
Size untuk tabel perkalian : 5
Tabel perkalian dari size 5:
1 2 3 4 5
1 1
2 2 4
3 3 6 9
4 4 8 12 16
5 5 10 15 20 25
Tulis sebuah program yang mempunyai tiga integer dan menghitung nilai GCF dari tiga angka.
GCF adalah angka terbesar yang secara rata dibagi ke semua angka yang diberikan.
1.4.3 Shape
Buatlah class Shape. class memiliki dua field String: name dan size. class mempunyai method
printShapeInfo, dimana hanya mengeluarkan nilai name dan field size dari object Shape. Juga
memiliki method printShapeName dan printShapeSize, dimana mencetak nama dan size dari
object, berturut-turut.
Menggunakan pewarisan, buat class Square dengan field yang sama dan method seperti itu dari
class Shape. Class ini mempunyai dua tambahan field integer: length dan width. Method
printShapeLength dan printShapeWidth yang mencetak panjang dan lebar object yang juga
termasuk dalam class ini. Anda juga harus meng-override printShapeInfo untuk mencetak
keluaran field tambahan dalam subclass juga.
1.4.4 Binatang
Buatlah interface Animal yang mempunyai tiga method:eat dan move. Semua method ini tidak
punya argumen atau nilai return. Method ini hanya mengeluarkan bagaimana object Animal
makan dan bergerak. Sebagai contoh, seekor kelinci memakan wortel dan bergerak dengan
melompat. Buat class Fish dan Bear yang menggunakan interface Animal. Terserah kepada Anda
bagaimana menggunakan method eat dan move.
Pengenalan Pemrograman 2 16
J.E.N.I.
Bab 2
Exceptions dan Assertions
2.1 Tujuan
2.2.1 Pendahuluan
Bugs dan error dalam sebuah program sangat sering muncul meskipun program
tersebut dibuat oleh programmer berkemampuan tinggi. Untuk menghindari
pemborosan waktu pada proses error-checking, Java menyediakan mekanisme
penanganan exception.
Exception adalah singkatan dari Exceptional Events. Kesalahan (errors) yang terjadi
saat runtime, menyebabkan gangguan pada alur eksekusi program. Terdapat
beberapa tipe error yang dapat muncul. Sebagai contoh adalah error pembagian 0,
mengakses elemen di luar jangkauan sebuah array, input yang tidak benar dan
membuka file yang tidak ada.
Seluruh exceptions adalah subclasses, baik secara langsung maupun tidak langsung,
dari sebuah root class Throwable. Kemudian, dalam class ini terdapat dua kategori
umum : Error class dan Exception class.
Exception class menunjukkan kondisi yang dapat diterima oleh user program.
Umumnya hal tersebut disebabkan oleh beberapa kesalahan pada kode program.
Contoh dari exceptions adalah pembagian oleh 0 dan error di luar jangkauan array.
Pengenalan Pemrograman 2 1
J.E.N.I.
Error class digunakan oleh Java run-time untuk menangani error yang muncul pada
saat dijalankan. Secara umum hal ini di luar control user karena kemunculannya
disebabkan oleh run-time environment. Sebagai contoh adalah out of memory dan
harddisk crash.
class DivByZero {
public static void main(String args[]) {
System.out.println(3/0);
System.out.println(“Cetak.”);
}
}
Jika kode tersebut dijalankan, akan didapatkan pesan kesalahan sebagai berikut :
Pesan tersebut menginformasikan tipe exception yang terjadi pada baris dimana
exception itu berasal. Inilah aksi default yang terjadi bila terjadi exception yang tidak
tertangani. Jika tidak terdapat kode yang menangani exception yang terjadi, aksi
default akan bekerja otomatis. Aksi tersebut pertama-tama akan menampilkan
deskripsi exception yang terjadi. Kemudian akan ditampilkan stack trace yang
mengindentifikasi method dimana exception terjadi. Pada bagian akhir, aksi default
tersebut akan menghentikan program secara paksa.
Bagaimana jika anda ingin melakukan penanganan atas exception dengan cara yang
berbeda? Untungnya, bahasa pemrograman Java memiliki 3 keywords penting dalam
penanganan exception, yaitu try, catch dan finally.
Pengenalan Pemrograman 2 2
J.E.N.I.
Seperti yang telah dijelaskan sebelumnya, keyword try, catch dan finally digunakan
dalam menangani bermacam tipe exception. 3 Keyword tersebut digunakan
bersama, namun finally bersifat opsional. Akan lebih baik jika memfokuskan pada 2
keyword pertama, kemudian membahas finally pada bagian akhir.
try {
<code to be monitored for exceptions>
} catch (<ExceptionType1> <ObjName>) {
<handler if ExceptionType1 occurs>
}
...
} catch (<ExceptionTypeN> <ObjName>) {
<handler if ExceptionTypeN occurs>
}
Blok catch dimulai setelah kurung kurawal dari kode try atau catch terkait.
Penulisan kode dalam blok mengikuti identasi
Gunakan contoh kode tersebut pada program DivByZero yang telah dibuat
sebelumnya :
class DivByZero {
public static void main(String args[]) {
try {
System.out.println(3/0);
System.out.println(“Cetak.”);
} catch (ArithmeticException exc) {
//Reaksi atas kejadian
System.out.println(exc);
}
System.out.println(“Setelah Exception.”);
}
}
Pengenalan Pemrograman 2 3
J.E.N.I.
java.lang.ArithmeticException: / by zero
After exception.
Bagian kode yang terdapat pada blok try dapat menyebabkan lebih dari satu tipe
exception. Dalam hal ini, terjadinya bermacam tipe kesalahan dapat ditangani
menggunakan beberapa blok catch. Perlu dicatat bahwa blok try dapat hanya
menyebabkan sebuah exception pada satu waktu, namun dapat pula menampikan
tipe exception yang berbeda di lain waktu.
Berikut adalah contoh kode yang menangani lebih dari satu exception :
class MultipleCatch {
public static void main(String args[]) {
try {
int den = Integer.parseInt(args[0]); //baris 4
System.out.println(3/den); //baris 5
} catch (ArithmeticException exc) {
System.out.println(“Nilai Pembagi 0.”);
} catch (ArrayIndexOutOfBoundsException exc2) {
System.out.println(“Missing argument.”);
}
System.out.println(“After exception.”);
}
}
Pelajari apakah yang akan terjadi terhadap program bila argumen – argumen berikut
dimasukkan oleh user :
a) Tidak ada argument
b) 1
c) 0
class NestedTryDemo {
public static void main(String args[]){
try {
int a = Integer.parseInt(args[0]);
try {
int b = Integer.parseInt(args[1]);
System.out.println(a/b);
} catch (ArithmeticException e) {
System.out.println(“Divide by zero error!");
}
} catch (ArrayIndexOutOfBoundsException) {
System.out.println(“2 parameters are required!");
}
}
Pengenalan Pemrograman 2 4
J.E.N.I.
}
Pelajari apa yang akan terjadi pada program jika argument – argument berikut dimasukkan :
a) Tidak ada argumen
b) 15
c) 15 3
d) 15 0
class NestedTryDemo2 {
static void nestedTry(String args[]) {
try {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
System.out.println(a/b);
} catch (ArithmeticException e) {
System.out.println("Divide by zero error!");
}
}
Saatnya anda mengimplementasikan finally dalam blok try-cacth. Berikut ini cara
penggunaan keyword tersebut :
try {
<kode monitor exception>
} catch (<ExceptionType1> <ObjName>) {
<penanganan jika ExceptionType1 terjadi>
} ...
} finally {
<kode yang akan dieksekusi saat blok try berakhir>
}
Pengenalan Pemrograman 2 5
J.E.N.I.
Sekali lagi, coding convention juga mengatur penggunaan finally seperti halnya
pada blok catch. Penggunaan finally dimulai setelah kurung kurawal penutup blok
catch terkait. Penulisan dalam blok tersebut juga mengalami identasi.
Blok finally mengandung kode penanganan setelah penggunaan try dan catch. Blok
kode ini selalu tereksekusi walaupun sebuah exception terjadi atau tidak pada blok
try. Blok kode tersebut juga akan menghasilkan nilai true meskipun return, continue
ataupun break tereksekusi. Terdapat 4 kemungkinan skenario yang berbeda dalam
blok try-catch-finally. Pertama, pemaksaan keluar program terjadi bila control
program dipaksa untuk melewati blok try menggunakan return, continue ataupun
break. Kedua, sebuah penyelesaian normal terjadi jika try-catch-finally tereksekusi
secara normal tanpa terjadi error apapun. Ketiga, kode program memiliki spesifikasi
tersendiri dalam blok catch terhadap exception yang terjadi. Yang terakhir, kebalikan
skenario ketiga. Dalam hal ini, exception yang terjadi tidak terdefinisikan pada blok
catch manapun. Contoh dari skenario – skenario tersebut terlihat pada kode berikut
ini :
class FinallyDemo {
static void myMethod(int n) throws Exception{
try {
switch(n) {
case 1: System.out.println("case pertama");
return;
case 3: System.out.println("case ketiga");
throw new RuntimeException("demo case
ketiga");
case 4: System.out.println("case keempat");
throw new Exception("demo case
keempat");
case 2: System.out.println("case Kedua");
}
} catch (RuntimeException e) {
System.out.print("RuntimeException terjadi: ");
System.out.println(e.getMessage());
} finally {
System.out.println("try-block entered.");
}
}
public static void main(String args[]){
for (int i=1; i<=4; i++) {
try {
FinallyDemo.myMethod(i);
} catch (Exception e){
System.out.print("Exception terjadi: ");
System.out.println(e.getMessage());
}
System.out.println();
}
}
}
Pengenalan Pemrograman 2 6
J.E.N.I.
Sebuah method perlu untuk menangkap ataupun mendaftar seluruh exceptions yang
mungkin terjadi, namun hal itu dapat menghilangkan tipe Error, RuntimeException,
ataupun subclass-nya.
Pengenalan Pemrograman 2 7
J.E.N.I.
class ThrowsDemo {
public static void main(String args[]) {
try {
ThrowingClass.myMethod();
} catch (ClassNotFoundException e) {
System.out.println(e);
}
}
}
Seperti yang disebutkan sebelumnya, root class dari seluruh exception classes
adalah Throwable class. Yang disebutkan dibawah ini adalah exception class
hierarchy. Seluruh exceptions ini terdefinisi pada package java.lang.
Pengenalan Pemrograman 2 8
J.E.N.I.
Sekarang anda sudah cukup familiar dengan beberapa exception classes, saatnya
untuk mengenalkan aturan : catch lebih dari satu harus berurutan dari subclass ke
superclass.
class MultipleCatchError {
public static void main(String args[]){
try {
int a = Integer.parseInt(args [0]);
int b = Integer.parseInt(args [1]);
System.out.println(a/b);
} catch (Exception e) {
System.out.println(e);
} catch (ArrayIndexOutOfBoundsException e2) {
System.out.println(e2);
}
System.out.println("After try-catch-catch.");
}
}
Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception
class adalah superclass dari ArrayIndexOutOfBoundsException class.
MultipleCatchError.java:9: exception
java.lang.ArrayIndexOutOfBoundsException has already been
caught } catch (ArrayIndexOutOfBoundsException e2) {
Checked exceptions adalah exception yang diperiksa oleh Java compiler. Compiler
memeriksa keseluruhan program apakah menangkap atau mendaftar exception yang
terjadi dalam sintax throws. Apabila checked exception tidak didaftar ataupun
ditangkap, maka compiler error akan ditampilkan.
Meskipun beberapa exception classes terdapat pada package java.lang namun tidak
mencukupi untuk menampung seluruh kemungkinan tipe exception yang mungkin
terjadi. Sehingga sangat mungkin bahwa anda perlu untuk membuat tipe exception
tersendiri.
Dalam pembuatan tipe exception anda sendiri, anda hanya perlu untuk membuat
sebuah extended class terhadap RuntimeException class, maupun Exception class
lain. Selanjutnya tergantung pada anda dalam memodifikasi class sesuai
Pengenalan Pemrograman 2 9
J.E.N.I.
class TestHateString {
public static void main(String args[]) {
String input = "invalid input";
try {
if (input.equals("invalid input")) {
throw new HateStringException();
}
System.out.println("String accepted.");
} catch (HateStringException e) {
System.out.println("I hate this string: " + input +
".");
}
}
}
2.6 Assertions
2.6.1 User Defined Exceptions
Pengenalan Pemrograman 2 10
J.E.N.I.
ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga
mereka menyadari bahwa saat menjalankannya, assertion harus dalam keadaan
aktif.
Jika anda ingin untuk menjalankan program tanpa menggunakan fitur assertions,
cukup jalankan program secara normal.
java MyProgram
Bentuk yang lain menggunakan dua ekspresi, berikut ini cara penulisannya :
assert <expression1> : <expression2>;
dimana <expression1> adalah kondisi assertion bernilai true dan <expression2> adalah
informasi yang membantu pemeriksaan mengapa program mengalami kesalahan.
class AgeAssert {
public static void main(String args[]) {
int age = Integer.parseInt(args[0]);
assert(age>0);
/* jika masukan umur benar (misal, age>0) */
if (age >= 18) {
System.out.println(“Congrats! You're an adult! =)”);
}
}
}
Pengenalan Pemrograman 2 11
J.E.N.I.
2.7 Latihan
2.7.1 Heksadesimal ke Desimal
*
***
*****
***
*
Pengenalan Pemrograman 2 12
J.E.N.I.
Bab 3
Teknik Pemrograman Lanjut
3.1 Tujuan
Modul ini mengenalkan suatu teknik pemrograman yang lebih tinggi. Dalam bagian ini
Anda akan mempelajari rekursif dan tipe data abstrak.
3.2 Rekursif
3.2.1 Apa yang dimaksud dengan Rekursif?
Rekursif adalah teknik pemecahan masalah yang powerful dan dapat digunakan ketika
inti dari masalah terjadi berulang kali. Tentu saja, tipe dari masalah ini dapat dipecahkan
mengunakan perkataan berulang-ulang (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 recursif tetapi recursion menyediakan solusi yang lebih
baik untuk suatu masalah. Pada rekursif, method dapat memanggil dirinya sendiri. Data
yang berada dalam method tersebut seperti argument disimpan sementara kedalam
stack sampai method pemanggilnya diselesaikan.
Untuk pengertian yang lebih baik dari rekursif, mari kita lihat pada bagaimana macam-
macam dari teknik iterasi. Dalam teknik-teknik tersebut dapat juga kita lihat
penyelesaian sebuah loop yang lebih baik menggunakan rekursif dari pada iterasi.
Pengenalan Pemrograman 2 1
J.E.N.I.
Dengan iterasi, proses diakhiri ketika kondisi loop gagal atau salah. Dalam kasus dari
penggunaan rekursif, proses yang berakhir dengan kondisi tertentu disebut
permasalahan dasar yang telah tercukupi oleh suatu pembatasan kondisi. Permasalahan
yang mendasar merupakan kejadian yang paling kecil dari sebuah masalah. Sebagai
contohnya, dapat dilihat pada kondisi rekursif pada faktorial, kasus yang mudah adalah
ketika inputnya adalah 1. 1 dalam kasus ini merupakan inti dari masalah.
Penggunaan dari iterasi dan rekursif dapat bersama-sama memandu loops jika hal ini
tidak digunakan dengan benar.
Keuntungan iterasi dibandingkan recursion adalah performance yang lebih baik. Hal
tersebut lebih cepat untuk recursion sejak terbentuknya sebuah parameter pada sebuah
method yang disebabkan oleh suatu CPU time. Bagaimanapun juga, rekursif mendorong
practice software 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 performance dan baiknya software engineering.
class FactorialIter {
static int factorial(int n) {
int result = 1;
for (int i = n; i > 1; i--) {
result *= i;
}
Pengenalan Pemrograman 2 2
J.E.N.I.
return result;
}
public static void main(String args[]) {
int n = Integer.parseInt(args[0]);
System.out.println(factorial(n));
}
}
Dibawah ini merupakan listing program yang sama tetapi menggunakan rekursif.
class FactorialRecur {
static int factorial(int n) {
if (n == 1) { /* The base case */
return 1;
}
/* Recursive definition; Self-invocation */
return factorial(n-1)*n;
}
public static void main(String args[]) {
int n = Integer.parseInt(args[0]);
System.out.println(factorial(n));
}
}
Sekarang, pertimbangan dari masalah dalam pencetakkan suatu angka desimal yang
nilai basenya telah ditetapkan oleh pengguna. Ingat bahwa solusi dalam hal ini untuk
menggunakan repetitive division dan untuk menulis sisa perhitungannya. Proses akan
berakhir ketika sisa hasil pembagian kurang dari base yang ditetapkan. Dapat
diasumsikan jika nilai input desimal adalah 10 dan kita akan mengkonversinya menjadi
base 8. Inilah solusinya dengan perhitungan menggunakan pensil dan kertas.
Contoh berikutnya. Nilai input desimalnya adalah 165 dan akan dikonversi ke base 16.
Pengenalan Pemrograman 2 3
J.E.N.I.
class DecToOthers {
public static void main(String args[]) {
int num = Integer.parseInt(args[0]);
int base = Integer.parseInt(args[1]);
printBase(num, base);
}
static void printBase(int num, int base) {
int rem = 1;
String digits = "0123456789abcdef";
String result = "";
/* the iterative step */
while (num!=0) {
rem = num%base;
num = num/base;
result = result.concat(digits.charAt(rem)+"");
}
/* printing the reverse of the result */
for(int i = result.length()-1; i >= 0; i--) {
System.out.print(result.charAt(i));
}
}
}
Berikut ini merupakan recursion untuk masalah yang sama dengan solusi sebelumnya.
class DecToOthersRecur {
static void printBase(int num, int base) {
String digits = "0123456789abcdef";
/* Recursive step*/
if (num >= base) {
printBase(num/base, base);
}
/* Base case: num < base */
System.out.print(digits.charAt(num%base));
}
public static void main(String args[]) {
int num = Integer.parseInt(args[0]);
int base = Integer.parseInt(args[1]);
printBase(num, base);
}
}
Pengenalan Pemrograman 2 4
J.E.N.I.
Abstract Data Type (ADT) adalah kumpulan dari elemen-elemen data yang disajikan
dengan satu set operasi yang digambarkan pada elemen-elemen data tersebut. Stacks,
queues dan binary trees adalah tiga contoh dari ADT. Dalam bab ini, Anda akan
mempelajari tentang stacks dan queues.
3.3.2 Stacks
Stack adalah satu set atau urutan elemen data dimana manipulasi data dari elemen-
elemen hanya diperbolehkan pada tumpukan teratas dari stack. Hal ini merupakan
perintah pengumpulan data secara linier yang disebut “last in, first out” (LIFO). Stacks
berguna untuk bermacam-macam aplikasi seperti pattern recognition dan
pengkonversian antar notasi infix, postfix dan prefix .
Dua operasi yang dihubungkan dengan stacks adalah operasi push dan pop. Push berarti
memasukkan data kedalam stacks yang paling atas dimana pop sebagai
penunjuk/pointer untuk memindahkan elemen ke atas stacks. Untuk memahami
bagaimana cara kerja stacks, pikirkan bagaimana Anda dapat menambah atau
memindakan sebuah data dari tumpukan data. Pikiran Anda akan memberitahu Anda
untuk menambah atau memindahkan data hanya pada stack yang paling atas karena
jika menggunakan cara lain, dapat menyebabkan tumpukan stack akan terjatuh.
n-1
...
6
5 Jayz top
4 KC
3 Jojo
2 Toto
1 Kyla
0 DMX bottom
Stack akan berarti penuh jika jangkauan cell teratas disimbolkan dengan n-1. Jika nilai
teratas / top sama dengan -1, stack berarti kosong.
Pengenalan Pemrograman 2 5
J.E.N.I.
3.3.3 Queues
Queues adalah contoh lain dari ADT. Hal ini merupakan perintah pengumpulan data yang
disebut “first-in, first-out”. Aplikasi ini meliputi jadwal pekerjaan dalam operating
system, topological sorting dan graph traversal.
Enqueue dan dequeue merupakan operasi yang dihubungkan dengan queues. Enqueu
menunjuk pada memasukkan data pada akhir queue dimana dequeue berarti
memindahkan elemen dari queue tersebut. Untuk mengingat bagaimana queue bekerja,
ingatlah arti khusus dari queue yaitu baris. Berikut ini bagaimana cara kerja queue.
Siapa yang akan mendapatkan kesempatan pertama untuk bertemu bintang idolanya
dari mereka yang sedang menunggu dalam sebuah barisan? Seharusnya orang pertama
yang berada pada barisan tersebut. Orang ini mendapat kesempatan pertama untuk
meninggalkan barisan. Hubungkan hal tersebut dengan bagaimana queue bekerja.
0 1 2 3 4 5 6 7 8 9 ... n-1
Eve Jayz KC Jojo Toto Kyla DMX
fron end Insert
t
Delete
Queue akan kosong jika nilai end kurang dari front. Sementara itu, akan penuh jika end
sama dengan n-1.
ADTs biasanya dapat diwakilkan menggunakan sequential dan linked representation. Hal
ini memudahkan untuk membuat sequential representation dengan menggunakan array.
Bagaimanapun juga, masalah dengan menggunakan array adalah pembatasan size,
yang membuatnya tidak fleksibel. Dengan menggunakan array, sering terjadi
kekurangan atau kelebihan space memory. Mempertimbangkan hal tersebut, Anda harus
membuat sebuah array dan mendeklarasikannya agar mampu menyimpan 50 elemen.
Jika user hanya memasukkan 5 elemen, maka 45 space pada memory akan sia-sia.
Disisi lain, jika user ingin memasukkan 51 elemen, space yang telah disediakan didalam
array tidak akan cukup.
Pengenalan Pemrograman 2 6
J.E.N.I.
SeqStack() {
memSpace = new int[10];
limit = 10;
}
SeqStack(int size) {
memSpace = new int[size];
limit = size;
}
boolean push(int value) {
top++;
/* check if the stack is full */
if (top < limit) {
memSpace[top] = value;
} else {
top--;
return false;
}
return true;
}
int pop() {
int temp = -1;
/* check if the stack is empty */
if (top >= 0) {
temp = memSpace[top];
top--;
} else {
return -1;
}
return temp;
}
public static void main(String args[]) {
SeqStack myStack = new SeqStack(3);
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
System.out.println(myStack.pop());
System.out.println(myStack.pop());
System.out.println(myStack.pop());
System.out.println(myStack.pop());
}
}
Linked list merupakan struktur dinamis yang berlawanan dengan array, yang merupakan
struktur statis. Hal ini berarti linked list dapat tumbuh dan berkurang dalam size yang
bergantung pada kebutuhan user. Linked list digambarkan sebagai kumpulan dari nodes,
Yang masing-masing berisi data dan link atau pointer ke node berikutnya didalam list.
Pengenalan Pemrograman 2 7
J.E.N.I.
Berikut ini merupakan contoh dari non-empty linked list dengan 3 node.
Berikut ini bagaimana class node diimplementasikan. Class ini dapat digunakan untuk
membuat linked list.
class Node {
int data; /* integer data contained in the node */
Node nextNode; /* the next node in the list */
}
class TestNode {
public static void main(String args[]) {
Node emptyList = null; /* create an empty list */
/* head points to 1st node in the list */
Node head = new Node();
/* initialize 1st node in the list */
head.data = 5;
head.nextNode = new Node();
head.nextNode.data = 10;
/* null marks the end of the list */
head.nextNode.nextNode = null;
/* print elements of the list */
Node currNode = head;
while (currNode != null) {
System.out.println(currNode.data);
currNode = currNode.nextNode;
}
}
}
Pengenalan Pemrograman 2 8
J.E.N.I.
Sekarang Anda telah mempelajari tentang linked list. Maka Anda telah siap untuk
menerapkan apa yang telah Anda pelajari untuk implementasi linked representation dari
stack.
class DynamicIntStack{
private IntStackNode top; /* head or top of the stack */
class IntStackNode { /* node class */
int data;
IntStackNode next;
IntStackNode(int n) {
data = n;
next = null;
}
}
Pengenalan Pemrograman 2 9
J.E.N.I.
Saat ini Anda telah diperkenalkan kepada dasar abstract data types. Pada intinya, Anda
telah mempelajari tentang dasar dari linked lists, stacks dan queue. Berita baik bahwa
abstract data types telah siap untuk diimplementasikan dan dimasukkan dalam Java.
Class Stack dan LinkedList diperbolehkan digunakan tanpa pengertian yang lengkap dari
konsep ini. Bagaimanapun juga, sebagai ilmuwan komputer, sangat penting untuk
mengerti konsep dari abstract data types. Oleh karena itu, penjelasan terperinci masih
disampaikan dalam bagian yang terdahulu. Dengan peluncuran dari J2SE5.0, queue
interface telah tersedia. Untuk detail pada class dan interface ini, dapat dilihat pada
dokumentasi Java API.
Kepada kita, Java telah menyajikan Collection classes dan interfaces yang lain, yang
semuanya dapat ditemukan di java.util package. Contoh dari Collection classes termasuk
LinkedList, ArrayList, HashSet dan TreeSet. Class tersebut benar-benar implementasi
dari collection interfaces yang berbeda. Induk hirarki dari collection interfaces adalah
collection interfaces itu sendiri. Sebuah collection hanya sebuah grup dari object yang
diketahui sebagai elemennya sendiri. Collection memperbolehkan penggandaan/salinan
dan tidak membutuhkan pemesanan elemen secara spesifik.
SDK tidak menyediakan implementasi built-in yang lain dari interface ini tetapi
mengarahkan subinterfaces, Set interfaces dan List interfaces diperbolehkan. Sekarang,
apa perbedaan dari kedua interface tersebut. Set merupakan collection yang tidak
dipesan dan tidak ada penggandaan didalamnya. Sementara itu, list merupakan
collection yang dipesan dari elemen-elemen dimana juga diperbolehkannya
penggandaan. HashSet, LinkedHashSet dan TreeSet suatu implementasi class dari Set
interfaces. ArrayList, LinkedList dan Vector suatu implementasi class dari List interfaces.
<root interface>
Collection
<interface> <interface>
Set List
<implementing classes> <implementing classes>
HashSet LinkedHashSet TreeSet ArrayList LinkedList Vector
Tabel 1.2.8a: Java collections
Berikut ini adalah daftar dari beberapa Collections methods yang disediakan dalam
Collection API dari Java 2 Platform SE v1.4.1. Pada Java 2 Platform SE v.1.5.0, methods
ini telah dimodifikasi untuk menampung generic types. Sejak generic types masih belum
selesai dibahas, sebaiknya mempertimbangkan method ini terlebih dahulu. Disarankan
bahwa Anda mengacu pada Collection methods yang terbaru dimana Anda lebih mudah
Pengenalan Pemrograman 2 10
J.E.N.I.
Collection Methods
public boolean add(Object o)
Memasukkan Object o kedalam collection ini. Mengembalikan nilai true jika o telah
sukse ditambahkan kedalam collection.
public void clear()
Menghapus semua element dari collection ini.
public boolean remove(Object o)
Menghapus single instance dari Object o pada collection ini, jika hal tersebut telah
diinputkan. Mengembalikan nilai true jika o telah ditemukan dan dihapus dari
collection.
public boolean contains(Object o)
Mengembalikan nilai true jika collection ini berisi Object o.
public boolean isEmpty()
Mengembalikan nilai true jika collection ini tidak berisi object atau element apapun.
public int size()
Mengembalikan nomor dari elements pada collection ini.
public Iterator iterator()
Mengembalikan sebuah iterator yang menunjukkan kita pada isi collection ini.
public boolean equals(Object o)
Mengembalikan nilai jika Object o sama dengan yang ada pada collection.
public int hashCode()
Mengembalikan nilai hash code (i.e., the ID) untuk collection ini. Objects atau
collections yang sama memiliki nilai hash code atau ID yang sama.
Anda diharapkan mengacu pada dokumentasi API untuk mengetahui daftar lengkap dari
methods dalam Collection, List dan Set interface.
Saat ini kita akan melihat beberapa collection classes. Harap mengacu pada API untuk
daftar dari methods yang dimasukkan kedalam class ini.
Pengenalan Pemrograman 2 11
J.E.N.I.
import java.util.*;
class LinkedListDemo {
public static void main(String args[]) {
LinkedList list = new LinkedList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add(new Integer(3));
list.add(new Integer(1));
System.out.println(list + ", size = " + list.size());
list.addFirst(new Integer(0));
list.addLast(new Integer(4));
System.out.println(list);
System.out.println(list.getFirst() + ", " +
list.getLast());
System.out.println(list.get(2) + ", " + list.get(3));
list.removeFirst();
list.removeLast();
System.out.println(list);
list.remove(new Integer(1));
System.out.println(list);
list.remove(3);
System.out.println(list);
list.set(2, "one");
System.out.println(list);
}
}
ArrayList merupakan versi fleksibel dari array biasa. Yang mengimplementasikan List
interface. Telitilah kode berikut ini.
import java.util.*;
class ArrayListDemo {
public static void main(String args[]) {
ArrayList al = new ArrayList(2);
System.out.println(al + ", size = " + al.size());
al.add("R");
al.add("U");
al.add("O");
System.out.println(al + ", size = " + al.size());
al.remove("U");
System.out.println(al + ", size = " + al.size());
ListIterator li = al.listIterator();
while (li.hasNext())
System.out.println(li.next());
Object a[] = al.toArray();
for (int i=0; i<a.length; i++)
System.out.println(a[i]);
}
}
Pengenalan Pemrograman 2 12
J.E.N.I.
HashSet merupakan sebuah implementasi dari Set interface yang berguna pada hash
table. Penggunaan suatu hash table lebih mudah dan cepat untuk melihat lebih detail
elemen-elemen yang ada. Table menggunakan suatu rumusan untuk menentukan
dimana suatu objek disimpan. Teliti program ini, yang menggunakan class HashSet.
import java.util.*;
class HashSetDemo {
public static void main(String args[]) {
HashSet hs = new HashSet(5, 0.5f);
System.out.println(hs.add("one"));
System.out.println(hs.add("two"));
System.out.println(hs.add("one"));
System.out.println(hs.add("three"));
System.out.println(hs.add("four"));
System.out.println(hs.add("five"));
System.out.println(hs);
}
}
TreeSet merupakan sebuah implementasi dari Set interface yang menggunakan tree.
Class ini memastikan bahwa yang disortir akan diurutkan secara ascending.
Pertimbangkan, bagaimana class TreeSet telah digunakan dalam listing program berikut
ini.
import java.util.*;
class TreeSetDemo {
public static void main(String args[]) {
TreeSet ts = new TreeSet();
ts.add("one");
ts.add("two");
ts.add("three");
ts.add("four");
System.out.println(ts);
}
}
Pengenalan Pemrograman 2 13
J.E.N.I.
3.4 Latihan
3.4.1 Faktor Persekutuan Terbesar
Faktor persekutuan terbesar (FPB) dari dua angka adalah angka yang terbesar selalu
dibagi oleh angka yang satunya, kemudian modulus atau sisa pembagian membagi
angka kedua dan seterusnya hingga sisa pembagian dari kedua angka tersebut sama
dengan nol. Menggunakan Euclid's method, buatlah dua kode untuk penghitungan dua
angka. Gunakan iterasi untuk kode program yang pertama dan rekursif untuk kode
program berikutnya.
Catatan pada algoritma Euclid :
1. Sebagai masukkan integers x dan y.
2. Ulangi step dibawah ini while y != 0
a. y = x % y;
b. x = Nilai lama y;
3. Return x.
Contoh, x = 14 dan y = 6.
y = x % y = 14 % 6 = 2
x=6
y=x%y=6%2=0
x = 2 (FPB)
Dengan menggunakan ide dari linked list, implementasikan sebuah integer queue
dinamis seperti integer stack dinamis yang diperkenalkan seperti contoh berikut.
Pengenalan Pemrograman 2 14
J.E.N.I.
Bab 4
Tour dari Package java.lang
4.1 Tujuan
Java datang dengan beberapa class built-in yang bermanfaat. Mari kita membahas class-
class tersebut.
Method-Method Math
public static double abs(double a)
Menghasilkan nilai mutlak a. Sebuah method yang di-overload. Dapat juga
menggunakan nilai float atau integer atau juga long integer sebagai parameter,
dengan kondisi tipe kembalinya juga menggunakan float atau integer atau long
integer, secara berturut-turut.
public static double random()
Menghasilkan nilai positif bilangan acak (random) yang lebih besar atau sama dengan
0.0 tetapi kurang dari 1.0.
public static double max(double a, double b)
Menghasilkan nilai maksimum, diantara dua nilai double, a and b. Sebuah method
yang di-overload. Dapat juga menggunakan nilai float atau integer atau juga long
integer sebagai parameter, dengan kondisi tipe kembalinya juga menggunakan float
atau integer atau long integer, secara berturut-turut.
public static double min(double a, double b)
Menghasilkan nilai minimum diantara dua nilai double, a and b. Sebuah method yang
di-overload. Dapat juga menggunakan nilai float atau integer atau juga long integer
Pengenalan Pemrograman 2 1
J.E.N.I.
sebagai parameter, dengan kondisi tipe kembalinya juga menggunakan float atau
integer atau long integer, secara berturut-turut.
public static double ceil(double a)
Menghasilkan bilangan bulat terkecil yang lebih besar atau sama dengan a.
public static double floor(double a)
Menghasilkan bilangan bulat terbesar yang lebih kecil atau sama dengan a.
public static double exp(double a)
Menghasilkan angka Euler, e pangkat a.
public static double log(double a)
Menghasilkan logaritma natural dari a.
public static double pow(double a, double b)
Menghasilkan a pangkat b.
public static long round(double a)
Menghasilkan pembulatan keatas ke long terdekat. Sebuah method yang di-overload.
Dapat juga menggunakan float pada argument dan akan menghasilkan pembulatan
ke atas ke int terdekat.
public static double sqrt(double a)
Menghasilkan akar kuadrat a.
public static double sin(double a)
Menghasilkan sinus sudut a dalam radian.
public static double toDegrees(double angrad)
Menghasilkan nilai derajat yang kira-kira setara dengan nilai radian yang diberikan.
public static double toRadians(double angdeg)
Menghasilkan nilai radian yang kira-kira setara dengan nilai derajat yang diberikan.
Tabel 1.1: Beberapa method dari class Math
Pengenalan Pemrograman 2 2
J.E.N.I.
class MathDemo {
public static void main(String args[]) {
System.out.println("absolute value of -5: " +
Math.abs(-5));
System.out.println("absolute value of 5: " +
Math.abs(-5));
System.out.println("random number(max value is 10): " +
Math.random()*10);
System.out.println("max of 3.5 and 1.2: " +
Math.max(3.5, 1.2));
System.out.println("min of 3.5 and 1.2: " +
Math.min(3.5, 1.2));
System.out.println("ceiling of 3.5: " + Math.ceil(3.5));
System.out.println("floor of 3.5: " + Math.floor(3.5));
System.out.println("e raised to 1: " + Math.exp(1));
System.out.println("log 10: " + Math.log(10));
System.out.println("10 raised to 3: " + Math.pow(10,3));
System.out.println("rounded off value of pi: " +
Math.round(Math.PI));
System.out.println("square root of 5 = " + Math.sqrt(5));
System.out.println("10 radian = " + Math.toDegrees(10) +
" degrees");
System.out.println("sin(90): " +
Math.sin(Math.toRadians(90)));
}
}
Ini adalah contoh output dari program yang dibuat. Coba jalankan program dan
bereksperimenlah secara bebas dengan memberikan argument.
Pengenalan Pemrograman 2 3
J.E.N.I.
Method-Method String
public char charAt(int index)
Mengirim karakter di indeks yang dispesifikasikan oleh parameter index.
public int compareTo(String anotherString)
Membandingkan dua String dan mengirim bilangan int yang menspesifikasikan apakah
objek string pemanggil kurang dari atau sama dengan anotherString. Bernilai negatif
jika objek yang dilewatkan (passed string) lebih besar, 0 jika kedua string sama, dan
bernilai positif jika objek string pemanggil (calling string) lebih besar.
public int compareToIgnoreCase(String str)
Serupa dengan compareTo tetapi case insensitivity.
public boolean equals(Object anObject)
Pengenalan Pemrograman 2 4
J.E.N.I.
Method-Method String
Menghasilkan nilai true jika parameter tunggalnya tersusun dari karakter yang sama
dengan objek tempat Anda memanggil equals. Sedangkan jika parameter yang
dispesifikkan bukan sebuah objek String atau jika tidak cocok dengan urutan simbol
pada string, method akan dikembalikan dengan nilai false.
public boolean equalsIgnoreCase(String anotherString)
Serupa dengan equals tetapi case insensitivity.
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
Mendapatkan characters dari string yang dimulai pada index srcBegin hingga index
srcEnd dan mengkopi character-character tersebut pada array dst dimulai pada index
dstBegin.
public int length()
Menghasilkan panjang String.
public String replace(char oldChar, char newChar)
Mengganti karakter, semua yang kemunculan oldChar diganti newChar.
public String substring(int beginIndex, int endIndex)
Mengirim substring dimulai dari indeks yang dispesifikasikan beginIndex dan berakhir
dengan indeks yang dispesifikasikan endIndex.
public char[] toCharArray()
Returns the character array equivalent of this string.
public String trim()
Menghilangkan whitespace di awal dan akhir objek String.
public static String valueOf(-)
Dapat menggunakan tipe data sederhana seperti boolean, integer atau character, atau
juga menggunakan sebuah objek sebagai parameter. Mengirim objek String yang
merepresentasikan tipe tertentu yang dilewatkan sebagai parameter.
class StringDemo {
public static void main(String args[]) {
String name = "Jonathan";
System.out.println("name: " + name);
System.out.println("3rd character of name: " +
name.charAt(2));
/* character yang pertama nampak secara berurutan
mempunyai nilai unicode lebih kecil */
System.out.println("Jonathan compared to Solomon: " +
name.compareTo("Solomon"));
System.out.println("Solomon compared to Jonathan: " +
"Solomon".compareTo("Jonathan"));
/* 'J' mempunyai nilai unicode yang lebih kecil dibanding
'j' */
System.out.println("Jonathan compared to jonathan: " +
Pengenalan Pemrograman 2 5
J.E.N.I.
name.compareTo("jonathan"));
System.out.println("Jonathan compared to jonathan (ignore
case): " + name.compareToIgnoreCase("jonathan"));
System.out.println("Is Jonathan equal to Jonathan? " +
name.equals("Jonathan"));
System.out.println("Is Jonathan equal to jonathan? " +
name.equals("jonathan"));
System.out.println("Is Jonathan equal to jonathan (ignore
case)? " + name.equalsIgnoreCase("jonathan"));
char charArr[] = "Hi XX".toCharArray();
/* Membutuhkan tambahan 1 untuk indeks endSrc dari
getChars */
"Jonathan".getChars(0, 2, charArr, 3);
System.out.print("getChars method: ");
System.out.println(charArr);
System.out.println("Length of name: " + name.length());
System.out.println("Replace a's with e's in name: " +
name.replace('a', 'e'));
/* Membutuhkan tambahan 1 untuk parameter endIndex dari
substring*/
System.out.println("A substring of name: " +
name.substring(0, 2));
System.out.println("Trim \" a b c d e f \": \"" +
" a b c d e f ".trim() + "\"");
System.out.println("String representation of boolean
expression 10>10: " + String.valueOf(10>10));
/* method toString secara implisit dipanggil method
println */
System.out.println("String representation of boolean
expression 10<10: " + (10<10));
/* Catatan, tidak ada perubahan pada nama objek String
meskipun setelah penggunaan semua method. */
System.out.println("name: " + name);
}
}
name: Jonathan
3rd character of name: n
Jonathan compared to Solomon: -9
Solomon compared to Jonathan: 9
Jonathan compared to jonathan: -32
Jonathan compared to jonathan (ignore case): 0
Is Jonathan equal to Jonathan? true
Is Jonathan equal to jonathan? false
Is Jonathan equal to jonathan (ignore case)? true
content of charArr after getChars method: Hi Jo
Length of name: 8
Replace a's with e's in name: Jonethen
A substring of name: Jo
Trim " a b c d e f ": "a b c d e f"
String representation of boolean expression 10>10: false
String representation of boolean expression 10<10: false
name: Jonathan
Pengenalan Pemrograman 2 6
J.E.N.I.
Ini adalah beberapa method pada class StringBuffer. Lihatlah acuan pada dokumentasi
Java API.
Method-Method StringBuffer
public int capacity()
Mengirim jumlah memori yang dialokasikan untuk StringBuffer.
public StringBuffer append(-)
Appends merepresentasikan string dari argument untuk objek StringBuffer.
Menggunakan parameter tunggal seperti tipe-tipe data berikut: boolean, char, char [],
double, float, int, long, Object, String and StringBuffer. Masih mempunyai versi yang
di-overload lainnya.
public char charAt(int index)
Mengirim character di lokasi tertentu di StringBuffer yang dispesifikasikan parameter
index.
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
Mendapatkan characters dari objek yang dimulai pada indeks srcBegin hingga indeks
srcEnd dan mengkopi character- character tersebut pada array dst dimulai pada indeks
dstBegin.
public StringBuffer delete(int start, int end)
Menghapus character-character pada range yang ditentukan.
public StringBuffer insert(int offset, -)
Menyisipkan beragam tipe data di offset spesifik di StringBuffer. Sebuah method yang
di-overload. Tipe data yang mungkin digunakan: boolean, char, char [], double, float,
int, long, Object and String. Masih mempunyai versi yang di-overload lainnya.
public int length()
Memperoleh panjang atau jumlah character di objek StringBuffer.
public StringBuffer replace(int start, int end, String str)
Mengganti bagian dari objek, seperti yang dispesifikasikan oleh argument satu dua,
dengan spesifikasi string str.
public String substring(int start, int end)
Substring menyaring bagian tertentu dari string, dimulai pada pengspesifikasian indeks
start hingga indeks the end.
public String toString()
Mengkonversi objek ke representasi string.
Pengenalan Pemrograman 2 7
J.E.N.I.
class StringBufferDemo {
public static void main(String args[]) {
StringBuffer sb = new StringBuffer("Jonathan");
System.out.println("sb = " + sb);
/* initial capacity is 16 */
System.out.println("capacity of sb: " + sb.capacity());
System.out.println("append \'O\' to sb: " +
sb.append("O"));
System.out.println("sb = " + sb);
System.out.println("3rd character of sb: " +
sb.charAt(2));
char charArr[] = "Hi XX".toCharArray();
/* Need to add 1 to the endSrc index of getChars */
sb.getChars(0, 2, charArr, 3);
System.out.print("getChars method: ");
System.out.println(charArr);
System.out.println("Insert \'jo\' at the 3rd cell: " +
sb.insert(2, "jo"));
System.out.println("Delete \'jo\' at the 3rd cell: " +
sb.delete(2,4));
System.out.println("length of sb: " + sb.length());
System.out.println("replace: " +
sb.replace(3, 9, " Ong"));
/* Need to add 1 to the endIndex parameter of substring*/
System.out.println("substring (1st two characters): " +
sb.substring(0, 3));
System.out.println("implicit toString(): " + sb);
}
}
Ini adalah output dari program yang telah dibuat di atas. Sekali lagi, bereksperimen
secara bebas dengan code-code merupakan cara terbaik mempelajari sintaks-sintaks
yang ada.
sb = Jonathan
capacity of sb: 24
append 'O' to sb: JonathanO
sb = JonathanO
3rd character of sb: n
getChars method: Hi Jo
Insert 'jo' at the 3rd cell: JojonathanO
Delete 'jo' at the 3rd cell: JonathanO
length of sb: 9
replace: Jon Ong
substring (1st two characters): Jon
implicit toString(): Jon Ong
Pengenalan Pemrograman 2 8
J.E.N.I.
Tabel 1.3: Tipe data primitif dan class wrappernya yang sesuai
Nama-nama class wrapper cukup mudah untuk diingat selama nama-nama itu sama
dengan tipe data primitif. Dan juga sebagai catatan, bahwa class-class wrapper diawali
dengan huruf besar dan versi yang ditunjukkan dari tipe data primitive.
class BooleanWrapper {
public static void main(String args[]) {
boolean booleanVar = 1>2;
Boolean booleanObj = new Boolean("TRue");
/* primitif ke objek; dapat juga menggunakan method
valueOf */
Boolean booleanObj2 = new Boolean(booleanVar);
System.out.println("booleanVar = " + booleanVar);
System.out.println("booleanObj = " + booleanObj);
System.out.println("booleanObj2 = " + booleanObj2);
System.out.println("compare 2 wrapper objects: " +
booleanObj.equals(booleanObj2));
/* objek ke primitif */
booleanVar = booleanObj.booleanValue();
System.out.println("booleanVar = " + booleanVar);
}
}
Pengenalan Pemrograman 2 9
J.E.N.I.
Method-Method Process
public abstract void destroy()
Mengakhiri proses.
public abstract int waitFor() throws InterruptedException
Tidak mengirim sampai proses yang dipanggil berakhir.
Method-Method Runtime
public static Runtime getRuntime()
Mengirim objek runtime yang merepresentasikan lingkungan runtime yang
berhubungan dengan applikasi Java saat itu.
public Process exec(String command) throws IOException
Dikarenakan command yang dispesifikasikan dieksekusi. Memperbolehkan Anda
mengeksekusi proses baru.
class RuntimeDemo {
public static void main(String args[]) {
Runtime rt = Runtime.getRuntime();
Process proc;
try {
proc = rt.exec("regedit");
proc.waitFor(); //try removing this line
} catch (Exception e) {
System.out.println("regedit is an unknown command.");
Pengenalan Pemrograman 2 10
J.E.N.I.
}
}
}
Method-Method System
Public static void arraycopy(Object src, int srcPos, Object dest, int
destPos, int length)
Mengkopi length elemen dari array src dimulai pada posisi srcPos ke dest yang dimulai
pada indeks destPos. Lebih cepat daripada memprogram secara manual code untuk
Anda sendiri.
Public static long currentTimeMillis()
Waktu dispesifikasikan dalam GMT (Greenwich Mean Time) serta merupakan jumlah
milidetik yang telah dilewati sejak tengan malam 1 Januari 1970. Waktu dalam ukuran
milidetik.
Public static void exit(int status)
Mematikan Java Virtual Machine (JVM) yang sedang berjalan. Nilai bukan nol untuk
status konvensi yang mengindikasikan keluar yang abnormal.
Public static void gc()
Menjalankan garbage collector, yang mereklamasi space memori tak terpakai untuk
digunakan kembali.
Public static void setIn(InputStream in)
Mengubah stream yang berhubungan dengan System.in, yang mana standart mengacu
pada keyboard.
Public static void setOut(PrintStream out)
Pengenalan Pemrograman 2 11
J.E.N.I.
Method-Method System
Mengubah stream yang berhubungan dengan System.out, yang mana standart
mengacu pada console.
import java.io.*;
class SystemDemo {
public static void main(String args[]) throws IOException {
int arr1[] = new int[1050000];
int arr2[] = new int[1050000];
long startTime, endTime;
/* menginisialisasi arr1 */
for (int i = 0; i < arr1.length; i++) {
arr1[i] = i + 1;
}
/* mengkopi secara manual */
startTime = System.currentTimeMillis();
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
endTime = System.currentTimeMillis();
System.out.println("Time for manual copy: " +
(endTime-startTime) + " ms.");
/* menggunakan utilitas copy yang disediakan oleh java –
yaitu method arraycopy */
startTime = System.currentTimeMillis();
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
endTime = System.currentTimeMillis();
System.out.println("Time for manual copy: " + (endTime-
startTime) + " ms.");
System.gc(); //force garbage collector to work
System.setIn(new FileInputStream("temp.txt"));
System.exit(0);
}
}
Pengenalan Pemrograman 2 12
J.E.N.I.
4.7 Latihan
4.7.1 Evaluasi Ekspresi
Menggunakan method-method class built-in Math, buatlah sebuah program yang
menggunakan nilai double x sebagai inputan dan evaluasilah nilai mutlak dari ekspresi
yang mengikuti.
x2 * cos(45derajat) + akar(e), e adalah angka Euler.
Input: 10
Output: 72.35939938935488
Input: 11
Output: 87.20864179427238
4.7.2 Palindrome
Palindrome adalah sebuah string yang membaca sama ketika mengarah ke depan atau
sebaliknya. Beberapa contoh dari palindrome : hannah, ana, and bib. Menggunakan
String atau class StringBuffer, buatlah sebuah program yang menggunakan satu string
sebagai inputan dan tentukan jika ini sebuah palindrome atau bukan.
4.7.3 Notepad
Menggunakan class Process and Runtime, bukalah aplikasi notepad dari program java.
Pengenalan Pemrograman 2 13
J.E.N.I.
Bab 5
Aplikasi Berbasis Teks
5.1 Tujuan
Pembahasan kali ini akan menitikberatkan pada bahasan penggunaan argument
command-line. Selebihnya, Anda akan mempelajari mengenai penggunaan streams
untuk mendapatkan nilai input dari user pada saat runtime, sekaligus dalam proses
manipulasi file.
java Calculate 1 2
Pada contoh berikut ini, data 1 disimpan pada variabel args[0], begitu pula dengan
data 2 yang disimpan pada args[1]. Sehingga, tujuan dari deklarasi String args[]
sebagai sebuah parameter pada method utama menjadi jelas.
Selain melewatkan argument menuju method utama, Anda juga dapat memanipulasi
system properties dari command-line.
Pengenalan Pemrograman 2 1
J.E.N.I.
Bentuk ini menghasilkan nilai String dari System Properties yang ditunjukkan oleh
key yang ditentukan. Jika hasil menunjukkan nilai null, berarti tidak terdapat property
dengan key yang ditentukan.
Bentuk ini juga menghasilkan nilai String dari System Properties sesuai key yang
ditentukan. Akan menghasilkan nilai def, sebuah nilai default, jika tidak terdapat
property dengan key yang sesuai.
Kita tidak dapat cukup berhenti pada detail dari system properties, namun
dilanjutkan dengan memanipulasi system properties yang digunakan. Jika Anda
tertarik mempelajari lebih lanjut tentang system properties, Anda dapat menelusuri
dokumentasi API yang disediakan.
java -D<name>=value
Sebagai contoh, untuk mengatur system property dengan nama user.home bernilai
phillipines, gunakan perintah berikut :
java -Duser.home=philippines
Untuk menampilkan daftar system properties yang tersedia pada sistem Anda,
gunakan method getProperties seperti yang ditunjukkan sebagai berikut :
System.getProperties().list(System.out);
Pengenalan Pemrograman 2 2
J.E.N.I.
Untuk membaca karakter dari keyboard, Anda dapat menggunakan byte stream
System.in yang terdapat pada object BufferedReader. Baris berikut menunjukkan
bagaimana untuk melakukan hal tersebut :
Method read dari object BufferedReader selanjutnya digunakan untuk membaca nilai
input dari perangkat input.
import java.io.*;
class FavoriteCharacter {
public static void main(String args[]) throws IOException {
System.out.println("Hi, what's your favorite character?");
char favChar;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
favChar = (char) br.read();
System.out.println(favChar + " is a good choice!");
}
}
Jika Anda lebih memilih untuk membaca keseluruhan baris daripada membaca satu
karakter tiap waktu, gunakan method readLine :
str = br.readLine();
Pengenalan Pemrograman 2 3
J.E.N.I.
Berikut ini sebuah program yang hampir menyerupai contoh sebelumnya, namun
membaca keseluruhan string, bukan satu karakter.
import java.io.*;
class GreetUser {
public static void main(String args[]) throws IOException {
System.out.println("Hi, what's your name?");
String name;
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
name = br.readLine();
System.out.println("Nice to meet you, " + name + "! :)");
}
}
Pada saat menggunakan streams, jangan lupa untuk mengimport package java.io
seperti yang ditunjukkan dibawah ini :
import java.io.*;
Satu hal lagi yang perlu untuk diingat, pembacaan dari streams dapat menyebabkan
terjadinya exception. Jangan lupa untuk menangani exception tersebut
menggunakan perintah try-catch atau dengan mengindikasikan exception pada
klausa throws dalam method.
Pengenalan Pemrograman 2 4
J.E.N.I.
FileInputStream(String filename)
Constructor tersebut membuat sebuah koneksi terhadap file dimana nama dari file
tersebut ditunjukkan sebagai sebuah argument. Exception berupa
FileNotFoundException akan muncul jika file tidak ditemukan atau tidak dapat dibuka
dan kemudian dibaca.
Pengenalan Pemrograman 2 5
J.E.N.I.
import java.io.*;
class ReadFile {
public static void main(String args[]) throws IOException {
System.out.println("What is the name of the file to read from?");
String filename;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
filename = br.readLine();
System.out.println("Now reading from " + filename + "...");
FileInputStream fis = null;
try {
fis = new FileInputStream(filename);
} catch (FileNotFoundException ex) {
System.out.println("File not found.");
}
try {
char data;
int temp;
do {
temp = fis.read();
data = (char) temp;
if (temp != -1) {
System.out.print(data);
}
} while (temp != -1);
} catch (IOException ex) {
System.out.println("Problem in reading from the file.");
}
}
}
FileOutputStream(String filename)
Contructor tersebut menyediakan jalur output stream terhadap sebuah file yang
akan ditulisi. Sebuah Exception berupa FileNotFoundException akan muncul jika file
yang dimaksud tidak dapat dibuka untuk ditulisi.
Jika output stream telah dibuat, Anda dapat menggunakannya untuk menulisi file
yang dituju menggunakan method write. Method tersebut menggunakan penandaan
sebagai berikut :
void write(int b)
Parameter b mereferensikan data yang akan dituliskan pada file sesuai dengan hasil
output stream.
Pengenalan Pemrograman 2 6
J.E.N.I.
import java.io.*;
class WriteFile {
public static void main(String args[]) throws IOException {
System.out.println("What is the name of the file to be written
to?");
String filename;
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
filename = br.readLine();
System.out.println("Enter data to write to " + filename +
"...");
System.out.println("Type q$ to end.");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filename);
} catch (FileNotFoundException ex) {
System.out.println("File cannot be opened for
writing.");
}
try {
boolean done = false;
int data;
do {
data = br.read();
if ((char)data == 'q') {
data = br.read();
if ((char)data == '$') {
done = true;
} else {
fos.write('q');
fos.write(data);
}
} else {
fos.write(data);
}
} while (!done);
} catch (IOException ex) {
System.out.println("Problem in reading from the file.");
}
}
}
Pengenalan Pemrograman 2 7
J.E.N.I.
5.5 Latihan
Buatlah sebuah program yang memuat dua String sebagai argument, sumber dan
nama file tujuan. Kemudian, baca file sumber dan tuliskan isi dari file tersebut
terhadap file tujuan, seluruh spasi yang ada (‘ ‘) diubah menjadi underscore (‘ _ ‘).
Pengenalan Pemrograman 2 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. Oleh karena itu, pemahaman atas algoritma –
algoritma yang ada sangatlah berguna.
Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi
dua bagian, yang belum diurutkan (meja pertama) dan yang sudah diurutkan (meja
kedua). Elemen pertama diambil dari bagian array yang belum diurutkan dan
kemudian diletakkan sesuai posisinya pada bagian lain dari array yang telah
diurutkan. Langkah ini dilakukan secara berulang hingga tidak ada lagi elemen yang
tersisa pada bagian array yang belum diurutkan.
Pengenalan Pemrograman 2 1
J.E.N.I.
6.2.1 Algoritma
Pada akhir modul ini, anda akan diminta untuk membuat implementasi bermacam
algoritma sorting yang akan dibahas pada bagian ini.
Mari kita kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket
kartu. Asumsikan bahwa kartu tersebut akan diurutkan secara ascending. Pada
awalnya, kartu tersebut akan disusun secara linier pada sebuah meja dari kiri ke
kanan, dan dari atas ke bawah. Pilih nilai kartu yang paling rendah, kemudian
tukarkan posisi kartu ini dengan kartu yang terletak pada pojok kiri atas meja. Lalu
cari kartu dengan nilai paling rendah diantara sisa kartu yang tersedia. Tukarkan
kartu yang baru saja terpilih dengan kartu pada posisi kedua. Ulangi langkah –
langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan
dapat digeser dengan kartu yang bernilai lebih rendah.
Pengenalan Pemrograman 2 2
J.E.N.I.
Ide utama dari algoritma selection sort adalah memilih elemen dengan nilai paling
rendah dan menukar elemen yang terpilih dengan elemen ke-i. Nilai dari i dimulai
dari 1 ke n, dimana n adalah jumlah total elemen dikurangi 1.
6.3.1 Algoritma
Pengenalan Pemrograman 2 3
J.E.N.I.
Seperti yang telah dijelaskan sebelumnya, Merge sort menggunakan pola divide and
conquer. Dengan hal ini deskripsi dari algoritma dirumuskan dalam 3 langkah
berpola divide-and-conquer. Berikut menjelaskan langkah kerja dari Merge sort.
1. Divide
Memilah elemen – elemen dari rangkaian data menjadi dua bagian.
2. Conquer
Conquer setiap bagian dengan memanggil prosedur merge sort secara
rekursif
3. Kombinasi
Mengkombinasikan dua bagian tersebut secara rekursif untuk mendapatkan
rangkaian data berurutan
Proses rekursi berhenti jika mencapai elemen dasar. Hal ini terjadi bilamana bagian
yang akan diurutkan menyisakan tepat satu elemen. Sisa pengurutan satu elemen
tersebut menandakan bahwa bagian tersebut telah terurut sesuai rangkaian.
6.4.3 Algoritma
void mergeSort(Object array[], int startIdx, int endIdx) {
if (array.length != 1) {
//Membagi rangkaian data, rightArr dan leftArr
mergeSort(leftArr, startIdx, midIdx);
mergeSort(rightArr, midIdx+1, endIdx);
combine(leftArr, rightArr);
}
}
Pengenalan Pemrograman 2 4
J.E.N.I.
Rangkaian data:
7 2 5 6
7 2 5 6
7 2
Mengkombinasikan
2 7
Mengkombinasikan
5 6
6.5 Quicksort
Quicksort ditemukan oleh C.A.R Hoare. Seperti pada merge sort, algoritma ini juga
berdasar pada pola divide-and-conquer. Berbeda dengan merge sort, algoritma ini
hanya mengikuti langkah – langkah sebagai berikut :
1. Divide
Memilah rangkaian data menjadi dua sub-rangkaian A[p…q-1] dan A[q+1…r]
dimana setiap elemen A[p…q-1] adalah kurang dari atau sama dengan A[q]
dan setiap elemen pada A[q+1…r] adalah lebih besar atau sama dengan
elemen pada A[q]. A[q] disebut sebagai elemen pivot. Perhitungan pada
elemen q merupakan salah satu bagian dari prosedur pemisahan.
Pengenalan Pemrograman 2 5
J.E.N.I.
2. Conquer
Mengurutkan elemen pada sub-rangkaian secara rekursif
Pada algoritma quicksort, langkah ”kombinasi” tidak di lakukan karena telah terjadi
pengurutan elemen – elemen pada sub-array
6.5.1 Algoritma
Rangkaian data:
3 1 4 1 5 9 2 6 5 3 5 8
Inisialisasi elemen kiri sebagai elemen kedua dan elemen kanan sebagai elemen
akhir.
kiri kanan
3 1 4 1 5 9 2 6 5 3 5 8
Geser elemen kiri kearah kanan sampai ditemukan nilai yang lebih besar dari elemen
pivot tersebut. Geser elemen kanan ke arah kiri sampai ditemukan nilai dari elemen
yang tidak lebih besar dari elemen tersebut.
kiri kanan
3 1 4 1 5 9 2 6 5 3 5 8
Pengenalan Pemrograman 2 6
J.E.N.I.
3 1 3 1 5 9 2 6 5 4 5 8
Terlihat bahwa titik kanan dan kiri telah digeser sehingga mendapatkan nilai elemen
kanan < elemen kiri. Dalam hal ini tukarkan elemen pivot dengan elemen kanan.
pivot
2 1 3 1 3 9 5 6 5 4 5 8
Kemudian urutkan elemen sub-rangkaian pada setiap sisi dari elemen pivot.
6.6 Latihan
6.6.1 Insertion Sort
Pengenalan Pemrograman 2 7
J.E.N.I.
Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.
class MergeSort {
static void mergeSort(int array[], int startIdx,
int endIdx) {
if(startIdx == _____) {
return;
}
int length = endIdx-startIdx+1;
int mid = _____;
mergeSort(array, _____, mid);
mergeSort(array, _____, endIdx);
int working[] = new int[length];
for(int i = 0; i < length; i++) {
working[i] = array[startIdx+i];
}
int m1 = 0;
int m2 = mid-startIdx+1;
for(int i = 0; i < length; i++) {
if(m2 <= endIdx-startIdx) {
if(m1 <= mid-startIdx) {
if(working[m1] > working[m2]) {
array[i+startIdx] = working[m2++];
} else {
array[i+startIdx] = _____;
}
} else {
array[i+startIdx] = _____;
}
} else {
array[_____] = working[m1++];
}
}
}
Pengenalan Pemrograman 2 8
J.E.N.I.
6.6.4 Quicksort
class QuickSort {
static void quickSort (int[] array, int startIdx,
int endIdx) {
// startIdx adalah index bawah
// endIdx is index atas
// dari array yang akan diurutkan
int i=startIdx, j=endIdx, h;
//pilih elemen pertama sebagai pivot
int pivot=array[_____];
// memilah
do {
while (array[i]_____pivot) {
i++;
}
while (array[j]>_____) {
j--;
}
if (i<=j) {
h=_____;
array[i]=_____;
array[j]=_____;
i++;
j--;
}
} while (i<=j);
// rekursi
if (startIdx<j) {
quickSort(array, _____, j);
}
if (i<endIdx) {
quickSort(array, _____, endIdx);
}
}
Pengenalan Pemrograman 2 9
J.E.N.I.
Bab 7
Abstract Windowing Toolkit
dan Swing
7.1 Tujuan
Tanpa mempelajari tentang grapichal user interface (GUI) API, Anda masih tetap bisa
membuat suatu program. Tetapi, program Anda akan kelihatan tidak menarik dan tidak
nyaman digunakan bagi para user. Memiliki GUI yang baik dapat memberi efek pada
penggunaan aplikasi. Java menyediakan banyak tool seperti Abstract Windowing Toolkit dan
Swing untuk mengembangkan aplikasi GUI yang interaktif.
AWT dan Swing menyediakan komponen GUI yang dapat digunakan dalam membuat aplikasi
Java dan applet. Anda akan mempelajari applet pada bab berikutnya. Tidak seperti beberapa
komponen AWT yang menggunakan native code, keseluruhan Swing ditulis menggunakan
bahasa pemrograman Java. Swing menyediakan implementasi platform-independent dimana
aplikasi yang dikembangkan dengan platform yang berbeda dapat memiliki tampilan yang
sama. Begitu juga dengan AWT menjamin tampilan look and feel pada aplikasi yang dijalankan
pada dua mesin yang berbeda menjadi terlihat sama. Swing API dibangun dari beberapa API
yang mengimplementasikan beberapa jenis bagian dari AWT. Kesimpulannya, komponen AWT
dapat digunakan dengan komponen Swing.
Pengenalan Pemrograman 2 1
J.E.N.I.
Dalam mengembangkan aplikasi GUI, komponen GUI seperti tombol atau textfield diletakkan
di dalam kontainer. Berikut ini adalah daftar dari beberapa kelas penting pada kontainer yang
telah disediakan oleh AWT.
Komponen Abstract Class untuk objek yang dapat ditampilkan pada console dan
berinteraksi dengang user. Bagian utama dari semua kelas AWT.
Kontainer Abstract Subclass dari Component Class. Sebuah komponen yang dapat
menampung komponen yang lainnya.
Panel Turunan dari Container Class. Sebuah frame atau window tanpa titlebar,
menubar tidak termasuk border. Superclass dari applet class.
Window Turunan dari Container class. Top level window, dimana berarti tidak bisa
dimasukkan dalam objek yang lainnya.Tidak memiliki border dan menubar.
Frame Turunan dari window class. Window dengan judul, menubar, border dan
pengatur ukuran di pojok. Memiliki empat konstruktor , dua diantaranya
memiliki penulisan seperti dibawah ini :
Frame()
Frame(String title)
Default dari window adalah not visible atau tak tampak hingga Anda mengatur visibility
menjadi true. Inilah syntax untuk metode setVisible.
void setVisible(boolean b)
Dalam mendesain aplikasi GUI, Object Frame selalu digunakan. Dibawah ini adalah contoh
bagaimana membuat sebuah aplikasi.
import java.awt.*;
Pengenalan Pemrograman 2 2
J.E.N.I.
7.3.2 Grafik
Beberapa metode grafik ditemukan dalam Graphic class. Dibawah ini adalah daftar dari
beberapa metode.
Hubungan dari kelas ini adalah Color class, dimana memiliki tiga konstruktor.
Dibawah ini adalah contoh program yang menggunakan beberapa metode di dalam Graphic
class.
import java.awt.*;
Pengenalan Pemrograman 2 3
J.E.N.I.
Agar panel dapat terlihat atau visible, dia harus diletakkan didalam window yang dapat terlihat
seperti sebuah frame.
Berikut ini adalah daftar dari kontrol AWT. Kontrol adalah komponen seperti tombol atau
textfield yang mengijinkan user untuk berinteraksi dengan aplikasi GUI. Berikut ini semua
subkelas dari Components class.
Berikut adalah aplikasi membuat sebuah frame dengan kontrol yang telah dimasukkan di
dalamnya.
import java.awt.*;
Pengenalan Pemrograman 2 4
J.E.N.I.
chooser.add("Britney");
fwc.add(chooser);
fwc.add(new Scrollbar());
fwc.setVisible(true);
}
}
1.FlowLayout
2.BorderLayout
3.GridLayout
4.GridBagLayout
5.CardLayout
Layout manager dapat diatur menggunakan metode setLayout dari Container class. Metode ini
dapat ditulis sebagai berikut.
Jika Anda memilih untuk tidak menggunakan layout manager, Anda dapat mengisi null sebagai
argumen untuk metode ini. Tetapi selanjutnya, Anda akan mengatur posisi elemen secara
manual dengan menggunakan metode setBounds dari Components class.
Metode ini mengatur posisi berdasarkan pada argumen x dan y, dan ukuran berdasarkan
argumen width dan height. Hal ini akan cukup menyulitkan dan membosankan untuk aplikasi
jika Anda memiliki beberapa objek komponen didalam objek kontainer. Anda akan memanggil
metode ini untuk setiap komponen.
FlowLayout Manager adalah default manager untuk Panel class dan subkelasnya, termasuk
applet class. Cara meletakkan komponen dari FlowLayout Manager dimulai dari kiri ke kanan
dan dari atas ke bawah, dimulai dari pojok kiri atas. Seperti pada saat Anda mengetik
menggunakan editor kata pada umumnya. Berikut adalah bagaimana FlowLayout Manager
bekerja, dimana memiliki tiga konstruktor seperti daftar di bawah ini.
FlowLayout Constructors
FlowLayout()
Membuat objek baru FlowLayout dengan posisi di tengah dan lima unit horizontal dan vertikal
gap dimasukkan pada komponen sebagai default.
FlowLayout(int align)
Pengenalan Pemrograman 2 5
J.E.N.I.
FlowLayout Constructors
Membuat objek baru FlowLayout dengan posisi spesifik dan lima unit horizontal dan vertikal
gap dimasukkan pada komponen sebagai default.
Membuat objek baru FlowLayout dengan argumen pertama sebagai posisi pada komponen
dan hgap untuk horizontal dan vgap untuk vertikal pada komponen
Gap dapat dikatakan sebagai jarak antara komponen dan biasanya diukur dengan satuan
pixel. Posisi argumen mengikuti penulisan sebagai berikut :
1.FlowLayout.LEFT
2.FlowLayout.CENTER
3.FlowLayout.RIGHT
import java.awt.*;
Gambar berikut adalah contoh dari hasil yang berjalan pada platform Window.
Pengenalan Pemrograman 2 6
J.E.N.I.
7.4.2.BorderLayout Manager
BorderLayout membagi kontainer menjadi lima bagian diantaranya utara, selatan, timur,
barat, dan tengah. Setiap komponen dimasukkan ke dalam region yang spesifik. Region utara
dan selatan membentuk jalur horizontal sedangkan region timur dan barat membentuk jalur
vertikal. Dan region tengah berada pada perpotongan jalur horizontal dan vertikal. Tampilan
ini adalah bersifat default untuk objek Window, termasuk objek dari subkelas Window yaitu
tipe Frame dan Dialog.
Konstruktor BorderLayout
BorderLayout()
Membuat objek BorderLayout baru tanpa spasi yang diaplikasikan diantara komponen yang
berbeda.
Membuat objek BorderLayout baru dengan spasi unit hgap horizontal dan unit vgap vertikal
yang diaplikasikan diantara komponen yang berbeda.
Seperti pada FlowLayout Manager, parameter hgap dan vgap disini juga menjelaskan jarak
antara komponen dengan kontainer.
Berikut ini adalah contoh program yang menunjukkan bagaimana BorderLayout bekerja.
import java.awt.*;
Pengenalan Pemrograman 2 7
J.E.N.I.
}
}
Berikut ini adalah hasil dari contoh program tersebut. Gambar kedua menunjukkan efek dari
mengubah bentuk dari frame.
Konstruktor GridLayout
GridLayout()
Membuat objek GridLayout baru dengan satu baris dan satu kolom sebagai default
Membuat objek GridLayout baru dengan jumlah baris dan kolom sesuai dengan keinginan
Membuat objek GridLayout baru dengan jumlah baris dan kolom yang ditentukan. Unit spasi
hgap horizontal dan vgap vertikal diaplikasikan ke dalam komponen.
Pengenalan Pemrograman 2 8
J.E.N.I.
Pengenalan Pemrograman 2 9
J.E.N.I.
Pengenalan Pemrograman 2 10
J.E.N.I.
Seperti pada package AWT, package dari Swing menyediakan banyak kelas untuk membuat
aplikasi GUI. Package tersebut dapat ditemukan di javax.swing. Perbedaan utama antara
keduanya adalah komponen Swing ditulis menyeluruh menggunakan Java mengingat yang
belakangan tidak. Kesimpulannya, program GUI ditulis menggunakan banyak kelas dari
package Swing yang mempunyai tampilan look and feel yang sama meski dijalankan pada
beda paltform. Lebih dari itu, Swing menyediakan komponen yang lebih menarik seperti color
chooser dan option pane.
Nama dari komponen GUI milik Swing hampir sama persis dengan komponen GUI milik AWT.
Perbedaan jelas terdapat pada penamaan komponen. Pada dasarnya, nama komponen Swing
sama dengan nama komponen AWT tetapi dengan tambahan huruf J pada prefixnya. Sebagai
contoh, satu komponen dalam AWT adalah button class. Sedangkan pada Swing, nama
komponen tersebut menjadi Jbutton class. Berikut adalah daftar dari komponen Swing.
Komponen Penjelasan
Swing
JComponent Kelas induk untuk semua komponen Swing, tidak termasuk top-level
kontainer
JButton Tombol “push”. Korespondesi pada button class dalam package AWT
JCheckBox Item yang dapat dipilih atau tidak oleh pengguna. Korespondensi pada
checkbox class dalam package AWT
Pengenalan Pemrograman 2 11
J.E.N.I.
Komponen Penjelasan
Swing
JTextField Mengijinkan untuk mengedit text satu baris. Korespondensi pada textfield
class dalam package AWT.
JFrame Turunan dan korepondensi pada frame class dalam package AWT tetapi
keduanya sedikit tidak cocok dalam kaitannya dengan menambahkan
komponen pada kontainer. Perlu mendapatkan content pane yang terbaru
sebelum menambah sebuah komponen.
JApplet Turunan dan korepondensi ke Applet class dalam package AWT. Juga sedikit
tidak cocok dengan applet class dalam kaitannya dengan menambahkan
komponen pada kontainer
JDialog Turunan dan korespondensi pada dialog class dalam package AWT. Biasanya
digunakan untuk menginformasikan sesuatu kepada pengguna atau prompt
pengguna untuk input.
Untuk daftar yang lengkap dari komponen Swing, Anda dapat melihatnya di dokumentasi API.
class SwingDemo {
JFrame frame;
JPanel panel;
JTextField textField;
JButton button;
Container contentPane;
void launchFrame() {
Pengenalan Pemrograman 2 12
J.E.N.I.
/* initialization */
frame = new JFrame("My First Swing Application");
panel = new JPanel();
textField = new JTextField("Default text");
button = new JButton("Click me!");
contentPane = frame.getContentPane();
/* add components to panel– uses FlowLayout by default */
panel.add(textField);
panel.add(button);
/* add components to contentPane– uses BorderLayout */
contentPane.add(panel, BorderLayout.CENTER);
frame.pack();
//causes size of frame to be based on the components
frame.setVisible(true);
}
public static void main(String args[]) {
SwingDemo sd = new SwingDemo();
sd.launchFrame();
}
}
Perlu diperhatikan pada package java.awt masih saja diimpor karena layout manager yang
digunakan terdapat pada package tersebut. Juga, memberi judul pada frame dan mengepack
komponen di dalam frame dapat juga dilakukan untuk frame AWT.
import javax.swing.*;
class JOptionPaneDemo {
JOptionPane optionPane;
void launchFrame() {
optionPane = new JOptionPane();
String name = optionPane.showInputDialog("Hi, what's your
name?");
optionPane.showMessageDialog(null,
"Nice to meet you, " + name + ".", "Greeting...",
optionPane.PLAIN_MESSAGE);
Pengenalan Pemrograman 2 13
J.E.N.I.
System.exit(0);
}
public static void main(String args[]) {
new JOptionPaneDemo().launchFrame();
}
}
7.6 Latihan
7.6.1 Tic-Tac-Toe
Buatlah tampilan GUI untuk program tic-tac-toe. Papannya terdiri dari enam kotak. Ingatlah
bahwa Anda akan menambahkan kode ini pada tahap akhir untuk mengatasi interaksi antar
pengguna. Jadi, desainlah papan Anda dengan benar. Pastikanlah Anda memilih komponen
yang pantas untuk papan tersebut. keluarkan semua sisi artistik Anda. Anda dapat
menggunakan AWT atau Swing untuk latihan ini.
Pengenalan Pemrograman 2 14
J.E.N.I.
Bab 8
GUI Event Handling
8.1 Tujuan
Pada modul ini, Anda akan belajar bagaimana mengendalikan events triggered ketika
user berinteraksi dengan aplikasi GUI Anda. Setelah menyelesaikan modul ini, Anda
akan dapat mengembangkan aplikasi GUI yang merespon interaksi user.
1. Event Source
The event source mengacu pada komponen GUI yang men-generate event. Sebagai
contoh, jika user menekan tombol, event source dalam hal ini adalah tombol.
2. Event Listener/Handler
The event listener menerima berita dari event-event dan proses-proses interaksi user.
Ketika tombol ditekan, listener akan mengendalikan dengan menampilkan sebuah
informasi yang berguna untuk user.
3. Event Object
Ketika sebuah event terjadi (misal, ketika user berinteraksi dengan komponen GUI),
sebuah objek event diciptakan. Objek berisi semua informasi yang perlu tentang
event yang telah terjadi. Informasi meliputi tipe dari event yang telah terjadi, seperti
ketika mouse telah di-klik. Ada beberapa class event untuk kategori yang berbeda
dari user action. Sebuah event object mempunyai tipe data tentang salah satu dari
class ini.
Pengenalan Pemrograman 2 1
J.E.N.I.
Ketika sesuatu terjadi dengan event source, sebuah event object akan menguraikan
event yang diciptakan. Event kemudian ditembak oleh source pada listeners yang
teregistrasi.
Saat listener menerima sebuah event object (pemberitahuan) dari source, dia akan
bekerja. Menerjemahkan pemberitahuan dan memproses event yang terjadi.
Pengenalan Pemrograman 2 2
J.E.N.I.
<Type> tergantung pada tipe dari event source. Dapat berupa Key, Mouse, Focus,
Component, Action dan lainnya.
Beberapa listeners dapat diregistrasi dengan satu event source untuk menerima
pemberitahuan event.
Listener yang telah teregistrasi dapat juga tidak diregistrasikan lagi menggunakan
remove<Type>Listener methods.
void remove<Type>Listener(<Type>Listener listenerObj)
Pengenalan Pemrograman 2 3
J.E.N.I.
ActionListener Method
public void actionPerformed(ActionEvent e)
Mengendalikan ActionEvent e yang terjadi.
MouseListener Methods
public void mouseClicked(MouseEvent e)
Dipanggil pada saat tombol mouse di click (seperti tekan dan lepas).
public void mouseEntered(MouseEvent e)
Dipanggil pada saat kursor mouse memasuki area komponen.
public void mouseExited(MouseEvent e)
Dipanggil pada saat kursor mouse meninggalkan area komponen.
public void mousePressed(MouseEvent e)
Dipanggil pada saat tombol mouse ditekan di atas komponen
public void mouseReleased(MouseEvent e)
Dipanggil pada saat tombol mouse dilepas di atas komponen
Pengenalan Pemrograman 2 4
J.E.N.I.
MouseListener Methods
public void mouseDragged(MouseEvent e)
Digunakan untuk memantau pergerakan mouse yang melintasi objek pada saat tombol
mouse ditekan. Tindakan ini persis sama dengan tindakan pada saat memindahkan
sebuah window.
public void mouseMoved(MouseEvent e)
Digunakan untuk memantau pergerakan mouse pada saat mouse melintasi area suatu
objek. Pada saat ini tidak ada mouse yang ditekan, hanya memindahkan pointer mouse
melalui objek.
WindowListener Methods
public void windowOpened(WindowEvent e)
Dipanggil pada saat objek window dibuka (pertama kali window dibuat tampil).
public void windowClosing(WindowEvent e)
Dipanggil pada saat user mencoba untuk menutup objek Window dari menu sistem
objek.
public void windowClosed(WindowEvent e)
Dipanggil pada saat objek Window ditutup setelah memanggil penempatan (misal,
release dari resource-resource yang digunakan oleh source) pada objek.
public void windowActivated(WindowEvent e)
Dilibatkan ketika objek Window adalah window yang aktif (window masih dipakai).
public void windowDeactivated(WindowEvent e)
Dilibatkan ketika objek Window tidak lagi merupakan window yang aktif.
public void windowIconified(WindowEvent e)
Dipanggil ketika objek Window di-minimize.
public void windowDeiconified(WindowEvent e)
Dipanggil ketika objek Window kembali setelah di-minimize ke keadaan normal.
Pengenalan Pemrograman 2 5
J.E.N.I.
1. Buatlah sebuah class yang menguraikan dan menampilkan tampilan dari aplikasi GUI
Anda.
2. Buatlah sebuah class yang menerapkan interface listener yang sesuai. Class ini boleh
mengacu pada class yang sama seperti pada langkah awal.
3. Dalam menerapkan class, gunakan semua methods dengan interface listener yang
sesuai. Uraikan masing-masing method bagaimana Anda ingin mengendalikan event-
event. Anda dapat memberikan implementasi kosong untuk method yang tidak ingin
Anda gunakan.
4. Daftarkan objek listener, instansiasi dari class listener pada langkah 2, dengan source
component menggunakan method add<Type>Listener.
import java.awt.*;
import java.awt.event.*;
Pengenalan Pemrograman 2 6
J.E.N.I.
}
public void mouseDragged(MouseEvent me) {
String msg = "Mouse dragged at " + me.getX() + "," +
me.getY();
tf.setText(msg);
}
public void mouseMoved(MouseEvent me) {
String msg = "Mouse moved at " + me.getX() + "," +
me.getY();
tf.setText(msg);
}
public static void main(String args[]) {
MouseEventsDemo med = new MouseEventsDemo("Mouse Events
Demo");
med.launchFrame();
}
}
import java.awt.*;
import java.awt.event.*;
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(this);
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
Pengenalan Pemrograman 2 7
J.E.N.I.
import java.awt.*;
import java.awt.event.*;
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(w);
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
Pengenalan Pemrograman 2 8
J.E.N.I.
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(new CFListener());
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
Pengenalan Pemrograman 2 9
J.E.N.I.
import java.awt.*;
import java.awt.event.*;
CloseFrame(String title) {
super(title);
label = new Label("Close the frame.");
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
dispose();
System.exit(1);
}
});
}
void launchFrame() {
setSize(300,300);
setVisible(true);
}
Pengenalan Pemrograman 2 10
J.E.N.I.
8.7 Latihan
8.7.1 Tic-Tac-Toe
Extend program papan Tic-Tac-Toe yang telah Anda kembangkan sebelumnya dan
tambahkan event handlers ke kode tersebut untuk membuat program berfungsi penuh.
Permainan Tic-Tac-Toe dimainkan dengan dua pemain. Pemain mengambil giliran
mengubah. Setiap giliran, pemain dapat memilih kotak pada papan. Ketika kotak dipilih,
kotak ditandai oleh simbol pemain (O dan X biasanya digunakan sebagai simbol).
Pemain yang sukses menaklukkan 3 kotak membentuk garis horisontal, vertikal, atau
diagonal, memenangkan permainan. Permainan akan berakhir ketika pemain menang
atau ketika semua kotak telah terisi.
Pengenalan Pemrograman 2 11
J.E.N.I.
Bab 9
Threads
9.1 Tujuan
Pada bab-bab sebelumnya Anda terbiasa untuk membuat program yang
berururutan/sekuensial. Sebuah program sekuensial berarti sebuah program yang hanya
memiliki satu aliran eksekusi. Setiap eksekusi, ia memiliki sebuah titik awal eksekusi,
kemudian sebuah sekuen eksekusi, dan kemudian berakhir. Selama runtime, pasti hanya
satu proses yang telah dieksekusi.
Bagaimanapun juga, di dunia nyata, pasti dibutuhkan sesuatu yang dapat mengatur
proses yang terjadi dan berjalan bersama-sama.Oleh karena itu, thread hadir untuk
menjadi solusi dalam mengatasi permasalahan tersebut.
Sebuah thread merupakan sebuah pengontrol aliran program. Untuk lebih mudahnya,
bayangkanlah thread sebagai sebuah proses yang akan dieksekusi didalam sebuah
program tertentu. Penggunaan sistem operasi modern saat ini telah mendukung
kemampuan untuk menjalankan beberapa program. Misalnya, pada saat Anda mengetik
sebuah dokumen di komputer Anda dengan menggunakan text editor, dalam waktu yang
bersamaan Anda juga dapat mendengarkan musik, dan surfing lewat internet di PC
Anda. Sistem operasi yang telah terinstal dalam computer Anda itulah yang
memperbolehkan Anda untuk menjalankan multitaskting. Seperti itu juga sebuah
program (ibaratkan di PC Anda), ia juga dapat mengeksekusi beberapa proses secara
bersama-sama(ibaratkan beberapa aplikasi berbeda yang bekerja pada PC Anda).
Sebuah contoh aplikasi adalah HotJava browser yang memperbolehkan Anda untuk
browsing terhadap suatu page, bersamaan dengan mendownload object yang lain,
misalnya gambar, memainkan animasi, dan juga file audio pada saat yang bersamaan.
Pengenalan Pemrograman 2 1
J.E.N.I.
1. Running
Sebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari CPU.
2. Ready to run
Thread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk
melakukannya.
3. Resumed
Setelah sebelumnya di block atau diberhentikan sementara, state ini kemudian siap
untuk dijalankan.
4. Suspended
Sebuah thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk
menjalankan thread lain bekerja.
5. Blocked
Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu berjalan,
karena ia akan menunggu sebuah resource tersedia atau sebuah event terjadi.
9.2.3 Prioritas
Untuk menentukan thread mana yang akan menerima control dari CPU dan akan
dieksekusi pertama kali, setiap thread akan diberikan sebuah prioritas. Sebuah prioritas
adalah sebuah nilai integer dari angka 1 sampai dengan 10, dimana semakin tinggi
prioritas dari sebuah thread, berarti semakin besar kesempatan dari thread tersebut
untuk dieksekusi terlebih dahulu.
Sebagai contoh, asumsikan bahwa ada dua buah thread yang berjalan bersama-sama.
Thread pertama akan diberikan prioritas nomor 5, sedangkan thread yang kedua
memiliki prioritas 10. Anggaplah bahwa thread pertama telah berjalan pada saat thread
kedua dijalankan. Thread kedua akan menerima control dari CPU dan akan dieksekusi
pada saat thread kedua tersebut memiliki prioritas yang lebih tinggi dibandingkan thread
yang pada saat itu tengah berjalan. Salah satu contoh dari skenario ini adalah context
switch.
Pengenalan Pemrograman 2 2
J.E.N.I.
Sebuah context switch terjadi apabila sebagian dari thread telah dikontrol oleh CPU dari
thread yang lain. Ada beberapa skenario mengenai bagaimana cara kerja dari context
switch. Salah satu skenario adalah sebuah thread yang sedang berjalan memberikan
kesempatan kepada CPU untuk mengontrol thread lain sehingga ia dapat berjalan.
Dalam kasus ini, prioritas tertinggi dari thread adalah thread yang siap untuk menerima
kontrol dari CPU. Cara yang lain dari context switch adalah pada saat sebuah thread
yang sedang berjalan diambil alih oleh thread yang memiliki prioritas tertinggi seperti
yang telah dicontohkan sebelumnya.
Hal ini juga mungkin dilakukan apabila lebih dari satu CPU tersedia, sehingga lebih dari
satu prioritas thread yang siap untuk dijalankan. Untuk menentukan diantara dua thread
yang memiliki prioritas sama untuk menerima kontrol dari CPU, sangat bergantung
kepada sistem operasi yang digunakan. Windows 95/98/NT menggunakan time-slicing
dan round-robin untuk menangani kasus ini. Setiap thread dengan prioritas yang sama
akan diberikan sebuah jangka waktu tertentu untuk dieksekusi sebelum CPU mengontrol
thread lain yang memiliki prioritas yang sama. Sedangkan Solaris, ia akan membiarkan
sebuah thread untuk dieksekusi sampai ia menyelesaikan tugasnya atau sampai ia
secara suka rela membiarkan CPU untuk mengontrol thread yang lain.
Thread Constructors
Thread()
Membuat sebuah object Thread yang baru.
Thread(String name)
Membuat sebuah object thread dengan memberikan penamaan yang spesifik.
Thread(Runnable target)
Membuat sebuah object Thread yang baru berdasar pada object Runnable. Target
menyatakan sebuah object dimana method run dipanggil.
Thread(Runnable target, String name)
Membuat sebuah object Thread yang baru dengan nama yang spesifik dan berdasarkan
pada object Runnable.
Pengenalan Pemrograman 2 3
J.E.N.I.
9.3.2 Constants
Class Thread juga menyediakan beberapa constants sebagai nilai prioritas. Tabel berikut
ini adalah rangkuman dari class Thread.
Thread Constants
public final static int MAX_PRIORITY
Nilai prioritas maksimum, 10
public final static int MIN_PRIORITY
Nilai prioritas minimum, 1.
public final static int NORM_PRIORITY
Nilai default prioritas, 5.
9.3.3 Methods
Method- method inilah yang disediakan dalam class Thread.
Thread Methods
public static Thread currentThread()
Mengembalikan sebuah reference kepada thread yang sedang berjalan.
public final String getName()
Mengembalikan nama dari thread.
public final void setName(String name)
Mengulang pemberian nama thread sesuai dengan argument name. Hal ini dapat
menyebabkan SecurityException.
public final int getPriority()
Mengembalikan nilai prioritas yang telah diberikan kepada thread tersebut.
public final boolean isAlive()
Menunjukkan bahwa thread tersebut sedang berjalan atau tidak.
public final void join([long millis, [int nanos]])
Sebuah overloading method. Sebuah thread yang sedang berjalan, harus menunggu
sampai thread tersebut selesai (jika tidak ada parameter-parameter spesifik), atau
sampai waktu yang telah ditentukan habis.
public static void sleep(long millis)
Menunda thread dalam jangka waktu milis. Hal ini dapat menyebabkan
InterruptedException.
public void run()
Eksekusi thread dimulai dari method ini.
Pengenalan Pemrograman 2 4
J.E.N.I.
Thread Methods
public void start()
Menyebabkan eksekusi dari thread berlangsung dengan cara memanggil method run.
import javax.swing.*;
import java.awt.*;
Pengenalan Pemrograman 2 5
J.E.N.I.
class TestThread {
public static void main(String args[]) {
PrintNameThread pnt1 = new PrintNameThread("A");
PrintNameThread pnt2 = new PrintNameThread("B");
PrintNameThread pnt3 = new PrintNameThread("C");
PrintNameThread pnt4 = new PrintNameThread("D");
}
}
Perhatikan bahwa variable reference pnt1, pnt2, pnt3, dan pnt4 hanya digunakan satu
kali. Untuk aplikasi ini, variabel yang menunjuk pada tiap thread pada dasarnya tidak
dibutuhkan. Anda dapat mengganti body dari main tersebut dengan pernyataan berikut
ini:
new PrintNameThread("A");
new PrintNameThread("B");
new PrintNameThread("C");
new PrintNameThread("D");
Program akan memberikan keluaran yang berbeda pada setiap eksekusi. Berikut ini
adalah contoh dari keluarannya.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCDABCDABCDA
BCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD
ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABC
DABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDBC
DBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBC
DBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBC
DBCDBCDBCDBCDBCDBCDBCD
Contoh dibawah ini hampir sama dengan contoh terakhir yang telah Anda pelajari, tapi
Pengenalan Pemrograman 2 6
J.E.N.I.
class TestThread {
public static void main(String args[]) {
new PrintNameThread("A");
new PrintNameThread("B");
new PrintNameThread("C");
new PrintNameThread("D");
}
}
Pengenalan Pemrograman 2 7
J.E.N.I.
class TestThread {
public static void main(String args[]) {
PrintNameThread pnt1 = new PrintNameThread("A");
PrintNameThread pnt2 = new PrintNameThread("B");
PrintNameThread pnt3 = new PrintNameThread("C");
PrintNameThread pnt4 = new PrintNameThread("D");
System.out.println("Running threads...");
try {
pnt1.thread.join();
pnt2.thread.join();
pnt3.thread.join();
pnt4.thread.join();
} catch (InterruptedException ie) {
}
System.out.println("Threads killed."); //dicetak terakhir
}
}
Cobalah untuk menjalan program diatas. Apa yang Anda dapat? Melalui pemanggilan
method join, kita memastikan bahwa pernyataan terakhir akan dieksekusi pada saat-
saat terakhir.
Sekarang, berilah comment dilua blok try-catch dimana join dipanggil. Apakah ada
perbedaan pada keluarannya?
Pengenalan Pemrograman 2 8
J.E.N.I.
9.5 Sinkronisasi
Sampai sejauh ini, Anda telah melihat contoh-contoh dari thread yang berjalan bersama-
sama tetapi tidak bergantung satu dengan yang lainnya. Thread tersebut adalah thread
yang berjalan sendiri tanpa memperhatikan status dan aktifitas dari thread lain yang
sedang berjalan. Pada contoh tersebut, setiap thread tidak membutuhkan resource atau
method dari luar sehingga ia tidak membutuhkan komunikasi dengan thread lain.
class TwoStrings {
static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
Pengenalan Pemrograman 2 9
J.E.N.I.
Program ini diharapkan dapat mencetak dua argument object Runnable secara
berurutan. Permasalahannya adalah, pendeklarasian method sleep akan menyebabkan
thread yang lain akan dieksekusi walaupun thread yang pertama belum selesai
dijalankan pada saat eksekusi method print dari class TwoStrings. Berikut ini adalah
contoh dari keluarannya.
Pada saat berjalan, ketiga thread telah mencetak argument string pertama mereka
sebelum argument kedua dicetak. Sehingga hasilnya adalah sebuah keluaran yang tidak
jelas.
Sebenarnya, pada contoh diatas, tidak menunjukkan permasalahan yang serius. Akan
tetapi pada aplikasi yang lain hal ini dapat menimbulkan exception atau permasalahan-
permasalahan tertentu.
synchronized (<object>) {
//statements yang akan disinkronisasikan
}
Dengan ini, object dari method tersebut hanya dapat dipanggil oleh satu thread pada
satu waktu.
class TwoStrings {
synchronized static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
Pengenalan Pemrograman 2 10
J.E.N.I.
System.out.println(str2);
}
}
class TestThread {
public static void main(String args[]) {
new PrintStringsThread("Hello ", "there.");
new PrintStringsThread("How are ", "you?");
new PrintStringsThread("Thank you ", "very much!");
}
}
Hello there.
How are you?
Thank you very much!
class TwoStrings {
static void print(String str1, String str2) {
System.out.print(str1);
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
System.out.println(str2);
}
}
Pengenalan Pemrograman 2 11
J.E.N.I.
this.str1 = str1;
this.str2 = str2;
this.ts = ts;
thread = new Thread(this);
thread.start();
}
public void run() {
synchronized (ts) {
ts.print(str1, str2);
}
}
}
class TestThread {
public static void main(String args[]) {
TwoStrings ts = new TwoStrings();
new PrintStringsThread("Hello ", "there.", ts);
new PrintStringsThread("How are ", "you?", ts);
new PrintStringsThread("Thank you ", "very much!", ts);
}
}
Pengenalan Pemrograman 2 12
J.E.N.I.
pelanggan belum siap untuk memesan. Akan sangat mengganggu apabila pelayan
terus-menerus bertanya kepada pelanggan apakah ia telah siap untuk memesan atau
tidak. Oleh karena itu, pelayan akan menunggu (wait) sampai pelanggan memberikan
tanda (notifies) bahwa ia telah siap untuk memesan. Sekali pelanggan sudah memesan,
akan sangat mengganggu apabila ia terus menerus bertanya kepada pelayan, apakah
pesanannya sudah tersedia atau tidak. Normalnya, pelanggan akan menunggu sampai
pelayan memberikan tanda (notifies) dan kemudian menyajikan makanan.
Perhatikan pada skenario berikut, setiap anggota yang menunggu, hanya akan berjalan
sampai anggota yang lain memberi tanda yang memerintahkan untuk berjalan. Hal ini
sama dengan yang terjadi pada thread.
Pengenalan Pemrograman 2 13
J.E.N.I.
class SharedData {
int data;
synchronized void set(int value) {
System.out.println("Generate " + value);
data = value;
}
synchronized int get() {
System.out.println("Get " + data);
return data;
}
}
class TestProducerConsumer {
public static void main(String args[]) throws Exception {
SharedData sd = new SharedData();
new Producer(sd);
new Consumer(sd);
}
}
Generate 8
Generate 45
Generate 52
Generate 65
Get 65
Generate 23
Get 23
Generate 49
Pengenalan Pemrograman 2 14
J.E.N.I.
Get 49
Generate 35
Get 35
Generate 39
Get 39
Generate 85
Get 85
Get 85
Get 85
Generate 35
Get 35
Get 35
Hasil tersebut bukanlah hasil yang kita harapkan. Kita berharap bahwa setiap nilai yang
diproduksi oleh produser dan juga kita akan mengansumsikan bahwa konsumen akan
mendapatkan value tersebut. Dibawah ini adalah keluaran yang kita harapkan.
Generate 76
Get 76
Generate 25
Get 25
Generate 34
Get 34
Generate 84
Get 84
Generate 48
Get 48
Generate 29
Get 29
Generate 26
Get 26
Generate 86
Get 86
Generate 65
Get 65
Generate 38
Get 38
Generate 46
Get 46
Untuk memperbaiki kode diatas, kita akan menggunakan method untuk komunikasi
interthread. Implementasi dibawah ini adalah implementasi dari permasalahan produsen
konsumen dengan menggunakan method untuk komunikasi interthread.
class SharedData {
int data;
boolean valueSet = false;
synchronized void set(int value) {
if (valueSet) { //baru saja membangkitkan sebuah nilai
try {
wait();
} catch (InterruptedException ie) {
}
}
System.out.println("Generate " + value);
data = value;
Pengenalan Pemrograman 2 15
J.E.N.I.
valueSet = true;
notify();
}
synchronized int get() {
if (!valueSet) { //produsen belum men-set sebuah nilai
try {
wait();
} catch (InterruptedException ie) {
}
}
System.out.println("Get " + data);
valueSet = false;
notify();
return data;
}
}
class TestProducerConsumer {
public static void main(String args[]) throws Exception {
SharedData sd = new SharedData();
new Producer(sd);
new Consumer(sd);
}
}
Pengenalan Pemrograman 2 16
J.E.N.I.
Tanpa penggunaan interface ini, kita akan mengeksekusi tugas dari Runnable dengan
cara menciptakan instance dari Thread dan memanggil method start dari object Thread.
Kode dibawah ini mendemonstrasikan hal tersebut:
new Thread(<aRunnableObject>).start();
Dengan kemampuan dari interface yang baru ini, object Runnable yang telah diberikan
akan dieksekusi menggunakan kode berikut ini:
<anExecutorObject>.execute(<aRunnableObject>);
Framework Executor merupakan salah satu solusi dari permasalahan ini dengan cara
mechanic decoupling task submission mengenai bagaimana setiap tugas dijalankan,
termasuk detail dari penggunaan thread, penjadwalan, dan sebagainya. Lebih
disarankan untuk membuat thread secara eksplisit daripada membuat thread dan
menjalankannya lewat method start yang telah diset untuk setiap task. Oleh karena itu
lebih disarankan untuk menggunakan potongan kode berikut ini:
Pengenalan Pemrograman 2 17
J.E.N.I.
methods:
Factory Method dari class Executor
public static ExecutorService newCachedThreadPool()
Menciptakan sebuah pool thread yang akan menciptakan thread sesuai yang
dibutuhkan, atau ia akan menggunakan kembali thread yang telah dibangun
sebelumnya, apabila tersedia. Sebuah method overloading, juga akan menggunakan
object ThreadFactory sebagai argument.
public static ExecutorService newFixedThreadPool(int nThreads)
Menciptakan sebuah pool thread yang dapat digunakan kembali untuk membetulkan
sebuah thread yang berada didalam antrian yang tidak teratur. Sebuah overloading
method, akan menggunakan object ThreadFactory sebagai tambahan parameter.
public static ScheduledExecutorService newScheduledThreadPool(int
corePoolSize)
Menciptakan sebuah pool thread yang akan menjadwalkan command yang akan
berjalan setelah diberikan sebuah delay, atau untuk mengeksekusi secara periodic.
Sebuah overloading method, akan menggunakan object ThreadFactory sebagai
tambahan parameter.
public static ExecutorService newSingleThreadExecutor()
Menciptakan sebuah Executor yang digunakan sebagai satu-satu-nya pelaksana dari
sebuah antrian thread yang tidak teratur. Creates an Executor that uses a single
worker thread operating off an unbounded queue. Sebuah overloading method, juga
akan menggunakan object ThreadFactory sebagai tambahan parameter.
public static ScheduledExecutorService newSingleThreadScheduledExecutor()
Menciptakan sebuah Executor thread yang akan menjadwalkan command untuk
dijalankan setelah delay tertentu, atau dieksekusi secara periodic. Sebuah overloading
method, juga akan menggunakan object ThreadFactory sebagai tambahan parameter
Pada saat sebuah tugas dari Runnable telah dieksekusi dan diselesaikan dengan control
sebuah interface Executor. Untuk memberhentikan thread ini, kita dapat dengan mudah
memanggil method shutdown dari interface tersebut seperti berikut ini:
executor.shutdown();
Interface Callable pada dasarnya adalah sama dengan interface Runnable tanpa
kelemahan-kelemahan yang telah disebutkan diatas. Untuk mendapatkan hasil dari
Pengenalan Pemrograman 2 18
J.E.N.I.
sebuah pekerjaan yang telah diselesaikan oleh Runnable, kita harus melakukan suatu
teknik untuk mendapatkan hasilnya. Teknik yang paling umum adalah dengan membuat
sebuah instance variable untuk menyimpan hasilnya. Kode berikut ini akan menunjukkan
bagaimana hal tersebut dilakukan.
import java.util.concurrent.*;
V adalah sebuah tipe generic yang berarti nilai pengembalian dari pemanggilan method
tersebut adalah tipe data reference apapun. Anda akan mempelajari tentang tipe data
generic di bab selanjutnya.
Masih ada lagi fitur-fitur concurrency dalam J2SE 5.0. Lihatlah lagi didalam dokumentasi
API untuk mendapatkan informasi lebih detail lagi mengenai fitur-fitur yang lain.
Pengenalan Pemrograman 2 19
J.E.N.I.
9.8 Latihan
9.8.1 Banner
Dengan menggunakan AWT atau Swing, buatlah sebuah banner sederhana yang akan
mencetak string yang dituliskan oleh user. String ini akan ditampilkan secara terus
menerus dan program Anda harus memberikan ilustrasi bahwa string tersebut bergerak
dari kiri ke kanan. Untuk memastikan bahwa proses perpindahannya tidak terlalu cepat,
Anda sebaiknya menggunakan method sleep dari class Thread.
Berikut ini adalah sebuah contoh dimana Anda menuliskan ”Your name here!”.
Pengenalan Pemrograman 2 20
J.E.N.I.
Bab 10
Jaringan
Java 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.
10.1.1 IP Adress
Pada setiap komputer yang terkoneksi dengan internet memiliki alamat IP unik. Alamat IP
secara logika hampir sama dengan alamat pengiriman surat tradisional dimana memiliki arti
bahwa alamat yang bersifat unik tersebut mewakili dari keterangan sebuah objek. Alamat
tersebut diwakilkan dalam 32-bit nomor yang digunakan sebagai pengenal yang bersifat unik
dari setiap komputer yang tersambung dengan internet. 192.1.1.1 adalah contoh dari sebuah
alamat IP. Mereka juga bisa ditulis dengan bentuk simbol seperti docs.rinet.ru.
10.1.2 Protokol
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 spesifik dan unik.
Protokol mengatur peraturan dan standar dimana menetapkan jenis komunikasi internet yang
khusus. Hal tersebut menjelaskan format data yang dikirim lewat internet, seiring dengan
bagaimana dan kapan itu dikirim.
Pengenalan Pemrograman 2 1
J.E.N.I.
Konsep dari protokol tentunya tidak terlalu asing untuk kita. Mengingat sudah beberapa kali
anda telah menggunakan jenis percakapan ini :
"Hallo."
"Hallo. Selamat siang. Bolehkah saya berbicara dengan Joan?"
"Okay, mohon tunggu sebentar."
"terima kasih."
...
Ini adalah protokol sosial yang digunakan ketika dalam pembicaraan melalui telepon. Jenis
protokol tipe ini memberikan kita kepercayaan untuk mengetahui apa yang harus dilakukan
dalam situasi tersebut. Mari kita lihat beberapa protokol penting yang digunakan pada
internet. Tanpa banyak kata, Hypertext Transfer Protocol (HTTP) adalah salah satu protokol
yang sering digunakan. Digunakan untuk mentransfer dokumen HTML pada Web. Kemudian,
ada juga File Transfer Protocol (FTP) dimana lebih umum dibandingkan dengan HTTP dan
mengijinkan anda untuk mentransfer file biner pada intenet. Kedua 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 HTTP digunakan ketika anda menyediakan isi Web melalui
layanan HTTP. Setiap komputer pada internet dapat menyediakan berbagai jenis layanan
melalui berbagai jenis protokol yang mendukung. Masalahnya, bagaimanapun, kita harus
mengetahui jenis layanan sebelum sebuah informasi dapat ditransfer. Untuk itulah port
digunakan.
Port adalah 16-bit nomor dimana mengenal setiap layanan yang ditawarkan oleh server
jaringan. Untuk menggunakan layanan khusus dan oleh karena itu, jalur komunikasi yang
melewati protokol tertentu, anda perlu untuk menyambungkan pada port yang sesuai. Port
dihubungkan dengan nomor dan beberapa nomor bersifat spesifik yang berhubungan dengan
jenis layanan khusus. Port dengan layanan pekerjaan tertentu disebut port standar. Sebagai
contoh, layanan FTP terletak pada port 21 sedangkan layanan HTTP terletak pada port 80. Jika
anda ingin menggunakan file transfer FTP, anda perlu terhubung dengan port 21 pada
komputer anda. Sekarang, semua standar layanan tertentu diberikan nilai port dibawah 1024.
port dengan nilai diatas 1024 disediakan untuk komunikasi custom. Jika terdapat kasus
dimana port dengan nilai diatas 1024 telah digunakan oleh beberapa komunikasi custom, anda
harus mencari nilai lainnya yang tidak digunakan.
Paradigma ini menjelaskan sebuah skenario sederhana. Tentunya, client terhubung dengan
sever dan meminta informasi. Kemudian server mengingat permintaan dan mengembalikan
informasi yang tersedia kepada client.
Pengenalan Pemrograman 2 2
J.E.N.I.
10.1.5 sockets
Konsep umum jaringan yang terakhir sebelum kita membahas lebih dalam tentang Java
networking adalah dengan memperhatikan sockets. Kebanyakan pemrograman Java network
menggunakan jenis khusus dari komunikasi jaringan yang diketahui sebagai sockets.
Socket adalah software abstrak untuk media input atau output komunikasi. Socket digunakan
oleh Java untuk mengatasi komunikasi pada jaringan level rendah. Jalur komunikasi ini
memungkinkan untuk mentransfer data melalui port khusus. Singkatnya, socket adalah point
terkahir untuk komunikasi antara dua mesin.
Pengenalan Pemrograman 2 3
J.E.N.I.
Konstruktor ServerSocket
ServerSocket(int port)
Ketika sebuah server menetapkan suatu port tertentu. Sebuah port 0 menugaskan sebuah
server kepada port bebas manapun. Panjang antrian maksimun untuk koneksi yang akan
datang diatur sebanyak 50 sebagai defaultnya.
Ketika sebuah server menetapkan suatu port tertentu.Panjang antrian maksimum untuk
koneksi yang akan datang berdasarkan pada parameter backlog.
Metode ServerSocket
Menyebabkan server untuk menunggu dan mendengarkan dari koneksi client, lalu
menerimanya.
Menutup socket server. Client tidak dapat lagi terhubung ke server hingga dibuka kembali
Contoh yang berhasil melakukan implementasi sebuah server sederhana, dimana sebuah
informasi sederhana dikirim oleh client.
import java.net.*;
import java.io.*;
try {
server = new ServerSocket(1234);
Pengenalan Pemrograman 2 4
J.E.N.I.
while(true) {
try {
client = server.accept();
OutputStream clientOut = client.getOutputStream();
PrintWriter pw = new PrintWriter(clientOut, true);
InputStream clientIn = client.getInputStream();
BufferedReader br = new BufferedReader(new
InputStreamReader(clientIn));
pw.println(br.readLine());
} catch (IOException ie) {
}
}
}
}
Konstruktor Socket
Membuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada host
tertentu.
Membuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada
alamat IP tertentu.
Tabel 1.2.1c: Konstruktor Socket
Metode Socket
Pengenalan Pemrograman 2 5
J.E.N.I.
Metode Socket
Mengembalikan remote port kepada socket ini pada saat masih terhubung.
Contoh yang berhasil melakukan implementasi sebuah client sederhana, dimana mengirim
data kepada server.
import java.io.*;
import java.net.*;
Pengenalan Pemrograman 2 6
J.E.N.I.
Konstruktor MulticastSocket
MulticastSocket(int port)
Metode MulticastSocket
Sebelum seorang dapat mengirim pesan kepada kelompok, pertama kali seorang tersebut
seharusnya menjadi anggota dari multicast kelompok dengan menggunakan metode
joinGroup. 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 DatagramPacket. Perhatikan bahwa dalam metode send dari class multiSocket,
dibutuhkan parameter yaitu objek DatagramPacket. Sehingga, kita harus mengerti objek jenis
ini sebelum menggunakan metode send.
Class DatagramPacket digunakan untuk mengirim data melalui conectionless protokol seperti
multicast. Masalah yang ditimbulkan bahwa pengiriman packet tidak terjamin. Mari kita
perhatikan dua dari enam konstruktor.
Konstruktor DatagramPacket
Konstruktor dari datagramPacket untuk menerima paket dengan panjang length. Seharusnya
kurang dari atau sama dengan ukuran dari buffer buf.
Konstruktor dari datagramPacket untuk mengirim paket dengan panjang length dengan
nomor port tertentu dan host tertentu.
Tabel 1.2.2c:Konstruktor DatagramPacket
Pengenalan Pemrograman 2 7
J.E.N.I.
Metode DatagramPacket
Mengembalikan alamat IP mesin dimana paket yang dikirim atau yang diterima
Mengembalikan nomor port pada remote host dimana paket yang dikirim atau yang diterima
Contoh multicast kita juga mengandung dua class, server dan client. Server menerima pesan
dari client dan mencetak pesan tersebut.
Berikut adalah class server
import java.net.*;
import java.net.*;
import java.io.*;
Pengenalan Pemrograman 2 8
J.E.N.I.
10.3 Latihan
Client yang terhubung ke server mengirim sebuah permintaan untuk sebuah pertanyaan atau
jawaban sebuah pertanyaan, Client mengirim pesan “permintaan”. Untuk jawaban dari sebuah
pertanyaan, client mengirim pesan “jawaban”. Ketika menerima pesan “permintaan”, secara
acak server akan memilih satu pertanyaan dari koleksi yang ada. Dia mengirimkan pertanyaan
yang dipilih sesuai dengan nomor yang bersangkutan kepada client.
Ketika server menerima pesan “jawaban” dari client, dia menginformasikan user bahwa user
perlu mengirimkan jawaban sesuai dengan nomor pertanyaan kepada server. Jawaban itu
harus dalam format <no pertanyaan>#<jawaban anda>.
Pengenalan Pemrograman 2 9
J.E.N.I.
Bab 11
Applet
11.1 Tujuan
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.
Pada module ini, Anda akan mempelajari tentang membuat applet menggunakan AWT.
import java.awt.*;
Pengenalan Pemrograman 2 1
J.E.N.I.
import java.applet.*;
/* masukkan bagian ini dalam kode html
<applet code="AppletDemo" width=300 height=100>
</applet>
*/
Setelah proses kompilasi, usahakan jalankan contoh ini menggunakan baris perintah
java. Apa yang terjadi? Ingat bahwa applet adalah aplikasi java yang spesial. Mereka
tidak dieksekusi menggunakan perintah java. Bahkan applet berjalan pada web browser
atau menggunakan applet viewer. Untuk membuka applet melalui sebuah web browser,
secara sederhana buka dokumen HTML dimana applet terintegrasi kedalamnya
menggunakan applet HTML tag (Perintah mengeluarkan kode pada contoh Hello World).
Cara lain untuk menjalankan sebuah applet adalah melalui perintah appletviewer. Untuk
memudahkan ikuti syntax berikut ini:
appletviewer AppletDemo.java
Tag HTML pada contoh yang diberikan mengindikasikan bahwa sebuah applet dibuat
dengan lebar 300 pixel dan tinggi 100 pixel. kemudian, method drawString
menggambar string "Hello world!" pada posisi pixel (80,25) menghitung kebawah dari
bagian kanan.
Ketika membuat sebuah applet, dibutuhkan suatu extend class Applet. Sebagaimana
yang disebutkan sebelumnya, classnya dapat ditemukan dalam java.applet package.
Oleh karena itu, mengimport the java.applet package merupakan suatu keharusan.
Juga, telah disebutkan sebelumnya bahwa class Applet adalah subclass dari class Panel.
Hal ini mengimplikasikan bahwa beberapa methods dari class applet ditemukan dalam
class Panel.Untuk mengakses methods atau fields dalam class Panel atau class-class
induk, diperlukan suatu aksi untuk import package java.awt .
Pengenalan Pemrograman 2 2
J.E.N.I.
1. init()
init adalah method yang dipanggil pertama kali. Yang sebenarnya berisi permintaan
pertama ketika applet di load.
2. start()
Setelah meminta method init, mulai dengan method yang dipangil selanjutnya.
method ini meminta dokumen HTML yang ditampilkan applet setiap waktu. Eksekusi
ringkasan dengan method ini dilakukan ketika applet ditampilkan kembali.
3. stop()
Ketika web browser meninggalkan dokumen HTML applet,method ini dipanggil untuk
menginformasikan applet bahwa dia harus menghentikan proses eksekusinya.
4. destroy()
method ini dipanggil ketika applet perlu dihapus dari kelangkapan memory. methode
stop selalu dipanggil sebelum method ini diminta untuk dijalankan.
Pengenalan Pemrograman 2 3
J.E.N.I.
Ketika membuat applet, sedikitnya beberapa dari method ini telah menolaknya. contoh
applet berikut menolak method berikut.
import java.applet.*;
import java.awt.*;
/*
<applet code="LifeCycleDemo" width=300 height=100>
</applet>
*/
<HTML>
<TITLE>Life Cycle Demo</TITLE>
<applet code="LifeCycleDemo" width=300 height=100>
</applet>
</HTML>
Pengenalan Pemrograman 2 4
J.E.N.I.
import java.awt.*;
import java.applet.*;
/*
<applet code="AppletDemo" width=300 height=100>
</applet>
*/
Pengenalan Pemrograman 2 5
J.E.N.I.
Contoh berikutnya memainkan file audio secara terus-menerus hingga method stop
applet dipanggil.
import java.awt.*;
import java.applet.*;
/*
<applet code="AudioApplet" width=300 height=100>
</applet>
*/
Pengenalan Pemrograman 2 6
J.E.N.I.
<APPLET
[CODEBASE = codebaseURL]
CODE = appletFile
[ATL = alternateText]
[NAME = appletInstanceName]
WIDTH = widthInPixels HEIGHT = heightInPixels
[ALIGN = alignment]
[VSPACE = vspaceInPixels] [HSPACE = hspaceInPixels]
>
[<PARAM NAME = parameterName1 VALUE = parameterValue1>]
[<PARAM NAME = parameterName2 VALUE = parameterValue2>]
...
[<PARAM NAME = parameterNamen VALUE = parameterValuen>]
[HTML that will be dsiplayed in the absence of Java]
</APPLET>
Pengenalan Pemrograman 2 7
J.E.N.I.
Contoh dibawah ini mendemokan bagaimana untuk mengakses parameter tertentu pada
HTML tag.
import java.awt.*;
import java.applet.*;
/*
<applet code="ParamDemo" width=300 height=100>
<param name="myParam" value="Hello world!">
</applet>
*/
Output dari program ini hanya sama seprti applet Hello World.
Pengenalan Pemrograman 2 8
J.E.N.I.
11.5 Latihan
11.5.1 Tic-Tac-Toe Applet satu-player
Buat game satu-player Tic-Tac-Toe. User memainkannya melawan komputer. Untuk
setiap giliran, pemain harus menggeser kotak dari papan. Sekali sebuah kotak terpilih,
kotak tersebut ditandai oleh symbol pemain (O dan X yang selalu digunakan sebagai
symbol). pemain yang berhasil mengatasi 3 kotak membentuk baris horizontal, vertical
atau diagonal memenangkan game ini. Game ini berakhir ketika pemain menang atau
ketika semua kotak sudah berhasil dibentuk. Desain dan gerakan komputer seakan-akan
user akan memengkan pertandingan melawan komputer.
Pengenalan Pemrograman 2 9
J.E.N.I.
Bab 12
Stream I/O Lanjut
12.1 Tujuan
Class InputStream adalah abstraksi class root untuk semua input stream byte sedangkan
class OutputStream adalah class root abstraksi dari semua output stream byte. Untuk
stream karakter, superclasss yang sesuai dari semua class-class secara berturut-turut
adalah class Reader dan the Writer. Kedua class-class ini adalah abstraksi class-class
untuk membaca dan menulis stream karakter.
Pengenalan Pemrograman 2 1
J.E.N.I.
stream ini. Anda diijinan untuk membaca dari input stream tapi tidak menulisnya. Di lain
pihak, Anda diijinkan untuk menulis output streams tapi tidak membacanya.
Class InputStream dan class Reader adalah superclass-superclass dari semua input
stream. Class OutputStream dan class Writer adalah class-class root dari semua output
stream.
Input stream juga dikenal sebagai stream sumber (source stream) sejak kita
memperoleh informasi dari stream ini. sementara itu output stream disebut juga stream
hasil(sink stream).
Sesi ini berturut-turut mempunyai sebuah tujuan dariclass-class stream yang berbeda.
Untuk melengkapi daftar dari class-class ini, silahkan melihat dokumentasi Java's API.
Pengenalan Pemrograman 2 2
J.E.N.I.
Class File menyediakan beberapa method untuk memanipulasi file dan direktori. Berikut
ini beberapa dari method-method tersebut.
Method-method File
public String getName()
Mengembalikan nilai nama file atau nama direktori dari object File ini.
public boolean exists()
Menguji apakah sebuah file atau sebuah direktori masih ada atau tidak
public long length()
Mengembalikan nilai ukuran dari file.
public long lastModified()
Mengembalikan nilai tanggal dalam milidetik ketika file terakhir kali dimodifikasi.
public boolean canRead()
Mengembalikan nilai true jika dijinkan untuk membaca dari file. Sebaliknya, nilai
pengembaliannya bernilai false.
public boolean canWrite()
mengembalikan nilai true jika diijinkan untuk menulis ke sebuah file. Sebaliknya, nilai
pengembaliannya bernilai false.
public boolean isFile()
Menguji apakah object ini berupa sebuah file, yaitu persepsi normal kita tentang apa itu
sebuah file (bukan sebuah direktori) atau bukan.
public boolean isDirectory()
menguji apakah object ini adalah sebuah direktori atau bukan.
Pengenalan Pemrograman 2 3
J.E.N.I.
Method-method File
public String[] list()
Mengembalikan nilai daftar file dan subdirektori yang ada dalam object ini. Object ini
haruslah berupa sebuah direktori.
public void mkdir()
Membuat sebuah direktori yang merupakan abstraksi nama path ini.
public void delete()
Membuang file atau direktori yang sebenarnya diwakili oleh object File tersebut.
Mari kita melihat bagaimana method ini bekerja berdasarkan contoh berikut ini :
import java.io.*;
Pengenalan Pemrograman 2 4
J.E.N.I.
if (!fn.canWrite()) {
System.out.println(fileName + " is not writable.");
}
}
}
Pengenalan Pemrograman 2 5
J.E.N.I.
Pengenalan Pemrograman 2 6
J.E.N.I.
Method Writer
public void write(-) throws IOException
Sebuah method overloading dalam lima versi:
public void write(int c) – Menulis sebuah karakter tunggal yang diwakili oleh
pemberian nilai integer.
public void write(char[] cbuf) – Menulis isi dari karakter array cbuf.
public abstract void write(char[] cbuf, int offset, int length) – Menulis
sejumlah length karakter dari aaray cbuf, dimulai pada offset tertentu.
public void write(String str) – Menulis string string.
public void write(String str, int offset, int length) – Menulis sejumlah
length karakter dari string str, dimulai pada offset tertentu.
public abstract void close() throws IOException
Menutup stream ini setelah flushing beberapa karaktr yang tidak tertulis. Invocation
method lain setelah menutup stream ini akan menyebabkan terjadinya IOException.
public abstract void flush()
Mengganti stream(yaitu karakter yang disimpan dalam buffer dengan segera ditulis ke
tujuan yang dimaksud).
Pengenalan Pemrograman 2 7
J.E.N.I.
import java.io.*;
class CopyFile {
void copy(String input, String output) {
FileReader reader;
FileWriter writer;
int data;
try {
reader = new FileReader(input);
writer = new FileWriter(output);
while ((data = reader.read()) != -1) {
writer.write(data);
}
reader.close();
writer.close();
} catch (IOException ie) {
ie.printStackTrace();
}
Pengenalan Pemrograman 2 8
J.E.N.I.
Cobalah program tersebut sendiri dan amatilah apa ang terjadi pada file yang
dimanipulasi.
class CopyFile {
void copy(String input, String output) {
BufferedReader reader;
BufferedWriter writer;
String data;
try {
reader = new BufferedReader(new FileReader(input));
writer = new BufferedWriter(new FileWriter(output));
while ((data = reader.readLine()) != null) {
writer.write(data, 0, data.length());
}
reader.close();
writer.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
Bandingkan kode ini dengan sebelumnya. Apakah hasil dari menjalankan program ini?
Pengenalan Pemrograman 2 9
J.E.N.I.
Method InputStream
public int read(-) throws IOException
Method overloaded, juga memiliki tiga versi seperti class Reader tersebut.
public abstract int read() - Membaca byte selanjutnya dari data dari stream ini.
public int read(byte[] bBuf)- Membaca sejumlah byte dan menyimpannya dalam
byta array bBuf.
public abstract int read(char[] cbuf, int offset, int length)- Membaca
panjang sejumlah length byte dan menyimpannya dalam array byte bBuf dimulai dari
offset tertentu.
public abstract void close() throws IOException
Menutup stream in. Memanggil method InputStream yang lain setelah menutup
streamnya akan menyebabkan sebuah IOException dijalankan.
public void mark(int readAheadLimit) throws IOException
Menandai posisi tertentu dalam stream. Setelah menandainya, panggil untuk
menjalankan fungsi reset() akan mencoba untuk mengatur posisi streamnya pada titik
tertentu kembali. Tidak semua stream input-byte mendukung operasi ini.
public boolean markSupported()
Mengindikasikan apakah suatu stream mendukung operasi pemberian tanda (mark) dan
reset. Yang tidak didukung secara default. Seharusnya diubah menjadi overide oleh
subclass.
public void reset() throws IOException
Merubah posisi stream pada posisi akhir yang diberi tanda (mark)
Pengenalan Pemrograman 2 10
J.E.N.I.
Pengenalan Pemrograman 2 11
J.E.N.I.
Method OutputStream
public void write(-) throws IOException
Sebuah method overloaded untuk menulis bentuk byte ke bentuk stream. Ada tiga versi
:
public abstract void write(int b) – Menulis nilai byte khusus b ke bentuk output
stream nya.
public void write(byte[] bBuf) – Menulis isi dari array byte bBuf ke bentuk stream
nya.
public void write(byte[] bBuf, int offset, int length) – Menulis sejumlah
length byte dari array bBuf ke bentuk streamnya, dimulai pada offset khusus ke
streamnya.
public abstract void close() throws IOException
Menutup stream ini dan mengeluarkan beberapa sumber dari sistem digabungkan
dengan streamnya. Penggunaan method lain setelah memanggil method ini akan
menyebabkan sebuahIOException dijalankan.
public abstract void flush()
Mengganti stream (sebagai contoh, data byte tersimpan dalam buffer akan segera
ditulis dalam tujuan yang diamksud).
Pengenalan Pemrograman 2 12
J.E.N.I.
Pengenalan Pemrograman 2 13
J.E.N.I.
import java.io.*;
class CopyFile {
void copy(String input, String output) {
FileInputStream inputStr;
FileOutputStream outputStr;
int data;
try {
inputStr = new FileInputStream(input);
outputStr = new FileOutputStream(output);
while ((data = inputStr.read()) != -1) {
outputStr.write(data);
}
inputStr.close();
outputStr.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
Pengenalan Pemrograman 2 14
J.E.N.I.
import java.io.*;
class CopyFile {
void copy(String input) {
PushbackInputStream inputStr;
PrintStream outputStr;
int data;
try {
inputStr = new PushbackInputStream(new
FileInputStream(input));
outputStr = new PrintStream(System.out);
while ((data = inputStr.read()) != -1) {
outputStr.println("read data: " + (char) data);
inputStr.unread(data);
data = inputStr.read();
outputStr.println("unread data: " + (char) data);
}
inputStr.close();
outputStr.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
Uji kode ini pada sebuah file yang mengandung sedikit baris atau karakter.
Pengenalan Pemrograman 2 15
J.E.N.I.
12.12 Serialisasi
Java Virtual Machine (JVM) mendukung kemampuan untuk membaca atau menulis
sebuah object ke bentuk stream. kemampuan ini disebut dengan serialisasi, proses
"flattening" sebuah object sehinnga data tersebut dapat disimpan ke beberapa
penyimpanan permanen atau dilewatkan ke object lain melalui class OutputStream.
Ketika menulis sebuah object, ini merupakan hal yang penting bahwa keadaan tersebut
sudah tertulis dan telah diserialisasi dari setiap objectnya dapat dibangun kembali
sebagaimana dtaa tersebut dibaca. Menyimpan sebuah objectke beberapa tipe
penyimpanan permanen yang dikenal sebagai persistence.
Stream yang digunakan untuk deserialisasi dan serialisasi secara berurutan adalah class
ObjectInputStream dan ObjectOutputStream .
Untuk memungkinkan sebuah object diserialisasi (sebagai contoh dapat disimpan dan
diurutkan), Class tersebut harus mengimplementasikan interface yang dapat
diserialisasi. Class ini seharusnya juga menyediakan default constructor atau sebuah
constructor tanpa argumen. Satu hal yang baik mengenai kemampuan untuk melakukan
serialisasiyang dapat diturunkan, yang berarti kita tidak memiliki implementasi
serialisasi pada setiap class. Ini berarti mengurangi pekrjaan untuk programmer. Anda
hanya dapat mengimplementasikan serialisasi sekali sepanjang hirarki class.
Jangan berputus asa. Sebuah class yang mengandung object yang tidak diserialisasi
dapat tetap diserialisasi jika penunjuk ke object non-serialisasi ditandai dengan
katakunci transient. Pertimbangkan contoh berikut ini :
Kata kunci transient mencagah data dari proses serialisasi. Object instantiasi dari class
ini sekarang dapat ditulis ke sebuah OutputStream.
Pengenalan Pemrograman 2 16
J.E.N.I.
import java.io.*;
try {
FileOutputStream fos = new
FileOutputStream("boolean.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(booleanData);
oos.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
Contoh dibawah ini membaca sebuah object Boolean dari sebuah ObjectInputStream. Ini
merupakan kesinambungan dari contoh sebelumnya pada serialisasi.
import java.io.*;
try {
FileInputStream fis = new
FileInputStream("boolean.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
booleanData = (Boolean) ois.readObject();
ois.close();
} catch (Exception e) {
Pengenalan Pemrograman 2 17
J.E.N.I.
e.printStackTrace();
}
System.out.println("Unserialized Boolean from " +
"boolean.ser");
System.out.println("Boolean data: " + booleanData);
System.out.println("Compare data with true: " +
booleanData.equals(new Boolean("true")));
}
12.13 Latihan
12.13.1 Enkripsi Sederhana
Baca dari sebuah file khusus oleh user dan encrypt isi file menggunakan teknik
penggeseran yang sederhana. Juga, tanyakan pada user untuk menginput ukuran
pergeseran. Output dari pesan yang telah di encrypt pada file yang lain yang memiliki
nama yang juga dibuat oleh user sendiri.
Sebagai contoh,
Ukuran pergeseran: 1
Pesan yang dibaca dari file: Hello
Pesan ter-encrypt: Ifmmp
Pengenalan Pemrograman 2 18
J.E.N.I.
Bab 13
Pengenalan Generics
13.1 Tujuan
Release Java terbaru menyediakan langkah terbesar dalam pemrograman Java
dibandingkan dengan versi-versi lain sebelumnya. Ini terdiri atas ekstensi yang cukup
signifikan terhadap source language syntax. Bagian yang paling terlihat yaitu
penambahan generic types.
Modul ini mengenalkan Anda konsep dasar mengenai Java generic types.
Tujuan utama dari penambahan generics pada Java adalah untuk memecahkan masalah
ini. tipe Generic memungkinkan subuah single class untuk bekerja dengan pilihan tipe
yang beraneka ragam. Ini adalah jalan yang alami untuk mengeliminasi keperluan untuk
pemilihan (casting).
Versi generic dari class ArrayList didesain untuk bekerja secara asli dengan beberapa
tipe class. Sama seperti, dia juga mempertahankan manfaat dari pengecekan tipe (type
Pengenalan Pemrograman 2 1
J.E.N.I.
checking). Kita dapat melanjutkannya dengan keperluan memiliki typecast elemen yang
kita dapatkan dari list dan memiliki pernyataan berikut terhadap pernyataan sebelumnya
:
Walaupun downcasting sudah terhapus, ini bukan berarti bahwa Anda dapat menandai
segala sesuatu sebagai return value dari method get dan melanjutkannya dengan
typecasting semuanya. Jika Anda menandai sesuatu yang lain disamping sebuah String
untuk output dari method get, Anda akan menghadapi sebuah waktu mengcompile type
tidak sesuai seperti pesan berikut ini :
found: java.lang.String
required: java.lang.Integer
Integer data = myArrayList.get(0);
Untuk Anda agar hanya memiliki ide bagaimana type-type generic digunakan sebelum
materi ini digali lebih dalam, pertimbangkan potongan kode berikut ini :
Amatilah melalui pernyataan, anda mungkin mengamati kata <String> segera terlihat
setelah referensi tipe data arraylist. Anda dapat menerjemahkan pernyataan pertama
sebagai instantiasi sebuah versi generic dari class ArrayList dan versi generic ini terdiri
dari object-object dari tipe String. genArrList adalah batas dari tipe String. Oleh sebab
itu, mengikat sebuah Integer atau beberapa tipe lain bukan String untuk hasil dari get
function akan menjadi illegal. Pernyataan berikut ini adalah illegal.
Pengenalan Pemrograman 2 2
J.E.N.I.
Sekarang mari kita melalui bagian dari kode yang menggunakan syntax untuk type
generic.
Untuk deklarasi dari class BasicGeneric,
nama class diikuti oleh sepasang kurung yang didalamnya terdapat huruf kapital A:
<A>. Ini disebut dengan sebuah parameter tipe. Penggunaan kurung ini
mengindikasikan bahwa class yang dideklarasikan adalah class generic. Ini berarti bahwa
class tidak bekerja dengan beberapa type referensi khusus.
kemudian, amati bahwa sebuah field dari class dideklarasikan menjadi tipe A
private A data;
Deklarasi ini mengelompokkan bahwa field data adalah dari tipe generic, tergantung
pada tipe data yang telah didesain untuk bekerja dengan object BasicGeneric.
Ketika mendeklarasikan sebuah instance dari class, anda harus mengelompokkan tipe
referensi dengan yang mana yang anda inginkan untuk bekerja sama.
Anda juga dapat bekerja denga variabel-variabel bertipe Integer atau referensi tipe yang
lain. Untuk bekrja dengan Integer, potongan kode memiliki pernyataan berikut ini :
Pengenalan Pemrograman 2 3
J.E.N.I.
Anda mungkin dapat menerjemahkan sisa dari kode dengan pemahaman anda sendiri.
Mempertimbangkan deklarasi dari method getData .
public A getData() {
return data;
}
Method getData mengembalikan sebuah nilai dari tipe A, Sebuah Tipe type. Ini bukan
berarti bahwa method tidak akan memiliki tipe data runtime, atau even pada waktu
meng-compile. Setelah Anda mendeklarasikan sebuah object yang bertipe BasicGeneric,
A adalah pengikat ke sebuah tipe data yang spesifik. Instance ini akan berlaku sebagai
jika ini dideklarasikan untuk memiliki tipe data spesifik ini dan tipe ini hanya dari bagian
sangat awal.
Pada kode yang diberikan, dua instances dari class BasicGeneric terbentuk.
Perlu diperhatikan perhatian bahwa instantiasi dari class generic adalah hanya sama
dengan instantiasi sebuah class normal kecuali bahwa tipe data khusus berada dalam
<> menggantikan nama konstruktor. Informasi tambahan ini mengindikasikan tipe dari
data anda akan bekerja dengan siapa untuk bagian instance ini dari class
BasicGeneric.Setelah instantiasi, anda dapat mengakses anggota dari class melalui
instance sekarang. Tidak ada yang lebih diperlukan untuk typecast nilai pengembalian
dari method getData sejak diputuskan bahwa ini akan bekerja dengan sebuah referensi
tipe data yang spesifik.
13.3.1 Pembatasan"Primitive"
Sebuah pembatasan type generic dalam Java adalah mereka dibatasi oleh tipe referensi
dan tidak akan bekerja dengan tipe data primitive.
Sebagai contoh, pernyataan berikut akan menjadi illegal sejak int adalah sebuah tipe
data primitive.
Pengenalan Pemrograman 2 4
J.E.N.I.
Sebagai contoh, kita mungkin ingin untuk mendefinisikan sebuah class generic
ScrollPane yang merupakan sebuah template untuk sebuah Container asli yang telah
dilengkapi dengan fungsi scrolling. Tipe runtime dari sebuah instance dari class ini akan
sering menjadi sebuah subclass dari Container, tapi tipe static atau general adalah
Container yang lebih sederhana.
Untuk membatasi instantiasi tipe dari sebuah class, kita menggunakan kata kunci
extends diikuti oleh class yang membatasi tipe generic sebagai bagian dari tipe
parameter.
Contoh berikut ini membatasi instantiasi tipe dari class ScrollPane ke subtipe dari class
Container.
class TestScrollPane {
public static void main(String args[]) {
ScrollPane <Panel> scrollPane1 = new
ScrollPane <Panel>();
// pernyataan berikutnya adalah illegal
ScrollPane <Button> scrollPane2 = new
ScrollPane <Button>();
}
}
Instantiasi dari scrollPane1 bernilai valid sejak Panel menjadi sebuah subclass dari class
Container sedangkan kreasi dari scrollPane2 akan menyebabkan munculnya compile
time error sejak Button bukan merupakan sebuah subclass dari Container.
Pengenalan Pemrograman 2 5
J.E.N.I.
instantiasi dari tipe generic yang melekat pada batas yang kita miliki.
Sejak kita yakin bahwa setiap tipe instantiasi adalah sebuah subclass dari batas yang
dimiliki, kita dapat memanggil beberapa method secara aman yang ditemukan dalam
objek static tipe. Jika kita belum menempatkan beberapa batas eksplisit pada
parameternya, default batas adalah Object. Ini berarti bahwa kita tidak dapat
menjalankan method pada sebuah instance dari batas yang tidak ditampilkan dalam
class Object.
method parameterisasi sangat membantu kita kita ingin untuk menampilkan tugas
dimana ketergantungan tipe antara argument dan nilai pengembalian aslinya merupakan
generic, tapi generic sebenarnya tidak mempercayakan pada beberapa tipe level class
informasi dan akan merubah dari method call ke method call.
Untuk mendeklarasikan tipe generic pada level method, pertimbangkan contoh berikut
ini :
class Utilities {
/* T secara implisit extends terhadap Object */
public static <T> ArrayList<T> make(T first) {
return new ArrayList<T>(first);
}
}
Untuk membangun sebuah instance baru dari ArrayList<Integer>, kita mempunyai cara
yang cukup sederhana yaitu pernyataan berikut :
Utilities.make(Integer(0));
Pengenalan Pemrograman 2 6
J.E.N.I.
13.6 Latihan
13.6.1 Swapping
Membentuk sebuah class dengan sebuah versi generic dari method printSwapped.
Method ini menukar secara sederhana nilai dari parameternya secara lokal dan mencetak
nilainya. Catatan bahwa pencetakan harus dilakukan pada method ini. Mencetak nilai
dari argument dalam method lain tidak akan bekerja karena Java melewatkan object ke
method melalui suatu nilai. Uji method ini pada object Integer, object String dan object
ArrayList.
Pengenalan Pemrograman 2 7