Anda di halaman 1dari 340

J.E.N.I.

BAB 1 Pengenalan Pemrograman Komputer


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

pada

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

Gambar 1: Skema IO Komputer

Pengenalan Pemrograman 1

J.E.N.I.

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

1.3 Komponen Dasar Komputer


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

1.3.1.2 Memori
Memori adalah media penyimpan data pada komputer. Memory, berdasarkan fungsinya dibagi menjadi dua yaitu : a. Primary Memory Dipergunakan untuk menyimpan data dan instruksi dari program yang sedang dijalankan. Biasa juga disebut sebagai RAM. Karakteristik dari memori primer adalah : o o o Volatil (informasi ada selama komputer bekerja. dipadamkan, informasi yang disimpannya juga hilang) Berkecepatan tinggi Akses random (acak) Ketika komputer

b.

Secondary Memory Dipergunakan untuk menyimpan data atau program biner secara permanen. Karakteristik dari memori sekunder adalah o o o Non volatil atau persisten Kecepatan relatif rendah (dibandingkan memori primer) Akses random atau sekuensial

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

Pengenalan Pemrograman 1

J.E.N.I.

Memori Utama (RAM) Cepat Mahal Kecil Ya

Memori Sekunder (ROM) Lambat Murah Besar Tidak

Kategori Kecepatan Harga Kapasitas Volatile

Tabel 1: Perbandingan antara memori utama dan memori sekunder

1.3.1.3 Input Dan Output Device


Input-Output Device, merupakan bagian yang berfungsi sebagai penghubung antara komputer dengan lingkungan di luarnya. Dapat dibagi menjadi dua kelompok, yaitu a. Input Device (Piranti Masukan) Berfungsi sebagai media komputer untuk menerima masukan dari luar. Beberapa contoh piranti masukan : o o o o o b. Keyboard Mouse Touch screen Scanner Camera

Output Device (Piranti Keluaran) Berfungsi sebagai media komputer untuk memberikan keluaran. Beberapa contoh piranti keluaran : o o o o Monitor Printer Speaker Plotter

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

J.E.N.I.

Tanpa ada sistem operasi maka komputer tidak dapat difungsikan sama sekali. 2. Program Utility, seperti Norton Utility, Scandisk, PC Tools. Program utility berfungsi untuk membantu atau mengisi kekurangan/kelemahan dari system operasi, misalnya PC Tools dapat melakukan perintah format sebagaimana DOS, tapi PC Tools mampu memberikan keterang dan animasi yang bagus dalam proses pemformatan. File yang telah dihapus oleh DOS tidak dapat dikembalikan lagi tapi dengan program bantu hal ini dapat dilakukan. 3. Program Aplikasi, seperti GL, MYOB, Payroll. Merupakan program yang khusus melakukan suatu pekerjaan tertentu, seperti program gaji pada suatu perusahaan. Maka program ini hanya digunakan oleh bagian keuangan saja tidak dapat digunakan oleh departemen yang lain. Umumnya program aplikasi ini dibuat oleh seorang programmer komputer sesuai dengan permintaan/kebutuhan seseorang/lembaga/perusahaan guna keperluan interennya. 4. Program Paket Merupakan program yang dikembangkan untuk kebutuhan umum, seperti : o o o o Pengolah kata /editor naskah : Wordstar, MS Word, Word Perfect, AmiPro Pengolah angka / lembar kerja : Lotus123, MS Excell, QuattroPro, dll Presentasi : MS PowerPoint Desain grafis : CorelDraw, PhotoShop

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

1.4 Sekilas Bahasa Pemrograman


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

J.E.N.I.

1.4.2 Kategori Bahasa Pemrograman


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

1.5 Alur Pembuatan Program


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

1.5.1 Definisi Permasalahan


Seorang programmer umumnya mendapatkan tugas berdasarkan sebuah permasalahan. Sebelum sebuah program dapat terdesain dengan baik untuk menyelesaikan beberapa
Pengenalan Pemrograman 1 5

J.E.N.I.

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

1.5.2

Analisa Permasalahan

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

Contoh masalah : Menampilkan jumlah kemunculan sebuah nama pada daftar Input Terhadap Program : Daftar Nama, Nama yang akan dicari Output Dari Program : Jumlah kemunculan nama yang dicari

1.5.3 Desain Algoritma dan Representasi


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

Pengenalan Pemrograman 1

J.E.N.I.

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

Gambar 2: Contoh Flowchart

Mengekspresikan solusi melalui Pseudocode : listNama keyNama hitung = = = Daftar Nama Nama yang dicari 0

Untuk setiap nama pada Daftar Nama lakukan : Jika nama == keyNama Hitung = Hitung + 1 Tampilkan Hitung

Pengenalan Pemrograman 1

J.E.N.I.

1.5.3.1 Simbol Flowchart dan Artinya


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

Simbol

Nama

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

Simbol Proses

Simbol Input Output (IO)

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

Simbol Garis Alir

Simbol Anotasi

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

Pengenalan Pemrograman 1

J.E.N.I.

Simbol

Nama

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

Simbol Percabangan

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

Simbol Konektor

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

Simbol Prosedur

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

Tabel 2: Simbol dari Flowchar

Pengenalan Pemrograman 1

J.E.N.I.

1.5.4 Pengkodean, Uji Coba dan Pembuatan Dokumentasi


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

Pengenalan Pemrograman 1

10

J.E.N.I.

1.6 Sistem Numerik dan Konversi


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

1.6.1 Sistem Bilangan Desimal


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

1.6.2 Sistem Bilangan Biner


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

11111102 10112

1.6.3 Sistem Bilangan Oktal


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

1768 138

1.6.4 Sistem Bilangan Heksadesimal


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

7E16

Pengenalan Pemrograman 1

11

J.E.N.I.

B16
B

Heksadesimal Nilai Dalam Desimal

0 0

1 1

2 2

3 3

4 4

5 5

6 6

7 7

8 8

9 9

A 10

B 11

C 12

D 13

E 14

F 15

Tabel 3: Bilangan heksadesimal dan perbandingannya terhadap desimal

Berikut adalah perbandingan keseluruhan sistem penulisan bilangan :

Desimal 12610 1110

Biner 11111102 10112

Oktal 1768 138

Heksadesimal 7E16 B16


B

Tabel 4: Contoh Konversi Antar Sistem Bilangan

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

Sebagai Contoh : 12610 = ?


2

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

Nilai Sisa 0 1 1 1 1 1 1 Urutkan

Pengenalan Pemrograman 1

12

J.E.N.I.

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

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

1.6.5.2 Desimal ke Oktal/Heksadesimal dan Oktal/Heksadesimal ke Desimal


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

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

Nilai Sisa 6 7 1

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

Pengenalan Pemrograman 1

13

J.E.N.I.

Contoh konversi Heksadesimal :

12610 = ?

16

Hasil Bagi 126 / 16 = 7 / 16 = 7

Nilai Sisa 14 (E) 7

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

Posisi Octal Digits

2 1

1 7

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

Pengenalan Pemrograman 1

14

J.E.N.I.

Contoh konversi Heksadesimal :

7E16 = ?

10

Posisi Digit Heksadesimal

1 7

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

1.6.5.3 Biner ke Oktal dan Oktal ke Biner


Untuk mengubah bilangan biner ke oktal, kita pilah bilangan tersebut menjadi 3 bit bilangan biner dari kanan ke kiri. Tabel berikut ini menunjukkan representasi bilangan biner terhadap bilangan oktal : Digit Oktal 0 1 2 3 4 5 6 7 Representasi Biner 000 001 010 011 100 101 110 111

Tabel 5: Bilangan octal dan perbandingannya dalam sistem biner

Pengenalan Pemrograman 1

15

J.E.N.I.

Sebagai contoh : 11111102 = ?


8

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

1.6.5.4 Biner ke Heksadesimal dan Heksadesimal ke Biner


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

Digit Heksadesimal 0 1 2 3 4
Pengenalan Pemrograman 1

Representasi Biner 0000 0001 0010 0011 0100


16

J.E.N.I.

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

Representasi Biner 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Tabel 6: Bilangan heksadesimal dan konversinya dalam biner

Sebagai contoh : 11111102 = ?


16

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

7E16 = ?

Pengenalan Pemrograman 1

17

J.E.N.I.

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

1.7.2 Konversi Sistem Bilangan


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

Pengenalan Pemrograman 1

18

J.E.N.I.

BAB 2 Pengenalan Bahasa JAVA


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

2.2 Latar Belakang JAVA


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

Pengenalan Pemrograman 1

J.E.N.I.

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

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

Pengenalan Pemrograman 1

J.E.N.I.

2.2.2 Apa itu Teknologi JAVA?


2.2.2.1 Sebuah Bahasa Pemrograman

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

2.2.2.2

Sebuah Development Environment

Sebagai sebuah peralatan pembangun, teknologi Java menyediakan banyak tools : compiler, interpreter, penyusun dokumentasi, paket kelas dan sebagainya.

2.2.2.3

Sebuah Aplikasi

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

2.2.2.4

Sebuah Deployment Environment

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

Pengenalan Pemrograman 1

J.E.N.I.

2.2.5 Mengapa Mempelajari JAVA?


Berdasarkan white paper resmi dari SUN, Java memiliki karakteristik berikut : 1. Sederhana (Simple) Bahasa pemrograman Java menggunakan Sintaks mirip dengan C++ namun sintaks pada Java telah banyak diperbaiki terutama menghilangkan penggunaan pointer yang rumit dan multiple inheritance. Java juga menggunakan automatic memory allocation dan memory garbage collection. Berorientasi objek (Object Oriented) Java mengunakan pemrograman berorientasi objek yang membuat program dapat dibuat secara modular dan dapat dipergunakan kembali. Pemrograman berorientasi objek memodelkan dunia nyata kedalam objek dan melakukan interaksi antar objek-objek tersebut. Terdistribusi (Distributed) Java dibuat untuk membuat aplikasi terdistribusi secara mudah dengan adanya libraries networking yang terintegrasi pada Java. Interpreted Program Java dijalankan menggunakan interpreter yaitu Java Virtual Machine (JVM). Hal ini menyebabkan source code Java yang telah dikompilasi menjadi Java bytecodes dapat dijalankan pada platform yang berbeda-beda. Robust Java mempuyai reliabilitas yang tinggi. Compiler pada Java mempunyai kemampuan mendeteksi error secara lebih teliti dibandingkan bahasa pemrograman lain. Java mempunyai runtime-Exception handling untuk membantu mengatasi error pada pemrograman. Secure Sebagai bahasa pemrograman untuk aplikasi internet dan terdistribusi, Java memiliki beberapa mekanisme keamanan untuk menjaga aplikasi tidak digunakan untuk merusak sistem komputer yang menjalankan aplikasi tersebut. Architecture Neutral Program Java merupakan platform independent. Program cukup mempunyai satu buah versi yang dapat dijalankan pada platform berbeda dengan Java Virtual Machine. Portable Source code maupun program Java dapat dengan mudah dibawa ke platform yang berbeda-beda tanpa harus dikompilasi ulang. Performance Performance pada Java sering dikatakan kurang tinggi. Namun performance Java dapat ditingkatkan menggunakan kompilasi Java lain seperti buatan

2.

3.

4.

5.

6.

7.

8.

9.

Pengenalan Pemrograman 1

J.E.N.I.

Inprise, Microsoft ataupun Symantec yang menggunakan Just In Time Compilers (JIT). 10. Multithreaded Java mempunyai kemampuan untuk membuat suatu program yang dapat melakukan beberapa pekerjaan secara sekaligus dan simultan. Dynamic Java didesain untuk dapat dijalankan pada lingkungan yang dinamis. Perubahan pada suatu class dengan menambahkan properties ataupun method dapat dilakukan tanpa menggangu program yang menggunakan class tersebut.

11.

2.2.4 Sebagian Fitur dari JAVA


2.2.4.1 Java Virtual Machine (JVM)

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

2.2.4.2

Garbage Collection

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

Pengenalan Pemrograman 1

J.E.N.I.

2.2.4.3

Code Security

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

Pengenalan Pemrograman 1

J.E.N.I.

2.2.5 Fase fase Pemrograman JAVA


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

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

Proses Menulis kode program Kompilasi program Menjalankan program Text editor

Tool

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

Java Compiler Java Interpreter

Pengenalan Pemrograman 1

J.E.N.I.

BAB 3 Mengenali Lingkup Pemrograman Anda


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

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

3.3 Program ava Pertama


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

.engenalan .emrograman I

J.E.N.I.

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

3.! Menggunakan Text editor dan "on#ole


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

Gambar 1: Aplikasi Text Editor di Linux

.engenalan .emrograman I

J.E.N.I.

