j.e.n.i - java

340
J.E.N.I. Pengenalan Pemrograman 1 1 BAB 1 Pengenalan Pemrograman Komputer 1.1 Tujuan Bagian ini akan membahas dasar – dasar komponen dari komputer meliputi hardware (perangkat keras) dan software (perangkat lunak). Kami juga akan menyertakan gambaran global tentang bahasa pemrograman dan sirkulasi pemrograman. Akan dibahas pula pada akhir pembahasan ini mengenai sistem dan konversi numerik. Pada akhir pembahasan, diharapkan pembaca dapat : Mengindentifikasi perbedaan komponen pada komputer Mengetahui tentang bahasa pemrograman komputer dan kategorinya Mengetahui alur kerja pembuatan program dan mengaplikasikannya pada pemecahan masalah Mengetahui tentang sistem numerik dan metode konversinya. 1.2 Pendahuluan Kata komputer berasal dari bahasa Latin yaitu Computare yang artinya menghitung. Dalam bahasa Inggris disebut to compute. Secara definisi komputer diterjemahkan sebagai sekumpulan alat elektronik yang saling bekerja sama, dapat menerima data (input), mengolah data (proses) dan memberikan informasi (output) serta terkoordinasi dibawah kontrol program yang tersimpan di memorinya. Jadi cara kerja komputer dapat kita gambarkan sebagai berikut : Gambar 1: Skema IO Komputer

Upload: ridho-wijaya

Post on 21-Oct-2015

291 views

Category:

Documents


15 download

DESCRIPTION

Tutorial Java dari JENI

TRANSCRIPT

Page 1: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 1

BAB 1

Pengenalan Pemrograman Komputer

1.1 Tujuan Bagian ini akan membahas dasar – dasar komponen dari komputer meliputi hardware (perangkat keras) dan software (perangkat lunak). Kami juga akan menyertakan gambaran global tentang bahasa pemrograman dan sirkulasi pemrograman. Akan dibahas pula pada akhir pembahasan ini mengenai sistem dan konversi numerik. Pada akhir pembahasan, diharapkan pembaca dapat : • Mengindentifikasi perbedaan komponen pada komputer • Mengetahui tentang bahasa pemrograman komputer dan kategorinya • Mengetahui alur kerja pembuatan program dan mengaplikasikannya pada

pemecahan masalah • Mengetahui tentang sistem numerik dan metode konversinya.

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

Gambar 1: Skema IO Komputer

Page 2: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 2

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

1.3 Komponen Dasar Komputer 1.3.1 HARDWARE 1.3.1.1 Central Processing Unit (CPU) Processor, merupakan bagian dari perangkat keras komputer yang melakukan pemprosesan aritmatika dan logika serta pengendalian operasi komputer secara keseluruhan. Prosesor terdiri atas dua bagian utama, yaitu ALU (Arithmetic Logic Unit) dan Control Unit. Kecepatan kerja prosesor biasanya ditentukan oleh kecepatan clock dari Control Unit-nya.

Contoh : jika prosesor memiliki frekuensi clock 350 MHz, berarti kecepatan pemprosesan satu instruksinya = T = 1/f = 1/(350 x 106 Hz), = 0,286 x 10-8 detik.

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

a. Primary Memory

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

o Volatil (informasi ada selama komputer bekerja. Ketika komputer dipadamkan, informasi yang disimpannya juga hilang)

o Berkecepatan tinggi o Akses random (acak)

b. Secondary Memory

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

o Non volatil atau persisten o Kecepatan relatif rendah (dibandingkan memori primer) o Akses random atau sekuensial

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

Page 3: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 3

Memori Utama (RAM)

Memori Sekunder (ROM)

Kategori

Cepat Lambat Kecepatan

Mahal Murah Harga

Kecil Besar Kapasitas

Ya Tidak Volatile

Tabel 1: Perbandingan antara memori utama dan memori sekunder

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

a. Input Device (Piranti Masukan)

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

o Keyboard o Mouse o Touch screen o Scanner o Camera

b. Output Device (Piranti Keluaran)

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

o Monitor o Printer o Speaker o Plotter

1.3.2 Software Merupakan program-program komputer yang berguna untuk menjalankan suatu pekerjaan sesuai dengan yang dikehendaki. Program tersebut ditulis dengan bahasa khusus yang dimengerti oleh komputer. Program dapat dianalogikan sebagai instruksi yang akan dijalankan oleh prosessor. Software terdiri dari beberapa jenis, yaitu : 1. Sistem Operasi, seperti DOS, Unix, Novell, OS/2, Windows.

Adalah software yang berfungsi untuk mengaktifkan seluruh perangkat yang terpasang pada komputer sehingga masing-masingnya dapat saling berkomunikasi.

Page 4: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 4

Tanpa ada sistem operasi maka komputer tidak dapat difungsikan sama sekali. 2. Program Utility, seperti Norton Utility, Scandisk, PC Tools.

Program utility berfungsi untuk membantu atau mengisi kekurangan/kelemahan dari system operasi, misalnya PC Tools dapat melakukan perintah format sebagaimana DOS, tapi PC Tools mampu memberikan keterang dan animasi yang bagus dalam proses pemformatan. File yang telah dihapus oleh DOS tidak dapat dikembalikan lagi tapi dengan program bantu hal ini dapat dilakukan.

3. Program Aplikasi, seperti GL, MYOB, Payroll.

Merupakan program yang khusus melakukan suatu pekerjaan tertentu, seperti program gaji pada suatu perusahaan. Maka program ini hanya digunakan oleh bagian keuangan saja tidak dapat digunakan oleh departemen yang lain. Umumnya program aplikasi ini dibuat oleh seorang programmer komputer sesuai dengan permintaan/kebutuhan seseorang/lembaga/perusahaan guna keperluan interennya.

4. Program Paket

Merupakan program yang dikembangkan untuk kebutuhan umum, seperti :

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

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

Page 5: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 5

1.4.2 Kategori Bahasa Pemrograman 1. Bahasa Pemrograman Tingkat Tinggi

Merupakan bahasa tingkat tinggi yang mempunyai ciri-ciri mudah dimengerti karena kedekatannya terhadap bahasa sehari – hari. Sebuah pernyataan program diterjemahkan kepada sebuah atau beberapa mesin dengan menggunakan compiler. Sebagai contoh adalah : JAVA, C++, .NET

2. Bahasa Pemrograman Tingkat Rendah

Bahasa pemrograman generasi pertama. Bahasa jenis ini sangat sulit dimengerti karena instruksinya menggunakan bahasa mesin. Disebut juga dengan bahasa assembly merupakan bahasa dengan pemetaan satu – persatu terhadap instruksi komputer. Setiap intruksi assembly diterjemahkan dengan menggunakan assembler.

3. Bahasa Pemrograman Tingkat Menengah

Dimana penggunaan instruksi telah mendekati bahasa sehari – hari, walaupun masih cukup sulit untuk dimengerti karena menggunakan singkatan – singkatan seperti STO yang berarti simpan (STORE) dan MOV yang artinya pindah (MOVE). Yang tergolong dalam bahasa ini adalah Fortran.

1.5 Alur Pembuatan Program Seorang programmer tidak melakukan pembuatan dan pengkodean program secara begitu saja, namun mengikuti perencanaan dan metodologi yang terstruktur yang memisahkan proses suatu aplikasi menjadi beberapa bagian. Berikut ini langkah – langkah sistematis dasar dalam menyelesaikan permasalahan pemrograman :

1. Mendefiniskan masalah 2. Menganalisa dan membuat rumusan pemecahan masalah 3. Desain Algoritma dan Representasi 4. Pengkodean, Uji Coba dan pembuatan dokumentasi

Untuk memahami langkah dasar dalam pemecahan masalah dalam sebuah komputer mari kita mendefinisikan sebuah permasalahan yang akan diselesaikan langkah demi langkah sebagaimana metodologi pemecahan masalah yang akan dibahas selanjutnya. Masalah yang akan kita selesaikan akan didefinisikan pada bagian selanjutnya. 1.5.1 Definisi Permasalahan Seorang programmer umumnya mendapatkan tugas berdasarkan sebuah permasalahan. Sebelum sebuah program dapat terdesain dengan baik untuk menyelesaikan beberapa

Page 6: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 6

permasalahan, masalah – masalah yang terjadi harus dapat diketahui dan terdefinisi dengan baik untuk mendapatkan detail persyaratan input dan output. Sebuah pendefinisan yang jelas adalah sebagian dari penyelesaian masalah. Pemrograman komputer mempersyaratkan untuk mendefiniskan program terlebih dahulu sebelum membuat suatu penyelesaian masalah. Mari kita definisikan sebuah contoh permasalahan :

”Buatlah sebuah program yang akan menampilkan berapa kali sebuah nama tampil pada sebuah daftar”

1.5.2 Analisa Permasalahan Setelah sebuah permasalahan terdefinisi secara memadai, langkah paling ringkas dan efisien dalam penyelesaian harus dirumuskan. Umumnya, langkah berikutnya meliputi memecahkan masalah tersebut menjadi beberapa bagian kecil dan ringkas. Contoh masalah : Menampilkan jumlah kemunculan sebuah nama pada daftar Input Terhadap Program : Daftar Nama, Nama yang akan dicari Output Dari Program : Jumlah kemunculan nama yang dicari 1.5.3 Desain Algoritma dan Representasi Setelah kita mengetahui dengan baik dan jelas mengenai permasalahan yang ingin diselesaikan, langkah selanjutnya yaitu membuat rumusan algoritma untuk menyelesaikan permasalahan. Dalam pemrograman komputer penyelesaian masalah didefinisikan dalam langkah demi langkah. Algoritma adalah urutan langkah – langkah logis penyelesaian masalah yang disusun secara sistematis dan logis. Logis merupakan kunci dari sebuah algoritma. Langkah – langkah dalam algoritma harus logis dan bernilai benar atau salah. Algoritma dapat diekpresikan dalam bahasa manusia, menggunakan presentasi grafik melalui sebuah FlowChart (diagram alir) ataupun melalui PseudoCode yang menjembatani antara bahasa manusia dengan bahasa pemrograman. Berdasarkan permasalahan yang terjadi pada bagian sebelumnya, bagaimanakah kita dapat memberikan solusi penyelesaian secara umum dalam sebuah alur yang dapat dengan mudah dimengerti?

Page 7: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 7

Mengekspresikan cara penyelesaian melalui bahasa manusia :

1. Tentukan daftar nama 2. Tentukan nama yang akan dicari, anggaplah ini merupakan sebuah kata kunci 3. Bandingkan kata kunci terhadap setiap nama yang terdapat pada daftar 4. Jika kata kunci tersebut sama dengan nama yang terdapat pada daftar,

tambahkan nilai 1 pada hasil perhitungan 5. Jika seluruh nama telah dibandingkan, tampilkan hasil perhitungan (output)

Mengekspresikan cara penyelesaian melalui FlowChart :

Gambar 2: Contoh Flowchart

Mengekspresikan solusi melalui Pseudocode :

listNama = Daftar Nama keyNama = Nama yang dicari hitung = 0 Untuk setiap nama pada Daftar Nama lakukan : Jika nama == keyNama Hitung = Hitung + 1 Tampilkan Hitung

Page 8: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 8

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

Simbol Nama Pengertian

Simbol Proses

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

Simbol Input – Output (IO)

Merepresentasikan fungsi I/O yang membuat sebuah data dapat diproses (input) atau ditampilkan (output) setelah mengalami eksekusi informasi

Simbol Garis Alir

Simbol ini digunakan untuk menghubungkan setiap langkah dalam flowchart dan menunjukkan kemana arah aliran diagram. Anak panah ini harus mempunyai arah dari kiri ke kanan atau dari atas ke bawah. Anak panah ini juga dapat diberi label, khususnya jika keluar dari symbol percabangan.

Simbol Anotasi

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

Page 9: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 9

Simbol Nama Pengertian

Simbol Percabangan

Simbol ini digunakan untuk melambangkan percabangan, yaitu pemeriksaan terhadap suatu kondisi. Dalam simbol ini, kita menuliskan keadaan yang harus dipenuhi. Hasil dari pemeriksaan dalam simbol ini adalah YES atau NO. Jika pemeriksaan menghasilkan keadaan benar, maka jalur yang harus dipilih adalah jalur yang berlabel Yes, sedangkan jika pemeriksaan menghasilkan keadaan salah, maka jalur yang harus dipilih adalah jalur yang berlabel No.

Simbol Terminator

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

Simbol Konektor

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

Simbol Prosedur

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

Tabel 2: Simbol dari Flowchar

Page 10: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 10

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

Page 11: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 11

1.6 Sistem Numerik dan Konversi Bilangan dapat disajikan dalam beberapa cara. Cara penyajiannya tergantung pada Basis (BASE) bilangan tersebut. Terdapat 4 cara utama dalam penyajian bilangan. 1.6.1 Sistem Bilangan Desimal Manusia umumnya menggunakan bilangan pada bentuk desimal. Bilangan desimal adalah sistem bilangan yang berbasis 10. Hal ini berarti bilangan – bilangan pada sistem ini terdiri dari 0 sampai dengan 9. Berikut ini beberapa contoh bilangan dalam bentuk desimal :

12610 (umumnya hanya ditulis 126) 1110 (umumnya hanya ditulis 11)

1.6.2 Sistem Bilangan Biner

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

11111102

10112

1.6.3 Sistem Bilangan Oktal

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

1768

138

1.6.4 Sistem Bilangan Heksadesimal

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

7E16

Page 12: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 12

BB16

Heksadesimal 0 1 2 3 4 5 6 7 8 9 A B C D E F

Nilai Dalam Desimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Tabel 3: Bilangan heksadesimal dan perbandingannya terhadap desimal

Berikut adalah perbandingan keseluruhan sistem penulisan bilangan :

Desimal Biner Oktal Heksadesimal

12610 11111102 1768 7E16

1110 10112 138 BB16

Tabel 4: Contoh Konversi Antar Sistem Bilangan

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

Sebagai Contoh :

12610 = ? 2

Hasil Bagi Nilai Sisa

126 / 2 = 63 0

63 / 2 = 31 1

31 / 2 = 15 1

15 / 2 = 7 1

7 / 2 = 3 1

3 / 2 = 1 1

1 / 2 = 1

Urutkan

Page 13: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 13

Dengan menuliskan nilai sisa mulai dari bawah ke atas, didapatkan angka biner 11111102.

Konversi bilangan biner ke desimal didapatkan dengan menjumlahkan perkalian semua bit biner dengan perpangkatan 2 sesuai dengan posisi bit tersebut. Sebagai Contoh :

110011012 = ? 10

Angka desimal 205 diperoleh dari penjumlahan angka yang di arsir. Setiap biner yang bernilai 1 akan mengalami perhitungan, sedangkan yang bernilai 0 tidak akan dihitung karena hanya akan menghasilkan nilai 0. 1.6.5.2 Desimal ke Oktal/Heksadesimal dan Oktal/Heksadesimal ke

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

12610 = ? 8

Hasil Bagi Nilai Sisa

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

126 / 8 = 15 6

15 / 8 = 1 7

1 / 8 = ` 1

Page 14: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 14

Contoh konversi Heksadesimal :

12610 = ? 16

Hasil Bagi Nilai Sisa

Dengan menuliskan nilai sisa dari bawah ke atas, kita peroleh bilangan Heksadesimal 7E16

Konversi bilangan Oktal dan Heksadesimal sama dengan konversi bilangan Biner ke Desimal. Perbedaanya hanya terdapat pada penggunaan angka basis. Jika sistem Biner menggunakan basis 2, maka pada bilangan Oktal, basis yang digunakan adalah 8 dan pada bilangan Heksadesimal adalah angka 16. Contoh konversi Oktal :

1768 = ? 10

126 / 16 = 7 14 (E)

7 / 16 = 7

Posisi 2 1 0

Octal Digits 1 7 6

6 x 80 = 6

7 x 81 = 56

1 x 82 = 64

TOTAL: 126

Page 15: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 15

Contoh konversi Heksadesimal :

7E16 = ? 10

Posisi 1 0

Digit Heksadesimal 7 E

14 x 160 = 14

7 x 161 = 112

TOTAL: 126

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

Digit Oktal Representasi Biner

0 000

1 001

2 010

3 011

4 100

5 101

6 110

7 111

Tabel 5: Bilangan octal dan perbandingannya dalam sistem biner

Page 16: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 16

Sebagai contoh :

11111102 = ? 8

0 1 1 1 1 1 0 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

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

Digit Heksadesimal Representasi Biner

0 0000

1 0001

2 0010

3 0011

4 0100

Page 17: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 17

Digit Heksadesimal Representasi Biner

5 0101

6 0110

7 0111

8 1000

9 1001

A 1010

B 1011

C 1100

D 1101

E 1110

F 1111

Tabel 6: Bilangan heksadesimal dan konversinya dalam biner

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

Page 18: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 18

1.7 Latihan 1.7.1 Menyusun Algoritma Dari permasalahan – permasalahan di bawah ini, susunlah sebuah algoritma untuk menyelesaikannya. Anda dapat menyusunnya dengan menggunakan pseudocode ataupun flowchart.

1. Memasak Roti 2. Menggunakan Komputer di Laboratorium 3. Menghitung rata – rata dari 3 buah bilangan

1.7.2 Konversi Sistem Bilangan Konversikan bilangan – bilangan berikut ini :

1. 198010 ke sistem bilangan Biner, Heksadesimal dan Oktal

2. 10010011012 ke sistem bilangan Desimal, Heksadesimal dan Oktal

3. 768 ke sistem bilangan Biner, Heksadesimal dan Desimal

4. 43F16 ke sistem bilangan Biner, Desimal dan Oktal

Page 19: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 1

BAB 2

Pengenalan Bahasa JAVA

2.1 Tujuan Pada bab ini akan dibahas secara singkat tentang sejarah JAVA dan definisi teknologi JAVA. Bab ini juga akan sedikit menyinggung tentang fase – fase dalam program JAVA. Pada akhir pembahasan, diharapkan pembaca dapat :

1. Menjelaskan fitur – fitur teknologi dari Java meliputi Java Virtual Machine (JVM), garbage collection, dan code security.

2. Menjelaskan perbedaan fase pada pemrograman JAVA

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

Page 20: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 2

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

Java telah mengakomodasi hampir seluruh fitur penting bahasa – bahasa pemrograman yang ada semenjak perkembangan komputasi modern manusia :

1. Dari SIMULA, bahasa pada tahun 65-an, bahasa yang paling mempengaruhi Java sekaligus C++. Dari bahasa ini diadopsi bentukan – bentukan dasar dari pemrograman berorientasi objek.

2. Dari LISP – bahasa tahun 55-an. Diadopsi fasilitas garbage collection, serta kemampuan untuk meniru generic list processing, meski fasilitas ini jarang yang memanfaatkannya.

3. Dari Algol – bahasa pada tahun 60-an, diambil struktur kendali yang dimilikinya.

4. Dari C++, diadopsi sintaks, sebagian semantiks dan exception handling 5. Dari bahasa Ada, diambil strongly type, dan exception handling. 6. Dari Objective C, diambil fasilitas interface. 7. Dari bahasa SmallTalk, diambil pendekatan single-root class hiérarchie,

dimana objek adalah satu kesatuan hirarki pewarisan 8. Dari bahasa Eiffel, fasilitas assertion yang mulai diterapkan di sebagian JDK

1.4

Page 21: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 3

2.2.2 Apa itu Teknologi JAVA? 2.2.2.1 Sebuah Bahasa Pemrograman Sebagai sebuah bahasa pemrograman, Java dapat membuat seluruh bentuk aplikasi, desktop, web dan lainnya, sebagaimana dibuat dengan menggunakan bahasa pemrograman konvensional yang lain. Java adalah bahasa pemrograman yang berorientasi objek (OOP) dan dapat dijalankan pada berbagai platform sistem operasi. Perkembangan Java tidak hanya terfokus oada satu sistem operasi, tetapi dikembangkan untuk berbagai sistem operasi dan bersifat open source. 2.2.2.2 Sebuah Development Environment Sebagai sebuah peralatan pembangun, teknologi Java menyediakan banyak tools : compiler, interpreter, penyusun dokumentasi, paket kelas dan sebagainya. 2.2.2.3 Sebuah Aplikasi Aplikasi dengan teknologi Java secara umum adalah aplikasi serbt a guna yang dapat dijalankan pada seluruh mesin yang memiliki Java Runtime Environment (JRE). 2.2.2.4 Sebuah Deployment Environment Terdapat dua komponen utama dari Deployment Environment. Yang pertama adalah JRE, yang terdapat pada paket J2SDK, mengandung kelas – kelas untuk semua paket teknologi Java yang meliputi kelas dasar dari Java, komponen GUI dan sebagainya. Komponen yang lain terdapat pada Web Browser. Hampir seluruh Web Browser komersial menyediakan interpreter dan runtime environment dari teknologi Java.

Page 22: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 4

2.2.5 Mengapa Mempelajari JAVA? Berdasarkan white paper resmi dari SUN, Java memiliki karakteristik berikut : 1. Sederhana (Simple)

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

2. Berorientasi objek (Object Oriented)

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

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

Page 23: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 5

Inprise, Microsoft ataupun Symantec yang menggunakan Just In Time Compilers (JIT).

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

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.

2.2.4 Sebagian Fitur dari JAVA 2.2.4.1 Java Virtual Machine (JVM) JVM adalah sebuah mesin imajiner (maya) yang bekerja dengan menyerupai aplikasi pada sebuah mesin nyata. JVM menyediakan spesifikasi hardware dan platform dimana kompilasi kode Java terjadi. Spesifikasi inilah yang membuat aplikasi berbasis Java menjadi bebas dari platform manapun karena proses kompilasi diselesaikan oleh JVM. Aplikasi program Java diciptakan dengan file teks berekstensi .java. Program ini dikompilasi menghasilkan satu berkas bytecode berekstensi .class atau lebih. Bytecode adalah serangkaian instruksi serupa instruksi kode mesin. Perbedaannya adalah kode mesin harus dijalankan pada sistem komputer dimana kompilasi ditujukan, sementara bytecode berjalan pada java interpreter yang tersedia di semua platform sistem komputer dan sistem operasi. 2.2.4.2 Garbage Collection Banyak bahasa pemrogaman lain yang mengijinkan seorang pemrogram mengalokasikan memori pada saat dijalankan. Namun, setelah menggunakan alokasi memori tersebut, harus terdapat cara untuk menempatkan kembali blok memori tersebut supaya program lain dapat menggunakannya. Dalam C, C++ dan bahasa lainnya, adalah pemrogram yang mutlak bertanggung jawab akan hal ini. Hal ini dapat menyulitkan bilamana pemrogram tersebut alpa untuk mengembalikan blok memori sehingga menyebabkan situasi yang dikenal dengan nama memory leaks. Program Java melakukan garbage collection yang berarti program tidak perlu menghapus sendiri objek – objek yang tidak digunakan lagi. Fasilitas ini mengurangi beban pengelolaan memori oleh pemrogram dan mengurangi atau mengeliminasi sumber kesalahan terbesar yang terdapat pada bahasa yang memungkinkan alokasi dinamis.

Page 24: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 6

2.2.4.3 Code Security Code Security terimplementasi pada Java melalui penggunaan Java Runtime Environment (JRE). Java menggunakan model pengamanan 3 lapis untuk melindungi sistem dari untrusted Java Code.

1. Pertama, class-loader menangani pemuatan kelas Java ke runtime interpreter. Proses ini menyediakan pengamanan dengan memisahkan kelas – kelas yang berasal dari local disk dengan kelas – kelas yang diambil dari jaringan. Hal ini membatasi aplikasi Trojan karena kelas – kelas yang berasal dari local disk yang dimuat terlebih dahulu.

2. Kedua, bytecode verifier membaca bytecode sebelum dijalankan dan menjamin bytecode memenuhi aturan – aturan dasar bahasa Java.

3. Ketiga, manajemen keamanan menangani keamanan tingkat aplikasi dengan mengendalikan apakah program berhak mengakses sumber daya seperti sistem file, port jaringan, proses eksternal dan sistem windowing.

Setelah seluruh proses tersebut selesai dijalankan, barulah kode program di eksekusi. Java juga menyediakan beragam teknik pengamanan lain :

1. Bahasa dirancang untuk mempersulit eksekusi kode perusak. Peniadaan pointer merupakan langkah besar pengamanan. Java tidak mengenal operasi pointer. Di tangan pemrogram handal, operasi pointer merupakan hal yang luar biasa untuk optimasi dan pembuatan program yang efisien serta mengagumkan. Namun mode ini dapat menjadi petaka di hadapan pemrogram jahat. Pointer merupakan sarana luar biasa untuk pengaksesan tak diotorisasi. Dengan peniadaan operasi pointer, Java dapat menjadi bahasa yang lebih aman.

2. Java memiliki beberapa pengaman terhadap applet. Untuk mencegah program bertindak mengganggu media penyimpanan, maka applet tidak diperbolehkan melakukan open, read ataupun write terhadap berkas secara sembarangan. Karena Java applet dapat membuka jendela browser yang baru, maka jendela mempunyai logo Java dan teks identifikasi terhadap jendela yang dibuka. Hal ini mencegah jendela pop-up menipu sebagai permintaan keterangan username dan password.

Page 25: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 7

2.2.5 Fase – fase Pemrograman JAVA Gambar dibawah ini menjelaskan aliran proses kompilasi dan eksekusi sebuah program Java :

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

Proses Tool Hasil

Menulis kode program Text editor Berkas berekstensi .java

Kompilasi program Java Compiler Berkas berekstensi .class (Java Bytecodes)

Menjalankan program Java Interpreter Program Output

Page 26: J.E.N.I - Java

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.

Diakhir pembahasan, para pelajar diharapkan dapat :• Membuat program Java menggunakan text editor dan console dalam linux (Ubuntu

Dapper)• Membedakan antara syntax-errors dan runtime-errors• Membuat program Java menggunakan NetBeans

3.2 Pendahuluan

IDE adalah sebuah peralatan dalam pemrograman yang diintegrasikan kedalam aplikasi software yang mendukung pembangunan GUI, text atau penulisan kode, compiler dan debugger.

Tutorial ini menggunakan Ubuntu Dapper sebagai sistem operasinya. Sebelum menggunakan tutorial ini, pastikan bahwa telah menginstal Java dan NetBeans dalam sistem yang anda gunakan. Untuk instruksi dalam bagaimana cara menginstal Java dan NetBeans, dapat dilihat pada Appendix A. Untuk versi Windows Xp dalam sesi ini, dapat dilihat pada Appendix B.

Sebelum membahas lebih detail, pada awalnya akan kita lihat program Java pertama yang akan anda tulis.

3.3 Program Java Pertamapublic class Hello { /** * My first java program */ public static void main(String[] args) {

//Menampilkan kata "Hello world" dilayar System.out.println("Hello world!");

} }

Pengenalan Pemrograman I 1

Page 27: J.E.N.I - Java

J.E.N.I.

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

3.4 Menggunakan Text editor dan Console

Dalam contoh ini, kita akan menggunakan text editor untuk mengedit program Java. Juga membuka terminal window untuk meng-compile dan meng-execute program Java anda.

Langkah 1: Memulai Text EditorUntuk memulai text editor di linux , klik pada Applications->Accessories->Text Editor.

Pengenalan Pemrograman I 2

Gambar 1: Aplikasi Text Editor di Linux

Page 28: J.E.N.I - Java

J.E.N.I.

Langkah 2: Membuka TerminalUntuk membuka terminal di linux, klik pada Applications-> Accessories-> Terminal.

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

Pengenalan Pemrograman I 3

Figure 2: Terminal pada Linux

Gambar 3: Menulis kode program menggunakan text editor

Page 29: J.E.N.I - Java

J.E.N.I.

Langkah 4: Simpanlah program Java anda

Program ini akan disimpan dalam file yang bernama ''Hello.java'', dan disimpan dalam sebuah folder yang bernama MYJAVAPROGRAMS.

Untuk membuka Save dialog box, klik pada File menu yang terdapat pada menubar dan kemudian klik save.

Setelah melakukan instruksi tersebut, dialog box akan tampil seperti gambar dibawah ini.

Pengenalan Pemrograman I 4

Gambar 4: Menyimpan file

Page 30: J.E.N.I - Java

J.E.N.I.

Klik pada tombol browse, kemudian klik tombol Create Folder.

Pengenalan Pemrograman I 5

Page 31: J.E.N.I - Java

J.E.N.I.

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

Saat ini, dalam pilihan textbox, ketiklah nama file dari program anda, yaitu ''Hello.java'', kemudian klik pada tombol SAVE.

Pengenalan Pemrograman I 6

Page 32: J.E.N.I - Java

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

Gambar 5: Window baru setelah penyimpanan

Page 33: J.E.N.I - Java

J.E.N.I.

Langkah 5: Meng-compile program andaLangkah berikut ini adalah meng-compile program Anda. Masuklah ke Terminal Window yang telah kita buka sebelumnya.

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.

Untuk masuk kedalam sebuah direktori, ketiklah perintah : cd [directory name]. Perintah ''cd'' digunakan untuk merubah direktori. Dalam hal ini, nama dari direktori kita adalah MYJAVAPROGRAM, maka anda harus mengetik : cd MYJAVAPROGRAMS.

Pengenalan Pemrograman I 8

Gambar 6: Merubah Direktori

Page 34: J.E.N.I - Java

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

Gambar 7: Daftar File didalam Direktori yang Baru

Gambar 8:Meng-compile File Java

Page 35: J.E.N.I - Java

J.E.N.I.

Selama peng-compile-an, javac menambah file kedalam disk yang disebut [filename].class, atau dalam hal ini, Hello.class, yang merupakan kode sebenarnya.

Langkah 6 : Menjalakan ProgramSelama proses peng-compile-an, javac menambah file baru kedalam disk yang disebut [filename].class, dalam hal ini, Hello.class, yang merupakan kode sebenarnya saat ini, dengan perkiraan tidak ada permasalahan pada saat proses compile (kita akan menyelidiki dan membahas permasalahan yang ditemukan selama proses compile, pada bagian berikutnya), berarti telah siap untuk menjalankan program anda.

Untuk menjalankan program Java Anda, dengan 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

Gambar 9: Menjalankan File Class

Page 36: J.E.N.I - Java

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.

3.4.1.1 Syntax ErrorsSyntax errors biasanya terjadi karena kesalahan penulisan. Mungkin Anda kekurangan sebuah perintah di Java atau lupa untuk menulis tanda titik-koma pada akhir pernyataan. Java mencoba untuk mengisolasi error tersebut dengan cara menunjukkan baris dari kode dan terlebih dahulu menunjuk karakter yang salah dalam baris tersebut. Bagaimanapun juga, error belum tentu berada pada titik yang ditunjuk.

Kesalahan umum lainnya adalah dalam kapitalisasi, ejaan, penggunaan dari karakter khusus yang tidak benar, dan penghilangan dari pemberian tanda baca yang sebenarnya.

Mari kita mengambil contoh, pada program Hello.java kita, dimana dengan sengaja kita hilangkan titik-koma pada akhir pernyataan dan juga mencoba untuk mengetikkan ejaan yang salah pada sebuah perintah.

Gambar 10: Listing Program yang Memiliki Error

Pengenalan Pemrograman I 11

Page 37: J.E.N.I - Java

J.E.N.I.

Lihatlah pesan error yang ditampilkan setelah peng-compile-an program dijalankan. Pesan error yang pertama memberitahu bahwa diprogram anda terdapat error pada baris 6. Hal itu menunjuk pada kata setelah static, dimana seharusnya dieja sebagai static.

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.

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

Pengenalan Pemrograman I 12

Gambar 11: Peng-compile-an listing Program yang Memiliki Error

Page 38: J.E.N.I - Java

J.E.N.I.

3.5 Menggunakan NetBeans

Sekarang kita mencoba mengerjakan program kita dengan jalan yang lebih rumit, mari kita lihat bagaimana mengerjakan semua proses yang telah dijelaskan pada bagian sebelumnya dengan menggunakan sebuah aplikasi.

Pada bagian pelajaran ini, kita akan menggunakan NetBeans, yang merupakan Integrated Development Environment atau IDE. Suatu IDE adalah 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 : NetBeansAda dua cara untuk menjalankan NetBeans. Pertama menulis perintah menggunakan terminal, atau hanya dengan mengklik pada tombol shortcut yang dapat ditemukan di desktop.

Untuk menjalankan NetBeans menggunakan command-line. Bukalah terminal (lihat langkahnya pada bagaimana menjalankan terminal didiskusi sebelumnya), dan ketiklah : netbeans.

Pengenalan Pemrograman I 13

Gambar 12: Menjalankan NetBeans Menggunakan Command-Line

Page 39: J.E.N.I - Java

J.E.N.I.

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

Pengenalan Pemrograman I 14

Gambar 13: Menjalankan NetBeans menggunakan shortcut icon di desktop

Page 40: J.E.N.I - Java

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

Gambar 14: Window Setelah Membuka NetBeans

Page 41: J.E.N.I - Java

J.E.N.I.

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

Pengenalan Pemrograman I 16

Gambar 15: Memilih Tipe Project

Page 42: J.E.N.I - Java

J.E.N.I.

Sekarang, dialog aplikasi yang baru akan ditampilkan.

Pengenalan Pemrograman I 17

Gambar 16: Mengatur Informasi Project

Page 43: J.E.N.I - Java

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

Gambar 17: Mengatur Lokasi Project

Page 44: J.E.N.I - Java

J.E.N.I.

Lihatlah lokasi project dan folder project telah berubah menjadi /home/florence/MYJAVAPROGRAMS.

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

Pengenalan Pemrograman I 19

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

Page 45: J.E.N.I - Java

J.E.N.I.

Langkah 3 : Menulis Program AndaSebelum menulis program, pertama akan dijelaskan window utama setelah membuat project.

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

Page 46: J.E.N.I - Java

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!");

Setelah pernyataan, //TODO code application logic here.

Pengenalan Pemrograman I 21

Gambar20: Memasukkan Kode

Page 47: J.E.N.I - Java

J.E.N.I.

Langkah 4 : Meng-compile Program AndaSekarang, untuk meng-compile program anda, klik pada Build->Buid Main Project. Atau, anda juga dapat menggunakan tombol shortcut untuk meng-compile kode anda.

Pengenalan Pemrograman I 22

Page 48: J.E.N.I - Java

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

Gambar 21: Tampilan Setelah sukses melakukan compile

Page 49: J.E.N.I - Java

J.E.N.I.

Langkah 5 : Menjalankan Program AndaUntuk menjalankan program Anda, klik pada Run->Run Main Project. Atau Anda juga dapat menggunakan tombol shortcut untuk menjalankan program Anda.

Pengenalan Pemrograman I 24

Gambar 22: Menjalankan dengan NetBeans

Page 50: J.E.N.I - Java

J.E.N.I.

Hasil dari program Anda ditampilkan pada window.

Pengenalan Pemrograman I 25

Gambar 23: Tampilan Setelah Sukses Menjalankan Program

Page 51: J.E.N.I - Java

J.E.N.I.

3.6 Latihan

3.6.1 Hello World!

Menggunakan NetBeans, membuat class dengan nama : [NamaAnda]. Hasil dari program yang harus tampil dilayar :

Welcome to Java Programming [NamaAnda]!!!

3.6.2 The Tree

Menggunakan NetBeans, membuat class dengan nama : TheTree. Hasil dari program yang harus tampil dilayar :

I think that I shall never see, a poem as lovely as a tree. A tree whose hungry mouth is pressed Against the Earth’s sweet flowing breast.

Pengenalan Pemrograman I 26

Page 52: J.E.N.I - Java

J.E.N.I.

BAB 4

Dasar-Dasar Pemrograman

4.1 Tujuan Pada bagian ini, kita akan mendiskusikan mengenai bagian dasar pemrograman java. Kita akan memulai dengan mencoba menjelaskan bagian dasar dari program Hello.java yang telah diperkenalkan pada bab sebelumnya.Kita juga akan mendiskusikan beberapa pedoman cara menulis script atau petunjuk penulisan kode dalam penulisan program lebih efektif dan mudah dibaca.

Pada akhir pembelajaran ini, pelajar seharusnya dapat :

• Mengidentifikasi bagian dasar dari program java

• Membedakan mana yang termasuk ke dalam java literals, tipe data dasar, tipe variabel, pengidentifikasian dan operator.

• Mengembangkan program java sederhana menggunakan konsep pembelajaran pada bab ini.

• Menganalisa program java pertama saya

4.2 Menganalisa program Java pertama saya

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

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

Pengenalan Pemrograman I 1

Page 53: J.E.N.I - Java

J.E.N.I.

Baris pertama kode :

public class Hello mengindikasikan nama class yaitu Hello. Pada java semua kode seharusnya ditempatkan didalam deklarasi class. Kita melakukannya dengan menggunakan kata kunci class. Sebagai tambahan, class menggunakan akses khusus public, yang mengindikasikan bahwa class kita mempunyai akses bebas ke class yang lain dari package yang lain pula (package merupakan kumpulan class-class). Kita akan membahas lebih dalam mengenai package dan akses khusus pada pembahasan selanjutnya. Baris berikutnya yaitu yang terdiri atas kurung kurawal { mengindikasikan awal blok. Pada kode ini, kita menempatkan kurung kurawal pada baris selanjutnya setelah deklarasi class, bagaimanapun, kita dapat juga meletakkan kurung kurawal ini setelah baris pertama dari kode yang kita tulis. Jadi, kita dapat menulis kode kita sebagai berikut :

public class Hello {

atau public class Hello { Tiga baris selanjutnya mengindikasikan adanya komentar dalam bahasa java. Komentar adalah sesuatu yang digunakan untuk mendokumentasikan setiap bagian dari kode yang ditulis. Komentar bukan merupakan bagian dari program itu sendiri, tetapi digunakan untuk tujuan dokumentasi. Komentar itu sendiri dapat ditambahkan pada kode yang anda tulis sebagai petunjuk yang dapat membantu proses pembelajaran pemrograman yang baik.

/** * My first java program */

Komentar diindikasikan oleh tanda “/*” dan “*/”. Segala sesuatu yang ada diantara tanda tersebut diabaikan oleh compiler java, dan mereka hanya dianggap sebagai komentar. Baris selanjutnya,

public static void main(String[] args) { atau dapat juga ditulis sebagai berikut,

public static void main(String[] args) {

mengindikasikan nama suatu method dalam class Hello yang bertindak sebagai method utama. Method utama adalah titik awal dari suatu program java. Semua proram kecuali applet yang ditulis dalam bahasa java dimulai dengan method utama. Yakinkan untuk

Pengenalan Pemrograman I 2

Page 54: J.E.N.I - Java

J.E.N.I.

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

//prints the string "Hello world" on screen Sekarang kita mempelajari 2 cara untuk membuat komentar. Cara pertama adalah dengan menempatkan komentar dalam /* dan */, dan cara yang lain adalah dengan menuliskan tanda // pada awal komentar Baris selanjutnya,

System.out.println("Hello world!"); menampilkan teks “Hello World!” pada layar. Perintah System.out.println(), menampilkan teks yang diapit oleh tanda double pute (“ ”) pada layar. Dua baris terakhir yang terdiri atas dua kurung kurawal digunakan untuk menutup method utama dan masing-masing class secara berurutan. Pedoman Penulisan Program: 1. Program Java yang anda buat harus selalu diakhiri dengan ekstensi file .java. 2. Nama File seharusnya sesuai/sama dengan nama class public nya. Sebagai contoh, jika

nama class public anda adalah Hello, anda harus menyimpan file tersebut dengan nama Hello.java.

3. Anda harus menulis komentar sebagai penjelasan pada kode yang anda tulis, yaitu komentar yang berisi keterangan mengenai baris perintah pada class atau apa yang dijalankan oleh method yang anda tulis tersebut.

Pengenalan Pemrograman I 3

Page 55: J.E.N.I - Java

J.E.N.I.

4.3. Komentar pada Java Komentar adalah catatan yang ditulis pada kode dengan tujuan sebagai bahan dokumentasi. teks ini bukan bagian dari program dan tidak mempengaruhi jalannya program.

Java mendukung tiga jenis komentar : C++ style komentar satu baris, C style beberapa baris, dan komentar javadoc khusus

4.3.1. Penulisan Komentar pada C++

komentar C++Style diawali dengan //. Semua teks setelah // dianggap sebagai komentar. Sebagi contoh,

// This is a C++ style or single line comments

4.3.2. Penulisan Komentar pada C

Komentar C-style atau juga disebut komentar beberapa baris diawali dengan /* dan diakhiri dengan */. Semua teks yang ada diantara dua tanda tersebut dianggap sebagai komentar. Tidak seperti komentar C++ style, itu dapat menjangkau beberapa baris. Sebagai contoh,

/* this is an exmaple of a C style or multiline comments */

4.3.3. Komentar Khusus javadoc

Komentar javadoc khusus digunakan untuk generatisasi dokumentasi HTML untuk program java anda. Anda dapat menciptakan komentar javadoc dengan memulai baris dengan /** dan mengakhirinya dengan */. Seperti Komentar C_style, ini dapat juga menjangkau beberapa baris. Ini juga dapat terdiri atas tag-tag untuk menambahkan lebih banyak informasi pada komentar anda. Sebagai contoh,

/** This is an example of special java doc comments used for \n generating an html documentation. It uses tags like: @author Florence Balagtas @version 1.2 */

Pengenalan Pemrograman I 4

Page 56: J.E.N.I - Java

J.E.N.I.

4.4. Pernyataan dalamJava dan Block pernyataan adalah satu atau lebih baris kode yang diakhiri dengan semicolon. sebagai contoh untuk pernyataan tunggal adalah

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

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

Pedoman Penulisan Program: 1. Pada saat pembuatan block, anda dapat meletakkan kurung kurawal buka pada baris

dengan pernyataan seperti contoh sebagai berikut , public static void main( String[] args ){ atau anda dapat meletakkan kurung kurawal pada baris selanjutnya, seperti, public static void main( String[] args ){ 2. Anda harus memberi jarak (indent) pernyataan selanjutnya setelah awal dari block ,

seperti contoh berikut, public static void main( String[] args ){ System.out.println("Hello"); System.out.println("world"); }

Pengenalan Pemrograman I 5

Page 57: J.E.N.I - Java

J.E.N.I.

4.5. Java Identifier Java Identifier adalah suatu tanda yang mewakili nama-nama vaiabel, method, class dsb. Contoh dari pengidentifikasi adalah : Hello, main, System, out. Pendeklarasian Java adalah case-sensitive. Hal ini berarti bahwa pengidentifikasi : Hello tidak sama dengan hello. Pengidentifikasi harus dimulai dengan salah satu huruf, underscore “_”, atau tanda dollar “$”. Hurufnya dapat berupa huruf besar maupun huruf kecil. Karakter selanjutnya dapat menggunakan nomor 0 smpai 9. Pengidentifikasi tidak dapat menggunakan kata kunci dalam java seperti class, public, void, dsb. Selanjutnya kita akan berdiskusi lebih banyak tentang kata kunci dalam java. Pedoman Penulisan Program: 1. Untuk pemberian nama dai class java, diberikan huruf kapital untuk huruf pertama pada

nama class. Untuk nama method dan variabel, huruf pertama dari kata harus dimulai dengan huruf kecil. Sebagi contoh:

ThisIsAnExampleOfClassName thisIsAnExampleOfMethodName 2. Pada kasus untuk pengidentifikasi labih dari satu kata , menggunakan huruf kapital untuk

mengindikasikan awal dari kata kecuali kata pertama. Sebagai contoh, charArray, fileNumber, ClassName.

3. Hindari menggunakan underscores pada awal pengidentifikasian seperti _read atau _write.

Pengenalan Pemrograman I 6

Page 58: J.E.N.I - Java

J.E.N.I.

4.6. Keyword dalam Java

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

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

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

Pengenalan Pemrograman I 7

Page 59: J.E.N.I - Java

J.E.N.I.

4.7.1. Literals Integer

literals Integer dibedakan dalam beberapa format yang berbeda: desimal (berbasis 10), heksadesimal (berbasis 16), and oktal (berbasis 8). Dalam penggunaan tipe data integer pada program, kita harus mengikuti aturan penggunaan beberapa notasi khusus. Untuk angka desimal, kita tidak memerlukan notasi khusus. Kita hanya menulis angka desimal seperti apa adanya. untuk angka heksadesimal, hal itu harus ditandai oleh “0x” atau “0X”. untuk oktal, ditandai oleh“0”. Sebagai contoh, mewakili angka 12. penulisan dalam bentuk desimalnya adalah 12, Sementara dalam heksadesimal, menjdi 0xC, dan dalam oktal, nilai tersebut ekivalen dengan 014. Default tipe data untuk integer literals adalah int. Int ditandai dengan ditampilkannya dalam 32-bit. Pada kasus-kasus tertentu anda dapat berharap untuk memaksa integer literal untuk menjadi tipe data long dengan menambahkan karakter “l” or “L”. tipe data long ditandai oleh ditampilkannya data dalam 64-bit. Kita akan membahas mengenai tipe data pada kesempatan selanjutnya.

4.7.2. Floating-Point Literals

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

4.7.3. Boolean Literals

Boolean literals hanya memiliki dua nilai, true atau false.

Pengenalan Pemrograman I 8

Page 60: J.E.N.I - Java

J.E.N.I.

4.7.4. Character Literals

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

4.7.5. String Literals

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

Pengenalan Pemrograman I 9

Page 61: J.E.N.I - Java

J.E.N.I.

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

4.8.1. logika - boolean

tipe data boolean diwakili oleh dua pernyataan : true dan false. Sebagai contoh adalah,

boolean result = true;

Contoh yang ditunjukkan diatas, mendeklarasikan variabel yang dinamai result sebagai tipe data boolean dan memberinya nilai true.

4.8.2. teksual – char

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

‘a’ //Huruf a ‘\t’ //A tab

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

'\'' //untuk single quotes '\"' //untuk double quotes

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

String message=“Hello world!”

Pengenalan Pemrograman I 10

Page 62: J.E.N.I - Java

J.E.N.I.

4.8.3. Integral – byte, short, int & long

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

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

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 :

Name or Type Range Integer Length

byte -27 to 27-1 8 bits

short -215 to 215-1 16 bits

int -231 to 231-1 32 bits

-263 to 263-1 64 bits long

Table 1: Integral tipes and their ranges

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

Pengenalan Pemrograman I 11

Page 63: J.E.N.I - Java

J.E.N.I.

4.8.4. Floating Point – float dan double

tipe Floating point memiliki double sebagai default tipe datanya. Floating-point literal terdiri atas salah satunya desimal point atau salah satu dari pilihan berikut ini,

E or e //(add exponential value) F or f //(float) D or d //(double)

Contohnya adalah,

3.14 //nilai floating-point sederhana (a double) 6.02E23 //A nilai floating-point yang besar 2.718F //A nilai float size sederhana 123.4E+306D //A nilai double yang besar dengan nilai redundant D

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

Float Length Name or Type Range

32 bits float -231 to 231-1

-263 to 263-1 64 bits double

Table 2: Tipe Floating point dan range nya

Pengenalan Pemrograman I 12

Page 64: J.E.N.I - Java

J.E.N.I.

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

4.9.1. Deklarasi dan Inisialisasi Variabel

Untuk deklarasi variabel adalah sebagai berikut,,

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

Catatan: Nilainya berada diantara <> adalah nilai yang disyaratkan, sementara nilai dalam tanda [] bersifat optional. Berikut ini adalah contoh program yang mendeklarasikan dan menginisialisasi beberapa variabel,

public class VariableSamples { public static void main( String[] args ){ //deklarasi a tipe data dengan nama variable // result dan tipe data boolean boolean result; //deklarasi tipe data dengan nama variabel // option dan tipe data char char option; option = 'C'; //menandai 'C' sebagai option //deklarasi tipe data dengan nama variabel //grade, double tipe data dan telah di inisialisasi //to 0.0 double grade = 0.0; } }

Petunjuk Penulisan Program: 1. Hal ini selalu baik untuk menginisialisasi variabel yang anda buat seperti anda

mendeklarasikannya. 2. Gunakan nama yang bersifat menggambarkan object untuk variabel yang anda buat.,

jika anda ingin mempunyai variabel yang terdiri atas nilai pelajar, beri nama dengan nama nilai dan jangan hanya beberapa huruf random yang anda pilih.

Pengenalan Pemrograman I 13

Page 65: J.E.N.I - Java

J.E.N.I.

3. Deklarasikan satu variabel tiap baris kode. Sebagai contoh , deklarasi variabel adalah sebagai berikut,

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

4.9.2. Menampilkan Data Variabel

Untuk mengeluarkan nilai dari variabel yang diinginkan, kita dapat menggunakan perintah sebagai berikut,

System.out.println() System.out.print()

Berikut ini adalah contoh program,

public class OutputVariable { public static void main( String[] args ){ int value = 10; char x; x = ‘A’; System.out.println( value ); System.out.println( “The value of x=“ + x ); } }

Program tersebut akan mengeluarkan teks berikut pada layar,

10 The value of x=A

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

Apa yang membedakan diantara perintah System.out.println() and System.out.print()? Yang pertama menambahkan baris baru pada akhir data untuk dikeluarkan, sementara selanjutnya tidak. Perhatikan pernyataan tersebut,

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

Pernyataan tersebut akan menghasilkan output berikut ini pada layar,

Pengenalan Pemrograman I 14

Page 66: J.E.N.I - Java

J.E.N.I.

Hello world! Sekarang perthatikan pernyataan berikut,

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

Pernyataan ini akan menghasilkan output sebagai berikut pada layar,

Hello world!

Pengenalan Pemrograman I 15

Page 67: J.E.N.I - Java

J.E.N.I.

4.9.4. Reference Variables vs. primitif Variables

Sekarang kita akan membedakan dua tipe variabel yang dimiliki oleh program java. Ada variabel reference dan variabel primitif . Variabel primitif adalah variabel dengan tipe data primitif. Mereka menyimpan data dalam lokasi memori yang sebenarnya dimana variabel tersebut berada. Variabel Reference adalah variabel yang menyimpan alamat dalam lokasi memori. Yang menunjuk ke lokasi memori dimana data sebenarnya berada. Ketika anda mendeklarasi variabel pada class tertentu, anda sebenarnya mendeklarasikan reference variable dalam bentuk object dalam classnya tersebut. Sebagai contoh, Apabila kita mempunyai dua variabel dengan tipe data int dan String.

int num = 10; String name = "Hello"

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

Memory Address

Variable Name

Data

1001 num 10 : : 1563 name Address(2000)

:

:

:

:

2000 "Hello"

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

Pengenalan Pemrograman I 16

Page 68: J.E.N.I - Java

J.E.N.I.

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

4.10.1 Operator Aritmatika

Berikut ini adalah dasar operator arithmatika yang dapat digunakan untuk membuat suatu program java,

Operator Use Description

+ op1 + op2 Adds op1 and op2

* op1 * op2 Multiplies op1 by op2

/ op1 / op2 Divides op1 by op2

% Computes the remainder of dividing op1 by op2

op1 % op2

- op1 - op2 Subtracts op2 from op1

Table 3: Operator Arithmatika dan fungsi-fungsinya

Pengenalan Pemrograman I 17

Page 69: J.E.N.I - Java

J.E.N.I.

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

public class aritmatikaDemo { public static void main(String[] args) { //sedikit angka int i = 37; int j = 42; double x = 27.475; double y = 7.22; System.out.println("Variable values..."); System.out.println(" i = " + i); System.out.println(" j = " + j); System.out.println(" x = " + x); System.out.println(" y = " + y); //penjumlahan angka System.out.println("Adding..."); System.out.println(" i + j = " + (i + j)); System.out.println(" x + y = " + (x + y)); //pengurangan angka System.out.println("Subtracting..."); System.out.println(" i - j = " + (i - j)); System.out.println(" x - y = " + (x - y)); //perkalian angka System.out.println("Multiplying..."); System.out.println(" i * j = " + (i * 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)); //menghitung hasil modulus dari pembagian System.out.println("Computing the remainder..."); System.out.println(" i % j = " + (i % j)); System.out.println(" x % y = " + (x % y)); //tipe penggabungan System.out.println("Mixing tipes...");

Pengenalan Pemrograman I 18

Page 70: J.E.N.I - Java

J.E.N.I.

System.out.println(" j + y = " + (j + y)); System.out.println(" i * x = " + (i * x)); } } Berikut ini adalah output program,

Variable values... i = 37 j = 42 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

Page 71: J.E.N.I - Java

J.E.N.I.

4.10.2. Operator Increment dan Decrement

Dari sisi operator dasar aritmatika, java juga terdiri atas operator unary increment (++) dan operator unary decrement (--). operator increment dan decrement menambah dah mengurangi nilai yang tersimpan dalm bentuk variabel angka terhadap nilai 1. Sebagai contoh, pernyataan,

count = count + 1; //increment nilai count dengan nilai 1

pernyataan tersebut ekivalen dengan,

count++;

Operator Use Description

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

++ ++op Increments op by 1; evaluates to the value of op after it was incremented

Decrements op by 1; evaluates to the value of op before it was decremented

-- op--

Decrements op by 1; evaluates to the value of op after it was decremented

-- --op

Table 4: operator Increment dan Decrement

Operator increment dan decrement dapat ditempatkan sebelum atau sesudah operand. Ketika digunakan sebelum operand, akan menyebabkan variabel diincrement atau didecrement oleh nilai 1, dan kemudian nilai baru digunakan dalam pernyataan dimana dia ditambahkan. Sebagai contoh,

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

Ketika operator increment dan decrement ditempatkan setelah operand, nilai variabel yang

Pengenalan Pemrograman I 20

Page 72: J.E.N.I - Java

J.E.N.I.

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

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

Pedoman Penulisan Program: Selalu jaga pernyataan yang mengandung operator increment dan decrement untuk dipahami secara mudah dan sederhana.

4.10.3 Operator Relasi

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

Operator Use Description

> op1 > op2 op1 is greater than op2

>= op1 >= op2 op1 is greater than or equal to op2

< op1 < op2 op1 is less than op2

<= op1 <= op2 op1 is less than or equal to op2

== op1 == op2 op1 and op2 are equal

!= op1 != op2 op1 and op2 are not equal

Table 5: Operator Relasi

Pengenalan Pemrograman I 21

Page 73: J.E.N.I - Java

J.E.N.I.

Berikut ini adalah contoh program yang menggunakan operator Relasi, public class RelasiDemo { public static void main(String[] args) { //a few numbers int i = 37; int j = 42; int k = 42; System.out.println("Variable values..."); System.out.println(" i = " + i); System.out.println(" j = " + j); System.out.println(" k = " + k); //lebih besar dari System.out.println("Greater than..."); System.out.println(" i > j = " + (i > j)); //false System.out.println(" j > i = " + (j > i)); //true System.out.println(" k > j = " + (k > j)); //false //lebih besar atau sama dengan System.out.println("Greater than or equal to..."); System.out.println(" i >= j = " + (i >= j)); //false System.out.println(" j >= i = " + (j >= i)); //true System.out.println(" k >= j = " + (k >= j)); //true //lebih kecil dari System.out.println("Less than..."); System.out.println(" i < j = " + (i < j)); //true System.out.println(" j < i = " + (j < i)); //false System.out.println(" k < j = " + (k < j)); //false //lebih kecil atau sama dengan System.out.println("Less than or equal to..."); System.out.println(" i <= j = " + (i <= j)); //true System.out.println(" j <= i = " + (j <= i)); //false System.out.println(" k <= j = " + (k <= j)); //true //sama dengan System.out.println("Equal to..."); System.out.println(" i == j = " + (i == j)); //false System.out.println(" k == j = " + (k == j)); //true //tidak sama dengan System.out.println("Not equal to...");

Pengenalan Pemrograman I 22

Page 74: J.E.N.I - Java

J.E.N.I.

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

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

Pengenalan Pemrograman I 23

Page 75: J.E.N.I - Java

J.E.N.I.

4.10.4 Operator logika

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

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

Pengenalan Pemrograman I 24

Page 76: J.E.N.I - Java

J.E.N.I.

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

Berikut ini adalah tabel kebenaran untuk && dan &,

x2 Result x1

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? Diberikan suatu pernyataan,

exp1 && exp2

&& akan mengevaluasi pernyataan exp1, dan segera mengembalikan nilai false dan menyatakan bahwa exp1 bernilai false. Jika exp1 bernilai false, operator tidak akan pernah mengevaluasi exp2 karena hasil operasi operator akan menjadi false tanpa memperhatikan nilai dari exp2. Sebaliknya, operator & selalu mengevaluasi kedua nilai dari exp1 dan exp2 sebelum mengembalikan suatu nilai jawaban. Berikut ini adalah suatu contoh source code yang menggunakan logika dan boolean AND,

public class TestAND { public static void main( String[] args ){ int i = 0; int j = 10; boolean test= false; //demonstrasi && test = (i > 10) && (j++ > 9); System.out.println(i); System.out.println(j); System.out.println(test); //demonstrasi & test = (i > 10) & (j++ > 9); System.out.println(i); System.out.println(j);

Pengenalan Pemrograman I 25

Page 77: J.E.N.I - Java

J.E.N.I.

System.out.println(test); } }

The output of the program is,

0 10 false 0 11 false

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

Pengenalan Pemrograman I 26

Page 78: J.E.N.I - Java

J.E.N.I.

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

Berikut ini adalah tabel kebenaran untuk || dan |,

x1 x2 Result

TRUE TRUE TRUE

TRUE FALSE TRUE

FALSE TRUE TRUE

FALSE FALSE FALSE

Table 7: Table Kebenaran untuk | dan ||

Perbedaan dasar antara operator || dan | adalah bahwa || mendukung short-circuit evaluations (atau proses evaluasi sebagian),sementara | tidak. Apa maksud dari pernyataan tersebut? diberikan suatu pernyataan,

exp1 || exp2 || akan mengevaluasi pernyataan exp1, dan segera mengembalikan nilai true dan menyatakan bahwa exp1 bernilai true. Jika exp1 bernilai true, operator tidak akan pernah mengevaluasi exp2 karena hasil dari operasi operator akan bernilai true tanpa memperhatikan nilai dari exp2. Sebaliknya,operator | selalu mengevaluasi kedua nilai dari exp1 and exp2 sebelum mengembalikan suatu jawaban suatu nilai. Berikut ini sebuah contoh source code yang menggunakan operator logika dan boolean OR,

public class TestOR { public static void main( String[] args ){ int i = 0; int j = 10; boolean test= false; //demonstrasi || test = (i < 10) || (j++ > 9); System.out.println(i); System.out.println(j); System.out.println(test); //demonstrasi | test = (i < 10) | (j++ > 9); System.out.println(i); System.out.println(j);

Pengenalan Pemrograman I 27

Page 79: J.E.N.I - Java

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

Page 80: J.E.N.I - Java

J.E.N.I.

4.10.4.3 ^ (boolean logika ExclusiveOR )

Berikut ini adalah tabel kebenaran untuk ^,

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,

public class TestXOR { public static void main( String[] args ){ boolean val1 = true; boolean val2 = true; System.out.println(val1 ^ val2); val1 = false; val2 = true; System.out.println(val1 ^ val2); val1 = false; val2 = false; System.out.println(val1 ^ val2); val1 = true; val2 = false; System.out.println(val1 ^ val2); } }

Hasil keluaran program tersebut adalah, false true false true

Pengenalan Pemrograman I 29

Page 81: J.E.N.I - Java

J.E.N.I.

4.10.4.4 ! (logika NOT)

logika NOT digunakan dalam satu argumen, dimana argumen tersebut dapat menjadi suatu pernyataan, variabel atau konstanta. Berikut ini adalah tabel kebenaran untukoperator not!,

x1 Result

TRUE FALSE

FALSE TRUE

Table 9: Tabel Kebenaran untuk !

Berikut ini adalah contoh source code yang menggunakan operator logika NOT,

public class TestNOT { public static void main( String[] args ){ boolean val1 = true; boolean val2 = false; System.out.println(!val1); System.out.println(!val2); } }

Hasil keluaran program adalah sebagai berikut,

false true

Pengenalan Pemrograman I 30

Page 82: J.E.N.I - Java

J.E.N.I.

4.10.5 Operator Kondisi(?:)

operator kondisi ?: adalah operator ternary. Hal ini berarti bahwa operator ini digunakan dalam tiga bentuk pernyataan condisional argumen yang digunakan bersama-sama. Struktur pernyataan yang menggunakan operator kondisi adalah,

exp1?exp2:exp3 Dimana nilai exp1 adalah suatu pernyataan boolean yang memiliki hasil yang salah satunya harus berupa nilai true atau false. Jika exp1 bernilai true, exp2 merupakan hasil operasi . Jika bernilai false, kemudian exp3 merupakan hasil operasinya. Sebagai contoh, diberikan code sebagai berikut,

public class kondisiOperator { public static void main( String[] args ){ String status = ""; int grade = 80; //mendapatkan status pelajar status = (grade >= 60)?"Passed":"Fail"; //print status System.out.println( status ); } }

Hasil keluaran dari program ini akan menjadi,

Passed

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

Pengenalan Pemrograman I 31

Page 83: J.E.N.I - Java

J.E.N.I.

Gambar2: Flowchart Berikut ini adalah program lain yang menggunakan operator ?: ,

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

Hasil keluaran program adalah,

Score = 10

Pengenalan Pemrograman I 32

Page 84: J.E.N.I - Java

J.E.N.I.

4.10.6 Operator Precedence

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

Gambar3: Operator Precedence

Diberikan pernyataan yang membingungkan,

6%2*5+4/2+88-10

Kita dapat menuliskan kembali pernyataan diatas dan menambahkan beberapa tanda kurung terhadap operator precedence,

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

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

Pengenalan Pemrograman I 33

Page 85: J.E.N.I - Java

J.E.N.I.

4.11 Latihan

4.11.1 Mendeklarasikan dan mencetak variabel

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

Variable name Data tipe Initial value number integer 10 letter character a result boolean true str String hello

Berikut ini merupakan tampilan yang diharapkan sebagai hasil eksekusi program,

Number = 10 letter = a result = true str = hello

4.11.2. Mendapatkan nilai rata-rata dari tiga angka

Buatlah program yang menghasilkan output nilai rata-ratadari tiga angka. Nilai dari masing-masing tiga angka tersebut adalah 10, 20 dan 45. Tampilan Output yang diharapkan adalah,

number 1 = 10 number 2 = 20 number 3 = 45 Average is = 25

4.11.3. Menampilkan nilai terbesar

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

number 1 = 10 number 2 = 23 number 3 = 5

Pengenalan Pemrograman I 34

Page 86: J.E.N.I - Java

J.E.N.I.

Nilai tertingginya adalah angka = 23

4.11.4. Operator precedence

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

Pengenalan Pemrograman I 35

Page 87: J.E.N.I - Java

J.E.N.I.

BAB 5

Mendapatkan Input dari Keyboard

5.1 Tujuan Kita sudah mempelajari konsep mendasar pada Java dan menulis beberapa program sederhana. Sekarang kita akan mencoba membuat program kita lebih interaktif dengan menggunakan input dari keyboard. Pada bab ini, kita akan mempelajari dua cara memberikan input, yang pertama adalah menggunakan kelas BufferedReader dan melalui GUI (Graphical User Interface) dengan menggunakan kelas JOptionPane. Pada akhir bab ini, para siswa diharapkan mampu:

• Membuat program Java yang interaktif yang bisa mendapatkan input dari keyboard • Menggunakan kelas BufferedReader untuk mendapatkan input dari keyboard

melalui layar console • Menggunakan kelas JOptionPane untuk mendapatkan input dari keyboard melalui

GUI

5.2 Menggunakan BufferedReader untuk

mendapatkan input Pada bagian ini, kita akan menggunakan kelas BufferedReader yang berada di java.io package untuk mendapatkan input dari keyboard. Berikut ini adalah langkah-langkah yang diperlukan untuk mendapatkan input dari keyboard: 1. Tambahkan di bagian paling atas code anda:

import java.io.*;

2. Tambahkan statement ini:

BufferedReader dataIn = new BufferedReader(new InputStreamReader( System.in) ); 3. Deklarasikan variabel String temporer untuk mendapatkan input, dan gunakan fungsi

readLine() untuk mendapatkan input dari keyboard. Anda harus mengetikkannya di dalam blok try-catch:

try{ String temp = dataIn.readLine();

} catch( IOException e ){ System.out.println(“Error in getting input”); }

Pengenalan Pemrograman I 1

Page 88: J.E.N.I - Java

J.E.N.I.

Berikut ini adalah source code selengkapnya:

import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class GetInputFromKeyboard { public static void main( String[] args ){ BufferedReader dataIn = new BufferedReader(new InputStreamReader( System.in) ); String name = ""; System.out.print("Please Enter Your Name:"); try{ name = dataIn.readLine(); }catch( IOException e ){ System.out.println("Error!"); } System.out.println("Hello " + name +"!"); } }

Berikutnya akan dijelaskan setiap baris dari code: Statement,

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

menjelaskan bahwa kita akan menggunakan kelas BufferedReader, InputStreamReader dan IOException yang berada di java.io package. Java Application Programming Interface (API) sudah berisi ratusan kelas yang bisa digunakan untuk program anda. Kelas-kelas tersebut dikumpulkan ke dalam packages. Packages memiliki kelas yang mempunyai fungsi yang saling berhubungan. Seperti pada contoh di atas, java.io package mengandung kelas-kelas yang memungkinkan program untuk melakukan input dan output data. Statement diatas juga dapat ditulis,

import java.io.*; yang akan mengeluarkan semua kelas yang berada pada paket, dan selanjutnya kita bisa menggunakan kelas-kelas tersebut pada program kita.

Pengenalan Pemrograman I 2

Page 89: J.E.N.I - Java

J.E.N.I.

Dua statement selanjutnya,

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

kita sudah mempelajari pada bab sebelumnya. Statement ini menyatakan bahwa kita mendeklarasikan sebuah class bernama GetInputFromKeyboard dan kita mendeklarasikan main method. Pada statement,

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

kita mendeklarasikan sebuah variabel bernama dataIn dengan tipe kelas BufferedReader. Jangan mengkhawatirkan tentang maksud dari syntax saat ini. Kita akan menjelaskannya pada akhir pembahasan. Sekarang, kita akan mendeklarasikan variabel String dengan identifier name,

String name = ""; Statement diatas merupakan tempat untuk menyimpan input dari user. Variabel name diinisialisasi sebagai String kosong "". Sebaiknya kita selalu menginisialisasi sebuah variabel setelah kita mendeklarasikannya. Baris berikutnya adalah memberikan output string pada layar menanyakan nama user.

System.out.print("Please Enter Your Name:"); Sekarang, block di bawah ini merupakan try-catch block,

try{ name = dataIn.readLine(); }catch( IOException e ){ System.out.println("Error!"); }

Pada baris ini menjelaskan bahwa kemungkinan terjadi error pada statement

name = dataIn.readLine(); akan ditangkap. Kita akan membahas tentang exception handling pada bab selanjutnya dari pembahasan ini, tetapi untuk sekarang, anda cukup mencatat bahwa anda perlu menambahkan kode ini untuk menggunakan readLine() method dari BufferedReader untuk mendapatkan input dari user.

Pengenalan Pemrograman I 3

Page 90: J.E.N.I - Java

J.E.N.I.

Selanjutnya statement, name = dataIn.readLine();

method diatas memanggil dataIn.readLine(), mendapatkan input dari user dan memberikan sebuah nilai String. Nilai ini akan disimpan ke dalam variabel name, yang akan kita gunakan pada statement akhir untuk menyambut user,

System.out.println("Hello " + name + "!");

Pengenalan Pemrograman I 4

Page 91: J.E.N.I - Java

J.E.N.I.

5.1 Menggunakan JOptionPane untuk mendapatkan input Cara lain untuk mendapatkan input dari user adalah dengan menggunakan kelas JoptionPane yang didapatkan dari javax.swing package. JoptionPane membuat kemudahan dengan memunculkan dialog box standar yang memberikan kepada user sebuah nilai atau menginformasikan sesuatu. Berikan kode berikut ini,

import javax.swing.JOptionPane; public class GetInputFromKeyboard { public static void main( String[] args ){ String name = ""; name = JoptionPane.showInputDialog("Please enter your name"); String msg = "Hello " + name + "!"; JOptionPane.showMessageDialog(null, msg); } }

Akan menghasilkan output,

Pengenalan Pemrograman I 5

Page 92: J.E.N.I - Java

J.E.N.I.

Statement pertama,

import javax.swing.JOptionPane; Menjelaskan bahwa kita mengimport kelas JoptionPane dari javax.swing package. Bisa juga ditulis,

import javax.swing.*; statement selanjutnya,

name = JOptionPane.showInputDialog("Please enter your name"); membuat sebuah JOptionPane input dialog, yang akan menampilkan dialog dengan sebuah pesan, sebuah textfield dan tombol OK seperti pada gambar. Hasil dari dialog tersebut adalah String dan disimpan ke dalam variabel name. Sekarang kita membuat pesan selamat datang, yang akan disimpan ke dalam variabe msg,

String msg = "Hello " + name + "!"; Baris selanjutnya adalah menampilkan sebuah dialog yang memilki sebuah pesan dan tombol OK,

JOptionPane.showMessageDialog(null, msg);

Pengenalan Pemrograman I 6

Page 93: J.E.N.I - Java

J.E.N.I.

5.1 Latihan

5.1.1 Kata Terakhir (versi BufferedReader)

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

Enter word1:Goodbye Enter word2:and Enter word3:Hello Goodbye and Hello

5.1.2 Kata Terakhir (versi JOptionPane)

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

Gambar 1: Input Pertama

Gambar 2: Input Kedua

Gambar 3: Menampilkan Pesan

Pengenalan Pemrograman I 7

Page 94: J.E.N.I - Java

J.E.N.I.

BAB 6

Struktur Kontrol

6.1 Tujuan

Pada bab sebelumnya, kita sudah mendapatkan contah dari program sequential, dimana statement dieksekusi setelah statement sebelumnya dengan urutan tertentu. Pada bagian ini, kita mempelajari tentang struktur kontrol yang bertujuan agar kita dapat menentukan urutan statement yang akan dieksekusi. Pada akhir bab, siswa diharapkan mampu:

• Menggunakan struktur kontrol keputusan (if, else, switch) yang digunakan untuk

memilih blok kode yang akan dieksekusi

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

untuk melakukan pengulangan pada blok kode yang akan dieksekusi

• Menggunakan statement percabangan (break, continue, return) yang digunakan

untuk mengatur redirection dari program

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

6.2.1 Statement if

Statement-if menentukan sebuah statement (atau blok kode) yang akan dieksekusi jika dan hanya jika persyaratan boolean (boolean statement) bernilai true. Bentuk dari statement if,

if( boolean_expression ) statement;

atau

if( boolean_expression ){ statement1; statement2; . . . }

Pengenalan Pemrograman 1 1

Page 95: J.E.N.I - Java

J.E.N.I.

Gambar 1: Flowchart Statement If

dimana, boolean_expression adalah sebuah persyaratan boolean (boolean statement) atau boolean variabel. Berikut ini adalah contoh code statement if,

int grade = 68; if( grade > 60 ) System.out.println("Congratulations!");

atau

int grade = 68; if( grade > 60 ){ System.out.println("Congratulations!"); System.out.println("You passed!"); }

Petunjuk Penulisan Program : 1. Boolean_expression pada statement harus merupakan nilai boolean.Hal ini berarti

persyaratan harus bernilai true atau false. 2. Masukkan statement di dalam blok if. Contohnya,

if( boolean_expression ){ //statement1; //statement2; }

Pengenalan Pemrograman 1 2

Page 96: J.E.N.I - Java

J.E.N.I.

6.2.2 Statement if-else

Statement if-else digunakan apabila kita ingin mengeksekusi sebuah statement dengan kondisi true dan statement yang lain dengan kondisi false. Bentuk statement if-else,

if( boolean_expression ) statement; else statement;

dapat juga ditulis seperti,

if( boolean_expression ){ statement1; statement2; . . . } else{ statement1; statement2; . . . }

Berikut ini contoh code statement if-else,

int grade = 68; if( grade > 60 ) System.out.println("Congratulations!"); else System.out.println("Sorry you failed");

atau

int grade = 68; if( grade > 60 ){ System.out.println("Congratulations!"); System.out.println("You passed!"); } else{ System.out.println("Sorry you failed"); }

Pengenalan Pemrograman 1 3

Page 97: J.E.N.I - Java

J.E.N.I.

Gambar 2: Flowchart Statement If-Else

Petunjuk Penulisan Program : 1. Untuk menghindari kebingungan, selalu letakkan statement di dalam blok if-else di

dalam tanda {}, 2. Anda dapat memiliki blok if-else yang bersarang. Ini berarti anda dapat memiliki blok

if-else yang lain di dalam blok if-else. Contohnya, if( boolean_expression ){

if( boolean_expression ){ . . . } } else{

. . . }

Pengenalan Pemrograman 1 4

Page 98: J.E.N.I - Java

J.E.N.I.

6.2.3 Statement if-else-if

Statement pada bagian else dari blok if-else dapat menjadi struktur if-else yang lain. Struktur seperti ini mengijinkan kita untuk membuat seleksi persyaratan yang lebih kompleks. Bentuk statement if-else if,

if( boolean_expression1 ) statement1; else if( boolean_expression2 ) statement2; else statement3;

Bisa anda catat anda dapat memiliki banyak blok else-if sesudah statement if. Blok else bersifat optional dan dapat dihilangkan. Pada contoh di bawah atas, jika boolean_expression1 bernilai true, maka program akan mengeksekusi statement1 dan melewati statement yang lain. Jika boolean_expression2 bernilai true, maka program akan mengeksekusi statement2 dan melewati statement3.

Gambar 3: Flowchart Statement If-Else-If

Pengenalan Pemrograman 1 5

Page 99: J.E.N.I - Java

J.E.N.I.

Berikut ini contoh code statement if-else-if

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

6.2.4 Kesalahan umum ketika menggunakan statement if-else:

1. Kondisi pada statement if bukan merupakan nilai boolean. Contohnya,

//BENAR int number = 0; if( number ){ //some statements here }

Variabel number tidak memiliki nilai Boolean. 2. Using = instead of == for comparison. For example, 3. Menggunakan = daripada == untuk operator perbandingan. Contohnya,

//SALAH int number = 0; if( number = 0 ){ //Statement Selanjutnya }

Seharusnya code tersebut ditulis,

//BENAR int number = 0; if( number == 0 ){ //Statement Selanjutnya }

3. Menulis elseif daripada else if.

Pengenalan Pemrograman 1 6

Page 100: J.E.N.I - Java

J.E.N.I.

6.2.5 Contoh statement if-else-else if

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

Pengenalan Pemrograman 1 7

Page 101: J.E.N.I - Java

J.E.N.I.

6.2.6 Statement switch

Cara lain untuk membuat percabangan adalah dengan menggunakan kata kunci switch. Dengan menggunakan switch kita bisa melakukan percabangan dengan persyaratan yang beragam. Bentuk statement switch,

switch( switch_expression ){ case case_selector1: statement1; // statement2; //block 1 . . . // break; case case_selector2: statement1; // statement2; //block 2 . . . // break; . . . default: statement1; // statement2; //block n . . . // break; }

dimana, switch_expression adalah persyaratan integer atau character dan case_selector1, case_selector2 dan seterusnya adalah konstanta nilai integer yang unique (unik). Ketika statement switch ditemukan, pertama kali Java memeriksa switch_expression, dan meloncat ke case dan mencocokkan nilai yang sama dengan persyaratannya. Program mengeksekusi statement dari awal sampai menemui statement break, dan melewati statement yang lain sampai akhir struktur switch. Jika tidak ditemui case yang cocok, maka program akan mengeksekusi blok default. Bisa anda catat bahwa blok default adalah optional. Sebuah statement switch bisa tidak memiliki blok default. CATATAN: • Tidak seperti statement if, pada struktur switch statement dieksekusi tanpa

memerlukan tanda kurung kurawal ({}). • Ketika sebuah case pada statement switch menemui kecocokan, semua statement

pada case tersebut akan dieksekusi. Tidak hanya demikian, statement lain yang berada pada case yang cocok juga dieksekusi.

• Untuk menghindari program mengeksekusi statement pada case berikutnya, kita menggunakan statement break sebagai statement akhir.

Pengenalan Pemrograman 1 8

Page 102: J.E.N.I - Java

J.E.N.I.

Gambar 4: Flowchart Statement Switch

Petunjuk Penulisan Program : 1. Menentukan penggunaan statement if atau statement switch adalah sebuah

keputusan. Anda dapat menentukan yang mana yang akan dipakai berdasarkan kemudahan membaca program dan faktor-faktor yang lain.

2. Statement if dapat digunakan untuk membuat keputusan berdasarkan rentang nilai tertentu atau kondisi tertentu, sedangkan statement switch membuat keputusan hanya berdasarkan nilai unique (unik) dari integer atau character.

Pengenalan Pemrograman 1 9

Page 103: J.E.N.I - Java

J.E.N.I.

6.2.7 Contoh statement switch

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

Pengenalan Pemrograman 1 10

Page 104: J.E.N.I - Java

J.E.N.I.

6.3 Struktur Kontrol Perulangan Struktur kontrol pengulangan adalah statement dari Java dimana kita bisa mengeksekusi blok code berulang-ulang dalam kurun nilai tertentu. Ada tiga macam jenis struktur kontrol pengulangan yaitu while, do-while, dan for-loops.

6.3.1 while loop

Statement while loop adalah statement atau blok statement yang diulang-ulang sampai mencapai kondisi yang cocok. Bentuk statement while,

while( boolean_expression ){ statement1; statement2; . . . }

Statement di dalam while loop akan dieksekusi berulang-ulang selama boolean_expression bernilai true. Contoh, pada code dibawah ini,

int i = 4; while ( i > 0 ){ System.out.print(i); i--; }

Contoh diatas akan mencetak angka 4321 pada layar. Perlu dicatat jika bagian i--; dihilangkan, akan menghasilkan looping yang tidak berhenti (infinite loop). Sehingga, ketika menggunakan while loop atau bentuk pengulangan yang lain, pastikan Anda memberikan statement yang membuat pengulangan berhenti pada suatu titik.

Pengenalan Pemrograman 1 11

Page 105: J.E.N.I - Java

J.E.N.I.

Berikut ini adalah beberapa contoh while loop, Contoh 1:

int x = 0; while (x<10) { System.out.println(x); x++; }

Contoh 2:

//infinite loop while(true) System.out.println(“hello”);

Contoh 3:

//no loops // statement is not even executed while (false) System.out.println(“hello”);

Pengenalan Pemrograman 1 12

Page 106: J.E.N.I - Java

J.E.N.I.

6.3.2 do-while loop

Do-while loop mirip dengan while-loop. Statement di dalam do-while loop akan dieksekusi beberapa kali selama kondisi bernilai true. Perbedaan antara while dan do-while loop adalah dimana statement di dalam do-while loop dieksekusi sedikitnya satu kali. Bentuk statement do-while,

do{ statement1; statement2; . . . }while( boolean_expression );

Statement di dalam do-while loop akan dieksekusi pertama kali, dan dilakukan pengecekan kondisi dari boolean_expression. Jika nilai tersebut belum mencapai nilai yang diinginkan, statement akan dieksekusi lagi. Berikut ini beberapa contoh do-while loop: Contoh 1:

int x = 0; do { System.out.println(x); x++; }while (x<10);

Contoh ini akan memberikan output 0123456789 pada layar. Contoh 2:

//infinite loop do{ System.out.println(“hello”); } while (true);

Contoh di atas akan melakukan pengulangan yang tidak berhenti untuk menulis “hello” pada layar. Contoh 3:

//one loop // statement is executed once do System.out.println(“hello”); while (false);

Contoh di atas akan memberikan output hello pada layar.

Pengenalan Pemrograman 1 13

Page 107: J.E.N.I - Java

J.E.N.I.

Panduan pemrograman: 1. Kesalahan pemrograman ketika menggunakan do-while loop adalah lupa untuk

menulis titik koma (;) setelah ekspresi while. do{ ... }while(boolean_expression)//- salah>tidak ada titik koma(;) 2. Seperti pada while loop, pastikan do-while loop anda berhenti pada suatu titik.

6.3.3 for loop

Seperti pada struktur pengulangan sebelumnya yaitu melakukan pengulangan eksekusi code beberapa kali. Bentuk dari for loop,

for (InitializationExpression; LoopCondition; StepExpression){ statement1; statement2; . . . }

dimana, InitializationExpression – inisialisasi dari variabel loop. LoopCondition - membandingkan variabel loop pada nilai batas. StepExpression - melakukan update pada variabel loop. Berikut ini adalah contoh dari for loop,

int i; for( i = 0; i < 10; i++ ){ System.out.print(i); }

Pada contoh ini, statement i=0 merupakan inisialisasi dari variabel. Selanjutnya, kondisi i<10 diperiksa. Jika kondisi bernilai true, statement di dalam for loop dieksekusi. Kemudian, statement i++ dieksekusi, dan dilakukan pengecekan kondisi. Kondisi ini akan dilakukan berulang-ulang sampai mencapai nilai yang salah (false). Contoh tadi, adalah contoh yang sama dari while loop,

int i = 0; while( i < 10 ){ System.out.print(i); i++; }

Pengenalan Pemrograman 1 14

Page 108: J.E.N.I - Java

J.E.N.I.

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

6.4.1 break statement

Statement break memiliki dua bentuk: unlabeled dan labeled.

6.4.1.1 Unlabeled break statement

Unlabeled menghentikan jalannya statement switch. Anda bisa juga menggunakan bentuk unlabeled untuk menghentikan for, while atau do-while loop. Contohnya,

String names[] = {"Beah", "Bianca", "Lance", "Belle", "Nico", "Yza", "Gem", "Ethan"}; String searchName = "Yza"; boolean foundName = false; for( int i=0; i< names.length; i++ ){ if( names[i].equals( searchName )){ foundName = true; break; } } if( foundName ){ System.out.println( searchName + " found!" ); } else{ System.out.println( searchName + " not found." ); }

Pada contoh ini, jika string “Yza” ditemukan, pengulangan pada for loop akan dihentikan dan akan melanjutkan ke proses berikutnya.

Pengenalan Pemrograman 1 15

Page 109: J.E.N.I - Java

J.E.N.I.

6.4.1.2 Labeled break statement

Bentuk labeled form dari statement break akan menghentikan statement luar, dimana diidentifikasikan berupa label pada statement break. Program berikut ini akan mencari nilai dalam array dua dimensi. Terdapat dua pengulangan bersarang (nested loop). Ketika sebuah nilai ditemukan, labeled break akan menghentikan statement yang diberi label searchLabel, dimana label ini berada di luar.

int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int searchNum = 5; boolean foundNum = false; searchLabel: for( int i=0; i<numbers.length; i++ ){ for( int j=0; j<numbers[i].length; j++ ){ if( searchNum == numbers[i][j] ){ foundNum = true; break searchLabel; } } } if( foundNum ){ System.out.println( searchNum + " found!" ); } else{ System.out.println( searchNum + " not found!" ); }

Statement break menghentikan sementera labeled statement; ia tidak lagi menjalankan flow control pada label. Flow control pada label akan di-transfer secara otomatis mengikuti labeled statement.

Pengenalan Pemrograman 1 16

Page 110: J.E.N.I - Java

J.E.N.I.

6.4.2 Continue statement

Statement continue memiliki dua bentuk: unlabeled dan labeled. Anda dapat menggunakan statement continue untuk melewati pengulangan dari for, while, atau do-while loop yang sedang berjalan.

6.4.2.1 Unlabeled continue statement

Bentuk unlabeled akan melewati akhir statement pada bagian yang dalam dan memeriksa boolean expression yang mengkontrol loop, pada dasarnya akan melewati bagian pengulangan pada loop. Berikut ini adalah contoh dari penghitungan angka dari “Beah” dalam suatu array.

String names[] = {"Beah", "Bianca", "Lance", "Beah"}; int count = 0; for( int i=0; i<names.length; i++ ){ if( !names[i].equals("Beah") ){ continue; //skip next statement } count++; } System.out.println("There are " + count + " Beahs in the list");

6.4.2.2 Labeled continue statement

Bentuk labeled akan melanjutkan sebuah statement dengan melewati pengulangan yang sedang berjalan dari loop terluar yang diberi label (tanda).

outerLoop: for( int i=0; i<5; i++ ){ for( int j=0; j<5; j++ ){ System.out.println("Inside for(j) loop"); //message1 if( j == 2 ) continue outerLoop; } System.out.println("Inside for(i) loop"); //message2 }

Pada contoh ini, pesan ke-2 tidak dicetak, karena statement continue akan melewati pengulangan yang sedang berjalan.

Pengenalan Pemrograman 1 17

Page 111: J.E.N.I - Java

J.E.N.I.

6.4.3 Return statement

Statement return digunakan untuk keluar dari sebuah fungsi (method). Statement return memiliki dua bentuk: menggunakan sebuah nilai, dan tidak memberikan nilai. Untuk memberikan sebuah nilai, cukup berikan nilai (atau ekspresi yang menghasilkan sebuah nilai) sesudah return. Contohnya,

return ++count; atau

return "Hello"; Tipe data dari nilai yang diberikan harus sama dengan tipe dari fungsi yang dideklarasikan. Ketika sebuah method void dideklariskan, gunakan bentuk return yang tidak memberikan nilai. Contohnya,

return; Kita akan membahas lebih lanjut tentang statement return ketika mempelajari tentang fungsi.

Pengenalan Pemrograman 1 18

Page 112: J.E.N.I - Java

J.E.N.I.

6.5 Latihan

6.5.1 Nilai

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

output hasilnya. 2. Gunakan JOptionPane untuk mendapat input dari user dan output hasilnya.

6.5.2 Membaca Bilangan

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

6.5.3 Cetak Seratus Kali

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

6.5.4 Perpangkatan

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

Pengenalan Pemrograman 1 19

Page 113: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 1

BAB 7

Java Array

7.1 Tujuan Dalam bagian ini, kita akan mendiskusikan mengenai array dalam Java. Pertama, kita akan mendefinisikan apa yang dimaksud dengan array, kemudian kita juga akan mendefinisikan bagaimana mendeklarasikannya dan menggunakannya dalam Java. Pada akhir pelajaran, siswa haruslah mampu untuk :

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

7.2 Pengenalan Array Dibagian sebelumnya, kita telah mendiskusikan bagaimana cara pendeklarasian berbagai macam variabel dengan menggunakan tipe data primitif. Dalam pendeklarasian variabel, kita sering menggunakan sebuah tipe data beserta nama variabel atau identifier yang unik, dimana untuk menggunakan variabel tersebut, kita akan memanggil dengan nama identifier-nya. Sebagai contoh, kita memiliki tiga variabel dengan tipe data int yang memiliki identifier yang berbeda untuk tiap variabel.

int number1; int number2; int number3; number1 = 1; number2 = 2; number3 = 3;

Seperti yang dapat Anda perhatikan pada contoh diatas, hanya untuk menginisialisasi dan menggunakan variabel terutama pada saat variabel-variabel tersebut memiliki tujuan yang sama, dirasa sangat membingungkan. Di Java maupun di bahasa pemrograman yang lain, mereka memiliki kemampuan untuk menggunakan satu variabel yang dapat menyimpan sebuah data list dan kemudian memanipulasinya dengan lebih efektif. Tipe variabel inilah yang disebut sebagai array.

Page 114: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 2

Gambar 1: Contoh dari Integer Array Sebuah array akan menyimpan beberapa item data yang memiliki tipe data sama didalam sebuah blok memori yang berdekatan yang kemudian dibagai menjadi beberapa slot. Bayangkanlah array adalah sebuah variabel – sebuah lokasi memori tertentu yang memiliki satu nama sebagai identifier, akan tetapi ia dapat menyimpan lebih dari sebuah value.

7.3 Pendeklarasian Array

Array harus dideklarasikan seperti layaknya sebuah variabel. Apabila Anda mendeklarasikan array, Anda harus membuat sebuah list dari tipe data, yang diikuti oleh tanda kurung buka dan kurung tutup, yang diikuti oleh nama identifier. Sebagai contoh,

int []ages;

atau Anda dapat menempatkan kurung buka dan kurung tutupnya setelah identifier. Sebagai contoh,

int ages[];

Page 115: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 3

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[];

Gambar 2: Inisialisasi Arrays

//instantiate obyek ages = new int[100];

atau bisa juga ditulis dengan,

//deklarasi dan instantiate obyek int ages[] = new int[100];

Pada contoh diatas, deklarasi akan memberitahukan kepada compiler Java, bahwa identifier ages akan digunakan sebagai nama array yang berisi data-data integer, dan kemudian untuk membuat atau meng-instantiate sebuah array baru yang terdiri dari 100 elemen. Selain menggunakan sebuah keyword baru untuk meng-instantiate array, Anda juga dapat secara otomatis mendeklarasikan array, membangunnya, kemudian memberikan sebuah value. Sebagai contoh,

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

Page 116: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 4

7.4 Pengaksesan sebuah elemen array Untuk mengakses sebuah elemen dalam array, atau mengakses sebagian dari array, Anda harus menggunakan sebuah nomor atau yang disebut sebagai index atau subscript. Sebuah nomor index atau subscript telah diberikan kepada tiap anggota array, sehingga program dan programmer dapat mengakses setiap value apabila dibutuhkan. Index selalu dalam integer. Dimulai dari nol, kemudian akan terus bertambah sampai list value dari array tersebut berakhir. Perlu dicatat, bahwa elemen-elemen didalam array dimulai dari 0 sampai dengan (ukuranArray-1). Sebagai contoh, pada array yang kita deklarasikan tadi, kita mempunyai,

//memberikan nilai 10 kepada elemen pertama array ages[0] = 10; //mencetak elemen array yang terakhir System.out.print(ages[99]);

Perlu diperhatikan bahwa sekali array dideklarasikan dan dikonstruksi, 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.

public class ArraySample{ public static void main( String[] args ){ int[] ages = new int[100]; for( int i=0; i<100; i++ ){ System.out.print( ages[i] ); } } }

Petunjuk penulisan program: 1. Biasanya, lebih baik menginisialisasi atau meng-instantiate array setelah Anda mendeklarasikannya. Sebagai contoh pendeklarasiannya int []arr = new int[100]; lebih disarankan daripada, int []arr; arr = new int[100]; 2. Elemen-elemen dalam n-elemen array memiliki index dari 0 sampai n-1. Perhatikan disini bahwa tidak ada elemen array arr[n]. Hal ini akan menyebabkan array-index out-of-bounds exception. 3. Anda tidak dapat mengubah ukuran dari sebuah array

Page 117: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 5

7.5 Panjang Array Untuk mengetahui berapa banyak element didalam sebuah array, Anda dapat menggunakan length (panjang) field dalam array. Panjang field dalam array akan mengembalikan ukuran dari array itu sendiri. Sebagai contoh,

arrayName.length Pada contoh sebelumnya, kita dapat menuliskannya kembali seperti berikut ini,

public class ArraySample { public static void main( String[] args ){ int[] ages = new int[100]; for( int i=0; i<ages.length; i++ ){ System.out.print( ages[i] ); } } }

Petunjuk penulisan program: 1. Pada saat pembuatan loop untuk memproses elemen-elemen dalam array,

gunakanlah length field didalam pernyataan pengkondisian dalam loop. Hal ini akan menyebabkan loop secara otomatis menyesuaikan diri terhada ukuran array yang berbeda-beda.

2. Pendeklarasian ukuran array di Java, biasanya digunakan constant untuk mempermudah. Sebagai contoh,

final int ARRAY_SIZE = 1000; //pendeklarasian constant . . . int[] ages = new int[ARRAY_SIZE];

Page 118: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 6

7.6 Array Multidimensi Array multidimensi diimplementasikan sebagai array didalam array. Array multidimensi dideklarasikan dengan menambahkan jumlah tanda kurung setelah nama array. Sebagai contoh,

// Elemen 512 x 128 dari integer array int[][] twoD = new int[512][128]; // karakter array 8 x 16 x 24 char[][][] threeD = new char[8][16][24]; // String array 4 baris x 2 kolom String[][] dogs = {{ "terry", "brown" }, { "Kristin", "white" }, { "toby", "gray"}, { "fido", "black"} };

Untuk mengakses sebuah elemen didalam array multidimensi, sama saja dengan mengakses array satu dimensi. Misalnya saja, untuk mengakses element pertama dari baris pertama didalam array dogs, kita akan menulis,

System.out.print( dogs[0][0] ); Kode diatas akan mencetak String “terry” di layar.

Page 119: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 7

7.7 Latihan

7.7.1 Hari dalam seminggu

Buatlah sebuah String array yang akan menginisialisasi 7 hari dalam seminggu. Sebagai contoh,

String days[] = {“Monday”, “Tuesday”….};

Gunakan while-loop, kemudian print semua nilai dari array (Gunakan juga untuk do-while dan for-loop)Using a while-loop.

7.7.2 Nomor terbesar

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

7.7.3 Buku Alamat

Berikut ini adalah array multidimensi yang menyatakan isi dari sebuah buku alamat:

String entry = {{"Florence", "735-1234", "Manila"}, {"Joyce", "983-3333", "Quezon City"}, {"Becca", "456-3322", "Manila"}};

Cetak buku alamat tersebut dalam format berikut ini:

Name : Florence Tel. # : 735-1234 Address : Manila Name : Joyce Tel. # : 983-3333 Address : Quezon City Name : Becca Tel. # : 456-3322 Address : Manila

Page 120: J.E.N.I - Java

J.E.N.I.

BAB 8

Argumen dari Command-line

8.1 Tujuan Pada bagian ini, kita akan mempelajari bagaimana untuk memproses sebuah input dari command-line dengan menggunakan argumen yang diberikan kepada program Java. Pada akhir pelajaran, siswa diharapkan dapat:

• Mengetahui dan menjelaskan mengenai argumen command-line

• Mendapatkan input dari user dengan menggunakan argumen command-line

• Mempelajari bagaimana memberikan argumen kedalam program pada NetBeans

8.2 Argumen Command-line Sebuah aplikasi Java dapat menerima berbagai argumen dari command-line. Argumen dari command line memberikan kesempatan bagi user untuk mempengaruhi operasi dari sebuah aplikasi dalam sekali invokasi. User memasukkan argumen command line pada saat meng-invoke aplikasi dan memberikan spesifikasi kepada aplikasi tersebut setelah nama kelas untuk dijalankan. Sebagai contoh, apabila Anda memiliki sebuah aplikasi Java dengan nama Sort, yang akan mengurutkan lima nomor, Anda dapat menjalankannya seperti berikut ini:

Pengenalan Pemrograman 1 1

Page 121: J.E.N.I - Java

J.E.N.I.

Gambar 1:Menjalankan argument dari Command-Line

Perhatikan bahwa sebuah argumen akan dipisahkan oleh spasi. Di bahasa Java, apabila Anda akan memanggil sebuah aplikasi, sebuah runtime system akan memberikan argumen command-line ke main method lewat array dari String, dimana tiap String dalam array terdiri dari sebuah argumen commmand-line. Perhatikan deklarasi dari main method,

public static void main( String[] args ) Argumen yang diberikan kepada program Anda akan disimpan kedalam sebuah array String dengan identifier args. Pada contoh sebelumnya, argumen dari command-line yang akan diberikan kepada aplikasi sort command adalah lima buah String yaitu “5”,”4”,”3”,”2”, dan “1”. Anda dapat mengetahaui berapa banyak argumen dari command-line dengan cara melihat panjang dari attribute array. Sebagai contoh,

int numberOfArgs = args.length; Jika program Anda membutuhkan support sebuah argumen command-line yang numeric. Anda harus mengkonversi String argumen tersebut untuk merepresantasikan sebuah nomor, misalnya “34” menjadi sebuah nomor. Kode dibawah ini adalah sebuah potongan untuk mengkonversi sebuah argumen command-line menjadi integer.

int firstArg = 0; if (args.length > 0){

Pengenalan Pemrograman 1 2

Page 122: J.E.N.I - Java

J.E.N.I.

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

parseInt akan mendapatkan NumberFormatException (ERROR) jika format args[0] tidak valid (bukan sebuah nomor). Petunjuk penulisan program: Sebelum menggunakan argumen command line, selalu telitilah terlebih dahulu berapa banyak argumen yang diperlukan untuk mengakses sebuah array, sehingga tidak ada exception yang akan muncul.

Pengenalan Pemrograman 1 3

Page 123: J.E.N.I - Java

J.E.N.I.

8.3 Argument Command-line di NetBeans Untuk menggambarkan bagaimana sebuah argumen diberikan pada program di NetBeans, marilah kita membuat sebuah program Java yang akan mencetak jumlah argumen dimana argumen pertama yang telah diberikan pada program tersebut.

public class CommandLineExample { public static void main( String[] args ){ System.out.println("Number of arguments=" + args.length); System.out.println("First Argument="+ args[0]); } }

Sekarang, jalankan NetBeans, buat sebuah project yang baru, dan beri nama project ini CommanLineExample. Copy kode yang telah dituliskan diatas, kemudian compile. Setelah itu, ikutilah langkah-langkan berikut ini untuk memberikan argumen kepada program Anda dengan menggunakan NetBeans. Klik di Projects (dilingkari dibawah)

Gambar 2: Membuka file project

Pengenalan Pemrograman 1 4

Page 124: J.E.N.I - Java

J.E.N.I. Klik kanan icon CommanLineExample dan akan keluar sebuah pop-up menu.

Klik pada properties-nya.

Gambar 3: Membuka Properties

Dialog mengenai project properties akan tampil

Figure 4: Properties Dialog

Pengenalan Pemrograman 1 5

Page 125: J.E.N.I - Java

J.E.N.I.

Kemudian, klik Run -> Running Project

Gambar 5: Klik untuk menjalankan project

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

Pengenalan Pemrograman 1 6

Page 126: J.E.N.I - Java

J.E.N.I.

Gambar 6: Set argument pada Command-Line

Gambar 7: Jalankan program dengan tombol shortcut

Kemudian, cobalah untuk menjalankan (RUN) progam Anda

Pengenalan Pemrograman 1 7

Page 127: J.E.N.I - Java

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

Gambar 8: Program Keluaran

Pengenalan Pemrograman 1 8

Page 128: J.E.N.I - Java

J.E.N.I.

8.4 Latihan

8.4.1 Mencetak Argument

Dapatkan input dari user dengan menggunakan argument command line dan cetak semua argumen ke layar. Sebagai contoh, jika user memasukkan

java Hello world that is all program Anda haruslah mencetak

Hello world that is all

8.4.2 Operasi Aritmatik

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

java ArithmeticOperation 20 4 program anda akan mencetak

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

Pengenalan Pemrograman 1 9

Page 129: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 1

BAB 9

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

9.2 Pengenalan Pemrograman Berorientasi Object OOP berputar pada konsep dari object sebagai dasar element dari program anda. Ketika kita membandingkan dengan dunia nyata, kita dapat menemukan beberapa objek disekitar kita, seperti mobil, singa, manusia dan seterusnya. Object ini dikarakterisasi oleh sifat / attributnya dan tingkah lakunya. Contohnya, objek sebuah mobil mempunyai sifat tipe transmisi, warna dan manufaktur. Mempunyai kelakuan berbelok, mengerem dan berakselerasi. Dengan cara yang sama pula kita dapat mendefinisikan perbedaan sifat dan tingkah laku dari singa. Coba perhatikan table dibawah ini sebagai contoh perbandingan :

Object Properties Behavior

Car type of transmission manufacturer color

turning braking accelerating

Lion Weight Color hungry or not hungry tamed or wild

roaring sleeping hunting

Table 1: Example of Real-life Objects

Page 130: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 2

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

9.3 Class dan Object 9.3.1 Perbedaan Class dan Object Pada dunia software, sebuah objek adalah sebuah komponen software yang stukturnya mirip dengan objek pada dunia nyata. Setiap objek dibuat dari satu set data (sifat) dimana variable menjabarkan esensial karakter dari objek, dan juga terdiri dari satu set dari methode (tingkah laku) yang menjabarkan bagaimana tingkah laku dari objek. Jadi objek adalah sebuah berkas software dari variable dan method yg berhubungan. Variable dan methods dalam objek Java scara formal diketahui sebagai instance variable dan instance methods untuk membedakannya dari variable klas dan method klas, dimana akan dibahas kemudian. Klas adalah sturktur dasa dari OOP. Dia terdiri dari dua tipe dari anggota dimana disebut dengan field (attribut/properti) dan method. Field mespesifikasi tipe data yang didefinisikan oleh class, sementara methode spesifikasi dari operasi. Sebuah objek adalah sebuah instance pada class. Untuk dapat membedakanantara class dan obect, mari kita mendiskusikan beberapa contoh. Apa yang kita miliki disini adalah sebuah class mobil dimana dapat digunakan untuk medefinisikan beberapa object mobil. Pada table dibawah, mobil A dan mobil B adalah objek dari kelas mobil. Kelas memiliki field plat nomer, warna, manufaktur, dan kecepatan yang diisi dengan nilai korespondendi pada objek mobil A dan mobil B. mobil juga dapat berakselerasi, berbelok dan mengerem.

Car Class Object Car A Object Car B

Plate Number ABC 111 XYZ 123

Color Blue Red

Manufacturer Mitsubishi Toyota

Instance

Variable

s

Current Speed 50 km/h 100 km/h

Accelerate Method

Turn Method Instance

Methods

Brake Method

Table 2: Contoh class car dan object-object nya

Page 131: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 3

Ketika diinisialisi, tiap objek mendapat satu set baru dari state variable. Bagaimanapun, implementasi dari method dibagi diantara objek pada kelas yang sama. Kelas menyediakan keuntungan dari reusability. Software programmers dapat digunakan dari sebuah kelas lagi dan lagi untuk membuat beberapa objek. 9.3.2 Instansiasi Class Untuk membuat sebuah objek atau sebuah instance pada sebuah kelas. Kita menggunakan operator baru. Sebagai contoh, jika anda ingin membuat instance dari kelas string, kita menggunakan kode berikut :

String str2 = new String(“Hello world!”);

or also equivalent to,

String str2 = "Hello";

Figure 1: Classs Instantiation

9.3.3 Variabel Class dan Method Sebagai tambahan pada contoh variable, hal ini juga memungkinkan untuk mendefinisikan variable kelas, dimana variable milik dari seluruh kelas. Ini berarti bahwa memiliki nilai yang sama untuk semua objek pada kelas yang sama. Mereka juga disebut static member variables.

9.4 Method 9.4.1 Apakah Method itu dan mengapa menggunakan Method? Pada contoh yang telah kita diskusikan sebelumnya, kita hanya memiliki satu method, dan itu adalah main() method. Didalam Java, kita dapat mendefinisikan beberapa method yang akan kita panggil dari method yang berbeda. Sebuah method adalah bagian terpisah dari kode yang akan dipanggil oleh program utama dan beberapa method lainnya untuk menunjukkan beberapa fungsi spesifik. Berikut adalah karakteristik dari method :

1. dapat mengembalikan satu atau tidak ada nilai 2. dia mungkin dapat diterima sebagai beberapa parameter yang dibutuhkan atau tidak

ada arameter sama sekali. Parameter juga disebut sebagai fungsi argument 3. setelah method telah selesai dieksekusi, dia akan kembali pada method yang

memanggilnya.

Page 132: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 4

Sekarang mengapa kita butuh untuk membuat method? Mengapa kita tidak meletakkan semua kode pada sebuah method yang sangat besar? Pemecahan masalah disini alah dekomposisi. Kita juga dapat melakukan ini di Java dengan mmbuat method untuk mengatasi bagian spesifik dari masalah. Mengambil sebuah permasalahan dan memecahkannya menjadi bagian kecil, bagian dapat diatur adalah penting untuk menulis program yang besar. 9.4.2 Memanggil Instance dari Method dan Passing Variabel Sekarang kita ilustrasikan bagaimana memanggil method, mari kita menggunakan kelas string sebagai contoh. Anda dapat menggunakan the Java API documentation untuk melihat semua method dalam kelas string yang tersedia. Selanjutnya, kita akan membuat method kita sendiri. Tapi sekarang mari kita menggunakan apa yang tersedia. Untuk memanggil sebuah instance method, kita menuliskan :

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

public char charAt(int index) Mengambil karakter pada index.

public boolean equalsIgnoreCase (String anotherString)

Membandingkan antar String, tidak case sensitive.

Table 3: Method dari Class String

Menggunakan method :

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

Page 133: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 5

9.4.3 Passing Variabel Dalam Method Pada contoh kita, kita telah mecoba melewati variable pada method. Bagaimanapun juga kita tidak dapat membedakan antara perbedaan tipe variabel passing dalam Java. Ada dua tipe data passing pada method, yang pertama adalah pass-by-value dan yang kedua adalah pass-by-reference. 9.4.3.1 Pass-by-Value Ketika pass-by-values terjadi, method menggunakan sebuah copy pada nilai pada variable yang dilewatkan pada method. method tidak dapat secara langsung dimodifikasi secara argument langsung meskipun jika dimodifikasi parameternya selama perhitungan berlangsung. Contoh :

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

Pass i as parameter which is copied to j

} public static void test( int j ){ //merubah nilai parameter j j = 33; } }

Pada contoh diatas yang telah diberikan, kita memanggil method tes dan melewatkan nilai i sebagai parameter. Nilai pada i dikopikan pada variable pada method j. sejak j adalah variable pengganti pada method tes, dia tidak akan berdampak pada nilai variable jika i pada main semenjak memiliki perbedaan kopy pada variable. Secara default, semua tipe data primitive ketika dilewatkan pada sebuah method adalah pass-by-values

Page 134: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 6

9.4.3.2 Pass-by-reference Ketika sebuah pass-by-reference terjadi, referensi pada sebuah objek dilewatkan dengan cara memanggil method. Hal ini berarti bahwa method mengkopi referensi pada variable yang dilewatkan pada method. Bagaimanapun juga, tidak seperti apda pass-by-value, method dapat membuat objek actual yang menerangkan pointing to, since, meskipun berbeda keterangan yang digunakan dalam method, lokasi dari data yang mereka tunjukkan adalah sama. contoh :

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

Pass ages as parameter which is copied to variable arr

} } }

Page 135: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 7

Gambar 2 : Contoh Pass By Reference

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

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

Classname.staticMethodName(params);

Page 136: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 8

Contoh dari static method yang digunakan :

//mencetak data padSystem.out.println(“Hello world”);

a layar

//convert string menjadi integer int i = Integer.parseInt(“10”); String hexEquivalent = Integer.toHexString( 10 );

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

Page 137: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 9

Contoh, yang diberi code snippet,

public class ScopeExample

{

public static void main( String[] args ){

int i = 0;

int j = 0;

//... some code here

{

int k = 0;

int m = 0;

int n = 0;

}

}

A

B

C D

E

Page 138: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 10

Kode yang kita miliki disini mempunyai lima jangkauan yang ditandai oleh baris dan keterangan yang mewakili jangkauan itu, dengan variable i,j,k,m dan n, dan 5 jangkauan A,B,C,D dan E, kita mempunyai beberapa jangkauan variable berikut: Jangkauan variable i adalah A. Jangkauan variable j adalah B. Jangkauan variable k adalah C. Jangkauan variable m adalah D. Jangkauan variable n adalah E. Sekarang, memberi kedua method utama dan menguji di contoh kita sebelumnya,

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

A

B

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

C

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

D

arr[i] = i + 50; }

E

} }

Pada method pertama, Jangkauan variables adalah, ages[ ] - scope A i in B - scope B i in C – scope C

Page 139: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 11

Pada method ujian, Jangkauan variables adalah, 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. Petunjuk Penulisan program : Hindari pemberian nama yang sama kepada variabel supaya Anda tidak kebingungan.

9.5 Casting, Converting dan Comparing Objects Pada bagian ini, kita akan belajar bagaimana mengunakan typecasting.Typecasting atau casting adalah proses konversi data dari tipe data tertentu ke tipe data yang lain. Kita juga akan belajar bagaimana meng-konversi tipe data primitive ke object dan sebaliknya. Kemudian, pada akhirnya kita akan belajar bagaimana membandingkan sebuah object.

Page 140: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 12

9.5.1 Casting Tipe Primitiv Casting antara tipe primitve mendukung Anda untuk mengkonversikan sebuah value dari sebuah tipe data tertentu kepada tipe primitive yang lain. Hal ini biasanya terjadi diantara tipe data numerik. Ada sebuah tipe data primitive yang tetap tidak dapat kita casting, dan dia adalah tipe data boolean. Sebagai contoh dari typecasting adalah pada saat Anda menyimpan sebuah integer kepada sebuah variabel dengan tipe data double. Sebagai contoh: int numInt = 10;

double numDouble = numInt; //implicit cast Pada contoh ini dapat kita lihat bahwa, walaupu variabel yang dituju (double) memiliki nilai yang lebih besar daripada nilai yang akan kita tempatkan didalamnya, data tersebut secara implisit dapat kita casting ke tipe data double. Contoh yang lain adalah apabila kita ingin untuk melakukan typecasting sebuah int ke char atau sebaliknya. Sebuah karakter akan dapat digunakan sebagai int karena setiap karakter memiliki sebuah nilai numerik yang merepresentasikan posisinya dalam satu set karakter. Jika sebuah variable memiliki nilai 65, maka cast (char) i akan menghasilkan nilai 'A'. Numerik kode yang merepresentasikan kapital A adalah 65, berdasarkan karakter set ASCII, dan Java telah mengadopsi bagian ini untuk mendukung karakter.

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

Ketika kita men-convert data yang bertipe besar ke tipe data yang lebih kecil, kita harus menggunakan explicit cast. Explicit casts mengikuti bentuk sebagai berikut :

(dataType)value dimana, dataType, adalah nama dari tipe data yang Anda convert value, adalah pernyataan yang dihasilkan pada nilai dari the source type. Sebagai contoh,

double valDouble = 10.12; int valInt = (int)valDouble; //men-convert valDouble ke tipe int double x = 10.2; int y = 2; int result = (int)(x/y); //hasil typecast operasi ke int

Page 141: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 13

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

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

Page 142: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 14

variabel yang mendefinisikan subclass. Untuk memilih sebuah object ke class yang lain, Anda menggunakan operasi yang sama sebagaimana untuk tipe-tipe primitive : Untuk memilih,

(classname)object dimana, classname, adalah nama dari class tujuan.

object, adalah sesuatu yang mengarah pada sumber object.

• Catatan: pemilihan ini membuat referensi ke object yang lama dari tipe namaclass;

object yang lama melanjutkan aksi seperti yang telah ada sebelumnya.

Figure 3: Class Hierarchy untuk superclass Employee Contoh berikut memilih sebuah instance dari class VicePresident ke sabuah instance dari class Employee; VicePresident adalah sebuah dari Employee dengan lebih banyak information, dimana disini mendefinisikan bahwa VicePresident memilihi executive washroom privileges,

Employee emp = new Employee(); VicePresident veep = new VicePresident(); emp = veep; // tidak adah pemilihan yang diperlukan untuk penggunaan yang cenderung naik veep = (VicePresident)emp; // Harus memilih dengan pemilihan secara eksplisit

9.5.3 Convert Tipe Primitive ke Object Dan Sebaliknya Satu hal yang tidak dapat Anda lakukan pada beberapa keadaan yaitu pemilihan dari sebuah objectke sebuah tipe data primitive, atau vice versa. Tipe-tipe primitive dan objectadalah sesuatu yang sangat berbeda dalam Java, dan Anda tidak bisa secara langsung memilih diantara dua atau saling menukar diantara keduanya. Sebagai sebuah alternatif, package java.lang yang terdiri atas class-class yang sesuai untuk setiap tipe data primitivenya yaitu : Float, Boolean, Byte, dan sebagainya. Kebanyakan dari class-class ini memiliki nama yang sama seperti tipe datanya, kecuali jika nama classnya diawali dengan huruf capital(Short -> sort, Double -> double dan sebagainya). Juga dua class memiliki nama yang berbeda dari tipe data yang sesuai : Character digunakan untuk variabel char dan Integer untuk variabel int. (Disebut dengan Wrapper Classes)

Page 143: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 15

Java merepresentasikan type data dan versi classnya dengan sangat berbeda, dan sebuah program tidak akan berhasil tercompile jika Anda menggunakan hanya satu ketika yang lain juga diperlukan. Menggunakan class-class yang sesuai untuk setiap tipe primitive, anda dapat membuat sebuah object yang memiliki nilai yang sama. Contoh :

//Pernyataan berikut membentuk sebuah instance bertype Integer // class dengan nilai integer 7801 (primitive -> Object) Integer dataCount = new Integer(7801); //Pernyataan berikut meng-converts sebuah object Integer ke //tipe data primitive int nya. Hasilnya adalah sebuah int //dengan nilai 7801 int newCount = dataCount.intValue(); // Anda perlu suatu translasi biasa pada program // yang meng-convert sebuah String ke sebuah tipe numeric, //seperti suatu int // Object->primitive String pennsylvania = "65000"; int penn = Integer.parseInt(pennsylvania);

• PERHATIAN: class Void tidak mewakili sesuatu dalam Java, jadi disini tidak ada alasan

menggunakannya ketika melakukan translasi antara nilai primitive dan object. Ini adalah penjelasan mengenai kata kunci void, dimana digunakan dalam definisi method untuk mengindikasikan bahwa methode tidak memiliki sebuah nilai kembalian.

9.5.3 Comparing Objects Dalam diskusi kita sebelumnya, kita mempelajari tentang operator untuk membandingkan nilai —sama, tidak sama, lebih kecil daripada, dan sebagainya. Operator ini yang paling banyak bekerja hanya pada tipe primitive, bukan pada object. Jika Anda berusaha untuk menggunakan nilai lain sebagai operands, Compiler Java akan menghasilkan error. Pengecualian untuk aturan ini adalah operator untuk persamaan : == (sama) dan != (tidak). Ketika dinampilkan ke object, operator ini tidak akan melakukan apa yang sebenarnya anda inginkan. Malahan mengecheck jika satu object memilki nilai yang sama seperti object lain, mereka mengenali jika kedua sisi dari operator menunjuk object yang sama. Untuk membandingkan instances dari sebuah class dan memiliki hasil yang berarti, Anda harus mengimplementasikan method khusus dalam class Anda dan memanggil method tersebut. Sebuah contoh yang baik untuk ini adalah class String. Sangat mungkin memiliki dua object String yang memiliki nilai yang sama. Jika Anda menggunakan operator == untuk membandingkan object ini, bagaimanapun, kita akan

Page 144: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 16

mempertimbangkan nilai yang tidak sama. Walaupun isinya sesuai mereka bukan merupakan object yang sama. Untuk melihat jika dua object String memiliki nilai yang sesuai, sebuah method dari class yang disebuat dengan equals() digunakan. Method menguji setiap character dalam string dan mengembalikan nilai true jika dua string memiliki nilai yang sama. Kode berikut mengilustrasikan hal tersebut,

class EqualsTest { public static void main(String[] arguments) { String str1, str2; str1 = "Free the bound periodicals."; str2 = str1; System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("Same object? " + (str1 == str2)); str2 = new String(str1); System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("Same object? " + (str1 == str2)); System.out.println("Same value? " + str1.equals(str2)); } }

Output program ini adalah sebagai berikut , OUTPUT:

String1: Free the bound periodicals. String2: Free the bound periodicals. Same object? true String1: Free the bound periodicals. String2: Free the bound periodicals. Same object? false Same value? True

Sekarang mari mendiskusikan tentang kode.

String str1, str2; str1 = "Free the bound periodicals.";

Page 145: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 17

Figure 4: Keduanya mengarah ke object yang sama Bagian pertama dari program ini mendeklarasikan dua variabel (str1 dan str2), memberikan literal "Free the bound periodicals." untuk str1, dan kemudian memberi nilai tersebut untuk str2. Seperti yang Anda pelajari sebelumnya, str1 dan str2 sekarang menunjuk ke object yang sama, dan uji kesamaan membuktikan hal tersebut.

str2 = new String(str1);

Padabagian yang kedua dari program ini, anda membuat object String baru dengan nilai yang sama sebagai str1 dan memberi str2 ke object baru String tersebut. Sekarang Anda memiliki dua object string yang berbeda yaitu str1 dan str2, keduanya memilki nilai yang sama.Test mereka untuk melihat jika meeka object yang sama dengan menggunakan operator == mengembalikan nilai yang diinginkan : false—mereka buka object yang sama dalam memory. Test mereka menggunakan method equals() juga mengembalikan jawaban yang diinginkan: true—mereka memiliki niali yang sama.

Figure 5: Sekarang mengarah pada object yang berbeda • Catatan: Mengapa Anda tidak dapat hanya menggunakan literal yang lain ketika Anda

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

Page 146: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 18

9.5.5 Menentukan Class dari sebuah Object Ingin menemukan apakah sebuah class object itu? Disini langkah untuk melakukannya untuk sebuah object yang diberikan sebagai kunci variabel : 1. Method getClass() mengembalikan sebuah object Class (dimana Class itu sendiri

merupakan sebuah class) yang memilki sebuah method yang disebut getName(). Pada bagiannya, getName() mengembalikan sebuah string yang mewakili nama class. Sebagai contoh,

String name = key.getClass().getName(); 2. operator InstanceOf

instanceOf memiliki dua operands: suatu mengarahke sebuah object pada sebelah kiri dan nama class pada sebelah kanan. pernyataan mengembalikan nilai true atau false tergantung pada apakah object adalah sebuah instance dari penamaan class atau beberapa dari subclass milik class tersebut. Sebagai contoh,

boolean ex1 = "Texas" instanceof String; // true Object pt = new Point(10, 10); boolean ex2 = pt instanceof String; // false

Page 147: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 19

9.6 Latihan 9.6.1 Mendefinisikan Istilah Dengan kata-kata Anda sendiri, definisikan istilah-istilah berikut ini : 1. Class 2. Object 3. Instantiate 4. Instance Variable 5. Instance Method 6. Class Variables atau static member variables 7. Constructor 9.6.2 Java Scavanger Hunt Pipoy adalah suatu anggota baru dalam bahasa pemrograman Java. Dia hanya memperdengarkan bahwa telah ada APIs siap pakai dalam Java yang salah satunya dapat digunakan dalam program mereka, dan ia ingin sekali untuk mengusahakan mereka keluar. Masalahnya adalah, Pipoy tidak memiliki copy dari dokumentasi Java, dan dia juga tidak memiliki acces internet, jadi tidak ada jalan untuknya untuk menunjukkan Java APIs. Tugas Anda adalah untuk membantu Pipoy memperhatikan APIs (Application Programming Interface). Anda harus menyebutkan class dimana seharusnya method berada, deklarasi method dan penggunaan contoh yang dinyatakan method. Sebagai contoh, jika Pipoy ingin untuk mengetahui method yang mengknversisebuah String ke integer,jawaban Anda seharusnya menjadi: Class: Integer Method Declaration: public static int parseInt( String value ) Sample Usage: String strValue = "100"; int value = Integer.parseInt( strValue ); yakinkan bahwa snippet dari kode yang Anda tulis dalam contoh Anda menggunakan compiles dan memberi output jawaban yang benar, jadi tidak membingungkan Pipoy. (Hint: Semua methods adalah dalam java.lang package). Dalam kasus dimana Anda dapat menemukan lebih banyak methods yang dapat menyelesaikan tugas, berikan hanya satu.

Page 148: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 20

Sekarang mari memulai pencarian! 1. Perhatikan sebuah method yang diuji jika String pasti diakhiri suffix yang pasti. Sebagai

contoh, jika diberikan string "Hello", Method harus mengembalikan nilai true suffix yang diberikan adalah "lo", dan false jika suffix yang diberikan adalah "alp".

2. Perhatikan untuk method yang mengenali character yang mewakili sebuah digit yang spesifik dalam radix khusus. Sebagai contoh, jika input digit adalah 15, dan the radix adalah 16, method akan mengembalikan Character F, sejak F adalah representasi hexadecimal untuk angka 15 (berbasis 10).

3. Perhatikan untuk method yang mengakhiri running Java Virtual Machine yang sedang berjalan

4. Perhatikan untuk method yang memperoleh lantai dari sebuah nilai double. Sebagai contoh, jika Saya input a 3.13, method harus mengembalikan nilai 3.

5. Perhatikan untuk method yang mengenali jika character yang dipakai adalah sebuah digit. Sebagai contoh, jika Saya input '3', dia akan mengembalikan nilai true.

Page 149: J.E.N.I - Java

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 Pada akhir pembahasan, diharapkan siswa dapat :

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

Pengenalan Pemrograman 1 1

Page 150: J.E.N.I - Java

J.E.N.I.

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

<modifier> class <name> { <attributeDeclaration>* <constructorDeclaration>* <methodDeclaration>*

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

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

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

Untuk mendefinisikan class, kita tuliskan :

public class StudentRecord {

//area penulisan kode selanjutnya }

dimana,

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

Pengenalan Pemrograman 1 2

Page 151: J.E.N.I - Java

J.E.N.I.

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

10.3 Deklarasi Atribut

Dalam pendeklarasian atribut, kita tuliskan :

<modifier> <type> <name> [= <default_value>];

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

Berikut ini adalah contoh informasi yang akan diisikan pada class StudentRecord :

name - String address - String age - Int math grade - double english grade - double science grade - double average grade - double

Anda dapat menambahkan informasi lain jika diperlukan.

Pengenalan Pemrograman 1 3

Page 152: J.E.N.I - Java

J.E.N.I.

10.3.1 Instance Variable Jika kita telah menuliskan seluruh atribut yang akan diisikan pada class, selanjutnya kita akan menuliskannya pada kode. Jika kita menginginkan bahwa atribut – atribut tersebut adalah unik untuk setiap object (dalam hal ini untuk setiap siswa), maka kita harus mendeklarasikannya sebagai instance variable : Sebagai contoh :

public class StudentRecord {

private String name; private String address; private int age; private double mathGrade; private double englishGrade; private double scienceGrade; private double average; //area penulisan kode selanjutnya

} dimana, private disini menjelaskan bahwa variabel tersebut hanya dapat diakses oleh class itu sendiri. Object lain tidak dapat menggunakan variabel tersebut secara langsung. Kita akan membahas tentang kemampuan akses pada pembahasan selanjutnya. Petunjuk Penulisan Program : 1. Deklarasikan seluruh instance variable pada awal penulisan class 2. Deklarasikan variable per baris 3. Penulisan instance variable, termasuk juga variabel lain harus dimulai dengan huruf kecil 4. Gunakan tipe data yang tepat pada setiap variabel 5. Deklarasikan instance variable sebagai private supaya hanya method pada class itu sendiri yang dapat mengaksesnya.

Pengenalan Pemrograman 1 4

Page 153: J.E.N.I - Java

J.E.N.I.

10.3.2 Class Variable atau Static Variables Disamping instance variable, kita juga dapat mendeklarasikan class variable atau variabel yang dimiliki class sepenuhnya. Nilai pada variabel ini sama pada semua object di class yang sama. Anggaplah kita menginginkan jumlah dari siswa yang dimiliki dari seluruh kelas, kita dapat mendeklarasiakan satu static variable yang akan menampung nilai tersebut. Kita beri nama variabel tersebut dengan nama studentCount. Berikut penulisan static variable :

public class StudentRecord {

//area deklarasi instance variables private static int studentCount; //area penulisan kode selanjutnya

} Kita gunakan keyword : ’static’ untuk mendeklarasikan bahwa variabel tersebut adalah static. Maka keseluruhan kode yang dibuat terlihat sebagai berikut :

public class StudentRecord {

private String name; private String address; private int age; private double mathGrade; private double englishGrade; private double scienceGrade; private double average; private static int studentCount; //area penulisan kode selanjutnya

}

Pengenalan Pemrograman 1 5

Page 154: J.E.N.I - Java

J.E.N.I.

10.4. Deklarasi Methods Sebelum kita membahas method apa yang akan dipakai pada class, mari kita perhatikan penulisan method secara umum. Dalam pendeklarasian method, kita tuliskan :

<modifier> <returnType> <name>(<parameter>*) { <statement>* }

dimana, <modifier> dapat menggunakan beberapa modifier yang berbeda <returnType> dapat berupa seluruh tipe data, termasuk void <name> identifier atas class <parameter> ::= <tipe_parameter> <nama_parameter>[,] 10.4.1 Accessor Methods Untuk mengimplementasikan enkapsulasi, kita tidak menginginkan sembarang object dapat mengakses data kapan saja. Untuk itu, kita deklarasikan atribut dari class sebagai private. Namun, ada kalanya dimana kita menginginkan object lain untuk dapat mengakses data private. Dalam hal ini kita gunakan accessor methods. Accessor Methods digunakan untuk membaca nilai variabel pada class, baik berupa instance maupun static. Sebuah accessor method umumnya dimulai dengan penulisan get<namaInstanceVariable>. Method ini juga mempunyai sebuah return value. Sebagai contoh, kita ingin menggunakan accessor method untuk dapat membaca nama, alamat, nilai bahasa Inggris, Matematika, dan ilmu pasti dari siswa. Mari kita perhatikan salah satu contoh implementasi accessor method.

public class StudentRecord {

private String name; : :

public String getName(){ return name;

} }

Pengenalan Pemrograman 1 6

Page 155: J.E.N.I - Java

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 :

StudentRecord.java:14: incompatible types found : int required: java.lang.String

return age; ^

1 error

Contoh lain dari penggunaan accessor method adalah getAverage,

public class StudentRecord {

private String name; : : public double getAverage(){

double result = 0; result = ( mathGrade+englishGrade+scienceGrade )/3; return result;

} }

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

Pengenalan Pemrograman 1 7

Page 156: J.E.N.I - Java

J.E.N.I.

10.4.2 Mutator Methods Bagaimana jika kita menghendaki object lain untuk mengubah data? Yang dapat kita lakukan adalah membuat method yang dapat memberi atau mengubah nilai variable dalam class, baik itu berupa instance maupun static. Method semacam ini disebut dengan mutator methods. Sebuah mutator method umumnya tertulis set<namaInstanceVariabel>. Mari kita perhatikan salah satu dari implementasi mutator method :

public class StudentRecord {

private String name; : : public void setName( String temp ){

name = temp; }

}

dimana,

public - 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

Page 157: J.E.N.I - Java

J.E.N.I.

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

public String getNumberInWords( int num ){

String defaultNum = "zero"; if( num == 1 ){

return "one"; //mengembalikan sebuah konstanta } else if( num == 2){

return "two"; //mengembalikan sebuah konstanta }

// mengembalikan sebuah variabel return defaultNum;

} 10.4.4 Static Methods Kita menggunakan static method untuk mengakses static variable studentCount.

public class StudentRecord {

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

return studentCount; }

} dimana, public - 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

Page 158: J.E.N.I - Java

J.E.N.I.

public - Menjelaskan bahwa method ini dapat diakses object luar kelas () - Method ini tidak memiliki parameter apapun Pada deklarasi di atas, method getStudentCount() akan selalu menghasilkan return value 0 jika kita tidak mengubah apapun pada kode program untuk mengatur nilainya. Kita akan membahas pengubahan nilai dari studentCount pada pembahasan constructor. Petunjuk Penulisan Program : 1. Nama method harus dimulai dengan huruf kecil 2. Nama method harus berupa kata kerja 3. Gunakan dokumentasi sebelum mendeklarasikan sebuah method. Anda dapat Menggunakan JavaDoc.

Pengenalan Pemrograman 1 10

Page 159: J.E.N.I - Java

J.E.N.I.

10.4.5 Contoh Kode Program dari class StudentRecord Berikut ini adalah kode untuk class StudentRecord :

public class StudentRecord {

private String name; private String address; private int age; private double mathGrade; private double englishGrade; private double scienceGrade; private double average; private static int studentCount; /** * Menghasilkan nama dari Siswa */ public String getName(){

return name; } /** * Mengubah nama siswa */ public void setName( String temp ){

name = temp; } // area penulisan kode lain /** * Menghitung rata – rata nilai Matematik, Bahasa Inggris, * * Ilmu Pasti */ public double getAverage(){

double result = 0; result = ( mathGrade+englishGrade+scienceGrade )/3;

return result;

} /** * Menghasilkan jumlah instance StudentRecord */ public static int getStudentCount(){

return studentCount; }

}

Pengenalan Pemrograman 1 11

Page 160: J.E.N.I - Java

J.E.N.I.

Berikut ini contoh kode dari class yang mengimplementasikan class StudentRecord :

public class StudentRecordExample {

public static void main( String[] args ){

//membuat 3 object StudentRecord StudentRecord annaRecord = new StudentRecord(); StudentRecord beahRecord = new StudentRecord(); StudentRecord crisRecord = new StudentRecord(); //Memberi nama siswa annaRecord.setName("Anna"); beahRecord.setName("Beah"); crisRecord.setName("Cris"); //Menampilkan nama siswa “Anna” System.out.println( annaRecord.getName() ); //Menampilkan jumlah siswa System.out.println("Count="+StudentRecord.getStudentCount());

} }

Output dari program adalah sebagai berikut :

Anna Student Count = 0

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

public void setAge( int age ){

age = age; //SALAH!!! }

Pengenalan Pemrograman 1 12

Page 161: J.E.N.I - Java

J.E.N.I.

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

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

this.<namaInstanceVariable> Sebagai contoh, kita dapat menulis ulang kode hingga tampak sebagai berikut :

public void setAge( int age ){ this.age = age;

}

Method ini akan mereferensikan nilai dari parameter age kepada instance variable dari object StudentRecord. CATATAN : Anda hanya dapat menggunakan referensi tipe ini terhadap instance variable dan BUKAN static ataupun class variabel.

10.6. Overloading Methods Dalam class yang kita buat, kadangkala kita menginginkan untuk membuat method dengan nama yang sama namun mempunyai fungsi yang berbeda menurut parameter yang digunakan. Kemampuan ini dimungkinkan dalam pemrograman Java, dan dikenal sebagai overloading method. Overloading method mengijinkan sebuah method dengan nama yang sama namun memiliki parameter yang berbeda sehingga mempunyai implementasi dan return value yang berbeda pula. Daripada memberikan nama yang berbeda pada setiap pembuatan method, overloading method dapat digunakan pada operasi yang sama namun berbeda dalam implementasinya.

Pengenalan Pemrograman 1 13

Page 162: J.E.N.I - Java

J.E.N.I.

Sebagai contoh, pada class StudentRecord kita menginginkan sebuah method yang akan menampilkan informasi tentang siswa. Namun kita juga menginginkan operasi penampilan data tersebut menghasilkan output yang berbeda menurut parameter yang digunakan. Jika pada saat kita memberikan sebuah parameter berupa string, hasil yang ditampilkan adalah nama, alamat dan umur dari siswa, sedang pada saat kita memberikan 3 nilai dengan tipe double, kita menginginkan method tersebut untuk menampilkan nama dan nilai dari siswa. Untuk mendapatkan hasil yang sesuai, kita gunakan overloading method di dalam deklarasi class StudentRecord.

public void print( String temp ){ System.out.println("Name:" + name); System.out.println("Address:" + address); System.out.println("Age:" + age);

} public void print(double eGrade, double mGrade, double sGrade)

System.out.println("Name:" + name); System.out.println("Math Grade:" + mGrade); System.out.println("English Grade:" + eGrade); System.out.println("Science Grade:" + sGrade);

} Jika kita panggil pada method utama (main) :

public static void main( String[] args ) {

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

annaRecord.getMathGrade(), annaRecord.getScienceGrade());

}

Pengenalan Pemrograman 1 14

Page 163: J.E.N.I - Java

J.E.N.I.

Kita akan mendapatkan output pada panggilan pertama sebagai berikut :

Name:Anna Address:Philippines Age:15

Kemudian akan dihasilkan output sebagai berikut pada panggilan kedua :

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

Jangan dilupakan bahwa overloaded method memiliki property sebagai berikut :

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

10.7. Deklarasi Constructor Telah tersirat pada pembahasan sebelumnya, Constructor sangatlah penting pada pembentukan sebuah object. Constructor adalah method dimana seluruh inisialisasi object ditempatkan. Berikut ini adalah property dari Constructor :

1. Constructor memiliki nama yang sama dengan class 2. Sebuah Constructor mirip dengan method pada umumnya, namun hanya informasi –

informasi berikut yang dapat ditempatkan pada header sebuah constructor, scope atau identifikasi pengaksesan (misal: public), nama dari konstuktor dan parameter.

3. Constructor tidak memiliki return value 4. Constructor tidak dapat dipanggil secara langsung, namun harus dipanggil dengan

menggunakan operator new pada pembentukan sebuah class. Untuk mendeklarasikan constructor, kita tulis,

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

}

Pengenalan Pemrograman 1 15

Page 164: J.E.N.I - Java

J.E.N.I.

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

public StudentRecord() {

//area penulisan kode }

10.7.2 Overloading Constructor Seperti telah kita bahas sebelumnya, sebuah constructor juga dapat dibentuk menjadi overloaded. Dapat dilihat pada 4 contoh sebagai berikut :

public StudentRecord(){

//area inisialisasi kode; } public StudentRecord(String temp){

this.name = temp; } public StudentRecord(String name, String address){

this.name = name; this.address = address;

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

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

}

Pengenalan Pemrograman 1 16

Page 165: J.E.N.I - Java

J.E.N.I.

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

public static void main( String[] args ) {

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

}

Sebelum kita lanjutkan, mari kita perhatikan kembali deklarasi static variable studentCount yang telah dibuat sebelumnya. Tujuan deklarasi studentCount adalah untuk menghitung jumlah object yang dibentuk pada class StudentRecord. Jadi, apa yang akan kita lakukan selanjutnya adalah menambahkan nilai dari studentCount setiap kali setiap pembentukan object pada class StudentRecord. Lokasi yang tepat untuk memodifikasi dan menambahkan nilai studentCount terletak pada constructor-nya, karena selalu dipanggil setiap kali objek terbentuk. Sebagai contoh :

public StudentRecord(){

//letak kode inisialisasi studentCount++; //menambah student

} public StudentRecord(String temp){

this.name = temp; studentCount++; //menambah student

} public StudentRecord(String name, String address){

this.name = name; this.address = address; studentCount++; //menambah student

}

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

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

}

Pengenalan Pemrograman 1 17

Page 166: J.E.N.I - Java

J.E.N.I.

10.7.4 Pemanggilan Constructor Dengan this() Pemanggilan constructor dapat dilakukan secara berangkai, dalam arti Anda dapat memanggil constructor di dalam constructor lain. Pemanggilan dapat dilakukan dengan referensi this(). Perhatikan contoh kode sebagai berikut :

1: public StudentRecord(){ 2: this("some string"); 3: 4: } 5: 6: public StudentRecord(String temp){ 7: this.name = temp; 8: } 9: 10: public static void main( String[] args ) 11: { 12: 13: StudentRecord annaRecord = new StudentRecord(); 14: }

Dari contoh kode diatas, pada saat baris ke 13 dipanggil akan memanggil constructor dasar pada baris pertama. Pada saat baris kedua dijalankan, baris tersebut akan menjalankan constructor yang memiliki parameter String pada baris ke-6. Beberapa hal yang patut diperhatikan pada penggunaan this() :

1. Harus dituliskan pada baris pertama pada sebuah constructor 2. Hanya dapat digunakan pada satu definisi constructor. Kemudian metode ini dapat

diikuti dengan kode – kode berikutnya yang relevan

Pengenalan Pemrograman 1 18

Page 167: J.E.N.I - Java

J.E.N.I.

10.8. Packages Packages dalam JAVA berarti pengelompokan beberapa class dan interface dalam satu unit. Fitur ini menyediakan mekanisme untuk mengatur class dan interface dalam jumlah banyak dan menghindari konflik pada penamaan. 10.8.1 Mengimport Packages Supaya dapat meggunakan class yang berada diluar package yang sedang dikerjakan, Anda harus mengimport package dimana class tersebut berada. Pada dasarnya, seluruh program JAVA mengimport package java.lang.*, sehingga Anda dapat menggunakan class seperti String dan Integer dalam program meskipun belum mengimport package sama sekali. Penulisan import package dapat dilakukan seperti dibawah ini :

import <namaPaket>; Sebagai contoh, bila Anda ingin menggunakan class Color dalam package awt, Anda harus menuliskan import package sebagai berikut :

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

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

java.awt.Color color; 10.8.2 Membuat Package Untuk membuat package, dapat dilakukan dengan menuliskan :

package <packageName>; Anggaplah kita ingin membuat package dimana class StudentRecord akan ditempatkan bersama dengan class – class yang lain dengan nama package schoolClasses.

Pengenalan Pemrograman 1 19

Page 168: J.E.N.I - Java

J.E.N.I.

Langkah pertama yang harus dilakukan adalah membuat folder dengan nama schoolClasses. Salin seluruh class yang ingin diletakkan pada package dalam folder ini. Kemudian tambahkan kode deklarasi package pada awal file. Sebagai contoh :

package schoolClasses; public class StudentRecord {

private String name; private String address; private int age;

} Package juga dapat dibuat secara bersarang. Dalam hal ini Java Interpreter menghendaki struktur direktori yang mengandung class eksekusi untuk disesuaikan dengan struktur package. 10.8.3 Pengaturan CLASSPATH Diasumsikan package schoolClasses terdapat pada direktori C:\. Langkah selanjutnya adalah mengatur classpath untuk menunjuk direktori tersebut sehingga pada saat akan dijalankan, JVM dapat mengetahui dimana class tersebut tersimpan. Sebelum membahas cara mengatur classpath, perhatikan contoh dibawah yang menAndakan kejadian bila kita tidak mengatur classpath. Asumsikan kita mengkompilasi dan menjalankan class StudentRecord :

C:\schoolClasses>javac StudentRecord.java C:\schoolClasses>java StudentRecord Exception in thread "main" java.lang.NoClassDefFoundError: StudentRecord (wrong name: schoolClasses/StudentRecord) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source)

Kita akan mendapatkan pesan kesalahan berupa NoClassDefFoundError yang berarti JAVA tidak mengetahui dimana posisi class. Hal tersebut disebabkan oleh karena class

Pengenalan Pemrograman 1 20

Page 169: J.E.N.I - Java

J.E.N.I.

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

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

C:\schoolClasses> java schoolClasses.StudentRecord Pada UNIX, asumsikan bahwa kita memiliki class - class yang terdapat dalam direktori /usr/local/myClasses, ketikkan :

export classpath=/usr/local/myClasses Perhatikan bahwa Anda dapat mengatur classpath dimana saja. Anda juga dapat mengatur lebih dari satu classpath, kita hanya perlu memisahkannya dengan menggunakan ; (Windows), dan : (UNIX). Sebagai contoh :

set classpath=C:\myClasses;D:\;E:\MyPrograms\Java dan untuk sistem UNIX :

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

Pengenalan Pemrograman 1 21

Page 170: J.E.N.I - Java

J.E.N.I.

10.9. Access Modifiers Pada saat membuat, mengatur properties dan class methods, kita ingin untuk mengimplementasikan beberapa macam larangan untuk mengakses data. Sebagai contoh, jika Anda ingin beberapa atribut hanya dapat diubah hanya dengan method tertentu, tentu Anda ingin menyembunyikannya dari object lain pada class. Di JAVA, implementasi tersebut disebut dengan access modifiers. Terdapat 4 macam access modifiers di JAVA, yaitu : public, private, protected dan default. 3 tipe akses pertama tertulis secara ekplisit pada kode untuk mengindikasikan tipe akses, sedangkan yang keempat yang merupakan tipe default, tidak diperlukan penulisan keyword atas tipe. 10.9.1 Akses Default (Package Accessibility) Tipe ini mempersyaratkan bahwa hanya class dalam package yang sama yang memiliki hak akses terhadap variabel dan methods dalam class. Tidak terdapat keyword pada tipe ini. Sebagai contoh :

public class StudentRecord {

//akses dasar terhadap variabel int name;

//akses dasar terhadap metode String getName(){

return name; }

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

Pengenalan Pemrograman 1 22

Page 171: J.E.N.I - Java

J.E.N.I.

10.9.2 Akses Public Tipe ini mengijinkan seluruh class member untuk diakses baik dari dalam dan luar class. Object apapun yang memiliki interaksi pada class memiliki akses penuh terhadap member dari tipe ini. Sebagai contoh :

public class StudentRecord {

//akses dasar terhadap variabel public int name;

//akses dasar terhadap metode public String getName(){

return name; }

} Dalam contoh ini, variabel name dan method getName() dapat diakses dari object lain. 10.9.3 Akses Protected Tipe ini hanya mengijinkan class member untuk diakses oleh method dalam class tersebut dan elemen – elemen subclass. Sebagai contoh :

public class StudentRecord {

//akses pada variabel protected int name;

//akses pada metode protected String getName(){

return name; }

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

Pengenalan Pemrograman 1 23

Page 172: J.E.N.I - Java

J.E.N.I.

10.9.4 Akses Private Tipe ini mengijinkan pengaksesan class hanya dapat diakses oleh class dimana tipe ini dibuat. Sebagai contoh :

public class StudentRecord {

//akses dasar terhadap variabel private int name;

//akses dasar terhadap metode private String getName(){

return name; }

} Pada contoh diatas, variabel name dan method getName() hanya dapat diakses oleh method internal class tersebut. Petunjuk Penulisan Program : Instance variable dari class secara default akan bertipe private sehingga class tersebut hanya akan menyediakan accessor dan mutator methods terhadap variabel ini.

Pengenalan Pemrograman 1 24

Page 173: J.E.N.I - Java

J.E.N.I.

10.10. Latihan 10.10.1 Entry Buku Alamat Tugas Anda adalah membuat sebuah class yang memuat data-data pada buku alamat. Tabel berikut mendefinisikan informasi yang dimiliki oleh buku alamat.

Attribut Deskripsi

Nama Nama Lengkap perseorangan

Alamat Alamat Lengkap

Nomor Telepon Nomor telepon personal

Alamat E-Mail Alamat E-Mail personal

Tabel 1: Atribut dan Deskripsi Atribut

Buat implementasi dari method sebagai berikut :

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

10.10.2 Buku Alamat Buat sebuah class buku alamat yang dapat menampung 100 data. Gunakan class yang telah dibuat pada nomor pertama. Anda harus mengimplementasikan method berikut pada buku alamat :

1. Memasukkan data 2. Menghapus data 3. Menampilkan seluruh data 4. Update data

Pengenalan Pemrograman 1 25

Page 174: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 1

BAB 11

Pewarisan, Polimorfisme, dan Interface

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

• Mendefinisikan superclasses dan subclasses

• Override method dari superclasses

• Membuat method final dan class final

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

Gambar 1: Hirarki class

Pewarisan adalah keuntungan besar dalam pemrograman berbasis object karena suatu sifat atau method didefinisikan dalam superclass, sifat ini secara otomatis diwariskan dari semua subclasses. Jadi, Anda dapat menuliskan kode method hanya sekali dan mereka

Page 175: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 2

dapat digunakan oleh semua subclass. Subclass hanya butuh mengimplementasikan perbedaannya sendiri dan induknya.

11.2.1 Mendefinisikan Superclass dan Subclass Untuk memperoleh suatu class, kita menggunakan kata kunci extend. Untuk mengilustrasikan ini, kita akan membuat contoh class induk. Dimisalkan kita mempunyai class induk yang dinamakan Person.

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

Page 176: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 3

Perhatikan bahwa atribut name dan address dideklarasikan sebagai protected. Alasannya kita melakukan ini yaitu, kita inginkan atribut-atribut ini untuk bisa diakses oleh subclasses dari superclassess. Jika kita mendeklarasikan sebagai private, subclasses tidak dapat menggunakannya. Catatan bahwa semua properti dari superclass yang dideklarasikan sebagai public, protected dan default dapat diakses oleh subclasses-nya. Sekarang, kita ingin membuat class lain bernama Student. Karena Student juga sebagai Person, kita putuskan hanya meng-extend class Person, sehingga kita dapat mewariskan semua properti dan method dari setiap class Person yang ada. Untuk melakukan ini, kita tulis,

public class Student extends Person { public Student(){ System.out.println(“Inside Student:Constructor”); //beberapa kode di sini } // beberapa kode di sini

} Ketika object Student di-instantiate, default constructor dari superclass secara mutlak meminta untuk melakukan inisialisasi yang seharusnya. Setelah itu, pernyataan di dalam subclass dieksekusi. Untuk mengilustrasikannya, perhatikan kode berikut,

public static void main( String[] args ){ Student anna = new Student();

} Dalam kode ini, kita membuat sebuah object dari class Student. Keluaran dari program adalah,

Inside Person:Constructor

Inside Student:Constructor

Page 177: J.E.N.I - Java

Gambar 2: Alur Program

J.E.N.I.

Pengenalan Pemrograman 1 4

Alur program ditunjukkan sebagai berikut.

11.2.2 Kata Kunci Super Subclass juga dapat memanggil constructor secara explicit dari superclass terdekat. Hal ini dilakukan dengan pemanggil construktor super. Pemanggil constructor super dalam constructor dari subclass akan menghasilkan eksekusi dari superclass constructor yang bersangkutan, berdasar dari argumen sebelumnya. Sebagai contoh, pada contoh class sebelumnya. Person dan Student, kita tunjukkan contoh dari pemanggil constructor super. Diberikan kode berikut untuk Student,

public Student(){

super( "SomeName", "SomeAddress" ); System.out.println("Inside Student:Constructor");

}

Kode ini memanggil constructor kedua dari superclass terdekat(yaitu adalah Person) dan mengeksekusinya. Contoh kode lain ditunjukkan sebagai berikut,

public Student(){ super(); System.out.println("Inside Student:Constructor");

}

Page 178: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 5

Kode ini memanggil default constructor dari superclass terdekat(yaitu Person) dan mengeksekusinya. Ada beberapa hal yang harus diingat ketika menggunakan pemanggil konstuktor super: 1. Pemanggil super() HARUS DIJADIKAN PERNYATAAN PERTAMA DALAM constructor. 2. Pemanggil super() hanya dapat digunakan dalam definisi constructor. 3. Termasuk constructor this() dan pemanggil super() TIDAK BOLEH TERJADI DALAM

constructor YANG SAMA. Pemakaian lain dari super adalah untuk menunjuk anggota dari superclass(seperti referensi this). Sebagai contoh,

public Student() { super.name = “somename”; super.address = “some address”;

}

11.2.3 Overriding Method Untuk beberapa pertimbangan, kadang-kadang class asal perlu mempunyai implementasi berbeda dari method yang khusus dari superclass tersebut. Oleh karena itulah, method overriding digunakan. Subclass dapat mengesampingkan method yang didefinisikan dalam superclass dengan menyediakan implementasi baru dari method tersebut. Misalnya kita mempunyai implementasi berikut untuk method getName dalam superclass Person,

public class Person { : : public String getName(){ System.out.println("Parent: getName"); return name; } : }

Untuk override, method getName dalam subclass Student, kita tulis, public class Student extends Person

{ : : public String getName(){ System.out.println("Student: getName"); return name; }

Page 179: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 6

: }

Jadi, ketika kita meminta method getName dari object class Student, method overridde akan dipanggil, keluarannya akan menjadi,

Student: getName

11.2.4 Method final dan class final

Dalam Java, juga memungkinkan untuk mendeklarasikan class-class yang tidak lama menjadi subclass. Class ini dinamakan class final. Untuk mendeklarasikan class untuk menjadi final kita hanya menambahkan kata kunci final dalam deklarasi class. Untuk contohnya, jika kita ingin class Person untuk dideklarasikan final, kita tulis,

public final class Person

{ //area kode

} Beberapa class dalam Java API dideklarasikan secara final untuk memastikan sifatnya tidak dapat di-override. Contoh-contoh dari class ini adalah Integer, Double, dan String. Ini memungkinkan dalam Java membuat method yang tidak dapat di-override. Method ini dapat kita panggil method final. Untuk mendeklarasikan method untuk menjadi final, kita tambahkan kata kunci final ke dalam deklarasi method. Contohnya, jika kita ingin method getName dalam class Person untuk dideklarasikan final, kita tulis, public final String getName(){

return name; }

Method static juga secara otomatis final. Ini artinya Anda tidak dapat membuatnya override.

Page 180: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 7

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,

public static main( String[] args ) { Person ref; Student studentObject = new Student(); Employee employeeObject = new Employee(); ref = studentObject; //Person menunjuk kepada // object Student //beberapa kode di sini

}

Sekarang dimisalkan kita punya method getName dalam superclass Person kita, dan kita override method ini dalam kedua subclasses Student dan Employee,

public class Person { public String getName(){ System.out.println(“Person Name:” + name); return name; } } public class Student extends Person { public String getName(){ System.out.println(“Student Name:” + name); return name; } }

Gambar 3: Hirarki dari class induk Person

Page 181: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 8

public class Employee extends Person { public String getName(){ System.out.println(“Employee Name:” + name);

return name; } Kembali ke method utama kita, ketika kita mencoba memanggil method getName dari referensi Person ref, method getName dari object Student akan dipanggil. Sekarang, jika kita berikan ref ke object Employee, method getName dari Employee akan dipanggil.

public static main( String[] args ) { Person ref; Student studentObject = new Student(); Employee employeeObject = new Employee(); ref = studentObject; //Person menunjuk kepada // object Student String temp = ref.getName(); //getName dari Student //class dipanggil System.out.println( temp ); ref = employeeObject; //Person menunjuk kepada // object Employee String temp = ref.getName(); //getName dari Employee //class dipanggil System.out.println( temp );

}

Kemampuan dari referensi untuk mengubah sifat menurut object apa yang dijadikan acuan dinamakan polimorfisme. Polimorfisme menyediakan multiobject dari subclasses yang berbeda untuk diperlakukan sebagai object dari superclass tunggal, secara otomatis menunjuk method yang tepat untuk menggunakannya ke particular object berdasar subclass yang termasuk di dalamnya. Contoh lain yang menunjukkan properti polimorfisme adalah ketika kita mencoba melalui referensi ke method. Misalkan kita punya method statis printInformation yang mengakibatkan object Person sebagai referensi, kita dapat me-referensi dari tipe Employee dan tipe Student ke method ini selama itu masih subclass dari class Person.

public static main( String[] args ) { Student studentObject = new Student(); Employee employeeObject = new Employee(); printInformation( studentObject ); printInformation( employeeObject ); }

Page 182: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 9

public static printInformation( Person p ){ . . . . }

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

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

public abstract void someMethod();

Gambar 4: class abstract

Page 183: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 10

Sekarang mari membuat contoh class abstract. public abstract class LivingThing

{ public void breath(){ System.out.println("Living Thing breathing..."); } public void eat(){ System.out.println("Living Thing eating..."); } /** * abstract method walk * Kita ingin method ini di-overridden oleh subclasses */ public abstract void walk();

}

Ketika class meng-extend class abstract LivingThing, dibutuhkan untuk override method abstract walk(), atau lainnya, juga subclass akan menjadi class abstract, oleh karena itu tidak dapat di-instantiate. Contohnya,

public class Human extends LivingThing { System.out.println("Human walks...");

public void walk(){

} }

Jika class Human tidak dapat overridde method walk, kita akan menemui pesan error berikut ini,

Human.java:1: Human is not abstract and does not override abstract method walk() in LivingThing public class Human extends LivingThing ^

1 error

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

Page 184: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 11

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

11.5.1 Kenapa Kita Memakai Interface? Kita akan menggunakan interface jika kita ingin class yang tidak berhubungan mengimplementasikan method yang sama. Melalui interface-interface, kita dapat menangkap kemiripan diantara class yang tidak berhubungan tanpa membuatnya 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,

public interface Relation { public boolean isGreater( Object a, Object b); public boolean isLess( Object a, Object b); public boolean isEqual( Object a, Object b); }

Alasan lain dalam menggunakan interface pemrograman object adalah untuk menyatakan sebuah interface pemrograman object tanpa menyatakan classnya. Seperti yang dapat kita lihat nanti dalam bagian Interface vs class, kita dapat benar-benar menggunakan interface sebagai tipe data. Pada akhirnya, kita perlu menggunakan interface untuk pewarisan model jamak dimana menyediakan class untuk mempunyai lebih dari satu superclass. Pewarisan jamak tidak ditunjukkan di Java, tetapi ditunjukkan di bahasa berorientasi object lain seperti C++.

Page 185: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 12

11.5.2 Interface vs. Class Abstract Berikut ini adalah perbedaan utama antara sebuah interface dan sebuah class abstract: method interface tidak punya tubuh, sebuah interface hanya dapat mendefinisikan konstanta dan interface tidak langsung mewariskan hubungan dengan class istimewa lainnya, mereka didefinisikan secara independent. 11.5.3 Interface vs. Class Satu ciri umum dari sebuah interface dan class adalah pada tipe mereka berdua. Ini artinya bahwa sebuah interface dapat digunakan dalam tempat-tempat dimana sebuah class dapat digunakan. Sebagai contoh, diberikan class Person dan interface PersonInterface, berikut deklarasi yang benar:

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

Bagaimanapun, Anda tidak dapat membuat instance dari sebuah interface. Contohnya:

PersonInterface pi = new PersonInterface(); //COMPILE

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

11.5.4 Membuat Interface Untuk membuat interface, kita tulis,

public interface [InterfaceName] { //beberapa method tanpa isi

} Sebagai contoh, mari kita membuat sebuah interface yang mendefinisikan hubungan antara dua object menurut urutan asli dari object.

public interface Relation { public boolean isGreater( Object a, Object b); public boolean isLess( Object a, Object b); public boolean isEqual( Object a, Object b);

}

Page 186: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 13

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

/** * Class ini mendefinisikan segmen garis */ public class Line implements Relation { private double x1; private double x2; private double y1; private double y2; public Line(double x1, double x2, double y1, double y2){ this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; }

public double getLength(){ double length = Math.sqrt((x2-x1)*(x2-x1) +

(y2-y1)* (y2-y1)); return length; } public boolean isGreater( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen > bLen); } public boolean isLess( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen < bLen); } public boolean isEqual( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen == bLen); }

}

Page 187: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 14

Ketika class Anda mencoba mengimplementasikan sebuah interface, selalu pastikan bahwa Anda mengimplementasikan semua method dari interface, jika tidak, Anda akan menemukan kesalahan ini,

Line.java:4: Line is not abstract and does not override abstract method isGreater(java.lang.Object,java.lang.Object) in Relation public class Line implements Relation ^ 1 error

11.5.5 Hubungan dari Interface ke Class Seperti yang telah kita lihat dalam bagian sebelumnya, class dapat mengimplementasikan sebuah interface selama kode implementasi untuk semua method yang didefinisikan dalam interface tersedia. Hal lain yang perlu dicatat tentang hubungan antara interface ke class-class yaitu, class hanya dapat mengEXTEND SATU superclass, tetapi dapat mengIMPLEMENTASIkan BANYAK interface. Sebuah contoh dari sebuah class yang mengimplementasikan interface adalah,

public class Person implements PersonInterface, LivingThing, WhateverInterface { //beberapa kode di sini

}

Contoh lain dari class yang meng-extend satu superclass dan mengimplementasikan sebuah interface adalah,

public class ComputerScienceStudent extends Student implements PersonInterface, LivingThing { //beberapa kode di sini

} Catatan bahwa sebuah interface bukan bagian dari hirarki pewarisan class. Class yang tidak berhubungan dapat mengimplementasikan interface yang sama.

Petunjuk penulisan program:

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

Page 188: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 15

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

public interface PersonInterface { . . . } public interface StudentInterface extends PersonInterface { . . .

}

Page 189: J.E.N.I - Java

J.E.N.I.

Pengenalan Pemrograman 1 16

11.6 Latihan 11.6.1 Extend StudentRecord

Dalam latihan ini, kita ingin untuk membuat catatan siswa yang lebih khusus yang berisi informasi tambahan tentang pengetahuan komputer siswa. Tugasnya adalah meng-extend class StudentRecord yang mengimplementasikan pelajaran sebelumnya. Cobalah untuk meng-override beberapa method yang ada dalam superclass StudentRecord, jika Anda benar-benar membutuhkannya. 11.6.2 Bentuk Abstract Class Cobalah untuk membuat class abstract yang dinamai Shape dengan method abstract getArea() dan getName(). Tulis dua subclasses-nya yaitu Circle dan Square. Anda dapat menambahkan method tambahan ke dalam subclasses jika diinginkan.

Page 190: J.E.N.I - Java

J.E.N.I.

BAB 12

Dasar Exception Handling

12.1 Tujuan

Dalam bagian ini, kita akan mempelajari teknik yang dipakai dalam Java dalam menangani kondisi yang tidak biasa dalam menjalankan operasi normal dalam program. Teknik ini dinamakan exception handling.

Pada akhir pembelajaran, siswa mampu untuk:• Mendefinisikan exception• Menangani exception menggunakan blok try-catch-finally

12.2 Apa itu Exception?

Exception adalah sebuah peristiwa yang menjalankan alur proses normal pada program. Peristiwa ini biasanya berupa kesalahan(error) dari beberapa bentuk. Ini disebabkan program kita berakhir tidak normal.

Beberapa contoh dari exception yang Anda mungkin jumpai pada latihan-latihan sebelumnya adalah: exception ArrayIndexOutOfBounds, yang terjadi jika kita mencoba mengakses elemen array yang tidak ada, atau NumberFormatException, yang terjadi ketika kita mencoba melalui parameter bukan angka dalam method Integer.parseInt.

12.3 Menangani Exception

Untuk menangani exception dalam Java, kita gunakan blok try-catch-finally. Apa yang kita lakukan dalam program kita adalah kita menempatkan pernyataan yang mungkin menghasilkan exception dalam blok ini.

Bentuk umum dari blok try-catch-finally adalah,

try{ //tulis pernyataan yang dapat mengakibatkan exception//dalam blok ini

}catch( <exceptionType1> <varName1> ){

//tulis aksi apa dari program Anda yang dijalankan jika ada //exception tipe tertentu terjadi

}. . .

Pengenalan Pemrograman 1 1

Page 191: J.E.N.I - Java

J.E.N.I.

catch( <exceptionTypen> <varNamen> ){//tulis aksi apa dari program Anda yang dijalankan jika ada //exception tipe tertentu terjadi

}finally{

//tambahkan kode terakhir di sini}

Exception dilemparkan selama eksekusi dari blok try dapat ditangkap dan ditangani dalam blok catch. Kode dalam blok finally selalu di-eksekusi.

Berikut ini adalah aspek kunci tentang sintak dari konstruksi try-catch-finally:• Notasi blok bersifat perintah• Setiap blok try, terdapat satu atau lebih blok catch, tetapi hanya satu blok finally.• Blok catch dan blok finally harus selalu muncul dalam konjungsi dengan blok try, dan

diatas urutan• Blok try harus diikuti oleh paling sedikit satu blok catch ATAU satu blok finally, atau

keduanya.• Setiap blok catch mendefinisikan sebuah penanganan exception. Header dari blok catch

harus membawa satu argumen, dimana exception pada blok tersebut akan ditangani. Exception harus menjadi class pelempar atau satu dari subclassesnya.

Pengenalan Pemrograman 1 2

Gambar 1: Alur kejadian blok try-catch-finally

Page 192: J.E.N.I - Java

J.E.N.I.

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

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

at ExceptionExample.main(ExceptionExample.java:5)

Untuk mencegah kejadian ini, kita dapat menempatkan kode ke dalam blok try-catch. Blok finally hanya sebagai pilihan lain saja. Sebagai contoh, kita tidak akan menggunakan blok finally.

public class ExceptionExample{

public static void main( String[] args ){

try{System.out.println( args[1] );

}catch( ArrayIndexOutOfBoundsException exp ){System.out.println("Exception caught!");

}}}

Jadi kita akan menjalankan program lagi tanpa argumen, keluarannya akan menjadi,

Exception caught!

Pengenalan Pemrograman 1 3

Page 193: J.E.N.I - Java

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 threeargs[0]=oneargs[1]=twoargs[2]=threeException in thread "main"

java.lang.ArrayIndexOutOfBoundsException: 3 at TestExceptions.main(1.java:4)

Ubah program TestExceptions untuk menangani exception, keluaran program setelah ditangkap exception-nya akan seperti ini:

javac TestExceptions one two threeargs[0]=oneargs[1]=twoargs[2]=threeException caught:

java.lang.ArrayIndexOutOfBoundsException: 3Quiting...

12.4.2 Menangkap Exception 2

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

Pengenalan Pemrograman 1 4

Page 194: J.E.N.I - Java

J.E.N.I.

Bab 1Review Konsep Dasar dalam Java

1.1 TujuanSebelum 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.

Sebelum melengkapi pelajaran ini, Anda sebaiknya mampu untuk:

1. Mengetahui dan menggunakan konsep dasar beorientasi object.

• class

• object

• atribut

• method

• konstruktor

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

dengan baik

• package

• enkapsulasi

• abstraksi

• pewarisan

• polimorfisme

• interface

3. Mengetahui dengan jelas penggunaan kata kunci this, super, final dan static

4. Membedakan antara method overloading dan method overridding

1.2 Konsep Berorientasi object

1.2.1 Desain Berorientasi object

Desain berorientasi object adalah sebuah teknik yang 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

Page 195: J.E.N.I - Java

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

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

1.2.8 Enkapsulasi

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

1.2.9 Abstraksi

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

1.2.10 Pewarisan

Pewarisan adalah hubungan antara class dimana dalam satu class ada superclass atau class induk dari class yang lain. Pewarisan menunjuk pada properti dan behaviour yang diterima dari nenek

Pengenalan Pemrograman 2 2

Page 196: J.E.N.I - Java

J.E.N.I.

moyang dari class. Ini dikenal juga sebagai hubungan “is-a”. Perhatikan pada hirarki berikut.

Gambar 1.1: Contoh Pewarisan

SuperHero adalah superclass dari class FlyingSuperHero dan UnderwaterSuperHero. Catatan bahwa FlyingSuperHero “is-a” SuperHero. Sebagaimana juga UnderwaterSuperHero “is-a” SuperHero

1.2.11 Polimorfisme

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

1.2.12 Interface

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

1.3 Struktur Program Java

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

1.3.1 Mendeklarasikan class Java

<classDeclaration> ::= <modifier> class <name> { <attributeDeclaration>* <constructorDeclaration>* <methodDeclaration>* }

dimana <modifier> adalah sebuah access modifier, yang mana boleh dikombinasikan dengan tipe yang laen dari modifier.

Pengenalan Pemrograman 2 3

SuperHero

FlyingSuperHero UnderwaterSuperHero

Page 197: J.E.N.I - Java

J.E.N.I.

Petunjuk Penulisan Program:* = berarti bahwa boleh ada 0 atau lebih kejadian dari deret tersebut yang menggunakannya juga.<description> = menunjukkan bahwa Anda harus mengganti nilai sebenarnya untuk bagian ini daripada menguranginya penulisannya.Ingat bahwa untuk class teratas, acces modifier yang valid hanyalah public dan package(yakni jika tidak ada acces modifier mengawali kata kunci class).

Contoh berikut ini mendeklarasikan blueprint SuperHero.

Class SuperHero { String superPowers[];

void setSuperPowers(String superPowers[]) { this.superPowers = superPowers; } void printSuperPowers() { for (int i = 0; i < superPowers.length; i++) { System.out.println(superPowers[i]);

} }

}

1.3.2 Mendeklarasikan Atribut

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

| <class>

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

Inilah contohnya.

public class AttributeDemo { private String studNum; public boolean graduating = false; protected float unitsTaken = 0.0f; String college;

}

1.3.3 Mendeklarasikan Method

<methodDeclaration> ::= <modifier> <returnType> <name>(<parameter>*) { <statement>* }<parameter> ::=

<parameter_type> <parameter_name>[,]

Pengenalan Pemrograman 2 4

Page 198: J.E.N.I - Java

J.E.N.I.

Sebagai contoh:

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

}

1.3.4 Mendeklarasikan sebuah Konstruktor

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

Petunjuk Penulisan Program:Nama konstruktor harus sama dengan nama class.<modifier> yang valid untuk konstruktor adalah public, protected, dan private.Konstruktor tidak memiliki nilai return.

Perhatikan contoh berikut.

class ConstructorDemo { private int data; public ConstructorDemo() { data = 100; } ConstructorDemo(int data) { this.data = data; }}

1.3.5 Meng-instansiasi sebuah class

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

Page 199: J.E.N.I - Java

J.E.N.I.

} public static void main(String args[]) { ConstructObj obj = new ConstructObj(); //di-instantiate }

}

1.3.6 Mengakses Anggota object

Untuk mengakses anggota dari sebuah object, kita gunakan notasi “dot”. Penggunaanya seperti berikut:

<object>.<member>

Contoh selanjutnya berdasar pada sebelumnya dengan pernyataan tambahan untuk mengakses anggota dan method tambahan.

class ConstructObj { int data; ConstructObj() { /* inisialisasi data */ } void setData(int data) { this.data = data; } public static void main(String args[]) { ConstructObj obj = new ConstructObj(); //instantiation obj.setData = 10; //access setData() System.out.println(obj.data); //access data }

}

1.3.7 Package

Untuk menunjukkan bahwa file asal termasuk package khusus, kita gunakan syntax berikut:

<packageDeclaration> ::= package <packageName>;

Untuk mengimpor package lain, kita gunakan syntax berikut:

<importDeclaration> ::= import <packageName.elementAccessed>;

Dengan ini, source code Anda harus memiliki format berikut:

[<packageDeclaration>]<importDeclaration>*

<classDeclaration>+

Pengenalan Pemrograman 2 6

Page 200: J.E.N.I - Java

J.E.N.I.

Petunjuk Penulisan Program:+ menunjukkan bahwa boleh ada 1 atau lebih kejadian pada baris ini dalam pengaplikasiannya.

Sebagai contoh.

package registration.reports;import registration.processing.*;import java.util.List;import java.lang.*; //imported by defaultclass MyClass { /* rincian dari MyClass */

1.3.8 Acces Modifier

Table berikut meringkas acces modifier dalam Java.

private default/package protected public

class yang sama Yes Yes Yes Yes

package yang sama Yes Yes Yes

package yang berbeda (subclass)

Yes Yes

package yang berbeda (non-subclass)

Yes

Tabel 1.2: Acces Modifier

1.3.9 Enkapsulasi

Menyembunyikan elemen dari penggunaan sebuah class dapat dilakukan dengan pembuatan anggota yang ingin Anda sembunyikan secara private.

Contoh berikut menyembunyikan field secret. Catatan bahwa field ini tidak langsung diakses oleh program lain menggunakan method getter dan setter.

class Encapsulation { private int secret; //field tersembunyi public boolean setSecret(int secret) { if (secret < 1 || secret > 100) { return false; } this.secret = secret; return true; } public getSecret() { return secret; }}

Pengenalan Pemrograman 2 7

Page 201: J.E.N.I - Java

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

class ColoredPoint extends Point { Color color;

}

1.3.11 Method Overriding

Method subclass override terhadap method superclass ketika subclass mendeklarasikan method yang signaturenya serupa ke method dalam superclass. Signature dari method hanyalah informasi yang ditemukan dalam definisi method bagian atas. Signature mengikutkan tipe return, nama dan daftar parameter method tetapi itu tidak termasuk acces modifier dan tipe yang lain dari kata kunci seperti final dan static.

Inilah perbedaan dari method overloading. Method overloading secara singkat didiskusikan dalam sub bagian pada kata kunci this.

class Superclass { void display(int n) { System.out.println("super: " + n); }}

class Subclass extends Superclass { void display(int k) { //method overriding System.out.println("sub: " + k); }}

class OverrideDemo { public static void main(String args[]) { Subclass SubObj = new Subclass(); Superclass SuperObj = SubObj; SubObj.display(3); ((Superclass)SubObj).display(4); }

}

Ini akan menghasilkan keluaran sebagai berikut.sub: 3sub: 4

Pemanggilan method ditentukan oleh tipe data sebenarnya dari object yang diminta method.

Pengenalan Pemrograman 2 8

Page 202: J.E.N.I - Java

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

class Subclass1 extends Superclass { public void overriddenMethod() { }}

class Subclass2 extends Superclass { void overriddenMethod() { }}

class Subclass3 extends Superclass { protected void overriddenMethod() { }}

class Subclass4 extends Superclass { private void overriddenMethod() { }}

1.3.12 Class Abstract dan Method

Bentuk umum dari sebuah method abstract adalah sebagai berikut:

abstract <modifier> <returnType> <name>(<parameter>*);

Sebuah class yang berisi method abstract harus dideklarasikan sebagai sebuah class abstract.

abstract <modifier> <returnType> <name>(<parameter>*);abstract class <name> { /* constructors, fields and methods */

}

Kata kunci tidak dapat digunakan pada 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.

Petunjuk Penulisan Program:catatan bahwa mendeklarasikan sebuah method abstract hampir mirip dalam mendeklarasikan class normal kecuali itu suatu method abstract yang tidak memiliki tubuh dan kepala sehingga dengan segera diakhiri dengan semicolon(;).

Pengenalan Pemrograman 2 9

Page 203: J.E.N.I - Java

J.E.N.I.

Sebagai contoh:

abstract class SuperHero { String superPowers[]; void setSuperPowers(String superPowers[]) { this.superPowers = superPowers; } void printSuperPowers() { for (int i = 0; i < superPowers.length; i++) { System.out.println(superPowers[i]); } } abstract void displayPower();}

class UnderwaterSuperHero extends SuperHero { void displayPower() { System.out.println("Communicate with sea creatures..."); System.out.println("Fast swimming ability..."); }}

class FlyingSuperHero extends SuperHero { void displayPower() { System.out.println("Fly..."); }}

1.3.13 Interface

Mendeklarasikan sebuah interface pada dasarnya mendeklarasikan sebuah class tetapi sebagai penggantinya menggunakan kata kunci class, kata kunci interface digunakan. Berikut syntaxnya.

<interfaceDeclaration> ::= <modifier> interface <name> { <attributeDeclaration>* [<modifier> <returnType> <name>(<parameter>*);]*

}

Anggotanya adalah public ketika interface dideklarasikan public.

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

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

Page 204: J.E.N.I - Java

J.E.N.I.

Contoh berikut menunjukkan bagaimana mendeklarasikan dan menggunakan sebuah interface.

interface MyInterface { void iMethod();}class MyClass1 implements MyInterface { public void iMethod() { System.out.println("Interface method."); }

void myMethod() { System.out.println("Another method."); }}

class MyClass2 implements MyInterface { public void iMethod() { System.out.println("Another implementation."); }}

class InterfaceDemo { public static void main(String args[]) { MyClass1 mc1 = new MyClass1(); MyClass2 mc2 = new MyClass2();

mc1.iMethod(); mc1.myMethod(); mc2.iMethod(); }}

1.3.14 Kata kunci this

Kata kunci this dapat digunakan untuk beberapa alasan berikut:1. Adanya ambigu pada atribut lokal dari variabel lokal2. Menunjuk pada object yang meminta method non-static3. Menunjuk pada konstruktor lain.

Sebagai contoh pada maksud pertama, perhatikan kode berikut dimana variabel data disediakan sebagai sebuah atribut dan parameter lokal pada saat yang sama.

class ThisDemo1 { int data; void method(int data) { this.data = data; /* this.data menunjuk ke atribut sementara data menunjuk ke variabel lokal */ }

}

Pengenalan Pemrograman 2 11

Page 205: J.E.N.I - Java

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

Petunjuk Penulisan Program:Memanggil this() harus ada pernyataan pertama dalam konstruktor.

1.3.15 Kata kunci super

Penggunaan kata kunci super berhubungan dengan pewarisan. Super digunakan untuk meminta konstruktor superclass. Super juga dapat digunakan seperti kata kunci this untuk menunjuk pada anggota dari superclass.

Program berikut mendemonstrasikan bagaimana referensi super digunakan untuk memanggil konstruktor superclass.

class Person { String firstName; String lastName; Person(String fname, String lname) { firstName = fname; lastName = lname; }}

class Student extends Person { String studNum; Student(String fname, String lname, String sNum) {

Pengenalan Pemrograman 2 12

Page 206: J.E.N.I - Java

J.E.N.I.

super(fname, lname); studNum = sNum; }

}

Petunjuk Penulisan Program:super() menunjuk pada superclass dengan segera. Ini harus berada pada pernyataan pertama dalam konstruktor superclass.

Kata kunci dapat juga digunakan untuk menunjuk anggota superclass seperti yang ditunjukkan pada contoh berikut.

class Superclass{ int a; void display_a(){ System.out.println("a = " + a); }}

class Subclass extends Superclass { int a; void display_a(){ System.out.println("a = " + a); } void set_super_a(int n){ super.a = n; } void display_super_a(){ super.display_a(); }}

class SuperDemo { public static void main(String args[]){ Superclass SuperObj = new Superclass(); Subclass SubObj = new Subclass(); SuperObj.a = 1; SubObj.a = 2; SubObj.set_super_a(3); SuperObj.display_a(); SubObj.display_a(); SubObj.display_super_a(); System.out.println(SubObj.a); }

}

Program tersebut akan menampilkan hasil berikut.a = 1

a = 2a = 3

2

Pengenalan Pemrograman 2 13

Page 207: J.E.N.I - Java

J.E.N.I.

1.3.16 Kata Kunci static

Kata kunci static dapat digunakan untuk anggota dari sebuah class. Kata kunci ini menyediakan static atau anggota class untuk diakses sama sebelum beberapa instance dari class dibuat.

Variabel class bersifat seperti variabel umum. Ini artinya bahwa variabel dapat diakses oleh semua instance dari class.

Method class mungkin dapat diambil tanpa membuat sebuah object dari class tersebut. Bagaimanapun, mereka hanya dapat mengakses anggota static dari class. Ditambahkan juga, mereka tidak dapat menunjuk this dan super.

Kata kunci static dapat juga diaplikasikan pada blok. Ini dinamakan dengan blok static. Blok ini dieksekusi hanya sekali, ketika class diisi. Hal ini biasanya digunakan untuk menginisialisasi variabel class.

class Demo { static int a = 0; static void staticMethod(int i) { System.out.println(i); } static { //blok static System.out.println("This is a static block."); a += 1; }}

class StaticDemo { public static void main(String args[]) { System.out.println(Demo.a); Demo.staticMethod(5); Demo d = new Demo(); System.out.println(d.a); d.staticMethod(0); Demo e = new Demo(); System.out.println(e.a); d.a += 3; System.out.println(Demo.a+", " +d.a +", " +e.a); }}

Keluaran dari source kode ditunjukkan di bawah ini.

This is a static block.151014, 4, 4

1.3.17 Kata Kunci final

Kata kunci final dapat diaplikasikan pada variabel, method dan class. Untuk mengingat fungsi dari kata kunci, ingat bahwa itu secara mudah dibatasi apa yang kita dapat lakukan dengan variabel, method dan class.

Nilai dari variabel final dapat tidak lama diubah sesudah nilainya telah diatur. Sebagai contoh,

Pengenalan Pemrograman 2 14

Page 208: J.E.N.I - Java

J.E.N.I.

final int data = 10;

Pernyataan berikut akan menyebabkan terjadi compilation error:data++;

Method final tidak dapat di-override dalam class anak.final void myMethod() { //in a parent class

}

myMethod tidak dapat lama di-override dalam class anak.

class final tidak dapat diwariskan tidak seperti class yang biasanya.final public class MyClass {

}

Petunjuk Penulisan Program:Perintah penulisan kata kunci final dan public memungkinkan bertukar tempat.

Pernyataan ini akan menyebabkan kesalahan compilation terjadi karena MyClass dapat tidak lama di-extended.

public WrongClass extends MyClass {}

1.3.18 Inner Classes

Sebuah inner class secara mudah dideklarasikan dalam class lain.

class OuterClass { int data = 5; class InnerClass { int data2 = 10; void method() { System.out.println(data); System.out.println(data2); } } public static void main(String args[]) { OuterClass oc = new OuterClass(); InnerClass ic = oc.new InnerClass(); System.out.println(oc.data); System.out.println(ic.data2); ic.method(); }

}

Untuk mampu mengakses anggota dari inner class, kita butuh sebuah instance dari inner class. Method-method dari inner class dapat secara langsung mengakses anggota dari outer class.

Pengenalan Pemrograman 2 15

Page 209: J.E.N.I - Java

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 : 5Tabel 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

1.4.2 Greatest Common Factor(GCF)

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

Input 1: 25 Input 1: 1 Input 1: 9

Input 2: 15 Input 2: 2 Input 2: 27

Input 3: 35 Input 3: 3 Input 3: 12

GCF: 5 GCF: 1 GCF: 3

1.4.3 Shape

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

1.4.4 Binatang

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

Pengenalan Pemrograman 2 16

Page 210: J.E.N.I - Java

J.E.N.I.

Bab 2Exceptions dan Assertions

2.1 Tujuan

Dasar penanganan exception telah dikenalkan pada anda di kursus pemrograman pertama. Bab ini membahas secara lebih dalam mengenai exception dan juga sedikit menyinggung tentang assertion.

Setelah menyelesaikan pembahasan, anda diharapkan dapat :1. Menangani exception dengan menggunakan try, catch dan finally2. Membedakan penggunaan antara throw dengan throws3. Menggunakan exception class yang berbeda – beda4. Membedakan antara checked exceptions dan unchecked exceptions5. Membuat exception class tersendiri6. Menjelaskan keunggulan penggunaan assertions7. Menggunakan assertions

2.2 Apa itu Exception?

2.2.1Pendahuluan

Bugs dan error dalam sebuah program sangat sering muncul meskipun program tersebut dibuat oleh programmer berkemampuan tinggi. Untuk menghindari pemborosan waktu pada proses error-checking, Java menyediakan mekanisme penanganan exception.

Exception adalah singkatan dari Exceptional Events. Kesalahan (errors) yang terjadi saat runtime, menyebabkan gangguan pada alur eksekusi program. Terdapat beberapa tipe error yang dapat muncul. Sebagai contoh adalah error pembagian 0, mengakses elemen di luar jangkauan sebuah array, input yang tidak benar dan membuka file yang tidak ada.

2.2.2Error dan Exception Classes

Seluruh exceptions adalah subclasses, baik secara langsung maupun tidak langsung, dari sebuah root class Throwable. Kemudian, dalam class ini terdapat dua kategori umum : Error class dan Exception class.

Exception class menunjukkan kondisi yang dapat diterima oleh user program. Umumnya hal tersebut disebabkan oleh beberapa kesalahan pada kode program. Contoh dari exceptions adalah pembagian oleh 0 dan error di luar jangkauan array.

Pengenalan Pemrograman 2 1

Page 211: J.E.N.I - Java

J.E.N.I.

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

2.2.3Sebuah Contoh

Perhatikan contoh program berikut :

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

System.out.println(3/0);System.out.println(“Cetak.”);

}}

Jika kode tersebut dijalankan, akan didapatkan pesan kesalahan sebagai berikut :

Exception in thread "main" java.lang.ArithmeticException: / by zero at DivByZero.main(DivByZero.java:3)

Pesan tersebut menginformasikan tipe exception yang terjadi pada baris dimana exception itu berasal. Inilah aksi default yang terjadi bila terjadi exception yang tidak tertangani. Jika tidak terdapat kode yang menangani exception yang terjadi, aksi default akan bekerja otomatis. Aksi tersebut pertama-tama akan menampilkan deskripsi exception yang terjadi. Kemudian akan ditampilkan stack trace yang mengindentifikasi method dimana exception terjadi. Pada bagian akhir, aksi default tersebut akan menghentikan program secara paksa.

Bagaimana jika anda ingin melakukan penanganan atas exception dengan cara yang berbeda? Untungnya, bahasa pemrograman Java memiliki 3 keywords penting dalam penanganan exception, yaitu try, catch dan finally.

Pengenalan Pemrograman 2 2

Page 212: J.E.N.I - Java

J.E.N.I.

2.3 Menangkap Exception

2.3.1Try - Catch

Seperti yang telah dijelaskan sebelumnya, keyword try, catch dan finally digunakan dalam menangani bermacam tipe exception. 3 Keyword tersebut digunakan bersama, namun finally bersifat opsional. Akan lebih baik jika memfokuskan pada 2 keyword pertama, kemudian membahas finally pada bagian akhir.

Berikut ini adalah penulisan try-catch secara umum :

try {<code to be monitored for exceptions>

} catch (<ExceptionType1> <ObjName>) {<handler if ExceptionType1 occurs>

}...} catch (<ExceptionTypeN> <ObjName>) {

<handler if ExceptionTypeN occurs>}

Petunjuk Penulisan Program :

Blok catch dimulai setelah kurung kurawal dari kode try atau catch terkait. Penulisan kode dalam blok 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 kejadianSystem.out.println(exc);

}System.out.println(“Setelah Exception.”);

}}

Kesalahan pembagian dengan bilangan 0 adalah salah satu contoh dari ArithmethicException. Tipe exception kemudian mengindikasikan klausa catch pada class ini. Program tersebut menangani kesalahan yang terjadi dengan menampilkan deskripsi dari permasalahan.

Pengenalan Pemrograman 2 3

Page 213: J.E.N.I - Java

J.E.N.I.

Output program saat eksekusi akan terlihat sebagai berikut :

java.lang.ArithmeticException: / by zeroAfter 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 4System.out.println(3/den); //baris 5

} catch (ArithmeticException exc) {System.out.println(“Nilai Pembagi 0.”);

} catch (ArrayIndexOutOfBoundsException exc2) {System.out.println(“Missing argument.”);

}System.out.println(“After exception.”);

}}

Pada contoh ini, baris ke-4 akan menghasilkan kesalahan berupa ArrayIndexOutOfBoundsException bilamana seorang user alpa dalam memasukkan argument, sedang baris ke-5 akan menghasilkan kesalahan ArithmethicException jika pengguna memasukkan nilai 0 sebagai sebuah argument.

Pelajari apakah yang akan terjadi terhadap program bila argumen – argumen berikut dimasukkan oleh user :

a) Tidak ada argumentb) 1c) 0

Penggunaan try bersarang diperbolehkan dalam pemrograman Java.

class NestedTryDemo {public static void main(String args[]){try {int a = Integer.parseInt(args[0]);try {int b = Integer.parseInt(args[1]);System.out.println(a/b);

} catch (ArithmeticException e) {System.out.println(“Divide by zero error!");

}} catch (ArrayIndexOutOfBoundsException) {System.out.println(“2 parameters are required!");}

}

Pengenalan Pemrograman 2 4

Page 214: J.E.N.I - Java

J.E.N.I.

}Pelajari apa yang akan terjadi pada program jika argument – argument berikut dimasukkan :

a) Tidak ada argumenb) 15c) 15 3d) 15 0

Kode berikut menggunakan try bersarang tergabung dengan penggunaan method.

class NestedTryDemo2 {static void nestedTry(String args[]) {

try {int a = Integer.parseInt(args[0]);int b = Integer.parseInt(args[1]);System.out.println(a/b);

} catch (ArithmeticException e) {System.out.println("Divide by zero error!");

}}

public static void main(String args[]){try {

nestedTry(args);} catch (ArrayIndexOutOfBoundsException e) {

System.out.println("2 parameters are required!");}

}}

Bagaimana output program tersebut jika diimplementasikan terhadap argument – argument berikut :

a) Tidak ada argumenb) 15c) 15 3d) 15 0

2.3.2Keyword Finally

Saatnya anda mengimplementasikan finally dalam blok try-cacth. Berikut ini cara penggunaan keyword tersebut :

try {<kode monitor exception>

} catch (<ExceptionType1> <ObjName>) {<penanganan jika ExceptionType1 terjadi>

} ...} finally {

<kode yang akan dieksekusi saat blok try berakhir>}

Pengenalan Pemrograman 2 5

Page 215: J.E.N.I - Java

J.E.N.I.

Petunjuk Penulisan Program :

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

Page 216: J.E.N.I - Java

J.E.N.I.

2.4 Melempar Exception

2.4.1Keyword Throw

Disamping menangkap exception, Java juga mengijinkan seorang user untuk melempar sebuah exception. Sintax pelemparan exception cukup sederhana.

throw <exception object>;

Perhatikan contoh berikut ini.

/* Melempar exception jika terjadi kesalahan input */class ThrowDemo {

public static void main(String args[]){String input = “invalid input”;try {

if (input.equals(“invalid input”)) {throw new RuntimeException("throw demo");

} else {System.out.println(input);

}System.out.println("After throwing");} catch (RuntimeException e) {

System.out.println("Exception caught here.");System.out.println(e);

}}

}

2.4.2Keyword Throws

Jika sebuah method dapat menyebabkan sebuah exception namun tidak menangkapnya, maka digunakan keyword throws. Aturan ini hanya berlaku pada checked exception. Anda akan mempelajari lebih lanjut tentang checked exception dan unchecked exception pada bagian selanjutnya, “Kategori Exception”.

Berikut ini penulisan syntax menggunakan keyword throws :

<type> <methodName> (<parameterList>) throws <exceptionList> {<methodBody>

}

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

Pengenalan Pemrograman 2 7

Page 217: J.E.N.I - Java

J.E.N.I.

Contoh berikut ini menunjukkan bahwa method myMethod tidak menangani ClassNotFoundException.

class ThrowingClass {static void myMethod() throws ClassNotFoundException {

throw new ClassNotFoundException ("just a demo");}

}

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

try {ThrowingClass.myMethod();

} catch (ClassNotFoundException e) {System.out.println(e);

}}

}

2.5 Kategori Exception

2.5.1Exception Classes dan Hierarchy

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.

Tabel 1.4. Exception Class Hierarchy

Pengenalan Pemrograman 2 8

Page 218: J.E.N.I - Java

J.E.N.I.

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

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

try {int a = Integer.parseInt(args [0]);int b = Integer.parseInt(args [1]);System.out.println(a/b);

} catch (Exception e) {System.out.println(e);

} catch (ArrayIndexOutOfBoundsException e2) {System.out.println(e2);

}System.out.println("After try-catch-catch.");

}}

Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception class adalah superclass dari ArrayIndexOutOfBoundsException class.

MultipleCatchError.java:9: exception java.lang.ArrayIndexOutOfBoundsException has already been caught } catch (ArrayIndexOutOfBoundsException e2) {

2.5.2Checked dan Unchecked Exceptions

Exception terdiri atas checked dan unchecked exceptions.

Checked exceptions adalah exception yang diperiksa oleh Java compiler. Compiler memeriksa keseluruhan program apakah menangkap atau mendaftar exception yang terjadi dalam sintax throws. Apabila checked exception tidak didaftar ataupun ditangkap, maka compiler error akan ditampilkan.

Tidak seperti checked exceptions, unchecked exceptions tidak berupa compile-time checking dalam penanganan exceptions. Fondasi dasar dari unchecked exception classes adalah Error, RuntimeException dan subclass-nya.

2.5.3User Defined Exceptions

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

Pengenalan Pemrograman 2 9

Page 219: J.E.N.I - Java

J.E.N.I.

permasalahan yang akan diselesaikan. Members dan constructors dapat dimasukkan pada exception class milik anda.

Berikut ini contohnya :

class HateStringException extends RuntimeException{/* Tidak perlu memasukkan member ataupun construktor */

}

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

String input = "invalid input";try {

if (input.equals("invalid input")) {throw new HateStringException();

}System.out.println("String accepted.");

} catch (HateStringException e) {System.out.println("I hate this string: " + input + ".");

}}

}

2.6 Assertions

2.6.1User Defined Exceptions

Assertions mengijinkan programmer untuk menentukan asumsi yang dihadapi. Sebagai contoh, sebuah tanggal dengan area bulan tidak berada antara 1 hingga 12 dapat diputuskan bahwa data tersebut tidak valid. Programmer dapat menentukan bulan harus berada diantara area tersebut. Meskipun hal itu dimungkinkan untuk menggunakan contructor lain untuk mensimulasikan fungsi dari assertions, namun sulit untuk dilakukan karena fitur assertion dapat tidak digunakan. Hal yang menarik dari assertions adalah seorang user memiliki pilihan untuk digunakan atau tidak pada saat runtime.

Assertion dapat diartikan sebagai extensi atas komentar yang menginformasikan pembaca kode bahwa sebagian kondisi harus terpenuhi. Dengan menggunakan assertions, maka tidak perlu untuk membaca keseluruhan kode melalui setiap komentar untuk mencari asumsi yang dibuat dalam kode. Namun, menjalankan program tersebut akan memberitahu anda tentang assertion yang dibuat benar atau salah. Jika assertion tersebut salah, maka AssertionError akan terjadi.

2.6.2Mengaktifkan dan Menonaktifkan Exceptions

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

Pengenalan Pemrograman 2 10

Page 220: J.E.N.I - Java

J.E.N.I.

ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga mereka menyadari bahwa saat menjalankannya, assertion harus dalam keadaan aktif.

Untuk mengkompilasi file yang menggunakan assertions, sebuah tambahan parameter perintah diperlukan seperti yang terlihat dibawah ini :

javac –source 1.4 MyProgram.java

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

java MyProgram

Namun, jika anda ingin mengaktifkan assertions, anda perlu menggunakan parameter –enableassertions atau –ea.

java –enableassertions MyProgram

2.6.3Sintax Assertions

Penulisan assertions memiliki dua bentuk.

Bentuk yang paling sederhana terlihat sebagai berikut :assert <expression1>;

dimana <expression1> adalah kondisi dimana assertion bernilai true.

Bentuk yang lain menggunakan dua ekspresi, berikut ini cara penulisannya :assert <expression1> : <expression2>;

dimana <expression1> adalah kondisi assertion bernilai true dan <expression2> adalah informasi yang membantu pemeriksaan mengapa program mengalami kesalahan.

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

int age = Integer.parseInt(args[0]);assert(age>0);/* jika masukan umur benar (misal, age>0) */if (age >= 18) {

System.out.println(“Congrats! You're an adult! =)”);}

}}

Pengenalan Pemrograman 2 11

Page 221: J.E.N.I - Java

J.E.N.I.

2.7 Latihan

2.7.1 Heksadesimal ke Desimal

Tentukan sebuah angka heksadesimal sebagai input. Konversi angka tersebut menjadi bilangan decimal. Tentukan exception class anda sendiri dan lakukan penanganan jika input dari user bukan berupa bilangan heksadesimal.

2.7.2 Menampilkan Sebuah Berlian

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

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

Pengenalan Pemrograman 2 12

Page 222: J.E.N.I - Java

J.E.N.I.

Bab 3Teknik Pemrograman Lanjut

3.1 Tujuan

Modul ini mengenalkan suatu teknik pemrograman yang lebih tinggi. Dalam bagian ini Anda akan mempelajari rekursif dan tipe data abstrak.

Setelah menyelesaikan pelajaran ini, diharapkan Anda dapat:1. Memahami dan menggunakan rekursif

2. Mengetahui perbedaan antara stacks dan queues

2. Mengimplementasikan suatu implementasi sequensial dari stacks dan queues

3. Mengimplementasikan suatu implementasi linked dari stacks and queues

4. Menggunakan Collection classes yang ada

3.2 Rekursif

3.2.1 Apa yang dimaksud dengan Rekursif?

Rekursif adalah teknik pemecahan masalah yang powerful dan dapat digunakan ketika inti dari masalah terjadi berulang kali. Tentu saja, tipe dari masalah ini dapat dipecahkan mengunakan perkataan berulang-ulang (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.

3.2.2 Rekursif Vs. Iterasi

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.

Menyelesaikan masalah dengan perulangan menggunakan iterasi secara tegas juga digunakan pada struktur kontrol pengulangan. Sementara itu, untuk rekursif, task diulangi dengan memanggil sebuah method pengulangan. Maksud dari hal tersebut adalah untuk menggambarkan sebuah masalah kedalam lingkup yang lebih kecil dari pengulangan itu sendiri. Pertimbangan suatu perhitungan yang faktorial dalam penentuan bilangan bulat. Definisi rekursif dari hal tersebut dapat diuraikan sebagai berikut: factorial(n) = factorial(n-1) * n; factorial(1) = 1. Sebagai contohnya, nilai faktorial dari 2 sama dengan fatorial (1)*2, dimana hasilnya adalah 2. Faktorial dari 3 adalah 6, dimana sama dengan faktorial dari (2)*3.

Pengenalan Pemrograman 2 1

Page 223: J.E.N.I - Java

J.E.N.I.

Gambar 1: Contoh Factorial

Dengan iterasi, proses diakhiri ketika kondisi loop gagal atau salah. Dalam kasus dari penggunaan rekursif, proses yang berakhir dengan kondisi tertentu disebut permasalahan dasar yang telah tercukupi oleh suatu pembatasan kondisi. Permasalahan yang mendasar merupakan kejadian yang paling kecil dari sebuah masalah. Sebagai 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.

3.2.3 Factorials: Contoh

Listing program berikut ini menunjukkan bagaimana menghitung faktorial menggunakan teknik iterasi.

class FactorialIter { static int factorial(int n) { int result = 1; for (int i = n; i > 1; i--) { result *= i; }

Pengenalan Pemrograman 2 2

Page 224: J.E.N.I - Java

J.E.N.I.

return result; } public static void main(String args[]) { int n = Integer.parseInt(args[0]);

System.out.println(factorial(n)); }}

Dibawah ini merupakan listing program yang sama tetapi menggunakan rekursif.

class FactorialRecur { static int factorial(int n) { if (n == 1) { /* The base case */ return 1; } /* Recursive definition; Self-invocation */ return factorial(n-1)*n; } public static void main(String args[]) { int n = Integer.parseInt(args[0]); System.out.println(factorial(n)); }

}

3.2.4 Print n in any Base: Contoh yang lain

Sekarang, 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.

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

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

Pengenalan Pemrograman 2 3

Page 225: J.E.N.I - Java

J.E.N.I.

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

Berikut ini merupakan solusi iterative untuk masalah diatas.

class DecToOthers { public static void main(String args[]) { int num = Integer.parseInt(args[0]); int base = Integer.parseInt(args[1]); printBase(num, base); } static void printBase(int num, int base) { int rem = 1; String digits = "0123456789abcdef"; String result = ""; /* 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

Page 226: J.E.N.I - Java

J.E.N.I.

3.3 Abstract Data Type

3.3.1 Apa yang Dimaksud dengan Abstract Data Type?

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.

Dibawah ini merupakan ilustrasi bagaimana tampilan dari stacks.

n-1

...

6

5 Jayz top

4 KC

3 Jojo

2 Toto

1 Kyla

0 DMX bottom

Tabel 1.2.2: Ilustrasi Stack

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

Page 227: J.E.N.I - Java

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.

Berikut ini merupakan ilustrasi dari bagaimana tampilan dari queue.

0 1 2 3 4 5 6 7 8 9 ... n-1

Eve Jayz KC Jojo Toto Kyla DMX

front

end Insert

Delete

Tabel 1.2.3: Ilustrasi Queue

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

3.3.4 Sequential and Linked Representation

ADTs biasanya dapat diwakilkan menggunakan sequential dan linked representation. Hal ini memudahkan untuk membuat sequential representation dengan menggunakan array. Bagaimanapun juga, masalah dengan menggunakan array adalah pembatasan size, yang membuatnya tidak fleksibel. Dengan menggunakan array, sering terjadi kekurangan atau kelebihan space 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.

Dibandingkan dengan sequential representation, linked representation lebih sedikit rumit tetapi lebih fleksibel. Linked representation menyesuaikan memory yang dibutuhkan oleh user. Penjelasan lebih lanjut pada linked representation akan didiskusikan pada bab berikutnya.

3.3.5 Sequential Representation dari Integer Stack

class SeqStack { int top = -1; /* initially, the stack is empty */ int memSpace[]; /* storage for integers */ int limit; /* size of memSpace */

Pengenalan Pemrograman 2 6

Page 228: J.E.N.I - Java

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

3.3.6 Linked Lists

Sebelum mengimplementasikan linked representation dari stacks, pertama mari kita pelejari bagaimana membuat linked representation. Dalam hal ini, kita akan menggunakan linked lists.

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.

Gambar dibawah ini menunjukkan tampilan dari node.

Pengenalan Pemrograman 2 7

Page 229: J.E.N.I - Java

J.E.N.I.

Gambar 2.6a: Sebuah node

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

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

Berikut ini bagaimana class node diimplementasikan. Class ini dapat digunakan untuk membuat linked list.

class Node { int data; /* 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

Page 230: J.E.N.I - Java

J.E.N.I.

3.3.7 Linked Representation dari Integer Stack

Sekarang Anda telah mempelajari tentang linked list. Maka Anda telah siap untuk menerapkan apa yang telah Anda pelajari untuk implementasi linked representation dari stack.

class DynamicIntStack{ private IntStackNode top; /* head or top of the stack */ class IntStackNode { /* node class */ int data; IntStackNode next; IntStackNode(int n) { data = n; next = null; } }

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

Pengenalan Pemrograman 2 9

Page 231: J.E.N.I - Java

J.E.N.I.

Gambar 1.2.7: Implementasi linked dari stack

3.3.8 Java Collections

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>Set

<interface>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

Page 232: J.E.N.I - Java

J.E.N.I.

mengerti generic types, yang akan didiskusikan pada chapter berikutnya.

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.

Tabel 1.2.8b: Methods dari class Collection

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.

Pada bagian sebelumnya, Anda telah melihat bagaimana mengimplementasikan linked list dengan cara Anda sendiri. Java SDK juga telah menyediakan built-implementation dari linked list untuk kita. LinkedList class berisi methods yang memperbolehkan linked list digunakan seperti stacks, queue atau ADT yang lain. Listing program berikut ini menunjukan bagaimana menggunakan class LinkedList.

Pengenalan Pemrograman 2 11

Page 233: J.E.N.I - Java

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

Page 234: J.E.N.I - Java

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

Gambar 1.2.8: Contoh TreeSet

Pengenalan Pemrograman 2 13

Page 235: J.E.N.I - Java

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 = 2x = 6y = x % y = 6 % 2 = 0x = 2 (FPB)

3.4.2 Sequential Representation dari Integer Queue

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

3.4.3 Linked Representation dari Integer Queue

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

3.4.4 Address Book

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

Pengenalan Pemrograman 2 14

Page 236: J.E.N.I - Java

J.E.N.I.

Bab 5Aplikasi 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.

Setelah menyelesaikan pembahasan ini, Anda diharapkan dapat :

1. Mendapatkan input dari comman-line

2. Mengetahui cara untuk memanipulasi properties dari sistem

3. Membaca standart input

4. Membaca dan menulis file

5.2 Argument Command-Line dan System Properties

Seperti yang telah Anda ketahui pada pembahasan sebelumnya, JAVA mengijinkan user untuk memasukkan data dari command-line. Sebagai contoh, untuk meneruskan argument 1 dan 2 kepada program Java bernama Calculate, anda dapat menuliskan baris berikut pada command prompt

java Calculate 1 2

Pada contoh berikut ini, data 1 disimpan pada variabel args[0], begitu pula dengan data 2 yang disimpan pada args[1]. Sehingga, tujuan dari deklarasi String args[] sebagai sebuah parameter pada method utama menjadi jelas.

Selain melewatkan argument menuju method utama, Anda juga dapat memanipulasi system properties dari command-line.

System properties hampir menyamai environment variables, namun tidak memiliki ketergantungan pada spesifikasi platform yang digunakan. Sebuah property secara sederhana berupa pemetaan antara property name dan value yang dimilikinya. Hal ini ditunjukkan pada Java dalam class Properties. Class System menyediakan sebuah method untuk menentukan system properties yang digunakan, method getProperties yang menghasilkan sebuah object Properties. Class yang sama juga menyediakan method getProperty yang memiliki dua buah bentuk.

Pengenalan Pemrograman 2 1

Page 237: J.E.N.I - Java

J.E.N.I.

public static String getProperty(String key)

Bentuk ini menghasilkan nilai String dari System Properties yang ditunjukkan oleh key yang ditentukan. Jika hasil menunjukkan nilai null, berarti tidak terdapat property dengan key yang ditentukan.

public static String getProperty(String key, String def)

Bentuk ini juga menghasilkan nilai String dari System Properties sesuai key yang ditentukan. Akan menghasilkan nilai def, sebuah nilai default, jika tidak terdapat property dengan key yang sesuai.

Tabel 1.1: getProperty() method dari class System

Kita tidak dapat cukup berhenti pada detail dari system properties, namun dilanjutkan dengan memanipulasi system properties yang digunakan. Jika Anda tertarik mempelajari lebih lanjut tentang system properties, Anda dapat menelusuri dokumentasi API yang disediakan.

Anda dapat menggunakan argument opsional –D pada perintah Java dalam command-line untuk menambahkan property baru.

java -D<name>=value

Sebagai contoh, untuk mengatur system property dengan nama user.home bernilai phillipines, gunakan perintah berikut :

java -Duser.home=philippines

Untuk menampilkan daftar system properties yang tersedia pada sistem Anda, gunakan method getProperties seperti yang ditunjukkan sebagai berikut :

System.getProperties().list(System.out);

Pengenalan Pemrograman 2 2

Page 238: J.E.N.I - Java

J.E.N.I.

5.3 Membaca Standard Input

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

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

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

Method read dari object BufferedReader selanjutnya digunakan untuk membaca nilai input dari perangkat input.

ch=(int)br.read(); //method read menghasilkan nilai integer

Cobalah contoh kode berikut :

import java.io.*;

class FavoriteCharacter {public static void main(String args[]) throws IOException {

System.out.println("Hi, what's your favorite character?");char favChar;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));favChar = (char) br.read();System.out.println(favChar + " is a good choice!");

}}

Jika Anda lebih memilih untuk membaca keseluruhan baris daripada membaca satu karakter tiap waktu, gunakan method readLine :

str = br.readLine();

Pengenalan Pemrograman 2 3

Page 239: J.E.N.I - Java

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

Page 240: J.E.N.I - Java

J.E.N.I.

5.4 Menangani File

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

5.4.1 Membaca sebuah File

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

FileInputStream(String filename)

Constructor tersebut membuat sebuah koneksi terhadap file dimana nama dari file tersebut ditunjukkan sebagai sebuah argument. Exception berupa FileNotFoundException akan muncul jika file tidak ditemukan atau tidak dapat dibuka dan kemudian dibaca.

Setelah membuat sebuah input stream, Anda kemudian dapat menggunakannya untuk membaca sebuah file dengan menggunakan method read. Method read menghasilkan sebuah nilai integer, dan akan menunjukkan nilai 1 jika telah mencapai batas akhir file.

Pengenalan Pemrograman 2 5

Page 241: J.E.N.I - Java

J.E.N.I.

Berikut ini contohnya :

import java.io.*;

class ReadFile {public static void main(String args[]) throws IOException {

System.out.println("What is the name of the file to read from?");String filename;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));filename = br.readLine();System.out.println("Now reading from " + filename + "...");FileInputStream fis = null;try {

fis = new FileInputStream(filename);} catch (FileNotFoundException ex) {

System.out.println("File not found.");}try {

char data;int temp;do {

temp = fis.read();data = (char) temp;

if (temp != -1) {System.out.print(data);

} } while (temp != -1);} catch (IOException ex) {

System.out.println("Problem in reading from the file.");}

}}

5.4.2 Menulis sebuah file

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

FileOutputStream(String filename)

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

Page 242: J.E.N.I - Java

J.E.N.I.

Program berikut menunjukkan contoh penulisan terhadap file :

import java.io.*;

class WriteFile {public static void main(String args[]) throws IOException {

System.out.println("What is the name of the file to be written to?");String filename;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));filename = br.readLine();System.out.println("Enter data to write to " + filename + "...");System.out.println("Type q$ to end.");FileOutputStream fos = null;try {

fos = new FileOutputStream(filename);} catch (FileNotFoundException ex) {

System.out.println("File cannot be opened for writing.");

}try {

boolean done = false;int data;

do {data = br.read();if ((char)data == 'q') {

data = br.read();if ((char)data == '$') {

done = true;} else {

fos.write('q');fos.write(data);

}} else {

fos.write(data);}

} while (!done);} catch (IOException ex) {

System.out.println("Problem in reading from the file.");}

}}

Pengenalan Pemrograman 2 7

Page 243: J.E.N.I - Java

J.E.N.I.

5.5 Latihan

5.5.1 Spasi menjadi Underscore ( _ )

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

Pengenalan Pemrograman 2 8

Page 244: J.E.N.I - Java

J.E.N.I.

Bab 6Algoritma 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.

Setelah menyelesaikan pembahasan pada bagian ini, anda diharapkan mampu :1. Memahami dan menjelaskan algoritma dari insertion sort, selection sort,

merge sort dan quick sort.2. Membuat implementasi pribadi menggunakan algoritma yang ada

6.2 Insertion Sort

Salah satu algoritma sorting yang paling sederhana adalah insertion sort. Ide dari algoritma ini dapat dianalogikan seperti mengurutkan kartu. Penjelasan berikut ini menerangkan bagaimana algoritma insertion sort bekerja dalam pengurutan kartu. Anggaplah anda ingin mengurutkan satu set kartu dari kartu yang bernilai paling kecil hingga yang paling besar. Seluruh kartu diletakkan pada meja, sebutlah meja ini sebagai meja pertama, disusun dari kiri ke kanan dan atas ke bawah. Kemudian kita mempunyai meja yang lain, meja kedua, dimana kartu yang diurutkan akan diletakkan. Ambil kartu pertama yang terletak pada pojok kiri atas meja pertama dan letakkan pada meja kedua. Ambil kartu kedua dari meja pertama, bandingkan dengan kartu yang berada pada meja kedua, kemudian letakkan pada urutan yang sesuai setelah perbandingan. Proses tersebut akan berlangsung hingga seluruh kartu pada meja pertama telah diletakkan berurutan pada meja kedua.

Algoritma insertion sort pada dasarnya memilah data yang akan diurutkan menjadi dua bagian, yang belum diurutkan (meja pertama) dan yang sudah diurutkan (meja kedua). Elemen pertama diambil dari bagian array yang belum diurutkan dan kemudian diletakkan sesuai posisinya pada bagian lain dari array yang telah diurutkan. Langkah ini dilakukan secara berulang hingga tidak ada lagi elemen yang tersisa pada bagian array yang belum diurutkan.

Pengenalan Pemrograman 2 1

Page 245: J.E.N.I - Java

J.E.N.I.

6.2.1Algoritma

void insertionSort(Object array[], int startIdx, int endIdx) {for (int i = startIdx; i < endIdx; i++) {int k = i;for (int j = i + 1; j < endIdx; j++) {

if (((Comparable) array[k]).compareTo(array[j])>0) {k = j;

}}swap(array[i],array[k]);

}}

6.2.2Sebuah Contoh

Data

Mango

Apple

Peach

Orange

Banana

1st Pass

Mango

Apple

Peach

Orange

Banana

2nd Pass

Apple

Mango

Peach

Orange

Banana

3rd Pass

Apple

Mango

Orange

Peach

Banana

4th Pass

Apple

Banana

Mango

Orange

Peach

Gambar 1.1.2: Contoh insertion sort

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

6.3 Selection Sort

Jika anda diminta untuk membuat algoritma sorting tersendiri, anda mungkin akan menemukan sebuah algoritma yang mirip dengan selection sort. Layaknya insertion sort, algoritma ini sangat rapat dan mudah untuk diimplementasikan.

Mari kita kembali menelusuri bagaimana algoritma ini berfungsi terhadap satu paket kartu. Asumsikan bahwa kartu tersebut akan diurutkan secara ascending. Pada awalnya, kartu tersebut akan disusun secara linier pada sebuah meja dari kiri ke kanan, dan dari atas ke bawah. Pilih nilai kartu yang paling rendah, kemudian tukarkan posisi kartu ini dengan kartu yang terletak pada pojok kiri atas meja. Lalu cari kartu dengan nilai paling rendah diantara sisa kartu yang tersedia. Tukarkan kartu yang baru saja terpilih dengan kartu pada posisi kedua. Ulangi langkah – langkah tersebut hingga posisi kedua sebelum posisi terakhir dibandingkan dan dapat digeser dengan kartu yang bernilai lebih rendah.

Pengenalan Pemrograman 2 2

Page 246: J.E.N.I - Java

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.1Algoritma

void selectionSort(Object array[], int startIdx, int endIdx) {int min;for (int i = startIdx; i < endIdx; i++) {

min = i;for (int j = i + 1; j < endIdx; j++) {

if (((Comparable)array[min]).compareTo(array[j])>0) {min = j;

}}

swap(array[min], array[i]);}

}

6.3.2Sebuah Contoh

Data

Maricar

Vanessa

Margaux

Hannah

Rowena

1st Pass

Hannah

Vanessa

Margaux

Maricar

Rowena

2nd Pass

Hannah

Margaux

Vanessa

Maricar

Rowena

3rd Pass

Hannah

Margaux

Maricar

Vanessa

Rowena

4th Pass

Hannah

Margaux

Maricar

Rowena

Vanessa

Figure 1.2.2: Contoh selection sort

6.4 Merge Sort

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

6.4.1Pola Divide and Conquer

Beberapa algoritma mengimplementasikan konsep rekursi untuk menyelesaikan permasalahan. Permasalahan utama kemudian dipecah menjadi sub-masalah, kemudian solusi dari sub-masalah akan membimbing menuju solusi permasalahan utama.

Pengenalan Pemrograman 2 3

Page 247: J.E.N.I - Java

J.E.N.I.

Pada setiap tingkatan rekursi, pola tersebut terdiri atas 3 langkah. 1. Divide

Memilah masalah menjadi sub masalah2. Conquer

Selesaikan sub masalah tersebut secara rekursif. Jika sub-masalah tersebut cukup ringkas dan sederhana, pendekatan penyelesaian secara langsung akan lebih efektif

3. KombinasiMengkombinasikan solusi dari sub-masalah, yang akan membimbing menuju penyelesaian atas permasalahan utama

6.4.2Memahami Merge Sort

Seperti yang telah dijelaskan sebelumnya, Merge sort menggunakan pola divide and conquer. Dengan hal ini deskripsi dari algoritma dirumuskan dalam 3 langkah berpola divide-and-conquer. Berikut menjelaskan langkah kerja dari Merge sort.

1. DivideMemilah elemen – elemen dari rangkaian data menjadi dua bagian.

2. ConquerConquer setiap bagian dengan memanggil prosedur merge sort secara rekursif

3. KombinasiMengkombinasikan 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.3Algoritma

void mergeSort(Object array[], int startIdx, int endIdx) {if (array.length != 1) {

//Membagi rangkaian data, rightArr dan leftArrmergeSort(leftArr, startIdx, midIdx);mergeSort(rightArr, midIdx+1, endIdx);combine(leftArr, rightArr);

}}

Pengenalan Pemrograman 2 4

Page 248: J.E.N.I - Java

J.E.N.I.

6.4.4Sebuah Contoh

Rangkaian data:

7 2 5 6

Membagi rangkaian menjadi dua bagian:LeftArr RightArr

27 27 65 65

Membagi LeftArr menjadi dua bagian:LeftArr RightArr

77 22

Mengkombinasikan

2 7

Membagi RightArr menjadi dua bagian:LeftArr RightArr

Mengkombinasikan

5 6

Mengkombinasikan LeftArr dan RightArr.

2 5 6 7

Gambar 1.3.4: Contoh merge sort

6.5 Quicksort

Quicksort ditemukan oleh C.A.R Hoare. Seperti pada merge sort, algoritma ini juga berdasar pada pola divide-and-conquer. Berbeda dengan merge sort, algoritma ini hanya mengikuti langkah – langkah sebagai berikut :

1. DivideMemilah 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

Page 249: J.E.N.I - Java

J.E.N.I.

2. ConquerMengurutkan 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.1Algoritma

void quickSort(Object array[], int leftIdx, int rightIdx) {int pivotIdx;/* Kondisi Terminasi */if (rightIdx > leftIdx) {

pivotIdx = partition(array, leftIdx, rightIdx);quickSort(array, leftIdx, pivotIdx-1);quickSort(array, pivotIdx+1, rightIdx);

}}

6.5.2Sebuah Contoh

Rangkaian data:

3 1 4 1 5 9 2 6 5 3 5 8

Pilih sebuah elemen yang akan menjadi elemen pivot.

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

Tukarkan antara elemen kiri dan kanan

kiri kanan

Pengenalan Pemrograman 2 6

Page 250: J.E.N.I - Java

J.E.N.I.

3 1 3 1 5 9 2 6 5 4 5 8

Geserkan lagi elemen kiri dan kanan.

kiri kanan

3 1 3 1 5 9 2 6 5 4 5 8

Tukarkan antar elemen kembali.

kiri kanan

3 1 3 1 2 9 5 6 5 4 5 8

Geserkan kembali elemen kiri dan kanan.

kanan kiri

3 1 3 1 2 9 5 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

Gambar 1.4.2: Contoh quicksort

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

6.6 Latihan

6.6.1Insertion Sort

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

Pengenalan Pemrograman 2 7

Page 251: J.E.N.I - Java

J.E.N.I.

6.6.2Selection Sort

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

6.6.3Merge Sort

Gunakan implementasi merge sort berikut ini terhadap serangkaian data integer.

class MergeSort {static void mergeSort(int array[], int startIdx, int endIdx) {if(startIdx == _____) {

return;}int length = endIdx-startIdx+1;int mid = _____;mergeSort(array, _____, mid);mergeSort(array, _____, endIdx);int working[] = new int[length];for(int i = 0; i < length; i++) {

working[i] = array[startIdx+i];}int m1 = 0;int m2 = mid-startIdx+1;for(int i = 0; i < length; i++) {

if(m2 <= endIdx-startIdx) {if(m1 <= mid-startIdx) {

if(working[m1] > working[m2]) {array[i+startIdx] = working[m2++];

} else {array[i+startIdx] = _____;

}} else {

array[i+startIdx] = _____;}

} else {array[_____] = working[m1++];

}}

}

public static void main(String args[]) {int numArr[] = new int[args.length];for (int i = 0; i < args.length; i++) {

numArr[i] = Integer.parseInt(args[i]);}mergeSort(numArr, 0, numArr.length-1);for (int i = 0; i < numArr.length; i++) {

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

}}

Pengenalan Pemrograman 2 8

Page 252: J.E.N.I - Java

J.E.N.I.

6.6.4 Quicksort

Gunakan implementasi quicksort berikut ini terhadap serangkaian data integer.

class QuickSort {static void quickSort (int[] array, int startIdx, int endIdx) {

// startIdx adalah index bawah// endIdx is index atas// dari array yang akan diurutkanint i=startIdx, j=endIdx, h;//pilih elemen pertama sebagai pivotint pivot=array[_____];

// memilahdo {

while (array[i]_____pivot) {i++;

}while (array[j]>_____) {

j--;}if (i<=j) {

h=_____;array[i]=_____;array[j]=_____;i++;j--;

}} while (i<=j);

// rekursiif (startIdx<j) {

quickSort(array, _____, j);}if (i<endIdx) {

quickSort(array, _____, endIdx);}

}

public static void main(String args[]) {int numArr[] = new int[args.length];for (int i = 0; i < args.length; i++) {

numArr[i] = Integer.parseInt(args[i]);}quickSort(numArr, 0, numArr.length-1);for (int i = 0; i < numArr.length; i++) {

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

}}

Pengenalan Pemrograman 2 9

Page 253: J.E.N.I - Java

J.E.N.I.

Bab 7Abstract 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.

Setelah menyelesaikan bab ini, Anda diharapkan untuk :1. Memahami persamaan dan perbedaan antara AWT dan Swing2. Perbedaan antara komponen dan kontainer.3. Mendesain aplikasi GUI menggunakan AWT.4. Mendesain aplikasi GUI menggunakan Swing.5. Menjelaskan tentang flow layout, border layout, dan grid layout dalam komponen GUI6. Membuat tampilan yang komplek dalam mendesain aplikasi GUI.

7.2 Abstract Windowing Toolkit (AWT) vs. Swing

The Java Foundation Class (JFC), merupakan bagian penting dari Java SDK, yang termasuk dalam koleksi dari API dimana dapat mempermudah pengembangan aplikasi JAVA GUI. JFC termasuk diantara 5 bagian utama dari API yaitu AWT dan Swing. Tiga bagian yang lainnya dari API adalah Java2D, Accessibility, dan Drag dan Drop. Semua itu membantu pengembang dalam mendesain dan mengimplementasikan aplikasi visual yang lebih baik.

AWT dan Swing menyediakan komponen GUI yang dapat digunakan dalam membuat aplikasi Java dan applet. Anda akan mempelajari applet pada bab berikutnya. Tidak seperti beberapa komponen AWT yang menggunakan native code, keseluruhan Swing ditulis menggunakan bahasa pemrograman Java. Swing menyediakan implementasi platform-independent dimana aplikasi yang dikembangkan dengan platform yang berbeda dapat memiliki tampilan yang sama. Begitu juga dengan AWT menjamin tampilan look and feel pada aplikasi yang dijalankan pada dua mesin yang berbeda menjadi terlihat sama. Swing API dibangun dari beberapa API yang mengimplementasikan beberapa jenis bagian dari AWT. Kesimpulannya, komponen AWT dapat digunakan dengan komponen Swing.

Pengenalan Pemrograman 2 1

Page 254: J.E.N.I - Java

J.E.N.I.

7.3 Komponen GUI pada AWT

7.3.1 Window Classes Fundamental

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

AWT Class Description

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)

Tabel 1.2.1: Kelas kontainer AWT

Untuk mengatur ukuran window, menggunakan metode setSize.void setSize(int width, int height)

mengubah ukuran komponen ini dengan width dan height sebagai parameter.void setSize(Dimension d)

mengubah ukuran dengan d.width dan d.height berdasar pada spesifikasi Dimension d.

Default dari window adalah not visible atau tak tampak hingga Anda mengatur visibility menjadi true. Inilah syntax untuk 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.*;

public class SampleFrame extends Frame {

Pengenalan Pemrograman 2 2

Page 255: J.E.N.I - Java

J.E.N.I.

public static void main(String args[]) { SampleFrame sf = new SampleFrame(); sf.setSize(100, 100); //Coba hilangkan baris ini sf.setVisible(true); //Coba hilangkan baris ini }}

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

7.3.2 Grafik

Beberapa metode grafik ditemukan dalam Graphic class. Dibawah ini adalah daftar dari beberapa metode.

drawLine() drawPolyline() setColor()

fillRect() drawPolygon() getFont()

drawRect() fillPolygon() setFont()

clearRect() getColor() drawString()

Tabel 1.2.2a: Beberapa metode dari kelas Graphics

Hubungan dari kelas ini adalah Color class, dimana memiliki tiga konstruktor.

Constructor Format Description

Color(int r, int g, int b) Nilai integer 0 - 255.

Color(float r, float g, float b) Nilai float 0.0 - 1.0.

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

Red: bits 16-23

Green: bits 8-15

Blue: bits 0-7

Dibawah ini adalah contoh program yang menggunakan beberapa metode di dalam Graphic class.

import java.awt.*;

public class GraphicPanel extends Panel { GraphicPanel() { setBackground(Color.black); //constant in Color class } public void paint(Graphics g) { g.setColor(new Color(0,255,0)); //green g.setFont(new Font("Helvetica",Font.PLAIN,16)); g.drawString("Hello GUI World!", 30, 100); g.setColor(new Color(1.0f,0,0)); //red

Pengenalan Pemrograman 2 3

Page 256: J.E.N.I - Java

J.E.N.I.

g.fillRect(30, 100, 150, 10); } public static void main(String args[]) { Frame f = new Frame("Testing Graphics Panel"); GraphicPanel gp = new GraphicPanel(); f.add(gp); f.setSize(600, 300); f.setVisible(true); }}

Agar panel dapat terlihat atau visible, dia harus diletakkan didalam window yang dapat terlihat seperti sebuah frame.

7.3.3 Beberapa komponen AWT

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

Label Button Choice

TextField Checkbox List

TextArea CheckboxGroup Scrollbar

Tabel 1.2.3: Komponen AWT

Berikut adalah aplikasi membuat sebuah frame dengan kontrol yang telah dimasukkan di dalamnya.

import java.awt.*;

class FrameWControls extends Frame { public static void main(String args[]) { FrameWControls fwc = new FrameWControls(); fwc.setLayout(new FlowLayout()); //more on this later fwc.setSize(600, 600); fwc.add(new Button("Test Me!")); fwc.add(new Label("Labe")); fwc.add(new TextField()); CheckboxGroup cbg = new CheckboxGroup(); fwc.add(new Checkbox("chk1", cbg, true)); fwc.add(new Checkbox("chk2", cbg, false)); fwc.add(new Checkbox("chk3", cbg, false)); List list = new List(3, false); list.add("MTV"); list.add("V"); fwc.add(list); Choice chooser = new Choice(); chooser.add("Avril"); chooser.add("Monica");

Pengenalan Pemrograman 2 4

Page 257: J.E.N.I - Java

J.E.N.I.

chooser.add("Britney"); fwc.add(chooser); fwc.add(new Scrollbar()); fwc.setVisible(true); }}

7.4 Layout Manager

Posisi dan ukuran suatu komponen ditentukan oleh layout manager. Layout manager mengatur tampilan dari komponen di dalam kontainer. Berikut ini beberapa layout manager yang terdapat di dalam Java.

1.FlowLayout2.BorderLayout3.GridLayout4.GridBagLayout5.CardLayout

Layout manager dapat diatur menggunakan metode setLayout dari Container class. Metode ini dapat ditulis sebagai berikut.

void setLayout(LayoutManager mgr)

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.

public void setBounds(int x, int y, int width, int height)

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.

7.4.1 FlowLayout Manager

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

Page 258: J.E.N.I - Java

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.

FlowLayout(int align, int hgap, int vgap)

Membuat objek baru FlowLayout dengan argumen pertama sebagai posisi pada komponen dan hgap untuk horizontal dan vgap untuk vertikal pada komponen

Tabel 1.3.1: Konstruktor FlowLayout

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

1.FlowLayout.LEFT

2.FlowLayout.CENTER

3.FlowLayout.RIGHT

Bagaimanakah output dari program berikut?

import java.awt.*;

class FlowLayoutDemo extends Frame { public static void main(String args[]) { FlowLayoutDemo fld = new FlowLayoutDemo(); fld.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10)); fld.add(new Button("ONE")); fld.add(new Button("TWO")); fld.add(new Button("THREE")); fld.setSize(100, 100); fld.setVisible(true); }}

Gambar berikut adalah contoh dari hasil yang berjalan pada platform Window.

Tabel 13.1: Contoh hasil dalam window

Pengenalan Pemrograman 2 6

Page 259: J.E.N.I - Java

J.E.N.I.

7.4.2.BorderLayout ManagerBorderLayout 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.

BorderLayout(int hgap, int vgap)

Membuat objek BorderLayout baru dengan spasi unit hgap horizontal dan unit vgap vertikal yang diaplikasikan diantara komponen yang berbeda.

Tabel 1.3.2: Konstruktor BorderLayout

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

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

1. BorderLayout.NORTH2. BorderLayout.SOUTH3. BorderLayout.EAST4. BorderLayout.WEST5. BorderLayout.CENTER

Berikut ini adalah contoh program yang menunjukkan bagaimana BorderLayout bekerja.import java.awt.*;

class BorderLayoutDemo extends Frame { public static void main(String args[]) { BorderLayoutDemo bld = new BorderLayoutDemo(); bld.setLayout(new BorderLayout(10, 10)); //may remove bld.add(new Button("NORTH"), BorderLayout.NORTH); bld.add(new Button("SOUTH"), BorderLayout.SOUTH); bld.add(new Button("EAST"), BorderLayout.EAST); bld.add(new Button("WEST"), BorderLayout.WEST); bld.add(new Button("CENTER"), BorderLayout.CENTER); bld.setSize(200, 200); bld.setVisible(true);

Pengenalan Pemrograman 2 7

Page 260: J.E.N.I - Java

J.E.N.I.

}}

Berikut ini adalah hasil dari contoh program tersebut. Gambar kedua menunjukkan efek dari mengubah bentuk dari frame.

Gambar 1.3.2: hasil contoh program

7.4.3 GridLayout Manager

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

Berikut ini adalah daftar dari konstruktor untuk GridLayout class.

Konstruktor GridLayout

GridLayout()

Membuat objek GridLayout baru dengan satu baris dan satu kolom sebagai default

GridLayout(int rows, int cols)

Membuat objek GridLayout baru dengan jumlah baris dan kolom sesuai dengan keinginan

GridLayout(int rows, int cols, int hgap, int vgap)

Membuat objek GridLayout baru dengan jumlah baris dan kolom yang ditentukan. Unit spasi hgap horizontal dan vgap vertikal diaplikasikan ke dalam komponen.

Tabel 1.3.3: Konstruktor GridLayout

Cobalah program ini.

import java.awt.*;

class GridLayoutDemo extends Frame { public static void main(String args[]) { GridLayoutDemo gld = new GridLayoutDemo();

Pengenalan Pemrograman 2 8

Page 261: J.E.N.I - Java

J.E.N.I.

gld.setLayout(new GridLayout(2, 3, 4, 4)); gld.add(new Button("ONE")); gld.add(new Button("TWO")); gld.add(new Button("THREE")); gld.add(new Button("FOUR")); gld.add(new Button("FIVE")); gld.setSize(200, 200); gld.setVisible(true); }}

Berikut ini adalah hasil dari program.

Gambar 1.3.3: hasil contoh program

7.4.4 Panel dan Tampilan kompleks

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

Pengenalan Pemrograman 2 9

Page 262: J.E.N.I - Java

J.E.N.I.

Perhatikan teknik yang digunakan pada contoh berikut.

import java.awt.*;

class ComplexLayout extends Frame { public static void main(String args[]) { ComplexLayout cl = new ComplexLayout(); Panel panelNorth = new Panel(); Panel panelCenter = new Panel(); Panel panelSouth = new Panel(); /* North Panel */ //Panels use FlowLayout by default panelNorth.add(new Button("ONE")); panelNorth.add(new Button("TWO")); panelNorth.add(new Button("THREE")); /* Center Panel */ panelCenter.setLayout(new GridLayout(4,4)); panelCenter.add(new TextField("1st")); panelCenter.add(new TextField("2nd")); panelCenter.add(new TextField("3rd")); panelCenter.add(new TextField("4th")); /* South Panel */ panelSouth.setLayout(new BorderLayout()); panelSouth.add(new Checkbox("Choose me!"), BorderLayout.CENTER); panelSouth.add(new Checkbox("I'm here!"), BorderLayout.EAST); panelSouth.add(new Checkbox("Pick me!"), BorderLayout.WEST); /* Adding the Panels to the Frame container */ //Frames use BorderLayout by default cl.add(panelNorth, BorderLayout.NORTH); cl.add(panelCenter, BorderLayout.CENTER); cl.add(panelSouth, BorderLayout.SOUTH); cl.setSize(300,300); cl.setVisible(true); }

}

Pengenalan Pemrograman 2 10

Page 263: J.E.N.I - Java

J.E.N.I.

Berikut ini adalah hasil dari program.

Gambar 1.3.4: Hasil dari contoh program

7.5 Komponen Swing

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 Swing

Penjelasan

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

Page 264: J.E.N.I - Java

J.E.N.I.

Komponen Swing

Penjelasan

JFileChooser Mengijinkan pengguna untuk memilih sebuah file. Korespondensi pada filechooser class dalam package AWT

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.

JPanel Turunan Jcomponent. Kontainer class sederhana tetapi bukan top-level. Korespondensi pada panel class dalam package AWT.

JApplet Turunan dan korepondensi ke Applet class dalam package AWT. Juga sedikit tidak cocok dengan applet class dalam kaitannya dengan menambahkan komponen pada kontainer

JOptionPane Turunan Jcomponent. Disediakan untuk mempermudah menampilkan pop-up kotak dialog.

JDialog Turunan dan korespondensi pada dialog class dalam package AWT. Biasanya digunakan untuk menginformasikan sesuatu kepada pengguna atau prompt pengguna untuk input.

JColorChooser Turunan Jcomponent. Mengijinkan pengguna untuk memilih warna

Tabel 1.4: Beberapa komponen Swing

Untuk daftar yang lengkap dari komponen Swing, Anda dapat melihatnya di dokumentasi API.

7.5.1 Setting Up Top-Level Containers

Seperti disebutkan diatas, top-level containers seperti Jframe dan Japplet dalam Swing sangat tidak cocok dengan AWT. Ini adalah syarat menambahkan komponen ke dalam kontainer. Jika Anda ingin menambahkan langsung sebuah komponen kedalam kontainer sebagai kontainer AWT, pertama-tama Anda telah mendapatkan content pane dari kontainer. Untuk melakukan hal tersebut, Anda akan menggunakan metode getContentPane dari kontainer.

7.5.2 Contoh Jframeimport javax.swing.*;import java.awt.*;

class SwingDemo { JFrame frame; JPanel panel; JTextField textField; JButton button; Container contentPane; void launchFrame() {

Pengenalan Pemrograman 2 12

Page 265: J.E.N.I - Java

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.

Petunjuk penulisan program:Perhatikan penulisan kode yang digunakan pada contoh ini tampak berlawanan dengan contoh untuk AWT. Komponen dideklarasikan sebagai fields, metode launchFrame ditentukan, dinisialisasikan dan penambahan semua komponen dilaksanakan di dalam metode launchFrame. Kita tidak lagi meng-extend Frame class. Keuntungan penggunaan gaya ini akan lebih berguna ketika sampai pada event handling.

Berikut adalah keluaran dari program diatas.

Gambar 1.4.2: Hasil contoh program

7.5.3 Contoh JOptionPane

import javax.swing.*;

class JOptionPaneDemo { JOptionPane optionPane; void launchFrame() { optionPane = new JOptionPane(); String name = optionPane.showInputDialog("Hi, what's your name?"); optionPane.showMessageDialog(null, "Nice to meet you, " + name + ".", "Greeting...", optionPane.PLAIN_MESSAGE);

Pengenalan Pemrograman 2 13

Page 266: J.E.N.I - Java

J.E.N.I.

System.exit(0); } public static void main(String args[]) { new JOptionPaneDemo().launchFrame(); }

}

Lihat, begitu mudahnya memasukkan input dari user.Berikut ini adalah hasil dari contoh program diatas

Gambar 1.4.3: Hasil contoh program

7.6 Latihan7.6.1 Tic-Tac-Toe

Buatlah tampilan GUI untuk program tic-tac-toe. Papannya terdiri dari enam kotak. Ingatlah bahwa Anda akan menambahkan kode ini pada tahap akhir untuk mengatasi interaksi antar pengguna. Jadi, desainlah papan Anda dengan benar. Pastikanlah Anda memilih komponen yang pantas untuk papan tersebut. keluarkan semua sisi artistik Anda. Anda dapat menggunakan AWT atau Swing untuk latihan ini.

Gambar 1.5.1: papan Tic-Tac-Toe

Pengenalan Pemrograman 2 14

Page 267: J.E.N.I - Java

J.E.N.I.

Bab 8

GUI Event Handling

8.1 TujuanPada 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.

Setelah menyelesaikan modul ini, Anda diharapkan mampu:1. Menerangkan komponen-komponen delegation event model 2. Mengerti bagaimana delegation event model bekerja3. Menciptakan aplikasi GUI yang berinteraksi dengan user4. Mendiskusikan manfaat dari class-class adapter 5. Mendiskusikan keuntungan-keuntungan dari menggunakan inner dan anonymous

class

8.2 Delegation Event ModelDelegasi event model menguraikan bagaimana program Anda dapat merespon interaksi dari user. Untuk memahami model, mari kita pelajari pertama-tama dengan tiga komponen utamanya.

1. Event SourceThe 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/HandlerThe 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 ObjectKetika 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

Page 268: J.E.N.I - Java

J.E.N.I.

Di bawah ini adalah delegation event model.

Gambar 8.1: Delegation Event Model

Pada awalnya, sebuah listener seharusnya diregistrasikan dengan sebuah source sehingga dapat menerima informasi tentang event-event yang terjadi pada source tersebut. Hanya listeners yang sudah teregistrasi yang dapat menerima pemberitahuan event-event. Ketika telah teregistrasi, sebuah listener hanya tinggal menunggu sampai event terjadi.

Ketika sesuatu terjadi dengan event source, sebuah event object akan menguraikan event yang diciptakan. Event kemudian ditembak oleh source pada 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

Page 269: J.E.N.I - Java

J.E.N.I.

8.2.1 Registrasi Listeners

Event source mendaftarkan sebuah listener melalui method add<Type>Listener.void add<Type>Listener(<Type>Listener listenerObj)

<Type> tergantung pada tipe dari event source. Dapat berupa Key, Mouse, Focus, Component, Action dan lainnya.Beberapa listeners dapat diregistrasi dengan satu event source untuk menerima pemberitahuan event.

Listener yang telah teregistrasi dapat juga tidak diregistrasikan lagi menggunakan remove<Type>Listener methods.

void remove<Type>Listener(<Type>Listener listenerObj)

8.3 Class-Class Event Sebuah event object mempunyai sebuah class event sebagai tipe data acuannya. Akar dari hirarki class event adalah class EventObject, yang dapat ditemukan pada paket java.util. Immediate subclass dari class EventObject adalah class AWTEvent. Class AWTEvent didefinisikan pada paket java.awt. Itu merupakan akar dari semua AWT-based events. Berikut ini beberapa dari class-class AWT event.

Class Event Deskripsi

ComponentEvent Extends AWTEvent. Dijalankan ketika sebuah komponen dipindahkan, di-resize, dibuat visible atau hidden.

InputEvent Extends ComponentEvent. Abstrak root class event untuk semua komponen-level input class-class event.

ActionEvent Extends AWTEvent. Dijalankan ketika sebuah tombol ditekan, melakukan double-klik daftar item, atau memilih sebuah menu.

ItemEvent Extends AWTEvent. Dijalankan ketika sebuah item dipilih atau di-deselect oleh user, seperti sebuah list atau checkbox.

KeyEvent Extends InputEvent. Dijalankan ketika sebuah key ditekan, dilepas atau diketikkan.

MouseEvent Extends InputEvent. Dijalankan ketika sebuah tombol mouse ditekan, dilepas, atau di-klik (tekan dan lepas), atau ketika sebuah kursor mouse masuk atau keluar dari bagian visible dari komponen.

TextEvent Extends AWTEvent. Dijalankan ketika nilai dari text field atau text area dirubah.

WindowEvent Extends ComponentEvent. Dijalankan sebuah objek Window dibuka, ditutup, diaktifkan, nonaktifkan, iconified, deiconified, atau ketika focus ditransfer kedalam atau keluar window.

Tabel 1.2: Class-Class Event

Catatan, bahwa semua subclass-subclass AWTEvent mengikuti konvensi nama ini:<Type>Event

Pengenalan Pemrograman 2 3

Page 270: J.E.N.I - Java

J.E.N.I.

8.4 Event ListenersEvent listeners adalah class yang mengimplementasikan interfaces <Type>Listener. Tabel di bawah menunjukkan beberapa listener interfaces yang biasanya digunakan.

Event Listeners Deskripsi

ActionListener Bereaksi atas perubahan mouse atau atau keyboard.

MouseListener Bereaksi atas pergerakan mouse.

MouseMotionListener Interface MouseMotionListener mendukung MouseListener. Menyediakan method-method yang akan memantau pergerakan mouse,seperti drag dan pemindahan mouse.

WindowListener Bereaksi atas perubahan window.

Tabel 1.3: Event Listeners

8.4.1 Method ActionListener

Interface ActionListener hanya terdiri dari satu method.

ActionListener Method

public void actionPerformed(ActionEvent e) Mengendalikan ActionEvent e yang terjadi.

Tabel 1.3.1: Method ActionListener

8.4.2 Method MouseListener

Di bawah ini adalah method-method MouseListener yang seharusnya digunakan dalam penerapan class.

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

Tabel 1.3.2: Method-Method MouseListener

Pengenalan Pemrograman 2 4

Page 271: J.E.N.I - Java

J.E.N.I.

8.4.3 Method-Method MouseMotionListener

MouseMotionListener mempunyai dua method untuk diimplementasikan.

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.

Tabel 1.3.3: The MouseMotionListener methods

8.4.4 Method-Method WindowListener

Di bawah ini method-method dari interface WindowListener.

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.

Tabel 1.3.4: Method-Method WindowListener

Pengenalan Pemrograman 2 5

Page 272: J.E.N.I - Java

J.E.N.I.

8.4.5 Petunjuk untuk Menciptakan Aplikasi Handling GUI Events

Berikut ini langkah-langkah yang Anda butuhkan untuk mengingat ketika ingin membuat aplikasi GUI dengan event handling.

1. Buatlah sebuah class yang menguraikan dan 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.

8.4.6 Contoh Mouse Events

import java.awt.*;import java.awt.event.*;

public class MouseEventsDemo extends Frame implements MouseListener, MouseMotionListener { TextField tf; public MouseEventsDemo(String title){ super(title); tf = new TextField(60); addMouseListener(this); } public void launchFrame() { /* Menambah komponen ke frame */ add(tf, BorderLayout.SOUTH); setSize(300,300); setVisible(true); } public void mouseClicked(MouseEvent me) { String msg = "Mouse clicked."; tf.setText(msg); } public void mouseEntered(MouseEvent me) { String msg = "Mouse entered component."; tf.setText(msg); } public void mouseExited(MouseEvent me) { String msg = "Mouse exited component."; tf.setText(msg); } public void mousePressed(MouseEvent me) { String msg = "Mouse pressed."; tf.setText(msg); } public void mouseReleased(MouseEvent me) { String msg = "Mouse released."; tf.setText(msg);

Pengenalan Pemrograman 2 6

Page 273: J.E.N.I - Java

J.E.N.I.

} public void mouseDragged(MouseEvent me) { String msg = "Mouse dragged at " + me.getX() + "," + me.getY(); tf.setText(msg); } public void mouseMoved(MouseEvent me) { String msg = "Mouse moved at " + me.getX() + "," + me.getY(); tf.setText(msg); } public static void main(String args[]) { MouseEventsDemo med = new MouseEventsDemo("Mouse Events Demo"); med.launchFrame(); }}

8.4.7 Contoh Menutup Window

import java.awt.*;import java.awt.event.*;

class CloseFrame extends Frame implements WindowListener { Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(this); } void launchFrame() { setSize(300,300); setVisible(true); } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { }

Pengenalan Pemrograman 2 7

Page 274: J.E.N.I - Java

J.E.N.I.

public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); }}

8.5 Adapter ClassesMenerapkan semua method dari interface yang semuanya akan membutuhkan banyak pekerjaan. Di satu sisi, Anda terkadang lebih sering tertarik menerapkan hanya beberapa method dari interface saja. Untungnya, Java menyediakan untuk kita class- class adapter yang menerapkan semua method dari masing-masing listener interface dengan lebih dari satu method. Implementasi dari method-method semuanya adalah kosong.

8.5.1 Close Window Example

import java.awt.*;import java.awt.event.*;

class CloseFrame extends Frame{ Label label; CFListener w = new CFListener(this); CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(w); } void launchFrame() { setSize(300,300); setVisible(true); } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); }}

class CFListener extends WindowAdapter{ CloseFrame ref; CFListener( CloseFrame ref ){

this.ref = ref;}

public void windowClosing(WindowEvent e) { ref.dispose(); System.exit(1); }}

Pengenalan Pemrograman 2 8

Page 275: J.E.N.I - Java

J.E.N.I.

8.6 Inner Class dan Anonymous Inner ClassBagian ini memberi Anda tinjauan ulang atas konsep yang sudah Anda pelajari di kursus pemrograman pertama. Inner class dan anonymous inner class sangatlah bermanfaat untuk GUI event handling.

8.6.1 Inner Class

Inner class, seperti namanya, adalah sebuah class yang dideklarasikan di dalam class lain. Kegunaan inner classes akan dapat membantu Anda menyederhanakan program, terutama dalam event handling seperti yang ditunjukkan pada contoh.

8.6.2 Contoh Menutup Window import java.awt.*;import java.awt.event.*;

class CloseFrame extends Frame{Label label;

CloseFrame(String title) {super(title);label = new Label("Close the frame.");this.addWindowListener(new CFListener());

}

void launchFrame() {setSize(300,300);setVisible(true);

}

class CFListener extends WindowAdapter {public void windowClosing(WindowEvent e) {

dispose();System.exit(1);

}}

public static void main(String args[]) {CloseFrame cf = new CloseFrame("Close Window

Example");cf.launchFrame();

}}

Pengenalan Pemrograman 2 9

Page 276: J.E.N.I - Java

J.E.N.I.

8.6.3 Anonymous Inner Class

Anonymous inner class adalah inner class yang tanpa nama. Kegunaan dari anonymous inner class akan menyederhanakan kode-kode Anda lebih lanjut. Di bawah ini merupakan modifikasi dari contoh bagian sebelumnya.

8.6.4 Contoh Menutup Window

import java.awt.*;import java.awt.event.*;

class CloseFrame extends Frame{ Label label; CloseFrame(String title) { super(title); label = new Label("Close the frame."); this.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e){ dispose(); System.exit(1);

} });

} void launchFrame() { setSize(300,300); setVisible(true); } public static void main(String args[]) { CloseFrame cf = new CloseFrame("Close Window Example"); cf.launchFrame(); }}

Pengenalan Pemrograman 2 10

Page 277: J.E.N.I - Java

J.E.N.I.

8.7 Latihan

8.7.1 Tic-Tac-Toe

Extend program papan Tic-Tac-Toe yang telah Anda kembangkan sebelumnya dan tambahkan event handlers ke kode tersebut untuk membuat program berfungsi penuh. Permainan Tic-Tac-Toe dimainkan dengan dua pemain. Pemain mengambil giliran mengubah. Setiap giliran, pemain dapat memilih kotak pada papan. Ketika kotak dipilih, kotak ditandai oleh simbol pemain (O dan X biasanya digunakan sebagai simbol). Pemain yang sukses menaklukkan 3 kotak membentuk garis horisontal, vertikal, atau diagonal, memenangkan permainan. Permainan akan berakhir ketika pemain menang atau ketika semua kotak telah terisi.

Gambar 8.2 : Program Tic-Tac-Toe

Pengenalan Pemrograman 2 11

Page 278: J.E.N.I - Java

J.E.N.I.

Bab 9

Threads

9.1 TujuanPada 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.

Setelah menyelesaikan pelajaran ini, Anda diharapkan dapat:1. Mendefiniskan threads2. Mengerti perbedaan state dalam threads3. Mengerti konsep prioritas dalam threads4. Mengetahui bagaimana menggunakan method didalam class Thread 5. Membuat sendiri sebuah thread6. Menggunakan sinkronisasi pada thread yang bekerja bersama-sama dan saling

bergantung satu dengan yang lainya7. Memperbolehkan thread untuk berkomunikasi dengan thread lain yang sedang

berjalan8. Mengerti dan menggunakan kemampuan concurency

9.2 Definisi dan dasar-dasar thread

9.2.1 Definisi Thread

Sebuah thread merupakan sebuah pengontrol aliran program. Untuk lebih mudahnya, bayangkanlah thread sebagai sebuah proses yang akan dieksekusi didalam sebuah program tertentu. Penggunaan sistem operasi modern saat ini telah mendukung kemampuan untuk menjalankan beberapa program. Misalnya, pada saat Anda mengetik sebuah dokumen di komputer Anda dengan menggunakan text editor, dalam waktu yang bersamaan Anda juga dapat mendengarkan musik, dan surfing lewat internet di PC Anda. Sistem operasi yang telah terinstal dalam computer Anda itulah yang memperbolehkan Anda untuk menjalankan multitaskting. Seperti itu juga sebuah program (ibaratkan di PC Anda), ia juga dapat mengeksekusi beberapa proses secara bersama-sama(ibaratkan beberapa aplikasi berbeda yang bekerja pada PC Anda). Sebuah contoh aplikasi adalah HotJava browser yang memperbolehkan Anda untuk browsing terhadap suatu page, bersamaan dengan mendownload object yang lain, misalnya gambar, memainkan animasi, dan juga file audio pada saat yang bersamaan.

Pengenalan Pemrograman 2 1

Page 279: J.E.N.I - Java

J.E.N.I.

Gambar 1.1: Thread

9.2.2 State dari Thread

Sebuah thread memungkinkan untuk memiliki beberapa state:

1. RunningSebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari CPU.

2. Ready to runThread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk melakukannya.

3. ResumedSetelah sebelumnya di block atau diberhentikan sementara, state ini kemudian siap untuk dijalankan.

4. SuspendedSebuah thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk menjalankan thread lain bekerja.

5. BlockedSebuah 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

Page 280: J.E.N.I - Java

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.

9.3 Class Thread

9.3.1 Constructor

Thread memiliki delapan constructor. Marilah kita lihat bersama beberapa constructor tersebut.

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.

Tabel 1.2.1: Constructor dari Thread

Pengenalan Pemrograman 2 3

Page 281: J.E.N.I - Java

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.

Tabel 1.2.2:Konstanta dalam Thread

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

Page 282: J.E.N.I - Java

J.E.N.I.

Thread Methods

public void start()Menyebabkan eksekusi dari thread berlangsung dengan cara memanggil method run.

Tabel 1.2.3: Method-method dari Thread

9.3.4 Sebuah contoh thread

Contoh dari thread pertama Anda adalah sebuah counter yang sederhana.

import javax.swing.*;import java.awt.*;

class CountDownGUI extends JFrame { JLabel label; CountDownGUI(String title) { super(title); label = new JLabel("Start count!"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().add(new Panel(), BorderLayout.WEST); getContentPane().add(label); setSize(300,300); setVisible(true); } void startCount() { try { for (int i = 10; i > 0; i--) { Thread.sleep(1000); label.setText(i + ""); } Thread.sleep(1000); label.setText("Count down complete."); Thread.sleep(1000); } catch (InterruptedException ie) { } label.setText(Thread.currentThread().toString()); } public static void main(String args[]) { CountDownGUI cdg = new CountDownGUI("Count down GUI"); cdg.startCount(); }}

9.4 Membuat ThreadsSebuah thread dapat diciptakan dengan cara menurunkan (extend) class Thread atau dengan mengimplementasikan sebuah interface Runnable.

Pengenalan Pemrograman 2 5

Page 283: J.E.N.I - Java

J.E.N.I.

9.4.1 Menurunkan (extend) class Thread

Contoh berikut ini adalah user akan mendefinisikan sebuah class Thread yang akan menuliskan nama dari sebuah object thread sebanyak 100 kali.

class PrintNameThread extends Thread { PrintNameThread(String name) { super(name);

// menjalankan thread dengan satu kali instantiate start(); } public void run() { String name = getName(); for (int i = 0; i < 100; i++) { System.out.print(name); } }}

class TestThread { public static void main(String args[]) { PrintNameThread pnt1 = new PrintNameThread("A"); PrintNameThread pnt2 = new PrintNameThread("B"); PrintNameThread pnt3 = new PrintNameThread("C"); PrintNameThread pnt4 = new PrintNameThread("D"); }}

Perhatikan bahwa variable reference pnt1, pnt2, pnt3, dan pnt4 hanya digunakan satu kali. Untuk aplikasi ini, variabel yang menunjuk pada tiap thread pada dasarnya tidak dibutuhkan. Anda dapat mengganti body dari main tersebut dengan pernyataan berikut ini:

new PrintNameThread("A"); new PrintNameThread("B"); new PrintNameThread("C"); new PrintNameThread("D");

Program akan memberikan keluaran yang berbeda pada setiap eksekusi. Berikut ini adalah contoh dari keluarannya.

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCDBCD

9.4.2 Mengimplementasikan interface Runnable

Cara lain untuk membuat sendiri sebuah thread adalah dengan mengimplementasikan interface Runnable. Hanya satu method yang dibutuhkan oleh interface Runnable yaitu method run. Bayangkanlah bahwa method run adalah method utama dari thread yang Anda ciptakan.

Contoh dibawah ini hampir sama dengan contoh terakhir yang telah Anda pelajari, tapi

Pengenalan Pemrograman 2 6

Page 284: J.E.N.I - Java

J.E.N.I.

pada contoh ini Anda akan mengimplement interface Runnable.

class PrintNameThread implements Runnable { Thread thread; PrintNameThread(String name) { thread = new Thread(this, name); thread.start(); } public void run() { String name = thread.getName(); for (int i = 0; i < 100; i++) { System.out.print(name); } }}

class TestThread { public static void main(String args[]) { new PrintNameThread("A"); new PrintNameThread("B"); new PrintNameThread("C"); new PrintNameThread("D"); }}

9.4.3 Extend vs Implement

Dari dua cara untuk menciptakan thread seperti diatas, memilih salah satu dari kedua cara tersebut bukanlah sebuah permasalahan. Implement sebuah interface Runnable menyebabkan lebih banyak pekerjaan yang harus dilakukan karena kita harus mendeklarasikan sebuah object Thread dan memanggil method Thread dari object ini. Sedangkan menurunkan (extend) sebuah class Thread, bagaimanapun menyebabkan class Anda tidak dapat menjadi turunan dari class yang lainnya karena Java tidak memperbolehkan adanya multiple inheritance. Sebuah pilihan antara mudah tidaknya untuk diimplementasikan (implement) dan kemungkinan untuk membuat turunan (extend) adalah sesuatu yang harus Anda tentukan sendiri. Perhatikan mana yang lebih penting bagi Anda karena keputusan ada ditangan Anda.

Pengenalan Pemrograman 2 7

Page 285: J.E.N.I - Java

J.E.N.I.

9.4.4 Sebuah contoh penggunaan method join

Sekarang, pada saat Anda telah mempelajari bagaimana membuat sebuah thread, marilah kita lihat bagaimana method join bekerja. Contoh dibawah ini adalah salah satu contoh penggunaan method join tanpa argument. Seperti yang dapat Anda lihat, bahwa method tersebut (yang dipanggil tanpa argumen) akan menyebabkan thread yang sedang bekerja saat ini menungggu sampai thread yang memanggil method ini selesai dieksekusi.

class PrintNameThread implements Runnable { Thread thread; PrintNameThread(String name) { thread = new Thread(this, name); thread.start(); } public void run() { String name = thread.getName(); for (int i = 0; i < 100; i++) { System.out.print(name); } }}

class TestThread { public static void main(String args[]) { PrintNameThread pnt1 = new PrintNameThread("A"); PrintNameThread pnt2 = new PrintNameThread("B"); PrintNameThread pnt3 = new PrintNameThread("C"); PrintNameThread pnt4 = new PrintNameThread("D"); System.out.println("Running threads..."); try { pnt1.thread.join(); pnt2.thread.join(); pnt3.thread.join(); pnt4.thread.join(); } catch (InterruptedException ie) { } System.out.println("Threads killed."); //dicetak terakhir }}

Cobalah untuk 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

Page 286: J.E.N.I - Java

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.

Didalam situasi-situasi tertentu, bagaimanapun sebuah thread yang berjalan bersama-sama kadang-kadang membutuhkan resource atau method dari luar. Oleh karena itu, mereka butuh untuk berkomunikasi satu dengan yan lain sehingga dapat mengetahui status dan aktifitas mereka. Contohnya adalah pada permasalahan produsen-konsumen. Kasus ini membutuhkan dua object utama, yaitu produsen dan konsumen. Kewajiban yang dimiliki oleh produsen adalah untuk membangkitkan nilai atau stream data yang konsumen inginkan.

9.5.1 Sebuah contoh yang tidak disinkronisasi

Marilah kita perhatikan sebuah kode sederhana yang mencetak sebuah string dengan urutan tertentu. Inilah programnya.

class TwoStrings { static void print(String str1, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { } System.out.println(str2); }}

class PrintStringsThread implements Runnable { Thread thread; String str1, str2; PrintStringsThread(String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run() { TwoStrings.print(str1, str2); }}class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); }}

Pengenalan Pemrograman 2 9

Page 287: J.E.N.I - Java

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.

Hello How are Thank you there.you?very much!

Pada saat berjalan, ketiga thread telah mencetak argument string pertama mereka sebelum argument kedua dicetak. Sehingga hasilnya adalah sebuah keluaran yang tidak jelas.

Sebenarnya, pada contoh diatas, tidak menunjukkan permasalahan yang serius. Akan tetapi pada aplikasi yang lain hal ini dapat menimbulkan exception atau permasalahan-permasalahan tertentu.

9.5.2 Mengunci Object

Untuk memastikan bahwa hanya satu thread yang mendapatkan hak akses kedalam method tertentu, Java memperbolehkan penguncian terhadap sebuah object termasuk method-method-nya dengan menggunakan monitor. Object tersebut akan menjalankan sebuah monitor implicit pada saat object dari method sinkronisasi dipanggil. Sekali object tersebut dimonitor, monitor tersebut akan memastikan bahwa tidak ada thread yang akan mengakses object yang sama. Sebagai konsekuensinya, hanya ada satu thread dalam satu waktu yang akan mengeksekusi method dari object tersebut.

Untuk sinkronisasi method, keyword-nya adalah synchronized yang dapat menjadi header dari pendefinisian method. Pada kasus ini dimana Anda tidak dapat memodifikasi source code dari method, Anda dapat mensinkronisasi object dimana method tersebut menjadi anggota. Syntax untuk mensinkronisasi sebuah object adalah sebagai berikut:

synchronized (<object>) { //statements yang akan disinkronisasikan }

Dengan ini, object dari method tersebut hanya dapat dipanggil oleh satu thread pada satu waktu.

9.5.3 Contoh Synchronized Pertama

Dibawah ini adalah kode yang telah dimodifikasi dimana method print dari class TwoStrings saat ini sudah disinkronisasi.

class TwoStrings { synchronized static void print(String str1, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { }

Pengenalan Pemrograman 2 10

Page 288: J.E.N.I - Java

J.E.N.I.

System.out.println(str2); }}

class PrintStringsThread implements Runnable { Thread thread; String str1, str2; PrintStringsThread(String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run() { TwoStrings.print(str1, str2); }}

class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); }}

Program tersebut saat ini memberikan keluaran yang benar.

Hello there.How are you?Thank you very much!

9.5.4 Contoh Synchronized Kedua

Dibawah ini adalah versi yang lain dari kode diatas. Sekali lagi, method print dari class TwoStrings telah disinkronisasi. Akan tetapi selain synchronized keyword diimplementasikan pada method,ia juga diaplikasikan pada object-nya.

class TwoStrings { static void print(String str1, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { } System.out.println(str2); }}

class PrintStringsThread implements Runnable { Thread thread; String str1, str2; TwoStrings ts; PrintStringsThread(String str1, String str2, TwoStrings ts) {

Pengenalan Pemrograman 2 11

Page 289: J.E.N.I - Java

J.E.N.I.

this.str1 = str1; this.str2 = str2; this.ts = ts; thread = new Thread(this); thread.start(); } public void run() { synchronized (ts) { ts.print(str1, str2); } }}

class TestThread { public static void main(String args[]) { TwoStrings ts = new TwoStrings(); new PrintStringsThread("Hello ", "there.", ts); new PrintStringsThread("How are ", "you?", ts); new PrintStringsThread("Thank you ", "very much!", ts); }}

Program ini juga memiliki keluaran pernyataan-pernyataan yang benar.

9.6 Komunikasi antar thread (Interthread)

Pada bagian ini, Anda akan mempelajari mengenai method-method dasar yang digunakan thread untuk berkomunikasi dengan thread lain yang sedang berjalan.

Methods untuk komunikasi Interthread

public final void wait()Menyebabkan thread ini menunggu sampai thread yang lain memanggil notify atau notifyAll method dari object ini. Hal ini dapat menyebabkan InterruptedException.

public final void notify()Membangunkan thread yang telah memanggil method wait dari object yang sama.

public final void notifyAll()Membangunkan semua thread yang telah memanggil method wait dari object yang sama.

Tabel 1.5: Methods untuk komunikasi Interthread

Untuk mendapatkan penjelasan dari method ini, perhatikanlah skenario pelayan-pelanggan. Pada skenario di sebuah restoran, seorang pelayan tidak akan menanyakan ke setiap orang apakah mereka akan memesan atau membutuhkan sesuatu, akan tetapi ia akan menunggu sampai pelanggan datang ke restoran tersebut. Pada saat seseorang datang, hal ini mengindikasikan bahwa ia mempunyai keinginan untuk memesan makanan dari restaurat tersebut. Atau juga bisa kita juga bisa kita nyatakan bahwa pelanggan yang memasuki restaurant mengindikasikan (notify) bahwa pelayan dibutuhkan untuk memberikan pelayanan. Akan tetapi,dalam kondisi sepert ini, seorang

Pengenalan Pemrograman 2 12

Page 290: J.E.N.I - Java

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.

Gambar 1.5: Skenario Pelayan-Pelanggan

9.6.1 Contoh Produsen-Konsumen

Contoh dibawah ini adalah salah satu implementasi dari permasalahan produsen-konsumen. Sebuah kelas yang menyediakan method untuk membangkitkan dan mengurangi nilai dari integer yang dipisahkan dari class Produsen dan Konsumen thread.

Pengenalan Pemrograman 2 13

Page 291: J.E.N.I - Java

J.E.N.I.

class SharedData { int data; synchronized void set(int value) { System.out.println("Generate " + value); data = value; } synchronized int get() { System.out.println("Get " + data); return data; }}

class Producer implements Runnable { SharedData sd; Producer(SharedData sd) { this.sd = sd; new Thread(this, "Producer").start(); } public void run() { for (int i = 0; i < 10; i++) { sd.set((int)(Math.random()*100)); } }}

class Consumer implements Runnable { SharedData sd; Consumer(SharedData sd) { this.sd = sd; new Thread(this, "Consumer").start(); } public void run() { for (int i = 0; i < 10 ; i++) { sd.get(); } }}

class TestProducerConsumer { public static void main(String args[]) throws Exception { SharedData sd = new SharedData(); new Producer(sd); new Consumer(sd); }}

Dibawah ini adalah contoh dari keluaran program :

Generate 8Generate 45Generate 52Generate 65Get 65Generate 23Get 23Generate 49

Pengenalan Pemrograman 2 14

Page 292: J.E.N.I - Java

J.E.N.I.

Get 49Generate 35Get 35Generate 39Get 39Generate 85Get 85Get 85Get 85Generate 35Get 35Get 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 76Get 76Generate 25Get 25Generate 34Get 34Generate 84Get 84Generate 48Get 48Generate 29Get 29Generate 26Get 26Generate 86Get 86Generate 65Get 65Generate 38Get 38Generate 46Get 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

Page 293: J.E.N.I - Java

J.E.N.I.

valueSet = true; notify(); } synchronized int get() { if (!valueSet) { //produsen belum men-set sebuah nilai try { wait(); } catch (InterruptedException ie) { } } System.out.println("Get " + data); valueSet = false; notify(); return data; }}

/* Bagian kode ini tidak ada yang berubah*/class Producer implements Runnable { SharedData sd; Producer(SharedData sd) { this.sd = sd; new Thread(this, "Producer").start(); } public void run() { for (int i = 0; i < 10; i++) { sd.set((int)(Math.random()*100)); } }}

class Consumer implements Runnable { SharedData sd; Consumer(SharedData sd) { this.sd = sd; new Thread(this, "Consumer").start(); } public void run() { for (int i = 0; i < 10 ; i++) { sd.get(); } }}

class TestProducerConsumer { public static void main(String args[]) throws Exception { SharedData sd = new SharedData(); new Producer(sd); new Consumer(sd); }}

Pengenalan Pemrograman 2 16

Page 294: J.E.N.I - Java

J.E.N.I.

9.7 Kemampuan Concurrency Dengan dirilisnya J2SE 5.0, telah tersedia kontrol threading yang baru dan juga tambahan fitur yang disebut concurrency. Fitur baru ini dapat ditemukan didalam package java.util.concurrent. Didalam sub bab ini, ada dua jenis fitur concurrency yang akan dijelaskan.

9.7.1 Interface Executor

Salah satu penambahan fitur mutakhir yang telah dibangun dalam aplikasi multithread adalah framework Executor. Interface ini termasuk didalam package java.util.concurrent, dimana object dari tipe ini akan mengeksekusi tugas-tugas dari Runnable.

Tanpa penggunaan interface ini, kita akan mengeksekusi tugas dari Runnable dengan cara menciptakan instance dari Thread dan memanggil method start dari object Thread. Kode dibawah ini mendemonstrasikan hal tersebut:

new Thread(<aRunnableObject>).start();

Dengan kemampuan dari interface yang baru ini, object Runnable yang telah diberikan akan dieksekusi menggunakan kode berikut ini:

<anExecutorObject>.execute(<aRunnableObject>);

Framework Executor ini berguna untuk aplikasi multithread, karena thread membutuhkan pengaturan dan penumpukan di suatu tempat, sehingga thread bisa saja sangat mahal. Sebagai hasilnya, pembangunan beberapa thread dapat mengakibatkan error pada memori. Salah satu solusi untuk mengatasi hal tersebut adalah dengan pooling thread. Didalam sebuah pooling thread, sebuah thread tidak lagi berhenti sementara akan tetapi ia akan berada dalam antrian didalam sebuah pool, setelah ia selesai melaksanakan tugasnya. Bagaimanapun, mengimplementasikan sebuah skema thread pooling dengan desain yang baik, tidaklah mudah dilakukan. Permasalahan yang lain adalah kesulitan untuk membatalkan atau mematikan sebuah thread.

Framework Executor merupakan salah satu solusi dari permasalahan ini dengan cara mechanic decoupling task submission mengenai bagaimana setiap tugas dijalankan, termasuk detail dari penggunaan thread, penjadwalan, dan sebagainya. Lebih disarankan untuk membuat thread secara eksplisit daripada membuat thread dan menjalankannya lewat method start yang telah diset untuk setiap task. Oleh karena itu lebih disarankan untuk menggunakan potongan kode berikut ini:

Executor <executorName> = <anExecutorObject>;<executorName>.execute(new <RunnableTask1>());<executorName>.execute(new <RunnableTask2>());...

Dikarenakan Executor adalah sebuah interface, ia tidak dapat di-instantiate. Untuk menciptakan sebuah object Executor, ia harus membuat sebuah class yang mengimplementasikan interface ini atau dengan menggunakan factory method yang telah disediakan class Executor. Class ini juga tersedia didalam package yang sama seperti Executor interface. Class Executors juga menyediakan factory method untuk me-manage thread pool sederhana. Berikut ini adalah rangkuman dari beberapa factory

Pengenalan Pemrograman 2 17

Page 295: J.E.N.I - Java

J.E.N.I.

methods: Factory Method dari class Executorpublic 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

Tabel 1.1: Factory Methods didalam class Executor

Pada saat sebuah tugas dari Runnable telah dieksekusi dan diselesaikan dengan control sebuah interface Executor. Untuk memberhentikan thread ini, kita dapat dengan mudah memanggil method shutdown dari interface tersebut seperti berikut ini:

executor.shutdown();

9.7.2 Interface Callable

Ingatlah kembali, bahwa ada dua cara untuk menciptakan sebuah thread. Kita dapat meng-extend sebuah class Thread atau meng-implement sebuah interface Runnable. Untuk menentukan teknik mana yang akan digunakan, kita akan melihat secara spesifik fungsi dari masing-masing teknik dengan cara meng-override method run. Penulisan method tersebut ditunjukkan seperti berikut ini:

public void run()

Kelemahan-kelemahan dari menciptakan thread dengan cara tersebut adalah:1. Method run tidak dapat melakukan pengembalian hasil selama ia memiliki void

sebagai nilai kembaliannya. 2. Method run mewajibkan Anda untuk mengecek setiap exception karena overriding

method tidak dapat menggunakan klausa throws.

Interface Callable pada dasarnya adalah sama dengan interface Runnable tanpa kelemahan-kelemahan yang telah disebutkan diatas. Untuk mendapatkan hasil dari

Pengenalan Pemrograman 2 18

Page 296: J.E.N.I - Java

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.

public MyRunnable implements Runnable { private int result = 0;

public void run() { ... result = someValue; }

/* Hasil dari attribute ini dijaga dari segala sesuatu perubahan yang dilakukan oleh kode-kode lain yang mengakses class ini */

public int getResult() { return result; }}

Tulislah interface Callable, kemudian dapatkanlah hasil sesederhana yang ditampilkan pada contoh dibawah ini.

import java.util.concurrent.*;

public class MyCallable implements Callable { public Integer call() throws java.io.IOException { ... return someValue; }}

Method call memiliki penulisan seperti berikut ini:

V call throws Exception

V adalah sebuah tipe generic yang berarti nilai pengembalian dari pemanggilan method tersebut adalah tipe data reference apapun. Anda akan mempelajari tentang tipe data generic di bab selanjutnya.

Masih ada lagi fitur-fitur concurrency dalam J2SE 5.0. Lihatlah lagi didalam dokumentasi API untuk mendapatkan informasi lebih detail lagi mengenai fitur-fitur yang lain.

Pengenalan Pemrograman 2 19

Page 297: J.E.N.I - Java

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!”.

Gambar 1.6.1: Contoh pergerakan string

Pengenalan Pemrograman 2 20

Page 298: J.E.N.I - Java

J.E.N.I.

Bab 10Jaringan

Java mengijinkan anda untuk mempermudah mengembangkan aplikasi yang mengerjakan berbagai pekerjaan melalui jaringan. Ini adalah suatu cita-cita pembuatan Java yang menjadi salah satu kekuatan Java sejak dibuat dengan internet di dalam cita-cita. Sebelum mempelajari tentang jaringan dalam Java. Pertama-tama anda akan diperkenalkan kepada beberapa konsep dasar jaringan.

Setelah menyelesaikan bab ini, anda diharapkan dapat :1.Mengerti konsep dasar jaringan

● IP addres

● protokol

● ports

● client/server

● socket2.Membuat aplikasi menggunakan paket jaringan Java

● ServerSocket

● Socket

● MulticastSocket

● DatagramPacket

10.1 Konsep dasar jaringan

Jika sebelumnya anda suda mengetahui, internet adalah jaringan global dengan berbagai jenis komputer yang berbeda yang tersambung dalam berbagai jalan. Walaupun terdapat perbedaan dalam software dan hardware yang disambung bersama, hal tersebut sangatlah bagus dimana internet masih berfungsi. Hal ini memungkinkan karena standar komunikasi memiliki ketetapan dan juga keselarasan. Standar ini menjamin kesesuaian dan kekuatan komunikasi diantara luasnya sistem pada internet. Mari kita melihat beberapa standar yang berlaku.

10.1.1 IP AdressPada 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 ProtokolSejak 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

Page 299: J.E.N.I - Java

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 PortSekarang, 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.

10.1.4 Paradigma client/serverParadigma client/server adalah dasar untuk Java networking framework. Tentunya, penetapan ini terdiri dari dua elemen besar, yaitu client dan server. Client adalah mesin yang membutuhkan beberapa jenis informasi sedangkan server adalah mesin yang menyimpan informasi dan menunggu untuk menyampaikannya pada client.

Paradigma ini menjelaskan sebuah skenario sederhana. Tentunya, client terhubung dengan sever dan meminta informasi. Kemudian server mengingat permintaan dan mengembalikan informasi yang tersedia kepada client.

Pengenalan Pemrograman 2 2

Page 300: J.E.N.I - Java

J.E.N.I.

Gambar1.1.4: Client/Server model

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.

10.2 The Java Networking Packagepackage dari java.net menyediakan banyak class yang berguna untuk pengembangan aplikasi jaringan. Untuk daftar lengkap dari class jaringan dan interface, dapat merujuk ke dokumentasi API. Kita akan fokus pada empat class yaitu : ServerSocket, Socket, MulticastSocket, dan DatagramPacket class.

10.2.1 ServerSocket and the Socket class

class ServerSocket menyediakan fungsi-fungsi dasar dari sebuah server. Tabel berikut menjelaskan dua dari empat konstruktor pada ServerSocket class :

Pengenalan Pemrograman 2 3

Page 301: J.E.N.I - Java

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.

ServerSocket(int port, int backlog)

Ketika sebuah server menetapkan suatu port tertentu.Panjang antrian maksimum untuk koneksi yang akan datang berdasarkan pada parameter backlog.

Tabel 1.2.1a: Konstruktor ServerSocket

Berikut adalah beberapa dari class method :

Metode ServerSocket

public Socket accept()

Menyebabkan server untuk menunggu dan mendengarkan dari koneksi client, lalu menerimanya.

public void close()

Menutup socket server. Client tidak dapat lagi terhubung ke server hingga dibuka kembali

public int getLocalPort()

Mengembalikan port dimana socket juga membatasi

public boolean isClosed()

Mendeteksi apakah socket tertutup atau belum

Tabel 1.2.1b: Metode ServerSocket

Contoh yang berhasil melakukan implementasi sebuah server sederhana, dimana sebuah informasi sederhana dikirim oleh client.

import java.net.*;import java.io.*;

public class EchoingServer { public static void main(String [] args) { ServerSocket server = null; Socket client;

try { server = new ServerSocket(1234);

Pengenalan Pemrograman 2 4

Page 302: J.E.N.I - Java

J.E.N.I.

//1234 is an unused port number } catch (IOException ie) { System.out.println("Cannot open socket."); System.exit(1); }

while(true) { try { client = server.accept(); OutputStream clientOut = client.getOutputStream(); PrintWriter pw = new PrintWriter(clientOut, true); InputStream clientIn = client.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)); pw.println(br.readLine()); } catch (IOException ie) { } } }}

Ketika ServerSocket class mengimplementasikan server socket, Socket class mengimplementasikan client socket. Socket class memiliki delapan konstruktor, dua diantaranya siap dipanggil. Langsung saja kita lihat dua konstruktor tersebut.

Konstruktor Socket

Socket(String host, int port)

Membuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada host tertentu.

Socket(InetAddress address, int port)

Membuat sebuah socket client dimana dihubungkan dengan diberikan nomor port pada alamat IP tertentu.

Tabel 1.2.1c: Konstruktor Socket

Berikut adalah beberapa dari class method :

Metode Socket

public void close()

Menutup socket client

public InputStream getInputStream()

Menerima kembali input stream yang berhubungan dengan socket ini.

public OutputStream getOutputStream()

Menerima kembali output stream yang berhubungan dengan socket ini.

public InetAddress getInetAddress()

Pengenalan Pemrograman 2 5

Page 303: J.E.N.I - Java

J.E.N.I.

Metode Socket

Mengembalikan alamat IP kepada socket ini pada saat masih terhubung.

public int getPort()

Mengembalikan remote port kepada socket ini pada saat masih terhubung.

public boolean isClosed()

Mendeteksi apakah socket telah tertutup atau tidak

Tabel 1.2.1d: Metode Socket

Contoh yang berhasil melakukan implementasi sebuah client sederhana, dimana mengirim data kepada server.

import java.io.*;import java.net.*;

public class MyClient { public static void main(String args[]) { try { //Socket client = new Socket("133.0.0.1", 1234); Socket client = new Socket(InetAddress.getLocalHost(), 1234); InputStream clientIn = client.getInputStream(); OutputStream clientOut = client.getOutputStream(); PrintWriter pw = new PrintWriter(clientOut, true); BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Type a message for the server: "); pw.println(stdIn.readLine()); System.out.println("Server message: "); System.out.println(br.readLine()); pw.close(); br.close(); client.close(); } catch (ConnectException ce) { System.out.println("Cannot connect to the server."); } catch (IOException ie) { System.out.println("I/O Error."); } }}

10.2.2 MulticastSocket dan DatagramPacket classclass MulticastSocket sangat berguna untuk aplikasi yang mengimplementasikan komunikasi secara berkelompok. Alamat IP untuk kelompok multicast berkisar diantara 224.0.0.0 hingga 239.255.255.255. Meskipun begitu, alamat 224.0.0.0 telah dipesan dan seharusnya tidak digunakan. class ini memiliki tiga konstruktor tetapi kita akan membahas satu dari ketiga konstruktor ini.

Pengenalan Pemrograman 2 6

Page 304: J.E.N.I - Java

J.E.N.I.

Konstruktor MulticastSocket

MulticastSocket(int port)

Membuat multicast socket dibatasi dengan pemberian nomor port

Tabel 1.2.2a: Konstruktor MulticastSocket

Tabel berikutnya memberikan penjelasan beberapa metode MulticastSocket.

Metode MulticastSocket

public void joinGroup(InetAddress mcastaddr)

Bergabung dengan kelompok multicast pada alamat tertentu

public void leaveGroup(InetAddress mcastaddr)

Meninggalkan kelompok multicast pada alamat tertentu

public void send(DatagramPacket p)

Metode turunan dari class DatagramSocket. Mengirim p dari socket ini.

Tabel 1.2.2b: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

DatagramPacket(byte[] buf, int length)

Konstruktor dari datagramPacket untuk menerima paket dengan panjang length. Seharusnya kurang dari atau sama dengan ukuran dari buffer buf.

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

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

Page 305: J.E.N.I - Java

J.E.N.I.

Berikut adalah beberapa metode menarik dari class DatagramPacket.

Metode DatagramPacket

public byte[] getData()

Mengembalikan buffer dimana data telah disimpan

public InetAddress getAddress()

Mengembalikan alamat IP mesin dimana paket yang dikirim atau yang diterima

public int getLength()

Mengembalikan panjang data yang dikirim atau diterima

public int getPort()

Mengembalikan nomor port pada remote host dimana paket yang dikirim atau yang diterima

Table 1.2.2d: Metode DatagramPacket

Contoh multicast kita juga mengandung dua class, server dan client. Server menerima pesan dari client dan mencetak pesan tersebut.

Berikut adalah class server

import java.net.*;

public class ChatServer { public static void main(String args[]) throws Exception { MulticastSocket server = new MulticastSocket(1234); InetAddress group = InetAddress.getByName("234.5.6.7"); //getByName – Mengembalikan alamat IP yang diberikan oleh Host server.joinGroup(group); boolean infinite = true; /* Server terus-menerus menerima data dan mencetak mereka */ while(infinite) { byte buf[] = new byte[1024]; DatagramPacket data = new DatagramPacket(buf, buf.length); server.receive(data); String msg = new String(data.getData()).trim(); System.out.println(msg); } server.close(); }}

Berikut adalah class client

import java.net.*;import java.io.*;

public class ChatClient { public static void main(String args[]) throws Exception { MulticastSocket chat = new MulticastSocket(1234);

Pengenalan Pemrograman 2 8

Page 306: J.E.N.I - Java

J.E.N.I.

InetAddress group = InetAddress.getByName("234.5.6.7"); chat.joinGroup(group); String msg = ""; System.out.println("Type a message for the server:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); msg = br.readLine(); DatagramPacket data = new DatagramPacket(msg.getBytes(),

0, msg.length(), group, 1234); chat.send(data); chat.close(); }

}

10.3 Latihan

10.3.1 Trivia ServerBuatlah sebuah server yang berisi satu set pertanyaan yang mudah. Secara sederhana, akan ada sekitar 5-10 pertanyaan.

Client yang terhubung ke server mengirim sebuah permintaan untuk sebuah pertanyaan atau jawaban sebuah pertanyaan, Client mengirim pesan “permintaan”. Untuk jawaban dari sebuah pertanyaan, client mengirim pesan “jawaban”. Ketika menerima pesan “permintaan”, secara acak server akan memilih satu pertanyaan dari koleksi yang ada. Dia mengirimkan pertanyaan yang dipilih sesuai dengan nomor yang bersangkutan kepada client.

Ketika server menerima pesan “jawaban” dari client, dia menginformasikan user bahwa user perlu mengirimkan jawaban sesuai dengan nomor pertanyaan kepada server. Jawaban itu harus dalam format <no pertanyaan>#<jawaban anda>.

Berikut adalah contoh skenario :Client: "permintaan"Server: "3#Siapa pembuat Java?"Client: "jawaban"Server: "Berikan jawabanmu dengan format: <nomor pertanyaanr>#<jawaban anda>"Client: "3#James Gosling"Server: Kerja yang bagus!...

Pengenalan Pemrograman 2 9

Page 307: J.E.N.I - Java

J.E.N.I.

Bab 11

Applet

11.1TujuanApplets adalah satu dari fitur yang paling menarik dalam java. Applet merupakan program yang Anda jalankan melalui web browser. Anda akan belajar tentang membentuk applet pada pembelajaran ini.

Setelah melengkapi pembelajaran ini, anda harus dapat :

1. mendefinisikan apa yang dimaksud dengan applet

2. Membentuk applet anda sendiri

3. Mengetahui siklus yang terdapat pada applet

• init • start • stop • destroy

4. menggunakan methods applet yang lain

• paint

• showStatus

• Methods untuk memainkan sebuah audio clip

5. Memahami html tag pada applet

11.2 Membentuk AppletsSebuah applet adalah tipe yang spesial dari program java yang dieksekusi melalui internet. Secara khusus berjalan pada suatu web browser seperti Netscape Navigator, Mozilla, atau Microsoft Internet Explorer. Bagaimanapun, jika dibandingkan dengan aplikasi Java yang normal, tidak diijinkan mengakses applet pada komputer yang mana dijalankan untuk alasan keamanan. Applet ini cukup terbatas jika dibandingkan dengan aplikasi java.

Pada module ini, Anda akan mempelajari tentang membuat applet menggunakan AWT.

11.2.1 Hello World Applet

Class Applet adalah sebuah subclass dari class Panel yang didefinisikan dalam AWT. Jalan terbaik untuk memahami bagaimana untuk membentuk Applet adalah dengan contoh. Jadi, berikut ini adalah contoh applet sederhana yang menampilkan "Hello world!".

import java.awt.*;

Pengenalan Pemrograman 2 1

Page 308: J.E.N.I - Java

J.E.N.I.

import java.applet.*;/* masukkan bagian ini dalam kode html <applet code="AppletDemo" width=300 height=100> </applet>*/

public class AppletDemo extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 80, 25); }}

Setelah proses kompilasi, usahakan 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 <java filename>

Sebagai contoh, untuk menjalankan contoh applet yang dijalankan , menggunakan:

appletviewer AppletDemo.java

Tag HTML pada contoh yang diberikan mengindikasikan bahwa sebuah applet dibuat dengan lebar 300 pixel dan tinggi 100 pixel. kemudian, method drawString menggambar string "Hello world!" pada posisi pixel (80,25) menghitung kebawah dari bagian kanan.

Gambar 1.1.1: contoh Applet

Ketika membuat sebuah applet, 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

Page 309: J.E.N.I - Java

J.E.N.I.

11.3 Method-Method Applet Bagian ini membahas methods applet yang akan Anda temukan manfaatnya.

11.3.1 Siklus Applet (The Applet Life Cycle)

Bahkan untuk memulai eksekusi pada main method seperti dalam aplikasi khas Java, browser atau applet viewer berhubungan dengan applet melalui method-method berikut :

1. init()init adalah method yang dipanggil pertama kali. 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

Page 310: J.E.N.I - Java

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>*/

class LifeCycleDemo extends Applet { String msg =""; public void init() { msg += "initializing... "; repaint(); } public void start() { msg += "starting... "; repaint(); } public void stop() { msg += "stopping... "; repaint(); } public void destroy() { msg += "preparing for unloading..."; repaint(); } public void paint(Graphics g) { g.drawString(msg, 15, 15); }}

Contoh dokumen html berikut tergabung dalam applet LifeCycleDemo .

<HTML><TITLE>Life Cycle Demo</TITLE> <applet code="LifeCycleDemo" width=300 height=100> </applet></HTML>

Pengenalan Pemrograman 2 4

Page 311: J.E.N.I - Java

J.E.N.I.

11.3.2 Method paint

Method lain yang tidak kalah penting adalah method paint, yang mana class Applet menurunkannya dari class induknya yaitu class Component, Yang meminta output applet setiap waktu yang diperlukan untuk dapat digambar kembali. Sebagai contoh dari setiap instance adalah ketika sebuah applet tersembunyi oleh window lain dapat dibuat terlihat lagi. Method ini selalu menolak ketika anda ingin membuat bagaimana applet yang Anda buat harus terlihat seperti yag anda inginkan. Pada contoh Hello World, applet memiliki string "Hello world!"pada background setelah menolak method paint.

11.3.3 ShowStatus Method

Applet memiliki window status, dimana memberi informasi kepada Anda tentang apa yang sebenarnya dilakukan applet. Jika anda ingin memberi output ke window status, secara sederhana memanggil method showStatus.Contoh berikut ini sama seperti contoh Hello World tapi dengan pernyataan tambahan yang memodifikasi isi dari window status.

import java.awt.*;import java.applet.*;/* <applet code="AppletDemo" width=300 height=100> </applet>*/

public class AppletDemo extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 80, 25); showStatus("This is an important information."); }}

Berikut ini adalah contoh hasil outputnya:

Gambar 1.2.3: contoh showStatus()

Pengenalan Pemrograman 2 5

Page 312: J.E.N.I - Java

J.E.N.I.

11.3.4 Memainkan Audio Clips

Applets juga menyediakan layanan melalui adanya suatu method yang memungkinkan Anda untuk memainkan file audio. Memainkan audio clips dalam sebuah applet melibatkan dua langkah dasar :

1. Dapatkan audio clip menggunakan method getAudioClip.2. Untuk memainkan audio clip, menggunakan method play atau loop pada object audio

clip. play memungkinkan Anda untuk memainkan audio satu kali mengingat loop berulang pada audio clip dan berhenti hanya ketika method stop dipanggil.

Contoh berikutnya memainkan file audio secara terus-menerus hingga method stop applet dipanggil.

import java.awt.*;import java.applet.*;/* <applet code="AudioApplet" width=300 height=100> </applet>*/

public class AudioApplet extends Applet { AudioClip ac; public void init() { try { /*audio clip tersimpan dalam direktori yang sama seperti kode javanya*/ /* spaceMusic telah terdownload dari java.sun.com */ ac = getAudioClip(getCodeBase(), "spaceMusic.au"); ac.loop(); } catch (Exception e) { System.out.println(e); } } public void stop() { ac.stop(); } public void paint(Graphics g) { g.drawString("Playing space music!", 80, 25); }}

Pengenalan Pemrograman 2 6

Page 313: J.E.N.I - Java

J.E.N.I.

11.4 Applet HTML TagsDalam contoh terdahulu, Anda sudah melihat bagaimana applet HTML tags digunakan dalam dokumen HTML atau source code java. Sekarang, Anda akan dikenalkan pada versi applet HTML tags yang lebih lengkap.

<APPLET [CODEBASE = codebaseURL] CODE = appletFile [ATL = alternateText] [NAME = appletInstanceName] WIDTH = widthInPixels HEIGHT = heightInPixels [ALIGN = alignment] [VSPACE = vspaceInPixels] [HSPACE = hspaceInPixels]>[<PARAM NAME = parameterName1 VALUE = parameterValue1>][<PARAM NAME = parameterName2 VALUE = parameterValue2>]...[<PARAM NAME = parameterNamen VALUE = parameterValuen>][HTML that will be dsiplayed in the absence of Java]</APPLET>

Kata kunci Applet HTML Tag

CODEBASEDirectory dimana class applet diletakkan. Untuk dokumen HTML, directory URL sesuai dengan setting awalnya/defaultnya.

CODENama file yang berisi kode applet applet. Dengan atau tanpa nama ekstensi .java atau .class .

ALTText ditampilkan jika browser mengerti applet tags tapi applet tidak dapat dieksekusi secara langsung. Mungkin terjadi jika Javanya disabled.

NAMENama dari applet. Digunakan untuk mwmungkinkan applets yang lain untuk berkomunikasi dengan applet ini dengan menunjukkan suatu applet berdasarkan namanya.

WIDTH, HEIGHTWidth dan height dari window applet. Dinyatakan dalam pixel.

ALIGN

Pengenalan Pemrograman 2 7

Page 314: J.E.N.I - Java

J.E.N.I.

Kata kunci Applet HTML Tag

Alignment atau pengaturan posisi dari applet. satu diantara "left", "right", "top", "bottom", "middle", "baseline", "texttop", "absmiddle", atau "absbottom". Peletakan posisi secara Default tergantung pada lingkungan.

"top" – posisi atas dari applet diratakan dengan item tertinggi dalam baris yang ada.

"bottom", baseline – posisi bawah dari applet diratakan dengan bawah dari content lain dalam baris yang sama.

"middle" – tengah dari applet diratakan dengan bawah dari content yang lain dalam baris yang sama.

"texttop" – posisi atas dari applet diratakan dengan posisi atas dari applet diratakan dengan posisi tertinggi dari posisi atas pada baris yang sama.

"absmiddle" – tengah dari applet diratakan dengan vertical middle dari content lain pada baris yang sama.

"absbottom" – posisi bawah dari applet diratakan dengan posisi bawah dari content lain dalam baris yang sama.

VSPACE, HSPACESpasi diatas dan dibawah (VSPACE) dan pada sisi (HSPACE) dari applet..

PARAM NAME, VALUEUntuk mengelompokkan parameter yang dapat menampilkan applet; applet dapat meminta method getParameter(String paramName).

Table 1.3: Applet HTML Tags

Contoh dibawah ini mendemokan bagaimana untuk mengakses parameter tertentu pada HTML tag.

import java.awt.*;import java.applet.*;/* <applet code="ParamDemo" width=300 height=100> <param name="myParam" value="Hello world!"> </applet>*/

public class ParamDemo extends Applet { public void paint(Graphics g) { g.drawString(getParameter("myParam"), 80, 25); }}

Output dari program ini hanya sama seprti applet Hello World.

Pengenalan Pemrograman 2 8

Page 315: J.E.N.I - Java

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

Page 316: J.E.N.I - Java

J.E.N.I.

Bab 12

Stream I/O Lanjut

12.1 Tujuan

Dalam module sebelumnya, Anda telah mempelajari bagaimana untuk mendapatkan input user dan memanipulasi file-file menggunakan strea. Kini Anda akan mempelajari lebih banyak tentang stream dan class-class stream yang lain.

Setelah melengkapi pembahasan ini, Anda harus dapat :

1. Tahu tipe-tipe stream yang umum digunakan2. Menggunakan class File dan methodnya

• Karakter dan Stream byte• Input dan Output Streams• Node dan Filter Streams

3. Menggunakan class-class Input/Output yang berbeda• Reader • Writer • InputStream • OutputStream

4. Memahami konsep dari stream chaining5. Mendefinisikan serialisasi6. Memahami penggunaan dari kata kunci transient 7. Menulis dan membaca dari sebuah object stream

12.2 Tipe-Tipe Stream yang Umum Digunakan

12.2.1 Stream Karakter dan Byte

Seperti yang elah disebutkan sebelumnya, secara umum ada dua tipe dari stream, yaitu stream karakter dan byte. Kita hanya mengulang perbedaan mendasar antara keduanya. Stream byte adalah abstraksi file atau alat untuk data biner sedangkan stream karakter adalah untuk karakter Unicode.

Class InputStream adalah abstraksi class root untuk semua input stream byte sedangkan class OutputStream adalah class root abstraksi dari semua output stream byte. Untuk stream karakter, superclasss yang sesuai dari semua class-class secara berturut-turut adalah class Reader dan the Writer. Kedua class-class ini adalah abstraksi class-class untuk membaca dan menulis stream karakter.

12.2.2 Input dan Output Stream

Stream juga dikategorikan berdasarkan apakah mereka digunakan untuk membaca atau menulis stream.Walaupun ini sudah cukup nyata, izinkan saya untuk mendefinisikan tipe

Pengenalan Pemrograman 2 1

Page 317: J.E.N.I - Java

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

12.2.3 Node dan Stream Filter

Kini package java.io membedakan antara node dan stream filter. Sebuah stream node adalah sebuah stream dengan fungsi dasar berupa fungsi membaca atau menulis dari sebuah lokasi khusus seperti pada disk atau dari jaringan. Tipe-tipe dari stream node terdiri atas file, memory dan jalur data. Stream filter, di lain pihak, diletakkan pada layer stream node diantara threads atau proses untuk menyediakan fungsi tambahan yang tidak dapat ditemukan dalam stream node oleh stream node itu sendiri. Penambahan lapisan pada sebuah stream node disebut dengan stream chaining.

Sesi ini berturut-turut mempunyai sebuah tujuan dariclass-class stream yang berbeda. Untuk melengkapi daftar dari class-class ini, silahkan melihat dokumentasi Java's API.

Pengenalan Pemrograman 2 2

Page 318: J.E.N.I - Java

J.E.N.I.

12.3 Class FileWalaupun class File bukan merupakan class stream, ini sesuatu yag penting bahwa kita mempelajari ini sejak class-class stream merupakan file-file yang telah dimanipulasi. Class adalah sebuah perwakilan dari abstraksi dari file-file nyata dan nama path direktori.

Untuk meng-instantiate sebuah object File, Anda dapat menggunakan constructor berikut ini:

Sebuah Constructor File

File(String pathname) Instantiate sebuah object File dengan nama path khusus sebagai nama filenya. Nama filenya mungkin salah satu menjadi penuh( sebagai contoh, isi dengan path yang lengkap) atau mungkin terdiri atas namafile itu sendiri dan diasumsikan menjadi diisi dalam direktori tersebut.

Table 1.2a: File constructor

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

Page 319: J.E.N.I - Java

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.

Table 1.2a: method-method File

Mari kita melihat bagaimana method ini bekerja berdasarkan contoh berikut ini :

import java.io.*;

public class FileInfoClass { public static void main(String args[]) { String fileName = args[0]; File fn = new File(fileName); System.out.println("Name: " + fn.getName()); if (!fn.exists()) { System.out.println(fileName + " does not exists."); /* membuat sebuah temporary directory . */ System.out.println("Creating temp directory..."); fileName = "temp"; fn = new File(fileName); fn.mkdir(); System.out.println(fileName + (fn.exists()? "exists": "does not exist")); System.out.println("Deleting temp directory..."); fn.delete(); System.out.println(fileName + (fn.exists()? "exists": "does not exist")); return; } System.out.println(fileName + " is a " + (fn.isFile()? "file." :"directory.")); if (fn.isDirectory()) { String content[] = fn.list(); System.out.println("The content of this directory:"); for (int i = 0; i < content.length; i++) { System.out.println(content[i]); } } if (!fn.canRead()) { System.out.println(fileName + " is not readable."); return; } System.out.println(fileName + " is " + fn.length() + " bytes long."); System.out.println(fileName + " is " + fn.lastModified() + " bytes long.");

Pengenalan Pemrograman 2 4

Page 320: J.E.N.I - Java

J.E.N.I.

if (!fn.canWrite()) { System.out.println(fileName + " is not writable."); } }}

12.4 Class Reader

Bagian ini menggambarkan stream karakter yang digunakan untuk membaca.

12.4.1 Method Reader

Class Reader terdiri atas beberapa method untuk membaca karakter. berikut ini adalah beberapa method class :

Method Reader

public int read(-) throws IOExceptionSebuah method overload, yang mana memiliki tiga versi. Membaca karakter, segala karakter array atau sebuah porsi untuk sebuah karakter array.

public int read() - membaca sebuah karakter tunggal.

public int read(char[] cbuf)- Membaca karakter dan menyimpannya dalam karakter array cbuf.

public abstract int read(char[] cbuf, int offset, int length)- Membaca karakter sejumlah panjang karakter tertentu dan menyimpannya dalam karakter cbuf dimulai pada tanda offset khusus yang telah ditentukan.

public abstract void close() throws IOExceptionMenutup Stream ini. Memanggil method Reader yang lain setelah menutup stream akan menyebabkan suatu IOException dijalankan.

public void mark(int readAheadLimit) throws IOExceptionMenandai posisi tertentu pada stream. Setelah menandai, panggil untuk melakukan reset() kemudian stream akan mencoba mengatur posisinya kembali pada titik ini. Tidak semua stream input karakter mendukung operasi ini.

public boolean markSupported()mengindikasikan apakah sebuah stream mendukung operasi pemberian tanda (mark) atau tidak Tidak didukung oleh default. Seharusnya bersifat overid subclass.

public void reset() throws IOExceptionReposisi stream ke posisi akhir stream yang telah ditandai

Table 1.3.1: Reader methods

Pengenalan Pemrograman 2 5

Page 321: J.E.N.I - Java

J.E.N.I.

12.4.2 Class Node Reader

Berikut ini adalah beberapa dasar class Reader:

Class-class Node Reader

FileReaderUntuk membaca file-file karakter.

CharArrayReaderMengimplementasikan suatu karakter buffer yang dapat dibaca.

StringReaderUntuk membaca dari sebuah sumber string.

PipedReaderDigunakan untuk pasangan (dengan sebuah PipedWriter yang sesuai) oleh dua urutan yang ingin berkomunikasi. Salah satu dari urutan tersebut membaca karakter dari sumber tertentu.

Table 1.3.2: Class-class Node Reader Classes

12.4.3 Class-Class Filter Reader

Untuk menambah fungsi ke class-class dasar Reader, Anda dapat menggunakan class stream filter. Berikut ini adalah beberapa dari class-class tersebut :

Class-Class Filter Reader

BufferedReadermengizinkan penyimpanan sementara karakteryang bertujuan untuk menyediakan fasilitas pembacaan karakter, arrays, dan bais yang lebih efisien.

FilterReaderUntuk membaca stream karakter yang telah terfilter.

InputStreamReaderMenkonversi pembacaan byte ke bentuk karakter.

LineNumberReaderSebuah subclass dari class BufferedReader yang dapat menjaga memori penyimpanan untuk nomor baris.

PushbackReaderSebuah subclass dari class FilterReader yang memungkinkan karakter dikembalikan atau tidak terbaca oleh stream.

Table 1.3.3: Class-class Filter Reader

Pengenalan Pemrograman 2 6

Page 322: J.E.N.I - Java

J.E.N.I.

12.5 Class-Class WriterSesi ini menggambarkan stream karakter yang digunakan untuk menulis.

12.5.1 Writer Method

Class Writer terdiri atas beberapa method untuk menulis karakter. Berikut ini adalah beberapa method class :

Method Writer

public void write(-) throws IOExceptionSebuah 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 IOExceptionMenutup stream ini setelah flushing beberapa karaktr yang tidak tertulis. Invocation method lain setelah menutup stream ini akan menyebabkan terjadinya IOException.

public abstract void flush()Mengganti stream(yaitu karakter yang disimpan dalam buffer dengan segera ditulis ke tujuan yang dimaksud).

Table 1.4.1: Method Writer

12.5.2 Node Writer Classes

Berikut ini beberapa dasar class Writer:

Node Writer Classes

FileWriterUntuk menulis karakter ke sebuah file.

CharArrayWriterMenggunakan karakter penyangga yang dapat dituliskan juga.

StringWriterUntuk menulis source string

PipedWriter

Pengenalan Pemrograman 2 7

Page 323: J.E.N.I - Java

J.E.N.I.

Node Writer Classes

Digunakan dengan berpasangan(dengan menghubungkan PipedReader) oleh dua thread yang ingin berkomunikasi. Satu dari thread ini menulis karakter ke stream ini.

Table 1.4.2: Node Writer classes

12.5.3 Filter Writer Classes

Untuk menambah fungsionalitas ke dasar class Writer, Anda dapat menggunakan class stream filter.Terdapat beberapa class-class:

Filter Writer Classes

BufferedWriterMenyediakan penyangga karakter bertujuan untuk menyediakan efisiensi penulisan karakter, array, dan garis.

FilterWriterUntuk menulis stream karakter yang difilter.

OutputStreamWriterMengkodekan karakter yang ditulis ke dalam byte.

PrintWriterMencetak representasi yang diformat dari object ke dala stream text-output.

Table 1.4.3: Filter Writer classes

12.6 Contoh Dasar Reader/WriterContoh penggantian menggunakan class FileReader dan FileWriter. Dalam contoh ini, program membaca dari file yang khusus oleh user dan mengkopi isi dari file ke file lain.

import java.io.*;

class CopyFile { void copy(String input, String output) { FileReader reader; FileWriter writer; int data; try { reader = new FileReader(input); writer = new FileWriter(output); while ((data = reader.read()) != -1) { writer.write(data); } reader.close(); writer.close(); } catch (IOException ie) { ie.printStackTrace(); }

Pengenalan Pemrograman 2 8

Page 324: J.E.N.I - Java

J.E.N.I.

}

public static void main(String args[]) { String inputFile = args[0]; String outputFile = args[1]; CopyFile cf = new CopyFile(); cf.copy(inputFile, outputFile); }}

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

12.7 Merubah Contoh Reader/WriterContoh pengganti hampir sama dengan contoh sebelumnya tetapi lebih efisien. Walaupun membaca dan menulis ke stream sekali saja, karakter membaca yang pertama disimpan dalam buffer sebelum penulisan karakter baris per baris. Program menggunakan teknik dari perangkaian stream dimana clas FileReader dan FileWriter didekorasi dengan class BufferedReader dan BufferedWriter, berurutan.

import java.io.*;

class CopyFile { void copy(String input, String output) { BufferedReader reader; BufferedWriter writer; String data; try { reader = new BufferedReader(new FileReader(input)); writer = new BufferedWriter(new FileWriter(output)); while ((data = reader.readLine()) != null) { writer.write(data, 0, data.length()); } reader.close(); writer.close(); } catch (IOException ie) { ie.printStackTrace(); } }

public static void main(String args[]) { String inputFile = args[0]; String outputFile = args[1]; CopyFile cf = new CopyFile(); cf.copy(inputFile, outputFile); }}

Bandingkan kode ini dengan sebelumnya. Apakah hasil dari menjalankan program ini?

Pengenalan Pemrograman 2 9

Page 325: J.E.N.I - Java

J.E.N.I.

12.8 Class InputStreamBagian ini memberikan gambaran perbedaan stream byte yang digunakan membaca.

12.8.1 Method InputStream

Class InputStream terdiri atas beberapa method untuk membaca byte. Beberapa method class:

Method InputStream

public int read(-) throws IOExceptionMethod 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 IOExceptionMenutup stream in. Memanggil method InputStream yang lain setelah menutup streamnya akan menyebabkan sebuah IOException dijalankan.

public void mark(int readAheadLimit) throws IOExceptionMenandai 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 IOExceptionMerubah posisi stream pada posisi akhir yang diberi tanda (mark)

Table 1.7.1: Method InputStream

12.8.2 Class-Class Node InputStream

Berikut ini merupakan beberapaclass-class dasar InputStream :

Class-class Node InputStream

FileInputStreamUntuk membaca baris byte dari sebuah file

BufferedArrayInputStream

Pengenalan Pemrograman 2 10

Page 326: J.E.N.I - Java

J.E.N.I.

Class-class Node InputStream

Mengimplementasikan sebua penimpan sementara yang terdiri atas data byte, yang mungkin dpat dibaca dari streamnya.

PipedInputStreamSeharusnya terhubung ke sebuah PipedOutputStream. Stream ini secara khusus digunakan oleh dua urutan yang didalamnya satu dari urutan tersebut membaca data dari sumber ini sementara urutan yang lain menulis ke PipedOutputStream tujuan.

Table 1.7.2: class-class Node InputStream

12.8.3 Class-class Filter InputStream

Untuk menambah fungsi ke class dasar InputStream, Anda dapat menggunakan class stream filter. Berikut ini adalah beberapa dari class-class tersebut :

Class-class Filter InputStream

BufferedInputStreamSebuah subclass dari FilterInputStream yang memungkinkan penyimpanan input sementara untuk menyediakan pembacaan byte yang lebih efisien.

FilterInputStreamUntuk membaca byte stream yang telah terfilter, yang mungkin memindahkan source dasar dari data sepanjang proses dan menyediakan fungsi tambahan.

ObjectInputStreamDigunakan untuk serialisasi object. Deserialisasi object dan data primitif yang telah tertulis sebelumnya menggunakan sebuahObjectOutputStream.

DataInputStreamSebuah subclass dari FilterInputStream yang memerintahkan sebuah aplikasi membaca data primitif Java dari sebuah input stream dasar dalam sebuah Mesin yang berjalan secara bebas(machine-independent way).

LineNumberInputStreamSebuah subclass FilterInputStream yang memungkinkan pemeriksaan posisi dari nomor baris tertentu.

PushbackInputStreamSebuah subclass dari class FilterInputStream yang memungkinkan byte diproses balik atau tidak dibaca ke bentuk sreamnya.

Table 1.7.3: Class-class Filter InputStream

Pengenalan Pemrograman 2 11

Page 327: J.E.N.I - Java

J.E.N.I.

12.9 Class-Class OutputStreamSesi ini memberikan sebuah pandangan tentang byte stream yang berbeda yang digunakan dalam proses penulisan.

12.9.1 Method OutputStream

Class OutputStream terdiri atas beberapa method untuk menulis data byte. Berikut ini adalah beberapa dari class methodnya :

Method OutputStream

public void write(-) throws IOExceptionSebuah 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 IOExceptionMenutup stream ini dan mengeluarkan beberapa sumber dari sistem digabungkan dengan streamnya. Penggunaan method lain setelah memanggil method ini akan menyebabkan sebuahIOException dijalankan.

public abstract void flush()Mengganti stream (sebagai contoh, data byte tersimpan dalam buffer akan segera ditulis dalam tujuan yang diamksud).

Table 1.8.1: Method OutputStream

12.9.2 Class-Class Node OutputStream

Berikut ini adalah beberapa dari class dasar OutputStream :

Clas-class Node OutputStream

FileOutputStreamUntuk menulis byte ke sebuah file.

BufferedArrayOutputStreamMengimplementasikan sebuah penyimpan sementara berupa byte, yang mana mungkin akan dituliskan ke bentuk streamnya.

PipedOutputStream

Pengenalan Pemrograman 2 12

Page 328: J.E.N.I - Java

J.E.N.I.

Clas-class Node OutputStream

Seharusnya tersambung ke sebuah PipedInputStream. Stream ini secara khusus digunakan oleh dua urutan dimana didalamnya satu dari urutan tersebut menulis data ke bentuk streamnya sementara urutan yang lain membaca dari PipedInputStream tujuan.

Table 1.8.2: Class-class Node OutputStream

12.9.3 Class-Class Filter OutputStream

Untuk menambah fungsi ke class dasar OutputStream, Anda dapat menggunakan class stream filter.berikut ini beberapa dari class tersebut :

Class-Class Filter OutputStream

BufferedOutputStreamSebuah subclass dari FilterOutputStream yang memungkinkan penyimpanan output sementara untuk proses penulisan byte yang lebih efisien. Memungkinkan penulisan byte ke bentuk dasar output stream tanpa menyebabkan diperlukannya pemanggilan dasar sistem untuk setiap penulisan byte.

FilterOutputStreamUntuk menulis stream byte yang telah difilter, yang mana mungkin dipindahkan ke source dasar dari data sepanjang proses dan menyediakan fungsi tambahan.

ObjectOutputStreamDigunakan untuk serialisasi object. Serialisasi object dan data primitif untuk sebuah OutputStream.

DataOutputStreamSebuah subclass dari FilterOutputStream yang menjalankan aplikasi penulisan data primitif ke output stream dasar ke dalam sebuah mesin yang bebas berjalan (machine-independent way).

PrintStream Sebuah subclass dari FilterOutputStream yang menyediakan kemampuan untuk mencetak representasi dari nilai data yang bermacam-macam dengan tepat.

Table 1.8.3: Class-Class Filter OutputStream

Pengenalan Pemrograman 2 13

Page 329: J.E.N.I - Java

J.E.N.I.

12.10 Contoh Dasar InputStream/OutputStreamContoh berikut ini menggunakan class FileInputStream dan FileOutputStream untuk membaca dari sebuah file khusus dan mengcopy isi dari file ini ke file yang lain.

import java.io.*;

class CopyFile { void copy(String input, String output) { FileInputStream inputStr; FileOutputStream outputStr; int data; try { inputStr = new FileInputStream(input); outputStr = new FileOutputStream(output); while ((data = inputStr.read()) != -1) { outputStr.write(data); } inputStr.close(); outputStr.close(); } catch (IOException ie) { ie.printStackTrace(); } }

public static void main(String args[]) { String inputFile = args[0]; String outputFile = args[1]; CopyFile cf = new CopyFile(); cf.copy(inputFile, outputFile); }}

Pengenalan Pemrograman 2 14

Page 330: J.E.N.I - Java

J.E.N.I.

12.11 Contoh Modifikasi InputStream/OutputStream Contoh berikutnya menggunakan class PushbackInputStream yang memanfaatkan sebuah object FileInputStream dan class PrintStream.

import java.io.*;

class CopyFile { void copy(String input) { PushbackInputStream inputStr; PrintStream outputStr; int data; try { inputStr = new PushbackInputStream(new FileInputStream(input)); outputStr = new PrintStream(System.out); while ((data = inputStr.read()) != -1) { outputStr.println("read data: " + (char) data); inputStr.unread(data); data = inputStr.read(); outputStr.println("unread data: " + (char) data); } inputStr.close(); outputStr.close(); } catch (IOException ie) { ie.printStackTrace(); } }

public static void main(String args[]) { String inputFile = args[0]; CopyFile cf = new CopyFile(); cf.copy(inputFile); }}

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

Pengenalan Pemrograman 2 15

Page 331: J.E.N.I - Java

J.E.N.I.

12.12 SerialisasiJava 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.

12.12.1 Kata Kunci transient

Ketika suatu object diserialisasi, tempat hanya disediakan untuk data object. Method dan Constructor bukan merupakan bagian dari stream serialisasi. Ada beberapa object yang tidak diserialisasi kaena data yang diwakilinya berubah secara konstan. Beberapa contoh dari setiap object adalah object FileInputStream dan Object Thread. Sebuah NotSerializableException dijalankan jika operasi serialisasi gagal karena beberapa alasan.

Jangan berputus asa. Sebuah class yang mengandung object yang tidak diserialisasi dapat tetap diserialisasi jika penunjuk ke object non-serialisasi ditandai dengan katakunci transient. Pertimbangkan contoh berikut ini :

class MyClass implements Serializable { transient Thread thread; //try removing transient int data; /* beberapa data yang lain*/}

Kata kunci transient mencagah data dari proses serialisasi. Object instantiasi dari class ini sekarang dapat ditulis ke sebuah OutputStream.

12.12.2 Serialisasi: Menulis Suatu Object Stream

Untuk menulis object ke sebuah stream, Anda perlu menggunakan classObjectOutputStream class dan methodnya yaitu method writeObject. Method writeObject memiliki tanda sebagai berikut :

public final void writeObject(Object obj) throws IOExceptiondimana obj adalah object yang ditulis ke stream.

Pengenalan Pemrograman 2 16

Page 332: J.E.N.I - Java

J.E.N.I.

Contoh dibawah ini menuliskan sebuah object Boolean ke sebuah ObjectOutputStream. Class Boolean mengimplementasikan interface yang dapat di Serialisasi. Selanjutnya, Instantiasi object dari class ini dapat ditulis ke dan dibaca dari sebuah stream.

import java.io.*;

public class SerializeBoolean { SerializeBoolean() { Boolean booleanData = new Boolean("true");

try { FileOutputStream fos = new FileOutputStream("boolean.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(booleanData); oos.close(); } catch (IOException ie) { ie.printStackTrace(); } }

public static void main(String args[]) { SerializeBoolean sb = new SerializeBoolean(); }}

12.12.3 Deserialisasi: Membaca Sebuah Object Stream

Untuk membaca sebuah object dari sebuah stream, Anda perlu menggunakan class ObjectInputStream dan methodnya yaitu method readObject. Method readObject memiliki tanda sebagai berikut :

public final Object readObject() throws IOException, ClassNotFoundException

dimana where obj adalah object yang dibaca dari stream. tipe Object dikembalikan harus melalui proses typecast ke nama class yang sesuai sebelum method pada class tersebut dapat dieksekusi.

Contoh dibawah ini membaca sebuah object Boolean dari sebuah ObjectInputStream. Ini merupakan kesinambungan dari contoh sebelumnya pada serialisasi.

import java.io.*;

public class UnserializeBoolean { UnserializeBoolean() { Boolean booleanData = null;

try { FileInputStream fis = new FileInputStream("boolean.ser"); ObjectInputStream ois = new ObjectInputStream(fis); booleanData = (Boolean) ois.readObject(); ois.close(); } catch (Exception e) {

Pengenalan Pemrograman 2 17

Page 333: J.E.N.I - Java

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

public static void main(String args[]) { UnserializeBoolean usb = new UnserializeBoolean(); }}

12.13 Latihan

12.13.1 Enkripsi Sederhana

Baca dari sebuah file khusus oleh user dan encrypt isi file menggunakan teknik penggeseran yang sederhana. Juga, tanyakan pada user untuk menginput ukuran pergeseran. Output dari pesan yang telah di encrypt pada file yang lain yang memiliki nama yang juga dibuat oleh user sendiri.

Sebagai contoh,Ukuran pergeseran: 1Pesan yang dibaca dari file: HelloPesan ter-encrypt: Ifmmp

Pengenalan Pemrograman 2 18

Page 334: J.E.N.I - Java

J.E.N.I.

Bab 13

Pengenalan Generics

13.1 TujuanRelease 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.

Setelah melengkapi pembahasan ini, anda harus dapat :1. Mengapresiasikan keuntungan dari generic types2. Mendeklarasikan class generic3. Menggunakan constrained generics4. Mendeklarasikan method generic

13.2 Mengapa Generics?Satu dari penyebab adanya bugs yang paling signifikan dalam Bahasa pemrograman Java adalah keperluan akan pernyataan typecast atau downcast untuk lebih mengkhususkan tipe data dari tipe staticnya secara terus-menerus. Sebagai contoh, Sebuah object arraylist memungkinkan kita untuk menambahkan beberapa referensi tipe object pada list tapi ketika kita mendapatkan kembali elemet ini , kita perlu untuk typecast object ke tipe referensi khusus yang sesuai dengan keperluan kita. Downcasting adalah hotspot yang potensial untuk ClassCastException. Yang juga membuat kode kita menjadi lebih panjang, jadi, menjadi lebih sedikit dapat terbaca. Lebih dari itu, downcasting juga efektif merusak manfaat dari sebuah kekuatan bahasa yang diketikkan sejak dia menghapuskan keamanan yang disediakan perusahaan berupa pemeriksaan tipe(type checking).

Tujuan utama dari penambahan 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).

Mari pertama-tama mempertimbangkan sebuah object ArrayList dan lihat bagaimana type generic akan membantu dalam peningkatan kode kita. Seperti yang sudah Anda ketahui, sebuah object arraylist memiliki kemampuan untuk menyimpan elemen-elemen dari beberapa tipe referensi untuk list ini. Sebuah instance arraylist, bagaimanapun, selalu memaksa kita untuk men-downcast object-object kita membantu mendapatkan kembali dari list. Pertimbangkan pernyataan berikut :

String myString = (String) myArrayList.get(0);

Versi generic dari class ArrayList didesain untuk bekerja secara asli dengan beberapa tipe class. Sama seperti, dia juga mempertahankan manfaat dari pengecekan tipe (type

Pengenalan Pemrograman 2 1

Page 335: J.E.N.I - Java

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 :

String myString = myArrayList.get(0);

Walaupun downcasting sudah terhapus, ini bukan berarti bahwa Anda dapat menandai segala sesuatu sebagai return value dari method get dan melanjutkannya dengan typecasting semuanya. Jika Anda menandai sesuatu yang lain disamping sebuah String untuk output dari method get, Anda akan menghadapi sebuah waktu mengcompile type tidak sesuai seperti pesan berikut ini :

found: java.lang.Stringrequired: java.lang.IntegerInteger 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 :

ArrayList <String> genArrList = new ArrayList <String>();genArrList.add("A generic string");String myString = genArrList.get(0);JoptionPane.showMessageDialog(this, myString);

Amatilah melalui pernyataan, anda mungkin mengamati kata <String> segera terlihat setelah referensi tipe data arraylist. Anda dapat menerjemahkan pernyataan pertama sebagai instantiasi sebuah versi generic dari class ArrayList dan versi generic ini terdiri dari object-object dari tipe String. genArrList adalah batas dari tipe String. Oleh sebab itu, mengikat sebuah Integer atau beberapa tipe lain bukan String untuk hasil dari get function akan menjadi illegal. Pernyataan berikut ini adalah illegal.

int myInt = genArrList.get();

13.3 Mendeklarasikan sebuah Class Generic Untuk menjalankan potongan code sebelumnya, kita harus sudah mendefinisikan versi generic dari class ArrayList. Untungnya, versi java terbaru sudah menyediakan user dengan versi generic dari semua class-class Java Collection. Pada sesi ini, Anda akan mempelajari bagaimana untuk mendeklarasikan class generic anda sendiri.Dripada berdiskusi lebihpanjang lagi tentang bagaimana untuk mendeklarasikan sebuah class generic , anda akan diberikan sebuah contoh sederhana tentang class generic untuk dipelajari bentuknya.

class BasicGeneric <A> { private A data; public BasicGeneric(A data) { this.data = data; } public A getData() { return data; }}

Pengenalan Pemrograman 2 2

Page 336: J.E.N.I - Java

J.E.N.I.

public class GenSample { public String method(String input) { String data1 = input; BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1); String data2 = basicGeneric.getData(); return data2; } public Integer method(int input) { Integer data1 = new Integer(input); BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1); Integer data2 = basicGeneric.getData(); return data2; } public static void main(String args[]) { GenSample sample = new GenSample(); System.out.println(sample.method("Some generic data")); System.out.println(sample.method(1234)); }}

Sekarang mari kita melalui bagian dari kode yang menggunakan syntax untuk type generic.Untuk deklarasi dari class BasicGeneric,

class BasicGeneric <A>

nama class diikuti oleh sepasang kurung yang didalamnya terdapat huruf kapital A: <A>. Ini disebut dengan sebuah parameter tipe. Penggunaan kurung ini mengindikasikan bahwa class yang dideklarasikan adalah class generic. Ini berarti bahwa class tidak bekerja dengan beberapa type referensi khusus.kemudian, amati bahwa sebuah field dari class dideklarasikan menjadi tipe A

private A data;

Deklarasi ini mengelompokkan bahwa field data adalah dari tipe generic, tergantung pada tipe data yang telah didesain untuk bekerja dengan object BasicGeneric.

Ketika mendeklarasikan sebuah instance dari class, anda harus mengelompokkan tipe referensi dengan yang mana yang anda inginkan untuk bekerja sama.

BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1);

Syntax <String> setelah mendeklarasi BasicGeneric mengelompokkan bahwa instance dari class ini akan bekerja dengan variabel-variabel bertipe String.

Anda juga dapat bekerja denga variabel-variabel bertipe Integer atau referensi tipe yang lain. Untuk bekrja dengan Integer, potongan kode memiliki pernyataan berikut ini :

BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1);

Pengenalan Pemrograman 2 3

Page 337: J.E.N.I - Java

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.

BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1);String data2 = basicGeneric.getData();

BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1);Integer data2 = basicGeneric.getData();

Perlu diperhatikan perhatian bahwa instantiasi dari class generic adalah hanya sama dengan instantiasi sebuah class normal kecuali bahwa tipe data khusus berada dalam <> menggantikan nama konstruktor. Informasi tambahan ini mengindikasikan tipe dari data anda akan bekerja dengan siapa untuk bagian instance ini dari class BasicGeneric.Setelah instantiasi, anda dapat mengakses anggota dari class melalui instance sekarang. Tidak ada yang lebih diperlukan untuk typecast nilai pengembalian dari method getData sejak diputuskan bahwa ini akan bekerja dengan sebuah referensi tipe data yang spesifik.

13.3.1 Pembatasan"Primitive"

Sebuah pembatasan type generic dalam Java adalah mereka dibatasi oleh tipe referensi dan tidak akan bekerja dengan tipe data primitive.

Sebagai contoh, pernyataan berikut akan menjadi illegal sejak int adalah sebuah tipe data primitive.

BasicGeneric <int> basicGeneric = new BasicGeneric <int>(data1);

Petama-tama Anda akan menyelesaikan type primitive sebelum menggunakan mereka sebagai arguments ke sebuah type generic.

13.3.2 Meng-compilasi Generics

Untuk meng-compile source codes Java denagn type generic menggunakan JDK (v. 1.5.0), gunakan syntax berikut ini :

Pengenalan Pemrograman 2 4

Page 338: J.E.N.I - Java

J.E.N.I.

javac -version -source "1.5" -sourcepath src -d classes src/SwapClass.java

Dimana src mengarah pada lokasi dari source code java sementara class mengarah pada lokasi dimana file class akan disimpan.Beriut ini sebuah contoh :

javac -version -source "1.5" -sourcepath c:\temp -d c:\temp c:/temp/SwapClass.java

13.4 Constrained Generics

Dalam contoh yang diberikan terdahulu, type parameter dari class BasicGeneric dapat memiliki beberapa referensi tipe data. Ada beberapa kasus, bagaimanapun, dimana anda ingin untuk membatasi tipe instantiasi yang potensial dari class generic. Java juga memungkinkan kita untuk membatasi set argument type yang mungkin untuk subtypes dari sebuah batas type yang diberikan.

Sebagai contoh, kita mungkin ingin untuk mendefinisikan sebuah class generic ScrollPane yang merupakan sebuah template untuk sebuah Container asli yang telah dilengkapi dengan fungsi scrolling. Tipe runtime dari sebuah instance dari class ini akan sering menjadi sebuah subclass dari Container, tapi tipe static atau general adalah Container yang lebih sederhana.

Untuk membatasi instantiasi tipe dari sebuah class, kita menggunakan kata kunci extends diikuti oleh class yang membatasi tipe generic sebagai bagian dari tipe parameter.

Contoh berikut ini membatasi instantiasi tipe dari class ScrollPane ke subtipe dari class Container.

class ScrollPane <MyPane extends Container> { ...}

class TestScrollPane { public static void main(String args[]) { ScrollPane <Panel> scrollPane1 = new ScrollPane <Panel>(); // pernyataan berikutnya adalah illegal ScrollPane <Button> scrollPane2 = new ScrollPane <Button>(); }}

Instantiasi dari scrollPane1 bernilai valid sejak Panel menjadi sebuah subclass dari class Container sedangkan kreasi dari scrollPane2 akan menyebabkan munculnya compile time error sejak Button bukan merupakan sebuah subclass dari Container.

menggunakan generic constrained yang dapat memberikan kita penambahan pengecekan tipe static. Sebagai sebuah hasil, kita akan menjamin bahwa setiap

Pengenalan Pemrograman 2 5

Page 339: J.E.N.I - Java

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.

13.5 Mendeklarasikan sebuah Method Generic

Disamping mendeklarasikan sebuah class generic, Java juga memberi kita perlakuan khusus untuk mendeklarasikan sebuah method generic. ini disebut dengan method polymorphic, yang mana didefinisikan menjadi method yang diberi nilai parameter berupa tipe.

method parameterisasi sangat membantu kita kita ingin untuk menampilkan tugas dimana ketergantungan tipe antara argument dan nilai pengembalian aslinya merupakan generic, tapi generic sebenarnya tidak mempercayakan pada beberapa tipe level class informasi dan akan merubah dari method call ke method call.

Sebagai contoh, Andaikata kita menginginkan untuk menambahkan sebuah method make untuk sebuah class ArrayList. Method static ini akan diambil dalam sebuah argument tunggal, yang mana akan menjadi satu-satunya elemen dari object ArrayList. Untuk membuat generic ArrayList kita, sebagai penampung beberapa tipe elemen, argumen tunggal dalam method make harus memiliki sebuah tipe generic sebagai sebuah argumen dan sebagai sebuah tipe nilai kembalian.

Untuk mendeklarasikan tipe generic pada level method, pertimbangkan contoh berikut ini :

class Utilities { /* T secara implisit extends terhadap Object */ public static <T> ArrayList<T> make(T first) { return new ArrayList<T>(first); }}

Java juga menggunakan sebuah mekanisme type-inference untuk secara otomatis menyimpulkan tipe method polymorphic berdasarkan pada tipe-tipe argumennya. Ini mengurangi panjang dan kompleksitas dari sebuah alur untuk menjalankan suatu method.

Untuk membangun sebuah instance baru dari ArrayList<Integer>, kita mempunyai cara yang cukup sederhana yaitu pernyataan berikut :

Utilities.make(Integer(0));

Pengenalan Pemrograman 2 6

Page 340: J.E.N.I - Java

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