Langkah 2% Mem&uka Terminal (ntuk membuka terminal di linu#, klik pada /pplications-0 /ccessories-0 erminal.

Figure 2: Terminal pada Linux

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

Gambar 3: Menulis kode program menggunakan text editor

.engenalan .emrograman I

J.E.N.I.

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

Gambar 4: Menyimpan file

.engenalan .emrograman I

J.E.N.I.

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

.engenalan .emrograman I

J.E.N.I.

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

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

.engenalan .emrograman I

J.E.N.I.

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

Gambar 5: Window baru setelah penyimpanan

.engenalan .emrograman I

J.E.N.I.

Langkah (% Meng)*ompile program anda ?angkah berikut ini adalah meng-compile program /nda. 'asuklah ke "ang telah kita buka sebelumn"a.

erminal ,indo*

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

Gambar 6: Merubah

irektori

.engenalan .emrograman I

J.E.N.I.

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

Gambar 7:

aftar File didalam

irektori yang !aru

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

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

J.E.N.I.

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

Gambar 9: Men&alankan File 'lass

.engenalan .emrograman I

10

J.E.N.I.

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

Gambar 10: Listing Program yang Memiliki Error

.engenalan .emrograman I

11

J.E.N.I.

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

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

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

.engenalan .emrograman I

12

J.E.N.I.

3.( Menggunakan 8etBean#


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

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

.engenalan .emrograman I

13

J.E.N.I.

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

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

.engenalan .emrograman I

14

J.E.N.I.

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

Gambar 14: Window (etelah Membuka .et!eans

.engenalan .emrograman I

15

J.E.N.I.

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

Gambar 15: Memilih Tipe ,ro&e#t

.engenalan .emrograman I

16

J.E.N.I.

$ekarang, dialog aplikasi "ang baru akan ditampilkan.

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

.engenalan .emrograman I

17

J.E.N.I.

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

Gambar 17: Mengatur Lokasi ,ro&e#t

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

.engenalan .emrograman I

18

J.E.N.I.

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

)older

project

telah

berubah

menjadi

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

Gambar 18: Window setelah Mengatur Lokasi ,ro&e#t ke M0$A1A,23G2AM(4Mengatur kelas utama pro&e#t men&adi 5ello

.engenalan .emrograman I

19

J.E.N.I.

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

.engenalan .emrograman I

20

J.E.N.I.

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

Gambar20: Memas#kkan $o%e

.engenalan .emrograman I

21

J.E.N.I.

Langkah ! % Meng)*ompile Program Anda $ekarang, untuk meng-compile program anda, klik pada %uild-0%uid 'ain .roject. /tau, anda juga dapat menggunakan tombol shortcut untuk meng-compile kode anda.

.engenalan .emrograman I

22

J.E.N.I.

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

Gambar 21: Tampilan (etelah sukses melakukan #ompile

.engenalan .emrograman I

23

J.E.N.I.

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

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

.engenalan .emrograman I

24

J.E.N.I.

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

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

.engenalan .emrograman I

25

J.E.N.I.

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

3.6.2 The Tree


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

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

.engenalan .emrograman I

26

J.E.N.I.

BAB 4 Dasar-Dasar Pemrograman


4.1 Tujuan
Pada bagian ini, kita akan mendiskusikan mengenai bagian dasar pemrograman java. Kita akan memulai dengan mencoba menjelaskan bagian dasar dari program Hello.java yang telah diperkenalkan pada bab sebelumnya.Kita juga akan mendiskusikan beberapa pedoman cara menulis script atau petunjuk penulisan kode dalam penulisan program lebih efektif dan mudah dibaca. Pada akhir pembelajaran ini, pelajar seharusnya dapat : Mengidentifikasi bagian dasar dari program java Membedakan mana yang termasuk ke dalam java literals, tipe data dasar, tipe variabel, pengidentifikasian dan operator. Mengembangkan program java sederhana menggunakan konsep pembelajaran pada bab ini. Menganalisa program java pertama saya

4.2 Menganalisa program Java pertama saya


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

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

Pengenalan Pemrograman I

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

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

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

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

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

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

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

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

J.E.N.I.

4.8. Tipe data primitif


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

4.8.1. logika - boolean


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

boolean result = true;


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

4.8.2. teksual char


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

a //Huruf a \t //A tab


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

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


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

String message=Hello world!

Pengenalan Pemrograman I

10

J.E.N.I.

4.8.3. Integral byte, short, int & long


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

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

pernyataan

mengindikasikan nilai

mengindikasikan

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

Integer Length

Name or Type

Range

8 bits 16 bits 32 bits 64 bits


Table 1: Integral tipes and their ranges

byte short int long

-27 -215

to 27-1 to 215-1

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

Pedoman Penulisan Program:

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

Pengenalan Pemrograman I

11

J.E.N.I.

4.8.4. Floating Point float dan double


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

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


Contohnya adalah,

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

Name or Type float double

Range

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

Pengenalan Pemrograman I

12

J.E.N.I.

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

4.9.1. Deklarasi dan Inisialisasi Variabel


Untuk deklarasi variabel adalah sebagai berikut,,

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


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

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

di

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

J.E.N.I.

3. Deklarasikan satu variabel tiap baris kode. Sebagai contoh , deklarasi variabel adalah sebagai berikut, double exam=0; double quiz=10; double grade = 0; Bentuk yang lebih disukai ketika melakukan deklarasi adalah, double exam=0, quiz=10, grade=0;

4.9.2. Menampilkan Data Variabel


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

System.out.println() System.out.print()
Berikut ini adalah contoh program,

public class OutputVariable { public static void main( String[] args ){ int value = 10; char x; x = A; System.out.println( value ); System.out.println( The value of x= + x ); } }
Program tersebut akan mengeluarkan teks berikut pada layar,

10 The value of x=A 4.9.3. System.out.println() vs. System.out.print()


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

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


Pernyataan tersebut akan menghasilkan output berikut ini pada layar,

Pengenalan Pemrograman I

14

J.E.N.I.

Hello world!
Sekarang perthatikan pernyataan berikut,

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


Pernyataan ini akan menghasilkan output sebagai berikut pada layar,

Hello world!

Pengenalan Pemrograman I

15

J.E.N.I.

4.9.4. Reference Variables vs. primitif Variables


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

int num = 10; String name = "Hello"


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

Memory Address 1001 : 1563

Variable Name num name

Data 10 : Address(2000)

: : 2000

: : "Hello"

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

Pengenalan Pemrograman I

16

J.E.N.I.

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

4.10.1 Operator Aritmatika


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

Operator + * / % -

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

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

Table 3: Operator Arithmatika dan fungsi-fungsinya

Pengenalan Pemrograman I

17

J.E.N.I.

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

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

* j)); * y));

/ j)); / y));

//menghitung hasil modulus dari pembagian System.out.println("Computing the remainder..."); System.out.println(" i % j = " + (i % j)); System.out.println(" x % y = " + (x % y)); //tipe penggabungan System.out.println("Mixing tipes...");
Pengenalan Pemrograman I 18

J.E.N.I.

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

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

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

Pengenalan Pemrograman I

19

J.E.N.I.

4.10.2. Operator Increment dan Decrement


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

count = count + 1; //increment nilai 1


pernyataan tersebut ekivalen dengan,

nilai

count

dengan

count++;

Operator ++

Use op++

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

++

++op

--

op--

--

--op

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

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


Ketika operator increment dan decrement ditempatkan setelah operand, nilai variabel yang
Pengenalan Pemrograman I 20

J.E.N.I.

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

int i = 10, int j = 3; int k = 0; k = j++ + i; //akan menghasilkan k = 3+10 = 13 Pedoman Penulisan Program:

Selalu jaga pernyataan yang mengandung operator increment dan decrement untuk dipahami secara mudah dan sederhana.

4.10.3 Operator Relasi


Operator Relasi membandingkan dua nilai dan menentukan keterhubungan diantara nilainilai tersebut. Hasil keluarannya berupa nilai boolean yaitu true atau false. Operator > >= < <= == != Use op1 > op2 op1 >= op2 op1 < op2 op1 <= op2 op1 == op2 op1 != op2 Description op1 is greater than op2 op1 is greater than or equal to op2 op1 is less than op2 op1 is less than or equal to op2 op1 and op2 are equal op1 and op2 are not equal
Table 5: Operator Relasi

Pengenalan Pemrograman I

21

J.E.N.I.

Berikut ini adalah contoh program yang menggunakan operator Relasi,

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

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

//lebih besar atau sama dengan System.out.println("Greater than System.out.println(" i >= j = System.out.println(" j >= i = System.out.println(" k >= j =

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

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

J.E.N.I.

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

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

Berikut adalah hasil keluaran dari program ini :

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

Pengenalan Pemrograman I

23

J.E.N.I.

4.10.4 Operator logika


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

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

Pengenalan Pemrograman I

24

J.E.N.I.

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


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

Table 6: Truth table for & and &&

Perbedaan dasar antara operator && dan & adalah bahwa && mensupports short-circuit evaluations (atau evaluasi perbagian), sementara operator & tidak. Apa arti dari pernyataan tersebut? Diberikan suatu pernyataan,

exp1 && exp2


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

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

J.E.N.I.

System.out.println(test); } }
The output of the program is,

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

Pengenalan Pemrograman I

26

J.E.N.I.

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


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

Table 7: Table Kebenaran untuk | dan ||

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

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

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

J.E.N.I.

System.out.println(test); } }
Hasil keluaran dari program ini adalah,

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

Pengenalan Pemrograman I

28

J.E.N.I.

4.10.4.3 ^ (boolean logika ExclusiveOR )


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

Table 8: Tabel kebenaran untuk ^

Hasil operasi operator exclusive OR adalah TRUE, jika dan hanya jika satu operand bernilai TRUE dan yang lain bernilai False. Catatan jika kedua operand harus selalu dievaluasi untuk menjumlahkan hasil dari suatu exclusive OR. Berikut ini adalah contoh source code yang menggunakan operator logika exclusive OR,

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

false true false true

Pengenalan Pemrograman I

29

J.E.N.I.

4.10.4.4 ! (logika NOT)


logika NOT digunakan dalam satu argumen, dimana argumen tersebut dapat menjadi suatu pernyataan, variabel atau konstanta. Berikut ini adalah tabel kebenaran untukoperator not!, x1 TRUE FALSE Result FALSE TRUE
Table 9: Tabel Kebenaran untuk !

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

public class TestNOT { public static void main( String[] args ){ boolean val1 = true; boolean val2 = false; System.out.println(!val1); System.out.println(!val2); }
} Hasil keluaran program adalah sebagai berikut,

false true

Pengenalan Pemrograman I

30

J.E.N.I.

4.10.5 Operator Kondisi(?:)


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

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

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

Passed

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

Pengenalan Pemrograman I

31

J.E.N.I.

Gambar2: Flowchart

Berikut ini adalah program lain yang menggunakan operator ?: ,

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

Score = 10

Pengenalan Pemrograman I

32

J.E.N.I.

4.10.6 Operator Precedence


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

Gambar3: Operator Precedence

Diberikan pernyataan yang membingungkan,

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

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

Pedoman Penulisan Program:

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

Pengenalan Pemrograman I

33

J.E.N.I.

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

Variable name number letter result str

Data tipe integer character boolean String

Initial value 10 a true hello

Berikut ini merupakan tampilan yang diharapkan sebagai hasil eksekusi program,

Number = 10 letter = a result = true str = hello 4.11.2. Mendapatkan nilai rata-rata dari tiga angka
Buatlah program yang menghasilkan output nilai rata-ratadari tiga angka. Nilai dari masingmasing tiga angka tersebut adalah 10, 20 dan 45. Tampilan Output yang diharapkan adalah,

number 1 = number 2 = number 3 = Average is

10 20 45 = 25

4.11.3. Menampilkan nilai terbesar


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

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

Pengenalan Pemrograman I

34

J.E.N.I.

Nilai tertingginya adalah angka = 23 4.11.4. Operator precedence


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

Pengenalan Pemrograman I

35

J.E.N.I.

BAB 5 Mendapatkan Input dari Keyboard


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

5.2 Menggunakan BufferedReader untuk mendapatkan input


Pada bagian ini, kita akan menggunakan kelas BufferedReader yang berada di java.io package untuk mendapatkan input dari keyboard. Berikut ini adalah langkah-langkah yang diperlukan untuk mendapatkan input dari keyboard: 1. Tambahkan di bagian paling atas code anda: import java.io.*; 2. Tambahkan statement ini: BufferedReader dataIn = new BufferedReader(new InputStreamReader( System.in) ); 3. Deklarasikan variabel String temporer untuk mendapatkan input, dan gunakan fungsi readLine() untuk mendapatkan input dari keyboard. Anda harus mengetikkannya di dalam blok try-catch: try{ String temp = dataIn.readLine(); } catch( IOException e ){ System.out.println(Error in getting input); }

Pengenalan Pemrograman I

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

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

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

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

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

J.E.N.I.

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

5.1.2 Kata Terakhir (versi JOptionPane)


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

Gambar 1: Input Pertama

Gambar 2: Input Kedua

Gambar 3: Menampilkan Pesan

Pengenalan Pemrograman I

J.E.N.I.

BAB 6 Struktur Kontrol


6.1 Tujuan
Pada bab sebelumnya, kita sudah mendapatkan 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

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

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

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

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

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

J.E.N.I.

6.2.5 Contoh statement if-else-else if


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

Pengenalan Pemrograman 1

J.E.N.I.

6.2.6 Statement switch


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

// //block 1 //

// //block 2 //

// //block n //

Pengenalan Pemrograman 1

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

J.E.N.I.

6.2.7 Contoh statement switch


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

Pengenalan Pemrograman 1

10

J.E.N.I.

6.3 Struktur Kontrol Perulangan


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

6.3.1 while loop


Statement while loop adalah statement atau blok statement yang diulang-ulang sampai mencapai kondisi yang cocok. Bentuk statement while, while( boolean_expression ){ statement1; statement2; . . . } Statement di dalam while boolean_expression bernilai true. Contoh, pada code dibawah ini, int i = 4; while ( i > 0 ){ System.out.print(i); i--; } Contoh diatas akan mencetak angka 4321 pada layar. Perlu dicatat jika bagian i--; dihilangkan, akan menghasilkan looping yang tidak berhenti (infinite loop). Sehingga, ketika menggunakan while loop atau bentuk pengulangan yang lain, pastikan Anda memberikan statement yang membuat pengulangan berhenti pada suatu titik. loop akan dieksekusi berulang-ulang selama

Pengenalan Pemrograman 1

11

J.E.N.I.

Berikut ini adalah beberapa contoh while loop, Contoh 1: int x = 0; while (x<10) { System.out.println(x); x++; } Contoh 2: //infinite loop while(true) System.out.println(hello); Contoh 3: //no loops // statement is not even executed while (false) System.out.println(hello);

Pengenalan Pemrograman 1

12

J.E.N.I.

6.3.2 do-while loop


Do-while loop mirip dengan while-loop. Statement di dalam do-while loop akan dieksekusi beberapa kali selama kondisi bernilai true. Perbedaan antara while dan do-while loop adalah dimana statement di dalam do-while loop dieksekusi sedikitnya satu kali. Bentuk statement do-while, do{ statement1; statement2; . . . }while( boolean_expression ); Statement di dalam do-while loop akan dieksekusi pertama kali, dan dilakukan pengecekan kondisi dari boolean_expression. Jika nilai tersebut belum mencapai nilai yang diinginkan, statement akan dieksekusi lagi. Berikut ini beberapa contoh do-while loop: Contoh 1: int x = 0; do { System.out.println(x); x++; }while (x<10); Contoh ini akan memberikan output 0123456789 pada layar. Contoh 2: //infinite loop do{ System.out.println(hello); } while (true); Contoh di atas akan melakukan pengulangan yang tidak berhenti untuk menulis hello pada layar. Contoh 3: //one loop // statement is executed once do System.out.println(hello); while (false); Contoh di atas akan memberikan output hello pada layar.
Pengenalan Pemrograman 1 13

J.E.N.I.

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

6.3.3 for loop


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

InitializationExpression inisialisasi dari variabel loop. LoopCondition - membandingkan variabel loop pada nilai batas. StepExpression - melakukan update pada variabel loop.

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

Pengenalan Pemrograman 1

14

J.E.N.I.

6.4 Branching Statements


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

6.4.1 break statement


Statement break memiliki dua bentuk: unlabeled dan labeled. 6.4.1.1 Unlabeled break statement Unlabeled menghentikan jalannya statement switch. Anda bisa juga menggunakan bentuk unlabeled untuk menghentikan for, while atau do-while loop. Contohnya, String names[] = {"Beah", "Bianca", "Lance", "Belle", "Nico", "Yza", "Gem", "Ethan"}; String boolean searchName = "Yza"; foundName = false;

for( int i=0; i< names.length; i++ ){ if( names[i].equals( searchName )){ foundName = true; break; } } if( foundName ){ System.out.println( searchName + " found!" ); } else{ System.out.println( searchName + " not found." ); } Pada contoh ini, jika string Yza ditemukan, pengulangan pada for loop akan dihentikan dan akan melanjutkan ke proses berikutnya.

Pengenalan Pemrograman 1

15

J.E.N.I.

6.4.1.2 Labeled break statement


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

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

Pengenalan Pemrograman 1

16

J.E.N.I.

6.4.2 Continue statement


Statement continue memiliki dua bentuk: unlabeled dan labeled. Anda dapat menggunakan statement continue untuk melewati pengulangan dari for, while, atau dowhile loop yang sedang berjalan. 6.4.2.1 Unlabeled continue statement Bentuk unlabeled akan melewati akhir statement pada bagian yang dalam dan memeriksa boolean expression yang mengkontrol loop, pada dasarnya akan melewati bagian pengulangan pada loop. Berikut ini adalah contoh dari penghitungan angka dari Beah dalam suatu array. String names[] = {"Beah", "Bianca", "Lance", "Beah"}; int count = 0; for( int i=0; i<names.length; i++ ){ if( !names[i].equals("Beah") ){ continue; //skip next statement } count++; } System.out.println("There are " + count + " Beahs in the list"); 6.4.2.2 Labeled continue statement Bentuk labeled akan melanjutkan sebuah statement dengan melewati pengulangan yang sedang berjalan dari loop terluar yang diberi label (tanda). outerLoop: for( int i=0; i<5; i++ ){ for( int j=0; j<5; j++ ){ System.out.println("Inside for(j) loop"); //message1 if( j == 2 ) continue outerLoop; } System.out.println("Inside for(i) loop"); //message2 } Pada contoh ini, pesan ke-2 tidak dicetak, karena statement continue akan melewati pengulangan yang sedang berjalan.

Pengenalan Pemrograman 1

17

J.E.N.I.

6.4.3 Return statement


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

Pengenalan Pemrograman 1

18

J.E.N.I.

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

6.5.2 Membaca Bilangan


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

6.5.3 Cetak Seratus Kali


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

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

Pengenalan Pemrograman 1

19

J.E.N.I.

BAB 7 Java Array


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

7.2 Pengenalan Array


Dibagian sebelumnya, kita telah mendiskusikan bagaimana cara pendeklarasian berbagai macam variabel dengan menggunakan tipe data primitif. Dalam pendeklarasian variabel, kita sering menggunakan sebuah tipe data beserta nama variabel atau identifier yang unik, dimana untuk menggunakan variabel tersebut, kita akan memanggil dengan nama identifier-nya. Sebagai contoh, kita memiliki tiga variabel dengan tipe data int yang memiliki identifier yang berbeda untuk tiap variabel. int number1; int number2; int number3; number1 = 1; number2 = 2; number3 = 3; Seperti yang dapat Anda perhatikan pada contoh diatas, hanya untuk menginisialisasi dan menggunakan variabel terutama pada saat variabel-variabel tersebut memiliki tujuan yang sama, dirasa sangat membingungkan. Di Java maupun di bahasa pemrograman yang lain, mereka memiliki kemampuan untuk menggunakan satu variabel yang dapat menyimpan sebuah data list dan kemudian memanipulasinya dengan lebih efektif. Tipe variabel inilah yang disebut sebagai array.

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 1: Contoh dari Integer Array

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

7.3 Pendeklarasian Array


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

Pengenalan Pemrograman 1

J.E.N.I.

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

Gambar 2: Inisialisasi Arrays

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

Pengenalan Pemrograman 1

J.E.N.I.

7.4 Pengaksesan sebuah elemen array


Untuk mengakses sebuah elemen dalam array, atau mengakses sebagian dari array, Anda harus menggunakan sebuah nomor atau yang disebut sebagai index atau subscript. Sebuah nomor index atau subscript telah diberikan kepada tiap anggota array, sehingga program dan programmer dapat mengakses setiap value apabila dibutuhkan. Index selalu dalam integer. Dimulai dari nol, kemudian akan terus bertambah sampai list value dari array tersebut berakhir. Perlu dicatat, bahwa elemen-elemen didalam array dimulai dari 0 sampai dengan (ukuranArray-1). Sebagai contoh, pada array yang kita deklarasikan tadi, kita mempunyai, //memberikan nilai 10 kepada elemen pertama array ages[0] = 10; //mencetak elemen array yang terakhir System.out.print(ages[99]); Perlu diperhatikan bahwa sekali array dideklarasikan dan dikonstruksi, disimpan dalam setiap anggota array akan diinisialisasi sebagai nol. Oleh apabila Anda menggunakan tipe data reference seperti String, ia tidak akan ke string kosong , sehingga Anda tetap harus membuat String array secara nilai yang karena itu, diinisalisasi eksplisit.

Berikut ini adalah contoh, bagaimana untuk mencetak seluruh elemen didalam array. Dalam contoh ini digunakanlah loop, sehingga kode kita menjadi lebih pendek. public class ArraySample{ public static void main( String[] args ){ int[] ages = new int[100]; for( int i=0; i<100; i++ ){ System.out.print( ages[i] ); } } } Petunjuk penulisan program: 1. Biasanya, lebih baik menginisialisasi atau meng-instantiate array setelah Anda mendeklarasikannya. Sebagai contoh pendeklarasiannya int []arr = new int[100]; lebih disarankan daripada, int []arr; arr = new int[100]; 2. Elemen-elemen dalam n-elemen array memiliki index dari 0 sampai n-1. Perhatikan disini bahwa tidak ada elemen array arr[n]. Hal ini akan menyebabkan array-index outof-bounds exception. 3. Anda tidak dapat mengubah ukuran dari sebuah array

Pengenalan Pemrograman 1

J.E.N.I.

7.5 Panjang Array


Untuk mengetahui berapa banyak element didalam sebuah array, Anda dapat menggunakan length (panjang) field dalam array. Panjang field dalam array akan mengembalikan ukuran dari array itu sendiri. Sebagai contoh, arrayName.length Pada contoh sebelumnya, kita dapat menuliskannya kembali seperti berikut ini, public class ArraySample { public static void main( String[] args ){ int[] ages = new int[100]; for( int i=0; i<ages.length; i++ ){ System.out.print( ages[i] ); } } } Petunjuk penulisan program: 1. Pada saat pembuatan loop untuk memproses elemen-elemen dalam array, gunakanlah length field didalam pernyataan pengkondisian dalam loop. Hal ini akan menyebabkan loop secara otomatis menyesuaikan diri terhada ukuran array yang berbeda-beda. 2. Pendeklarasian ukuran array di Java, biasanya digunakan constant untuk mempermudah. Sebagai contoh, final int ARRAY_SIZE = 1000; ... int[] ages = new int[ARRAY_SIZE]; //pendeklarasian constant

Pengenalan Pemrograman 1

J.E.N.I.

7.6 Array Multidimensi


Array multidimensi diimplementasikan sebagai array didalam array. Array multidimensi dideklarasikan dengan menambahkan jumlah tanda kurung setelah nama array. Sebagai contoh, // Elemen 512 x 128 dari integer array int[][] twoD = new int[512][128]; // karakter array 8 x 16 x 24 char[][][] threeD = new char[8][16][24]; // String array 4 baris x 2 kolom String[][] dogs = {{ "terry", "brown" }, { "Kristin", "white" }, { "toby", "gray"}, { "fido", "black"} }; Untuk mengakses sebuah elemen didalam array multidimensi, sama saja dengan mengakses array satu dimensi. Misalnya saja, untuk mengakses element pertama dari baris pertama didalam array dogs, kita akan menulis, System.out.print( dogs[0][0] ); Kode diatas akan mencetak String terry di layar.

Pengenalan Pemrograman 1

J.E.N.I.

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

7.7.2 Nomor terbesar


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

7.7.3 Buku Alamat


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

Pengenalan Pemrograman 1

J.E.N.I.

BAB 8 Argumen dari Command-line


8.1 Tujuan
Pada 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

J.E.N.I.

Gambar 1:Menjalankan argument dari Command-Line

Perhatikan bahwa sebuah argumen akan dipisahkan oleh spasi. Di bahasa Java, apabila Anda akan memanggil sebuah aplikasi, sebuah runtime system akan memberikan argumen command-line ke main method lewat array dari String, dimana tiap String dalam array terdiri dari sebuah argumen commmand-line. Perhatikan deklarasi dari main method, public static void main( String[] args ) Argumen yang diberikan kepada program Anda akan disimpan kedalam sebuah array String dengan identifier args. Pada contoh sebelumnya, argumen dari command-line yang akan diberikan kepada aplikasi sort command adalah lima buah String yaitu 5,4,3,2, dan 1. Anda dapat mengetahaui berapa banyak argumen dari command-line dengan cara melihat panjang dari attribute array. Sebagai contoh, int numberOfArgs = args.length; Jika program Anda membutuhkan support sebuah argumen command-line yang numeric. Anda harus mengkonversi String argumen tersebut untuk merepresantasikan sebuah nomor, misalnya 34 menjadi sebuah nomor. Kode dibawah ini adalah sebuah potongan untuk mengkonversi sebuah argumen command-line menjadi integer. int firstArg = 0; if (args.length > 0){
Pengenalan Pemrograman 1 2

J.E.N.I.

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

Petunjuk penulisan program: Sebelum menggunakan argumen command line, selalu telitilah terlebih dahulu berapa banyak argumen yang diperlukan untuk mengakses sebuah array, sehingga tidak ada exception yang akan muncul.

Pengenalan Pemrograman 1

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

J.E.N.I.

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

Gambar 3: Membuka Properties

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

Figure 4: Properties Dialog

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 5: Klik untuk menjalankan project

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

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 6: Set argument pada Command-Line

Gambar 7: Jalankan program dengan tombol shortcut

Kemudian, cobalah untuk menjalankan (RUN) progam Anda

Pengenalan Pemrograman 1

J.E.N.I.

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

Gambar 8: Program Keluaran

Pengenalan Pemrograman 1

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

J.E.N.I.

BAB 9 Bekerja dengan Java Class Library


9.1 Tujuan

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

9.2

Pengenalan Pemrograman Berorientasi Object

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

Behavior turning braking accelerating roaring sleeping hunting

Lion

J.E.N.I.

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

9.3

Class dan Object

9.3.1 Perbedaan Class dan Object


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

Object Car B XYZ 123 Red Toyota 100 km/h

Pengenalan Pemrograman 1

J.E.N.I.

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

9.3.2 Instansiasi Class


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

9.3.3 Variabel Class dan Method


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

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

Pengenalan Pemrograman 1

J.E.N.I.

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

9.4.2 Memanggil Instance dari Method dan Passing Variabel


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

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

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

Definition Mengambil karakter pada index. Membandingkan antar String, tidak case sensitive.

Table 3: Method dari Class String

Menggunakan method :

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

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

Pengenalan Pemrograman 1

J.E.N.I.

9.4.3 Passing Variabel Dalam Method


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

public class TestPassByValue { public static void main( String[] args ){ int i = 10; //mencetak nilai i System.out.println( i ); //memanggil method test //passing i pada method test test( i ); //Mencetak nilai i System.out.println( i ); } public static void test( int j ){ //merubah nilai parameter j j = 33; } }
Pada contoh diatas yang telah diberikan, kita memanggil method tes dan melewatkan nilai i sebagai parameter. Nilai pada i dikopikan pada variable pada method j. sejak j adalah variable pengganti pada method tes, dia tidak akan berdampak pada nilai variable jika i pada main semenjak memiliki perbedaan kopy pada variable. Secara default, semua tipe data primitive ketika dilewatkan pada sebuah method adalah pass-by-values

Pass i as parameter which is copied to j

Pengenalan Pemrograman 1

J.E.N.I.

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

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

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

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

Pengenalan Pemrograman 1

J.E.N.I.

Gambar 2 : Contoh Pass By Reference

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

9.4.4 Memanggil Method Static


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

Classname.staticMethodName(params);

Pengenalan Pemrograman 1

J.E.N.I.

Contoh dari static method yang digunakan :

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

String hexEquivalent = Integer.toHexString( 10 );

9.4.5 Lingkup Variabel


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

Pengenalan Pemrograman 1

J.E.N.I.

Contoh, yang diberi code snippet,

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

int i = 0;

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

D
int k = 0;

int

m = 0;

E
int } } n = 0;

Pengenalan Pemrograman 1

J.E.N.I.

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

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

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

B A

Pada method pertama, Jangkauan variables adalah,

ages[ ] i in B i in C

- scope A - scope B scope C


10

Pengenalan Pemrograman 1

J.E.N.I.

Pada method ujian, Jangkauan variables adalah,

arr[ ] i in E

- scope D - scope E

manakala variable di deklarasikan,hanya satu variable yang di identifikasi atau nama dapat di identifikasi di jangkauan, maksudnya jika kamu mempunyai deklarasi berikut,

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


Compilermu akan menghasilkan error karena kamu perlu mempunyai nama yang lain dari variable di satu blok, bagaimanapun, kamu dapat mempunyai dua variable dengan nama yang sama, jika mereka tidak dideklarasikan pada blok yang sama, Contoh

int test = 0; System.out.print( test ); //..some code here { int test = 20; System.out.print( test ); }
Manakala system pertama out.print itu memanggil, dia mencetak nilai dari variable ujian pertama sejak terdapat pada variable jangkauan itu. Yang kedua, system.out print, nilai 20 dicetak sejak tertutup ujian jangkauan variable itu. Petunjuk Penulisan program : Hindari pemberian nama yang sama kepada variabel supaya Anda tidak kebingungan.

9.5 Casting, Converting dan Comparing Objects


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

Pengenalan Pemrograman 1

11

J.E.N.I.

9.5.1 Casting Tipe Primitiv


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

char valChar = 'A'; int valInt = valChar; System.out.print( valInt ); //casting explisit: keluaran 65 Ketika kita men-convert data yang bertipe besar ke tipe data yang lebih kecil, kita harus menggunakan explicit cast. Explicit casts mengikuti bentuk sebagai berikut : (dataType)value dimana, dataType, adalah nama dari tipe data yang Anda convert value, adalah pernyataan yang dihasilkan pada nilai dari the source type.

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

Pengenalan Pemrograman 1

J.E.N.I.

9.5.2 Casting Objects


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

Figure 2: Contoh Hierarchy Class

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

Pengenalan Pemrograman 1

13

J.E.N.I.

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

Figure 3: Class Hierarchy untuk superclass Employee

Contoh berikut memilih sebuah instance dari class VicePresident ke sabuah instance dari class Employee; VicePresident adalah sebuah dari Employee dengan lebih banyak information, dimana disini mendefinisikan bahwa VicePresident memilihi executive washroom privileges, Employee emp = new Employee(); VicePresident veep = new VicePresident(); emp = veep; // tidak adah pemilihan yang diperlukan untuk penggunaan yang cenderung naik veep = (VicePresident)emp; // Harus memilih dengan pemilihan secara eksplisit

9.5.3 Convert Tipe Primitive ke Object Dan Sebaliknya


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

Pengenalan Pemrograman 1

14

J.E.N.I.

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

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

9.5.3 Comparing Objects


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

Pengenalan Pemrograman 1

15

J.E.N.I.

mempertimbangkan nilai yang tidak sama. Walaupun isinya sesuai mereka bukan merupakan object yang sama. Untuk melihat jika dua object String memiliki nilai yang sesuai, sebuah method dari class yang disebuat dengan equals() digunakan. Method menguji setiap character dalam string dan mengembalikan nilai true jika dua string memiliki nilai yang sama. Kode berikut mengilustrasikan hal tersebut, class EqualsTest { public static void main(String[] arguments) { String str1, str2; str1 = "Free the bound periodicals."; str2 = str1; System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("Same object? " + (str1 == str2)); str2 = new String(str1); System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("Same object? " + (str1 == str2)); System.out.println("Same value? " + str1.equals(str2));

} }

Output program ini adalah sebagai berikut , OUTPUT: String1: Free the bound String2: Free the bound Same object? true String1: Free the bound String2: Free the bound Same object? false Same value? True periodicals. periodicals. periodicals. periodicals.

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

Pengenalan Pemrograman 1

16

J.E.N.I.

Figure 4: Keduanya mengarah ke object yang sama

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

Figure 5: Sekarang mengarah pada object yang berbeda

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

Pengenalan Pemrograman 1

17

J.E.N.I.

9.5.5 Menentukan Class dari sebuah Object


Ingin menemukan apakah sebuah class object itu? Disini langkah untuk melakukannya untuk sebuah object yang diberikan sebagai kunci variabel : 1. Method getClass() mengembalikan sebuah object Class (dimana Class itu sendiri merupakan sebuah class) yang memilki sebuah method yang disebut getName(). Pada bagiannya, getName() mengembalikan sebuah string yang mewakili nama class. Sebagai contoh, String name = key.getClass().getName(); 2. operator InstanceOf instanceOf memiliki dua operands: suatu mengarahke sebuah object pada sebelah kiri dan nama class pada sebelah kanan. pernyataan mengembalikan nilai true atau false tergantung pada apakah object adalah sebuah instance dari penamaan class atau beberapa dari subclass milik class tersebut. Sebagai contoh, boolean ex1 = "Texas" instanceof String; // true Object pt = new Point(10, 10); boolean ex2 = pt instanceof String; // false

Pengenalan Pemrograman 1

18

J.E.N.I.

9.6

Latihan

9.6.1 Mendefinisikan Istilah


Dengan kata-kata Anda sendiri, definisikan istilah-istilah berikut ini : 1. 2. 3. 4. 5. 6. 7. Class Object Instantiate Instance Variable Instance Method Class Variables atau static member variables Constructor

9.6.2 Java Scavanger Hunt


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

Pengenalan Pemrograman 1

19

J.E.N.I.

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

Pengenalan Pemrograman 1

20

J.E.N.I.

BAB 10 Membuat Class Sendiri 10.1 Tujuan


Setelah kita mempelajari penggunaan class dari Java Class Library, kita akan mempelajari bagaimana menuliskan sebuah class sendiri. Pada bagian ini, untuk mempermudah pemahaman pembuatan class, kita akan membuat contoh class dimana akan ditambahkan beberapa data dan fungsi fungsi lain. Kita akan membuat class yang mengandung informasi dari Siswa dan operasi operasi yang dibutuhkan pada record siswa. Beberapa hal yang perlu diperhatikan pada syntax yang digunakan pada bab ini dan bagian lainnya :
* <description> [] - Menandakan bahwa terjadi lebih dari satu kejadian dimana elemen tersebut diimplementasikan - Menandakan bahwa Anda harus memberikan nilai pasti pada bagian ini - Indikasi bagian optional

Pada akhir pembahasan, diharapkan siswa dapat : Membuat kelas mereka sendiri Mendeklarasikan atribut dan method pada class Menggunakan referensi this untuk mengakses instance data Membuat dan memanggil overloaded method Mengimport dan membuat package Menggunakan access modifiers untuk mengendalikan akses terhadap class member

Pengenalan Pemrograman 1

J.E.N.I.

10.2

Mendefinisikan Class Anda

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

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

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

lain.

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

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

public class StudentRecord { //area penulisan kode selanjutnya }

dimana,

Public Class StudentRecord

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

Pengenalan Pemrograman 1

J.E.N.I.

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

10.3

Deklarasi Atribut

Dalam pendeklarasian atribut, kita tuliskan :


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

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

name address age math grade english grade science grade average grade

String String Int double double double double

Anda dapat menambahkan informasi lain jika diperlukan.

Pengenalan Pemrograman 1

J.E.N.I.

10.3.1

Instance Variable

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

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

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

Pengenalan Pemrograman 1

J.E.N.I.

10.3.2

Class Variable atau Static Variables

Disamping instance variable, kita juga dapat mendeklarasikan class variable atau variabel yang dimiliki class sepenuhnya. Nilai pada variabel ini sama pada semua object di class yang sama. Anggaplah kita menginginkan jumlah dari siswa yang dimiliki dari seluruh 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

J.E.N.I.

10.4.

Deklarasi Methods

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

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

10.4.1

Accessor Methods

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

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

Pengenalan Pemrograman 1

J.E.N.I.

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

Pernyataan berikut,
return name;

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

Contoh lain dari penggunaan accessor method adalah getAverage,


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

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

Pengenalan Pemrograman 1

J.E.N.I.

10.4.2

Mutator Methods

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

dimana, public void setName (String temp) Pernyataan berikut :


name = temp;

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

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

Pengenalan Pemrograman 1

J.E.N.I.

10.4.3

Multiple Return Statements

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

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

10.4.4

Static Methods

Kita menggunakan static method untuk mengakses static variable studentCount.

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

dimana, public static Int getStudentCount - Menjelaskan bahwa method ini dapat diakses object luar kelas - Method ini adalah static dan pemanggilannya menggunakan [namaKelas].[namaMethod]. Sebagai contoh : studentRecord.getStudentCount - Tipe return dari method. Mengindikasikan method tersebut harus mempunyai return value berupa integer - Nama dari method

Pengenalan Pemrograman 1

J.E.N.I.

public ()

- Menjelaskan bahwa method ini dapat diakses object luar kelas - Method ini tidak memiliki parameter apapun

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

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

Pengenalan Pemrograman 1

10

J.E.N.I.

10.4.5

Contoh Kode Program dari class StudentRecord

Berikut ini adalah kode untuk class StudentRecord :


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

Pengenalan Pemrograman 1

11

J.E.N.I.

Berikut ini contoh kode dari class yang mengimplementasikan class StudentRecord :

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

Output dari program adalah sebagai berikut :


Anna Student Count = 0

10.5.

Referensi this

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

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

Pengenalan Pemrograman 1

12

J.E.N.I.

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

age = age;

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

this.<namaInstanceVariable>

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

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

10.6.

Overloading Methods

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

Pengenalan Pemrograman 1

13

J.E.N.I.

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

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

Jika kita panggil pada method utama (main) :

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

Pengenalan Pemrograman 1

14

J.E.N.I.

Kita akan mendapatkan output pada panggilan pertama sebagai berikut :

Name:Anna Address:Philippines Age:15

Kemudian akan dihasilkan output sebagai berikut pada panggilan kedua :

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

Jangan dilupakan bahwa overloaded method memiliki property sebagai berikut : 1. Nama yang sama 2. Parameter yang berbeda 3. Nilai kembalian (return) bisa sama ataupun berbeda

10.7.

Deklarasi Constructor

Telah tersirat pada pembahasan sebelumnya, Constructor sangatlah penting pada pembentukan sebuah object. Constructor adalah method dimana seluruh inisialisasi object ditempatkan. Berikut ini adalah property dari Constructor : 1. Constructor memiliki nama yang sama dengan class 2. Sebuah Constructor mirip dengan method pada umumnya, namun hanya informasi informasi berikut yang dapat ditempatkan pada header sebuah constructor, scope atau identifikasi pengaksesan (misal: public), nama dari konstuktor dan parameter. 3. Constructor tidak memiliki return value 4. Constructor tidak dapat dipanggil secara langsung, namun harus dipanggil dengan menggunakan operator new pada pembentukan sebuah class. Untuk mendeklarasikan constructor, kita tulis,
<modifier> <className> (<parameter>*) { <statement>* }

Pengenalan Pemrograman 1

15

J.E.N.I.

10.7.1

Default Constructor

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

public StudentRecord() { //area penulisan kode

10.7.2

Overloading Constructor

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

public StudentRecord(double mGrade, double eGrade, double sGrade){ mathGrade = mGrade; englishGrade = eGrade; scienceGrade = sGrade; }

Pengenalan Pemrograman 1

16

J.E.N.I.

10.7.3

Menggunakan Constructor

Untuk menggunakan constructor, kita gunakan kode kode sebagai berikut :

public static void main( String[] args ) { //membuat 3 objek StudentRecord annaRecord=new StudentRecord("Anna"); StudentRecord beahRecord=new StudentRecord("Beah","Philippines"); StudentRecord crisRecord=new StudentRecord(80,90,100); //area penulisan kode selanjtunya }

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

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

public StudentRecord(double mGrade, double eGrade, double sGrade){ mathGrade = mGrade; englishGrade = eGrade; scienceGrade = sGrade; studentCount++; //menambah student }

Pengenalan Pemrograman 1

17

J.E.N.I.

10.7.4

Pemanggilan Constructor Dengan this()

Pemanggilan constructor dapat dilakukan secara berangkai, dalam arti Anda dapat memanggil constructor di dalam constructor lain. Pemanggilan dapat dilakukan dengan referensi this(). Perhatikan contoh kode sebagai berikut : 1: public StudentRecord(){ 2: this("some string"); 3: 4: } 5: 6: public StudentRecord(String temp){ 7: this.name = temp; 8: } 9: 10: public static void main( String[] args ) 11: { 12: 13: StudentRecord annaRecord = new StudentRecord(); 14: } Dari contoh kode diatas, pada saat baris ke 13 dipanggil akan memanggil constructor dasar pada baris pertama. Pada saat baris kedua dijalankan, baris tersebut akan menjalankan constructor yang memiliki parameter String pada baris ke-6. Beberapa hal yang patut diperhatikan pada penggunaan this() : 1. Harus dituliskan pada baris pertama pada sebuah constructor 2. Hanya dapat digunakan pada satu definisi constructor. Kemudian metode ini dapat diikuti dengan kode kode berikutnya yang relevan

Pengenalan Pemrograman 1

18

J.E.N.I.

10.8.

Packages

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

10.8.1

Mengimport Packages

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

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

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

10.8.2

Membuat Package

Untuk membuat package, dapat dilakukan dengan menuliskan : package <packageName>; Anggaplah kita ingin membuat package dimana class StudentRecord akan ditempatkan bersama dengan class class yang lain dengan nama package schoolClasses.

Pengenalan Pemrograman 1

19

J.E.N.I.

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

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

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

10.8.3

Pengaturan CLASSPATH

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

Asumsikan kita mengkompilasi dan menjalankan class StudentRecord :


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

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

J.E.N.I.

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

C:\schoolClasses> set classpath=C:\

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

C:\schoolClasses> java schoolClasses.StudentRecord

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

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

dan untuk sistem UNIX :


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

Pengenalan Pemrograman 1

21

J.E.N.I.

10.9.

Access Modifiers

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

10.9.1

Akses Default (Package Accessibility)

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

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

Pengenalan Pemrograman 1

22

J.E.N.I.

10.9.2

Akses Public

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

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

10.9.3

Akses Protected

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

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

Pengenalan Pemrograman 1

23

J.E.N.I.

10.9.4

Akses Private

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

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

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

Pengenalan Pemrograman 1

24

J.E.N.I.

10.10. Latihan
10.10.1 Entry Buku Alamat

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

Attribut Nama Alamat Nomor Telepon Alamat E-Mail Alamat Lengkap Nomor telepon personal Alamat E-Mail personal

Deskripsi Nama Lengkap perseorangan

Tabel 1: Atribut dan Deskripsi Atribut

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

10.10.2

Buku Alamat

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

Pengenalan Pemrograman 1

25

J.E.N.I.

BAB 11 Pewarisan, Polimorfisme, dan Interface


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

Mendefinisikan superclasses dan subclasses Override method dari superclasses Membuat method final dan class final

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

Gambar 1: Hirarki class Pewarisan adalah keuntungan besar dalam pemrograman berbasis object karena suatu sifat atau method didefinisikan dalam superclass, sifat ini secara otomatis diwariskan dari semua subclasses. Jadi, Anda dapat menuliskan kode method hanya sekali dan mereka
Pengenalan Pemrograman 1 1

J.E.N.I.

dapat digunakan oleh semua subclass. Subclass hanya butuh mengimplementasikan perbedaannya sendiri dan induknya.

11.2.1

Mendefinisikan Superclass dan Subclass

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

name; address;

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

Pengenalan Pemrograman 1

J.E.N.I.

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

Pengenalan Pemrograman 1

Gambar 2: Alur Program

J.E.N.I.

Alur program ditunjukkan sebagai berikut.

11.2.2

Kata Kunci Super

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

J.E.N.I.

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

11.2.3

Overriding Method

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

J.E.N.I.

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

11.2.4

Method final dan class final

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

Pengenalan Pemrograman 1

J.E.N.I.

11.3

Polimorfisme

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

Person

Student

Employee

Gambar 3: Hirarki dari class induk Person

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

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

J.E.N.I.

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

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

J.E.N.I.

public static printInformation( Person p ){ . . . . }

11.4

Abstract Class

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

Gambar 4: class abstract

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

Pengenalan Pemrograman 1

J.E.N.I.

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

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

Pengenalan Pemrograman 1

10

J.E.N.I.

11.5

Interface

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

11.5.1

Kenapa Kita Memakai Interface?

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

Pengenalan Pemrograman 1

11

J.E.N.I.

11.5.2

Interface vs. Class Abstract

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

11.5.3

Interface vs. Class

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

Bagaimanapun, Anda tidak dapat membuat instance dari sebuah interface. Contohnya: pi = new PersonInterface(); //COMPILE //ERROR!!! Ciri umum lain adalah baik interface maupun class dapat mendefinisikan method. Bagaimanapun, sebuah interface tidak punya sebuah kode implementasi sedangkan class memiliki salah satunya. PersonInterface

11.5.4

Membuat Interface

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

Pengenalan Pemrograman 1

12

J.E.N.I.

Sekarang, penggunaan interface, kita gunakan kata kunci implements. Contohnya, /** * Class ini mendefinisikan segmen garis */ public class Line implements Relation { private double x1; private double x2; private double y1; private double y2; public Line(double x1, double x2, double y1, double y2){ this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; } public double getLength(){ double length = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)* (y2-y1)); return length; } public boolean isGreater( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen > bLen); } public boolean isLess( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen < bLen); } public boolean isEqual( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen == bLen); } }

Pengenalan Pemrograman 1

13

J.E.N.I.

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

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

11.5.5

Hubungan dari Interface ke Class

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

Pengenalan Pemrograman 1

14

J.E.N.I.

11.5.6

Pewarisan Antar Interface

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

Pengenalan Pemrograman 1

15

J.E.N.I.

11.6
11.6.1

Latihan
Extend StudentRecord

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

11.6.2

Bentuk Abstract Class

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

Pengenalan Pemrograman 1

16

J.E.N.I.

BAB 12 Dasar Exception Handling


12.1 Tujuan
Dalam bagian ini, kita akan mempelajari teknik yang dipakai dalam Java dalam menangani kondisi yang tidak biasa dalam menjalankan operasi normal dalam program. Teknik ini dinamakan exception handling. Pada akhir pembelajaran, siswa mampu untuk !ende"inisikan e#$eption !enangani e#$eption menggunakan blok try%$at$h%"inally

12.2

Apa itu Exception?

E#$eption adalah sebuah peristiwa yang menjalankan alur proses normal pada program. Peristiwa ini biasanya berupa kesalahan&error' dari beberapa bentuk. Ini disebabkan program kita berakhir tidak normal. (eberapa $ontoh dari e#$eption yang )nda mungkin jumpai pada latihan%latihan sebelumnya adalah e#$eption )rrayInde#*ut*"(ounds, yang terjadi jika kita men$oba mengakses elemen array yang tidak ada, atau Number+ormatE#$eption, yang terjadi ketika kita men$oba melalui parameter bukan angka dalam method Integer.parseInt.

12.3 Menangani Exception


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

} # # #

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

Pengenalan Pemrograman -

J.E.N.I.

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

Gambar 1: Alur kejadian blok try-catch-finally

Pengenalan Pemrograman -

J.E.N.I.

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

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

,ystem#out#println( args-1. / }catch( ArrayIndexOutOfBoundsException exp ){ ,ystem#out#println(&%xception caught0& / } } } Jadi kita akan menjalankan program lagi tanpa argumen, keluarannya akan menjadi, %xception caught0

Pengenalan Pemrograman -

J.E.N.I.

12.

!atihan

12.4.1 Menangkap Exception 1


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

12.4.2 Menangkap Exception 2


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

Pengenalan Pemrograman -

J.E.N.I.

Bab 1 Review Konsep Dasar dalam Java


1.1 Tujuan
Sebelum melangkah pada fitur-fitur menarik yang ada pada Java, mari kita meninjau beberapa hal yang telah Anda pelajari pada pelajaran pemograman pertama Anda. Pelajaran ini menyajikan di ku i tentang perbedaan kon ep-kon ep berorienta i obje!t dalam Java. Sebelum melengkapi pelajaran ini, Anda ebaiknya mampu untuk" #. $engetahui dan menggunakan kon ep da ar beorienta i obje!t.

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

%. $engetahui dengan jela dengan baik


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

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

1.2 Konsep Berorientasi object


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

Pengenalan Pemrograman %

J.E.N.I.

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

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

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

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

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

1.2.

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

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

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

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

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

J.E.N.I.

moyang dari !la

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

SuperHero

FlyingSuperHero

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

SuperHero adalah uper!la dari !la FlyingSuperHero dan UnderwaterSuperHero. +atatan bah&a FlyingSuperHero /i -a0 SuperHero. Sebagaimana juga UnderwaterSuperHero /i -a0 SuperHero

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

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

1.3 Struktur

ro!ram Java

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

1.3.1 Mendeklarasikan class ,a-a


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

Pengenalan Pemrograman %

J.E.N.I.

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

1.3.2 Mendeklarasikan Atribut


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

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


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

1.3.3 Mendeklarasikan Method


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

J.E.N.I.

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

1.3.4 Mendeklarasikan sebuah Konstruktor


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

1.3.5 Men"1instansiasi sebuah class


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

J.E.N.I.

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

99di:instantiate

1.3.6 Men"akses An""ota object


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

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

1.3.

!acka"e

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

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

Pengenalan Pemrograman %

J.E.N.I.

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

1.3.# Acces Modi*ier


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

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

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

Pengenalan Pemrograman %

J.E.N.I.

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

1.3.11 Method O-erridin"


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

Pengenalan Pemrograman %

J.E.N.I.

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

1.3.12 Class Abstract dan Method


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

abstract <modifier> <return/*pe> <name>$<parameter>*%"abstract class <name> { 9* constructors1 fields and methods *9 ' -ata kun!i tidak dapat digunakan pada kon truktor atau method static. Ini juga penting untuk diingat bah&a !la abstract tidak dapat di-instantiate. +la yang meng-extends abstract! Jika tidak ub!la ebuah !la abstract haru mengimplementa ikan endiri dapat dideklara ikan ebagai abstract! emua method

!etunjuk !enulisan !ro"ra). catatan bahwa mendeklarasikan sebuah method abstract hampir mirip dalam mendeklarasikan class normal kecuali itu suatu method abstract yang tidak memiliki tubuh dan kepala sehingga dengan segera diakhiri dengan semicolon&2'!
Pengenalan Pemrograman % 9

J.E.N.I.

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

'

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

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

Anggotanya adalah public ketika interfa!e dideklara ikan public!


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

Pengenalan Pemrograman %

10

J.E.N.I.

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

'

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

' '

1.3.14 Kata kunci this


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

Pengenalan Pemrograman %

11

J.E.N.I.

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

1.3.15 Kata kunci su%er


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

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

J.E.N.I.

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

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

Pengenalan Pemrograman %

13

J.E.N.I.

1.3.16 Kata Kunci static


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

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

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

1.3.1

Kata Kunci *inal

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

Pengenalan Pemrograman %

14

J.E.N.I.

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

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

1.3.1# +nner Classes


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

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

Pengenalan Pemrograman %

15

J.E.N.I.

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

1.4.2 3reatest Co))on 4actor53C46


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

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

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

Pengenalan Pemrograman %

16

J.E.N.I.

Bab 2 Exceptions dan Assertions


2.1 Tujuan
Dasar penanganan exception telah dikenalkan pada anda di kursus pemrograman pertama. Bab ini membahas secara lebih dalam mengenai exception dan juga sedikit menyinggung tentang assertion. Setelah menyelesaikan pembahasan, anda diharapkan dapat !. "enangani exception dengan menggunakan try, catch dan #inally $. "embedakan penggunaan antara thro% dengan thro%s &. "enggunakan exception class yang berbeda ' beda (. "embedakan antara checked exceptions dan unchecked exceptions ). "embuat exception class tersendiri *. "enjelaskan keunggulan penggunaan assertions +. "enggunakan assertions

2.2 Apa itu Exception?


2.2.1 Pendahuluan
Bugs dan error dalam sebuah program sangat sering muncul meskipun program tersebut dibuat oleh programmer berkemampuan tinggi. ,ntuk menghindari pemborosan %aktu pada proses error-checking, Ja.a menyediakan mekanisme penanganan exception. Exception adalah singkatan dari Exceptional E.ents. /esalahan 0errors1 yang terjadi saat runtime, menyebabkan gangguan pada alur eksekusi program. 2erdapat beberapa tipe error yang dapat muncul. Sebagai contoh adalah error pembagian 3, mengakses elemen di luar jangkauan sebuah array, input yang tidak benar dan membuka #ile yang tidak ada.

2.2.2 Error dan Exception Classes


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

5engenalan 5emrograman $

J.E.N.I.

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

2.2.3 Sebuah Contoh


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

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

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

5engenalan 5emrograman $

J.E.N.I.

2.3 Menangkap Exception


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

try { /code to be monitored 0or e(ceptions1 & catc) (/'(ception2ype31 /4b+5ame1) { /)andler i0 '(ception2ype3 occurs1 & ... & catc) (/'(ception2ype51 /4b+5ame1) { /)andler i0 '(ception2ype5 occurs1 &

Petunjuk Penulisan Progra

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

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

/esalahan pembagian dengan bilangan 3 adalah salah satu contoh dari ArithmethicException. 2ipe exception kemudian mengindikasikan klausa catch pada class ini. 5rogram tersebut menangani kesalahan yang terjadi dengan menampilkan deskripsi dari permasalahan.

5engenalan 5emrograman $

J.E.N.I.

:utput program saat eksekusi akan terlihat sebagai berikut


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

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

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

5engenalan 5emrograman $

J.E.N.I.

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

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

Bagaimana output program tersebut jika diimplementasikan terhadap argument ' argument berikut a1 2idak ada argumen b1 !) c1 !) & d1 !) 3

2.3.2 "ey#ord $inally


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

5engenalan 5emrograman $

J.E.N.I.

Petunjuk Penulisan Progra

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

5engenalan 5emrograman $

J.E.N.I.

2.4 Melempar Exception


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

t)roA /e(ception ob+ect1!


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

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


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

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

5engenalan 5emrograman $

J.E.N.I.

4ontoh berikut ini menunjukkan bah%a method my%ethod tidak menangani &lass'ot(oundException.
class 2)roAing#lass { static void my7et)od() t)roAs #lass5ot@ound'(ception { t)roA neA #lass5ot@ound'(ception (*+ust a demo*)! & & class 2)roAsDemo { public static void main(String args[]) { try { 2)roAing#lass.my7et)od()! & catc) (#lass5ot@ound'(ception e) { System.out.println(e)! & & &

2.

!ategori Exception

2.&.1 Exception Classes dan 'ierarchy


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

Tabel ).*. Exception &lass +ierarchy

5engenalan 5emrograman $

J.E.N.I.

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

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

2.&.2 Checked dan (nchecked Exceptions


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

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


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

5engenalan 5emrograman $

J.E.N.I.

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

2." Assertions
2.+.1 (ser )e*ined Exceptions
6ssertions mengijinkan programmer untuk menentukan asumsi yang dihadapi. Sebagai contoh, sebuah tanggal dengan area bulan tidak berada antara ! hingga !$ dapat diputuskan bah%a data tersebut tidak .alid. 5rogrammer dapat menentukan bulan harus berada diantara area tersebut. "eskipun hal itu dimungkinkan untuk menggunakan contructor lain untuk mensimulasikan #ungsi dari assertions, namun sulit untuk dilakukan karena #itur assertion dapat tidak digunakan. @al yang menarik dari assertions adalah seorang user memiliki pilihan untuk digunakan atau tidak pada saat runtime. 6ssertion dapat diartikan sebagai extensi atas komentar yang mengin#ormasikan pembaca kode bah%a sebagian kondisi harus terpenuhi. Dengan menggunakan assertions, maka tidak perlu untuk membaca keseluruhan kode melalui setiap komentar untuk mencari asumsi yang dibuat dalam kode. Namun, menjalankan program tersebut akan memberitahu anda tentang assertion yang dibuat benar atau salah. Jika assertion tersebut salah, maka AssertionError akan terjadi.

2.+.2 ,engakti*kan dan ,enonakti*kan Exceptions


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

5engenalan 5emrograman $

10

J.E.N.I.

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

sebuah

tambahan

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

+ava 7y<rogram

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

assertions,

anda

perlu

menggunakan

+ava Ienableassertions 7y<rogram

2.+.3 Sintax -ssertions


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

dimana <expression1> adalah kondisi assertion bernilai true dan <expression2> adalah in#ormasi yang membantu pemeriksaan mengapa program mengalami kesalahan.

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

5engenalan 5emrograman $

11

J.E.N.I.

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

2...2 ,ena

pilkan Sebuah /erlian

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

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

5engenalan 5emrograman $

12

J.E.N.I.

Bab 3 Teknik Pemrograman Lanjut


3.1 Tujuan
Modul ini mengenalkan suatu teknik pemrograman yang lebih tinggi. Dalam bagian ini Anda akan mempelajari rekursif dan tipe data abstrak. Setelah menyelesaikan pelajaran ini, diharapkan Anda dapat !. Memahami dan menggunakan rekursif ". Mengetahui perbedaan antara sta#ks dan $ueues ". Mengimplementasikan suatu implementasi se$uensial dari sta#ks dan $ueues %. Mengimplementasikan suatu implementasi linked dari sta#ks and $ueues

4. Menggunakan Collection #lasses yang ada

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

3.2.2 Rekursif Vs. Iterasi


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

J.E.N.I.

Gambar 1: Contoh Factorial

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

3.2.3 Factorials: Conto


7isting program berikut ini menunjukkan bagaimana menghitung faktorial menggunakan teknik iterasi. class FactorialIter { static int factorial(int n) { int result = 1; for (int i = n; i > 1; i--) { result *= i; }
,engenalan ,emrograman " 2

J.E.N.I.

return result; } public static void main(Strin ar s!") { int n = Inte er#parseInt(ar s!$"); S%stem#out#println(factorial(n)); }

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

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

yang lain

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

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

,engenalan ,emrograman "

J.E.N.I.

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

,engenalan ,emrograman "

J.E.N.I.

3.3 Abstract Data Type


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

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

Tabel 1.2.2: Ilustrasi Stack

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

,engenalan ,emrograman "

J.E.N.I.

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

% JayA

B 35

; Jojo

2 (oto

F 3yla

: DMC end

... Insert Delete

n)!

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

3.3.! 'e)uential and *inked Representation


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

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


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

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

J.E.N.I.

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

3.3., *inked *ists


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

,engenalan ,emrograman "

J.E.N.I.

Iambar 2.2a Sebuah node

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

Iambar 3.2b Non)empty linked list dengan tiga node

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

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

,engenalan ,emrograman "

J.E.N.I.

3.3.- *inked Representation dari Integer 'tack


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

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

,engenalan ,emrograman "

J.E.N.I.

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

3.3.. /a0a Collections


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

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

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

J.E.N.I.

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

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

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

,engenalan ,emrograman "

11

J.E.N.I.

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

,engenalan ,emrograman "

12

J.E.N.I.

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

Iambar !.".: 5ontoh (reeSet

,engenalan ,emrograman "

13

J.E.N.I.

3.& Lati$an
3.!.1 Faktor "ersekutuan &er%esar
1aktor persekutuan terbesar *1,6+ dari dua angka adalah angka yang terbesar selalu dibagi oleh angka yang satunya, kemudian modulus atau sisa pembagian membagi angka kedua dan seterusnya hingga sisa pembagian dari kedua angka tersebut sama dengan nol. Menggunakan Eu#lidKs method, buatlah dua kode untuk penghitungan dua angka. Iunakan iterasi untuk kode program yang pertama dan rekursif untuk kode program berikutnya. 5atatan pada algoritma Eu#lid !. Sebagai masukkan integers ? dan y. ". -langi step diba'ah ini 'hile y L. 9 a. y . ? M y0 b. ? . Nilai lama y0 %. &eturn ?. 5ontoh, ? . !B dan y . 2. y . ? M y . !B M 2 . " ?.2 y.?My.2M".9 / 0 2 1F234

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


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

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


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

3.!.! Address #ook


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

,engenalan ,emrograman "

14

J.E.N.I.

Bab 5 Aplikasi Berbasis Teks


5.1 Tujuan
Pembahasan kali ini akan menitikberatkan pada bahasan penggunaan argument command-line. Selebihnya, Anda akan mempelajari mengenai penggunaan streams untuk mendapatkan nilai input dari user pada saat runtime, sekaligus dalam proses manipulasi ile. Setelah menyelesaikan pembahasan ini, Anda diharapkan dapat ! ". #endapatkan input dari comman-line $. #engetahui cara untuk memanipulasi properties dari sistem %. #embaca standart input &. #embaca dan menulis ile

5.2 Argument Command-Line dan System Properties


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

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

Pengenalan Pemrograman $

J.E.N.I.

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

Tabel 1.1: getProperty() method dari class System

/ita tidak dapat cukup berhenti pada detail dari system properties, namun dilanjutkan dengan memanipulasi system properties yang digunakan. Jika Anda tertarik mempelajari lebih lanjut tentang system properties, Anda dapat menelusuri dokumentasi API yang disediakan. Anda dapat menggunakan argument opsional 01 pada perintah Ja(a dalam command-line untuk menambahkan property baru.
java -D<name>=value

Sebagai contoh, untuk mengatur system property dengan nama user.home bernilai phillipines, gunakan perintah berikut !
java -Duser.home=philippines

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

Pengenalan Pemrograman $

J.E.N.I.

5.

!emba"a Standard #nput

1ibandingkan dengan mendapatkan masukan user dari command-line, sebagian user lebih memilih untuk memasukkan data bilamana diminta oleh program pada saat eksekusi. Satu cara dalam melakukan hal ini adalah dengan menggunakan stream. Sebuah stream adalah abstraksi dari sebuah ile atau sebuah perangkat yang mengijinkan beberapa set item untuk dibaca atau ditulisi. Streams terhubung dengan physical de(ices seperti keyboards, consoles dan iles. 3erdapat dua bentuk umum dari streams, byte streams dan character streams. .yte streams digunakan pada data biner, sedangkan character streams digunakan pada karakter 2nicode. System.in dan System.out adalah dua contoh dari byte streams yang digunakan dalam Ja(a. )ontoh pertama mere erensikan pada keyboard, kemudian contoh kedua mere erensikan pada console. 2ntuk membaca karakter dari keyboard, Anda dapat menggunakan byte stream System.in yang terdapat pada object .u ered4eader. .aris berikut menunjukkan bagaimana untuk melakukan hal tersebut !

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

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

)obalah contoh kode berikut !

import java.io.+! class ,avoriteCharacter pu&lic static voi$ main(String args./ thro's (012ception System.out.println(34i5 'hat6s your #avorite character73 ! char #avChar! "u##ere$%ea$er &r = ne' "u##ere$%ea$er(ne' (nputStream%ea$er(System.in #avChar = (char &r.rea$( ! System.out.println(#avChar 8 3 is a goo$ choice93 ! : :

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

Pengenalan Pemrograman $

J.E.N.I.

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

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

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

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

Pengenalan Pemrograman $

J.E.N.I.

5.$ !enangani %ile


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

5.4.1 Membaca sebuah File


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

,ile(nputStream(String #ilename

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

Pengenalan Pemrograman $

J.E.N.I.

.erikut ini contohnya !


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

5.4.2 Menulis sebuah file


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

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

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

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

Pengenalan Pemrograman $

J.E.N.I.

Program berikut menunjukkan contoh penulisan terhadap ile !


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

Pengenalan Pemrograman $

J.E.N.I.

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

Pengenalan Pemrograman $

J.E.N.I.

Bab 6 Algoritma Sorting


6.1 Tujuan
Sorting adalah proses menyusun elemen elemen dengan tata urut tertentu dan proses tersebut terimplementasi dalam bermacam aplikasi. Kita ambil contoh pada aplikasi perbankan. Aplikasi tersebut mampu menampilkan daftar account yang aktif. Hampir seluruh pengguna pada sistem akan memilih tampilan daftar berurutan secara ascending demi kenyamanan dalam penelusuran data. Beberapa macam algoritma sorting telah dibuat karena proses tersebut sangat mendasar dan sering digunakan. leh karena itu! pemahaman atas algoritma algoritma yang ada sangatlah berguna. "etelah menyelesaikan pembahasan pada bagian ini! anda diharapkan mampu # 1. $emahami dan men%elaskan algoritma dari insertion sort, selection sort, merge sort dan quick sort. &. $embuat implementasi pribadi menggunakan algoritma yang ada

6.2 Insertion Sort


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

'engenalan 'emrograman &

J.E.N.I.

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

6.2.2 Sebuah Contoh


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

Gambar 1.1.2: Contoh insertion sort

'ada akhir modul ini! anda akan diminta untuk membuat implementasi bermacam algoritma sorting yang akan dibahas pada bagian ini.

6.3 Selection Sort


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

'engenalan 'emrograman &

J.E.N.I.

Ide utama dari algoritma selection sort adalah memilih elemen dengan nilai paling rendah dan menukar elemen yang terpilih dengan elemen ke.i. Nilai dari i dimulai dari / ke n! dimana n adalah %umlah total elemen dikurangi /.

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

6.3.2 Sebuah Contoh


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

"igure 1.2.2: Contoh selection sort

6.4 Merge Sort


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

6.4.1 Pola Divide and Con uer


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

'engenalan 'emrograman &

J.E.N.I.

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

6.4.2 Memahami Merge Sort


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

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

'engenalan 'emrograman &

J.E.N.I.

6.4.4 Sebuah Contoh


2angkaian data# 8 & 9 :

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

7 2

5 6

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

7
& 8

$engkombinasikan

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

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

Gambar 1.(.): Contoh merge sort

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

'engenalan 'emrograman &

J.E.N.I.

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

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

6.#.2 Sebuah Contoh


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

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

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

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

,ukarkan antara elemen kiri dan kanan kiri kanan

'engenalan 'emrograman &

J.E.N.I.

&

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

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

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

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

Gambar 1.).2: Contoh quicksort

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

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

'engenalan 'emrograman &

J.E.N.I.

6.6.2 Selection Sort


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

6.6.3 Merge Sort


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

'engenalan 'emrograman &

J.E.N.I.

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

'engenalan 'emrograman &

J.E.N.I.

Bab 7 Abstract Windowing Toolkit dan Swing


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

7.2 Abstract Windowing Toolkit (AWT) vs. Swing


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

Pengenalan Pemrograman 3

J.E.N.I.

7.3 Ko

!on"n #$% !ada AWT

7.3.1 Window Classes Fundamental


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

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

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

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

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

void setSize(int width, int height)


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

void setSize(Dimension d)

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

Pengenalan Pemrograman 3

J.E.N.I.

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

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

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

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

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

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

Description

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

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

lass

Pengenalan Pemrograman 3

J.E.N.I.

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

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

7.3.3 Beberapa komponen AWT


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

.hoi7e ;ist %7rollbar

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

ontrol !ang telah dimasu

an di

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

Pengenalan Pemrograman 3

J.E.N.I.

hooser.add(2/ritne?2); %w .add( hooser); %w .add(new S rollbar()); %w .setVisible(true); : ,

7.& 'a(out )anag"r


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

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

7.4.1 Flow a!out "ana#er


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

Pengenalan Pemrograman 3

J.E.N.I.

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

Tabel 1 * 1" #onstruktor Flow+ayout

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

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

Tabel 1* 1" Contoh hasil dala% window

Pengenalan Pemrograman 3

J.E.N.I.

7.4.2.Border a!out "ana#er


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

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

Tabel 1 * !" #onstruktor )order+ayout

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

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

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

Pengenalan Pemrograman 3

J.E.N.I.

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

edua menunju

an e#e

dari

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

7.4.3 Grid a!out "ana#er


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

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

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

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

J.E.N.I.

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

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

7.4.4 %anel dan Tampilan kompleks


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

Pengenalan Pemrograman 3

J.E.N.I.

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

Pengenalan Pemrograman 3

10

J.E.N.I.

5eri ut ini adalah hasil dari program.

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

7.* Ko

!on"n Swing

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

Komponen Swing
J.omponent J5utton J.he7 5o6

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

Pengenalan Pemrograman 3

11

J.E.N.I.

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

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

JPanel JApplet

J9ptionPane J/ialog

J.olor.hooser

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

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


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

7.&.2 Conto+ ,frame


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

J.E.N.I.

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

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

Petunjuk penulisan program:


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

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

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


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

Pengenalan Pemrograman 3

13

J.E.N.I.

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

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

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

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

(a%bar 1 1 1" papan Tic0Tac0Toe

Pengenalan Pemrograman 3

14

J.E.N.I.

Bab 8 GUI Event Handling


8.1 Tujuan
Pada modul ini, Anda akan belajar bagaimana mengendalikan events triggered ketika user berinteraksi dengan aplikasi GUI Anda. Setelah men elesaikan modul ini, Anda akan dapat mengembangkan aplikasi GUI ang merespon interaksi user. Setelah men elesaikan modul ini, Anda diharapkan mampu! ". #enerangkan komponen$komponen delegation event model %. #engerti bagaimana delegation event model bekerja &. #en'iptakan aplikasi GUI ang berinteraksi dengan user (. #endiskusikan man)aat dari 'lass$'lass adapter *. #endiskusikan keuntungan$keuntungan dari menggunakan inner dan anonymous class

8.2 Delegation Event Model


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

Pengenalan Pemrograman %

"

J.E.N.I.

+i ba4ah ini adalah delegation event model.

Gambar 8.1: Delegation Event Model

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

Pengenalan Pemrograman %

J.E.N.I.

8.2.1 Registrasi Listeners


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

8.3 Class-Class Event


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

Class Event

Deskripsi komponen

6omponentEvent E8tends $&TEvent. +ijalankan ketika sebuah dipindahkan, di$resi'e, dibuat visible atau (idden. InputEvent A'tionEvent ItemEvent 0e Event #ouseEvent

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

,e8tEvent 7indo4Event

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

Pengenalan Pemrograman %

&

J.E.N.I.

8.4 Event Listeners


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

7indo4-istener

8.4.1 Method ActionListener


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

8.4.2 Method MouseListener


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

ang seharusn a digunakan dalam

Pengenalan Pemrograman %

J.E.N.I.

8.4.3 Method Method MouseMotionListener


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

8.4.4 Method Method !indo"Listener


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

Pengenalan Pemrograman %

J.E.N.I.

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


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

8.4.* Contoh Mouse Events


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

J.E.N.I.

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

8.4.+ Contoh Menutup !indo"


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

Pengenalan Pemrograman %

J.E.N.I.

public static void main(/trin% ar%s@A) . Close,rame cf 0 ne& Close,rame(<Close 'indo& E"ample<)+ cf)launc3,rame()+ 4

8.5

da!ter Classes

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

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


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

Pengenalan Pemrograman %

<

J.E.N.I.

8." Inner Class dan

n#n$%#us Inner Class

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

8.*.1 )nner Class


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

8.*.2 Contoh Menutup !indo"


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

Pengenalan Pemrograman %

J.E.N.I.

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


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

8.*.4 Contoh Menutup !indo"


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

Pengenalan Pemrograman %

">

J.E.N.I.

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

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

Pengenalan Pemrograman %

""

J.E.N.I.

Bab 9 Threads
9.1 Tujuan
Pada bab-bab sebelumnya Anda terbiasa untuk membuat program yang berururutan/sekuensial. Sebuah program sekuensial berarti sebuah program yang hanya memiliki satu aliran eksekusi. Setiap eksekusi, ia memiliki sebuah titik awal eksekusi, kemudian sebuah sekuen eksekusi, dan kemudian berakhir. Selama runtime, pasti hanya satu proses yang telah dieksekusi. agaimanapun !uga, di dunia nyata, pasti dibutuhkan sesuatu yang dapat mengatur proses yang ter!adi dan ber!alan bersama-sama."leh karena itu, thread hadir untuk men!adi solusi dalam mengatasi permasalahan tersebut. Setelah menyelesaikan pela!aran ini, Anda diharapkan dapat# $. %ende&iniskan threads '. %engerti perbedaan state dalam threads (. %engerti konsep prioritas dalam threads ). %engetahui bagaimana menggunakan method didalam *lass +hread ,. %embuat sendiri sebuah thread -. %enggunakan sinkronisasi pada thread yang beker!a bersama-sama dan saling bergantung satu dengan yang lainya .. %emperbolehkan thread untuk berkomunikasi dengan thread lain yang sedang ber!alan /. %engerti dan menggunakan kemampuan *on*uren*y

9.2 Definisi dan dasar-dasar thread


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

Pengenalan Pemrograman '

J.E.N.I.

Gambar 1.1: Thread

9.2.2 State dari Thread


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

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

Pengenalan Pemrograman '

'

J.E.N.I.

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

9.3 Class Thread


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

Pengenalan Pemrograman '

J.E.N.I.

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

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

Pengenalan Pemrograman '

J.E.N.I.

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

9.3.4 Sebuah contoh thread


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

9.4 Membuat Threads


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

Pengenalan Pemrograman '

J.E.N.I.

9.4.1 Menurunkan (extend) c ass Thread


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

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

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

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

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


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

J.E.N.I.

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

9.4.3 %xtend &s '"# e"ent


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

Pengenalan Pemrograman '

J.E.N.I.

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


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

Pengenalan Pemrograman '

J.E.N.I.

9.5 Sinkr nisasi


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

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


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

Pengenalan Pemrograman '

J.E.N.I.

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

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


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

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


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

Pengenalan Pemrograman '

$8

J.E.N.I.

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

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

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


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

J.E.N.I.

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

9.! " munikasi antar thread #$nterthread%


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

0ntuk mendapatkan pen!elasan dari method ini, perhatikanlah skenario pelayanpelanggan. Pada skenario di sebuah restoran, seorang pelayan tidak akan menanyakan ke setiap orang apakah mereka akan memesan atau membutuhkan sesuatu, akan tetapi ia akan menunggu sampai pelanggan datang ke restoran tersebut. Pada saat seseorang datang, hal ini mengindikasikan bahwa ia mempunyai keinginan untuk memesan makanan dari restaurat tersebut. Atau !uga bisa kita !uga bisa kita nyatakan bahwa pelanggan yang memasuki restaurant mengindikasikan 3noti'y4 bahwa pelayan dibutuhkan untuk memberikan pelayanan. Akan tetapi,dalam kondisi sepert ini, seorang
Pengenalan Pemrograman ' $'

J.E.N.I.

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

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

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


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

Pengenalan Pemrograman '

$(

J.E.N.I.

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

Pengenalan Pemrograman '

$)

J.E.N.I.

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

<I <N LI

<I

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

0ntuk memperbaiki kode diatas, kita akan menggunakan method untuk komunikasi interthread. Implementasi dibawah ini adalah implementasi dari permasalahan produsen konsumen dengan menggunakan method untuk komunikasi interthread. class Shared.ata 3 int data, b##lean "alueSet 5 false, s$nchr#ni;ed "#id set(int "alue) 3 if ("alueSet) 3 DDbaru sa%a membangEitEan sebuah nilai tr$ 3 *ait(), ? catch (Interrupted8(cepti#n ie) 3 ? ? S$stem)#ut)println(6/enerate 6 C "alue), data 5 "alue,
Pengenalan Pemrograman ' $,

J.E.N.I.

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

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

Pengenalan Pemrograman '

$-

J.E.N.I.

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


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

9.0.1 'nterface %xecutor


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

Pengenalan Pemrograman '

$.

J.E.N.I.

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

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

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

J.E.N.I.

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

Pengenalan Pemrograman '

$;

J.E.N.I.

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

Gambar 1.6.1: Contoh per%era*an strin%

Pengenalan Pemrograman '

'8

J.E.N.I.

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

IP addres protokol ports client#server

socket $."embuat aplikasi menggunakan paket jaringan Java

ServerSocket Socket MulticastSocket DatagramPacket

10.1 Konsep dasar jaringan


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

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

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

J.E.N.I.

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

"Hallo." "Hallo. Selamat siang. Bolehkah saya berbicara dengan oan!" ""kay# mohon tunggu sebentar." "terima kasih." ... Ini adalah protokol sosial yang digunakan ketika dalam pembicaraan melalui telepon. Jenis protokol tipe ini memberikan kita kepercayaan untuk mengetahui apa yang harus dilakukan dalam situasi tersebut. "ari kita lihat beberapa protokol penting yang digunakan pada internet. ,anpa banyak kata, (yperte-t ,rans&er Protocol .(,,P/ adalah salah satu protokol yang sering digunakan. 0igunakan untuk mentrans&er dokumen (,"1 pada %eb. +emudian, ada juga 2ile ,rans&er Protocol .2,P/ dimana lebih umum dibandingkan dengan (,,P dan mengijinkan anda untuk mentrans&er &ile biner pada intenet. +edua protokol tersebut memiliki peraturan masing-masing dan standar dalam pengiriman data. Java juga dapat mendukung kedua protokol tersebut.

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

10.1.4 Paradigma client/server


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

Pengenalan Pemrograman $

J.E.N.I.

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

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

10.2 The Java Networking Package


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

10.2.1 ServerSocket and the Socket class


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

Pengenalan Pemrograman $

J.E.N.I.

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

:erikut adalah beberapa dari class method

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

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

Pengenalan Pemrograman $

J.E.N.I.

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

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

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

:erikut adalah beberapa dari class method

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

Pengenalan Pemrograman $

J.E.N.I.

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

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

10.2.2

ulticastSocket dan !atagramPacket class

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

Pengenalan Pemrograman $

J.E.N.I.

Konstruktor 6ulticastSocket(int port)

ulticastSocket

"embuat multicast socket dibatasi dengan pemberian nomor port


)abel 1.2.2a& *onstruktor MulticastSocket

,abel berikutnya memberikan penjelasan beberapa metode "ulticastSocket.

etode

ulticastSocket

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

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

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

Pengenalan Pemrograman $

J.E.N.I.

:erikut adalah beberapa metode menarik dari class 0atagramPacket.

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

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

J.E.N.I.

, ;

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

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

Pengenalan Pemrograman $

J.E.N.I.

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

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

%. menggunakan methods applet yang lain


'. #emahami html tag pada applet

11.2 Membentuk Applets


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

11.2.1 Hello World Applet


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

J.E.N.I.

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

Gambar 1.1.1: contoh Applet

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

J.E.N.I.

11.3 Method-Method Applet


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

11.3.1 Siklus Applet (The Applet Life Cycle)


*ahkan untuk memulai eksekusi pada main method seperti dalam aplikasi khas Java, browser atau applet viewer berhubungan dengan applet melalui method;method berikut 1. init ! init adalah method yang dipanggil pertama kali. <ang sebenarnya berisi permintaan pertama ketika applet di load. ". start ! Setelah meminta method init, mulai dengan method yang dipangil selanjutnya. method ini meminta dokumen 0-#4 yang ditampilkan applet setiap waktu. Eksekusi ringkasan dengan method ini dilakukan ketika applet ditampilkan kembali. #. stop ! 9etika web browser meninggalkan dokumen 0-#4 applet,method ini dipanggil untuk menginformasikan applet bahwa dia harus menghentikan proses eksekusinya. $. destroy ! method ini dipanggil ketika applet perlu dihapus dari kelangkapan memory. methode stop selalu dipanggil sebelum method ini diminta untuk dijalankan.

+engenalan +emrograman "

J.E.N.I.

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

+engenalan +emrograman "

J.E.N.I.

11.3.2 Method pai t


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

11.3.3 Sho!Status Method


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

Gambar 1.".#: contoh showStatus !

+engenalan +emrograman "

'

J.E.N.I.

11.3." Me#ai ka

Audio Clips

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

+engenalan +emrograman "

>

J.E.N.I.

11.4 Applet HTML Tags


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

+engenalan +emrograman "

J.E.N.I.

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

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

+engenalan +emrograman "

J.E.N.I.

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

+engenalan +emrograman "

J.E.N.I.

Bab 12 Stream I/O Lanjut


12.1 Tujuan
Dalam module sebelumnya, Anda telah mempelajari bagaimana untuk mendapatkan input user dan memanipulasi file-file menggunakan strea. Kini Anda akan mempelajari lebih banyak tentang stream dan lass- lass stream yang lain. !etelah melengkapi pembahasan ini, Anda harus dapat " #. $ahu tipe-tipe stream yang umum digunakan %. &enggunakan lass 'ile dan methodnya Karakter dan !tream byte Input dan (utput !treams Node dan 'ilter !treams ). &enggunakan lass- lass Input*(utput yang berbeda Reader Writer InputStream OutputStream +. &emahami konsep dari stream haining ,. &endefinisikan serialisasi -. &emahami penggunaan dari kata kun i transient .. &enulis dan memba a dari sebuah obje t stream

12.2 Tipe-Tipe Stream yang Umum Digunakan


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

12.2.2 Input dan Output Stream


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

J.E.N.I.

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

12.2.3 Node dan Stream Filter


Kini pa kage java.io membedakan antara node dan stream filter. !ebuah stream node adalah sebuah stream dengan fungsi dasar berupa fungsi memba a atau menulis dari sebuah lokasi khusus seperti pada disk atau dari jaringan. $ipe-tipe dari stream node terdiri atas file, memory dan jalur data. !tream filter, di lain pihak, diletakkan pada layer stream node diantara threads atau proses untuk menyediakan fungsi tambahan yang tidak dapat ditemukan dalam stream node oleh stream node itu sendiri. 3enambahan lapisan pada sebuah stream node disebut dengan stream haining. !esi ini berturut-turut mempunyai sebuah tujuan dari lass- lass stream yang berbeda. /ntuk melengkapi daftar dari lass- lass ini, silahkan melihat dokumentasi Ja6a7s A3I.

3engenalan 3emrograman %

J.E.N.I.

12.3 Cla

!ile

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

onstru tor

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

3engenalan 3emrograman %

J.E.N.I.

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

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

J.E.N.I.

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

12." Cla

#ea$er

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

12.".1

ethod #eader

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

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

3engenalan 3emrograman %

J.E.N.I.

12.".2 Class Node #eader


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

12.".3 Class!Class Filter #eader


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

lass

3engenalan 3emrograman %

J.E.N.I.

12.% Cla
12.$.1 %riter

-Cla
ethod

&riter

!esi ini menggambarkan stream karakter yang digunakan untuk menulis.

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

12.$.2 Node %riter Classes


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

3engenalan 3emrograman %

J.E.N.I.

Node %riter Classes Digunakan dengan berpasangan4dengan menghubungkan $ipedReader5 oleh dua thread yang ingin berkomunikasi. !atu dari thread ini menulis karakter ke stream ini.
&able 1.".2' Node %riter classes

12.$.3 Filter %riter Classes


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

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


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

J.E.N.I.

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

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

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


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

3engenalan 3emrograman %

J.E.N.I.

12., Cla
12.(.1

InputStream

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

ethod InputStream

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

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

12.(.2 Class!Class Node InputStream


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

3engenalan 3emrograman %

#A

J.E.N.I.

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

12.(.3 Class!class Filter InputStream


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

lass

3engenalan 3emrograman %

##

J.E.N.I.

12.- Cla

-Cla

OutputStream

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

12.).1

ethod OutputStream

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

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

12.).2 Class!Class Node OutputStream


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

3engenalan 3emrograman %

#%

J.E.N.I.

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

12.).3 Class!Class Filter OutputStream


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

3engenalan 3emrograman %

#)

J.E.N.I.

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


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

3engenalan 3emrograman %

#+

J.E.N.I.

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


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

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

3engenalan 3emrograman %

#,

J.E.N.I.

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

12.12.1 Kata Kunci transient


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

12.12.2 Serialisasi'

enulis Suatu Ob*ect Stream

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

J.E.N.I.

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

12.12.3 +eserialisasi'

embaca Sebuah Ob*ect Stream

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

J.E.N.I.

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

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

3engenalan 3emrograman %

#=

J.E.N.I.

Bab 13 Pengenalan Generics


13.1 Tujuan
Release Java terbaru menyediakan langkah terbesar dalam pemrograman Java dibandingkan dengan versi-versi lain sebelumnya. Ini terdiri atas ekstensi yang cukup signifikan terhadap source language syntax. Bagian yang paling terlihat yaitu penambahan generic types. odul ini mengenalkan !nda konsep dasar mengenai Java generic types. "etelah melengkapi pembahasan ini# anda harus dapat $ %. engapresiasikan keuntungan dari generic types &. endeklarasikan class generic '. enggunakan constrained generics (. endeklarasikan method generic

13.2 Mengapa Generics?


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

J.E.N.I.

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

13.3 Mendeklarasikan sebuah Class Generic


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

2engenalan 2emrograman &

&

J.E.N.I.

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

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

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

2engenalan 2emrograman &

J.E.N.I.

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

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

2etama-tama !nda akan menyelesaikan type primitive sebelum menggunakan mereka sebagai arguments ke sebuah type generic.

13.3.2 Meng-compilasi Generics


6ntuk meng-compile source codes Java denagn type generic menggunakan J+4 .v. %.8.9/# gunakan syntax berikut ini $

2engenalan 2emrograman &

J.E.N.I.

java# 6version 6sour#e "0.7" 6sour#e%at' sr# 6d #lasses sr#8S!a%9lass.java +imana src mengarah pada lokasi dari source code *ava sementara class mengarah pada lokasi dimana file class akan disimpan. Beriut ini sebuah contoh $ java# 6version 6sour#e "0.7" 6sour#e%at' #::tem% 6d #::tem% #:8tem%8S!a%9lass.java

13.4 Constrained Generics


+alam contoh yang diberikan terdahulu# type parameter dari class BasicGeneric dapat memiliki beberapa referensi tipe data. !da beberapa kasus# bagaimanapun# dimana anda ingin untuk membatasi tipe instantiasi yang potensial dari class generic. Java *uga memungkinkan kita untuk membatasi set argument type yang mungkin untuk subtypes dari sebuah batas type yang diberikan. "ebagai contoh# kita mungkin ingin untuk mendefinisikan sebuah class generic ScrollPane yang merupakan sebuah template untuk sebuah Container asli yang telah dilengkapi dengan fungsi scrolling. 0ipe runtime dari sebuah instance dari class ini akan sering men*adi sebuah subclass dari Container# tapi tipe static atau general adalah Container yang lebih sederhana. 6ntuk membatasi instantiasi tipe dari sebuah class# kita menggunakan kata kunci extends diikuti oleh class yang membatasi tipe generic sebagai bagian dari tipe parameter. :ontoh berikut ini membatasi instantiasi tipe dari class ScrollPane ke subtipe dari class Container. #lass S#roll&ane <(y&ane e;tends 9ontainer ... / -

#lass <estS#roll&ane %u.li# stati# void main(String args23) S#roll&ane <&anel s#roll&ane0 = ne! S#roll&ane <&anel (); 88 %ernyataan .eri=utnya adala' illegal S#roll&ane <+utton s#roll&ane1 = ne! S#roll&ane <+utton (); / / Instantiasi dari scrollPane1 bernilai valid se*ak Panel men*adi sebuah subclass dari class Container sedangkan kreasi dari scrollPane2 akan menyebabkan munculnya compile time error se*ak B tton bukan merupakan sebuah subclass dari Container. menggunakan generic constrained yang dapat memberikan kita penambahan pengecekan tipe static. "ebagai sebuah hasil# kita akan men*amin bah)a setiap
2engenalan 2emrograman & 8

J.E.N.I.

instantiasi dari tipe generic yang melekat pada batas yang kita miliki. "e*ak kita yakin bah)a setiap tipe instantiasi adalah sebuah subclass dari batas yang dimiliki# kita dapat memanggil beberapa method secara aman yang ditemukan dalam ob*ek static tipe. Jika kita belum menempatkan beberapa batas eksplisit pada parameternya# default batas adalah !"#ect. Ini berarti bah)a kita tidak dapat men*alankan method pada sebuah instance dari batas yang tidak ditampilkan dalam class !"#ect.

13.

Mendeklarasikan sebuah Method Generic

+isamping mendeklarasikan sebuah class generic# Java *uga memberi kita perlakuan khusus untuk mendeklarasikan sebuah method generic. ini disebut dengan method polymorphic# yang mana didefinisikan men*adi method yang diberi nilai parameter berupa tipe. method parameterisasi sangat membantu kita kita ingin untuk menampilkan tugas dimana ketergantungan tipe antara argument dan nilai pengembalian aslinya merupakan generic# tapi generic sebenarnya tidak mempercayakan pada beberapa tipe level class informasi dan akan merubah dari method call ke method call. "ebagai contoh# !ndaikata kita menginginkan untuk menambahkan sebuah method $a%e untuk sebuah class ArrayList. ethod static ini akan diambil dalam sebuah argument tunggal# yang mana akan men*adi satu-satunya elemen dari ob*ect ArrayList. 6ntuk membuat generic ArrayList kita# sebagai penampung beberapa tipe elemen# argumen tunggal dalam method $a%e harus memiliki sebuah tipe generic sebagai sebuah argumen dan sebagai sebuah tipe nilai kembalian. 6ntuk mendeklarasikan tipe generic pada level method# pertimbangkan contoh berikut ini $ #lass >tilities 8? < se#ara im%lisit e;tends ter'ada% @.je#t ?8 %u.li# stati# << ArrayList<< ma=e(< first) return ne! ArrayList<< (first); / / Java *uga menggunakan sebuah mekanisme type-inference untuk secara otomatis menyimpulkan tipe method polymorphic berdasarkan pada tipe-tipe argumennya. Ini mengurangi pan*ang dan kompleksitas dari sebuah alur untuk men*alankan suatu method. 6ntuk membangun sebuah instance baru dari ArrayList<Integer># kita mempunyai cara yang cukup sederhana yaitu pernyataan berikut $ >tilities.ma=e(Integer(0));

2engenalan 2emrograman &

J.E.N.I.

13.! "atihan
13.6.1 Swapping
embentuk sebuah class dengan sebuah versi generic dari method print"&apped. ethod ini menukar secara sederhana nilai dari parameternya secara lokal dan mencetak nilainya. :atatan bah)a pencetakan harus dilakukan pada method ini. encetak nilai dari argument dalam method lain tidak akan beker*a karena Java mele)atkan ob*ect ke method melalui suatu nilai. 6*i method ini pada ob*ect Integer' ob*ect String dan ob*ect ArrayList.

2engenalan 2emrograman &

<

Anda mungkin juga menyukai