Pemograman Java
Pemograman Java
Perkembangan teknologi dan informasi dewasa ini semakin menuntut otomasi yang dapat membuat banyak hal yang sebelumnya tidak dapat diperoleh. Namun demikian hal ini menuntut pemahaman pemrograman yang tidak sederhana untuk pemula. Hal ini terutama karena sintaks dan alur program yang mungkin baru pertama kali ditemui. Pengembangan selanjutnya akan lebih mudah jika konsep pemrograman berorientasi objek (object oriented ) digunakan. Hal ini memungkinkan penggunaan bagian dari program digunakan kembali untuk bagian lain (reusable) dari program tersebut atau bahkan dari program lain. Salah satu bahasa komputer yang dapat memenuhi pemrograman berorientasi objek tersebut adalah bahasa Java. Bahasa ini merupakan bahasa yang tidak tergantung pada platform (operating system dan hardware) serta mempunyai banyak fasilitas antara lain untuk pemrograman berorientasi objek, graphic user interface dan internet. Diktat ini diharapkan berfungsi sebagai panduan untuk matakuliah dan praktikum pemrograman komputer. Mahasiswa diharapkan membaca pula detail pembahasan yang terdapat dalam buiku-buku teks berbahasa Inggris mengenai pemrograman komputer dengan JAVA. Praktikum diharapkan diselenggarakan dengan dibantu oleh asisten. Praktikum dilakukan dengan menggunakan kompiler Java Development Kit (JDK) yang dapat didownload gratis melalui http://java.sun.com/. Untuk kemudahan pemrograman, IDE Netbeans digunakan. Netbeans dapat didownload gratis melalui http://www.netbeans.org. Bobot penilaian praktikum adalah 30% dari seluruh nilai pada pelajaran pemrograman komputer. Beberapa contoh latihan yang tercantum dalam diktat diharapkan dipahami oleh mahasiswa. Diktat ini masih dalam taraf awal dan masih terus dikembangkan, terutama bersumber pada tutorial yang dapat didownload secara gratis dari http://java.sun.com/docs/books/tutorial/. Setelah di download, le tersebut perlu di uncompress.. Tutorial tersebut juga sudah dibukukan dengan judul The Java Tutorial: Second Edition. Namun buku
Gambar 0.1: Cover depan buku The Java Tutorial. tersebut ketinggalan perkembangannya dibandingkan dengan tutorial di internet yang selalu diperbaharui. Segala kritik dan saran sangat diharapkan untuk penyempurnaan diktat ini. Penulis dapat dihubungi melalui e-mail dengan alamat purwanto [email protected]. Perkembangan lebih lanjut mengenai diktat ini dapat dilihat melalui web site http://apurwanto.110mb.com/. Tugas-tugas praktikum dapat dilihat, dibaca, dikomentari dan ditanyai di http://pemrograman-komputer-java.blogspot.com/
ii
ii
Daftar Isi
Kata Pengantar i
I Memulai
1 Fenomena Java 1.1 Apakah Java ? . . . . . . . . . . . . . . . . 1.1.1 Bahasa Pemrograman Java . . . . . 1.1.2 Platform Java . . . . . . . . . . . . 1.2 Apa yang dapat dilakukan oleh Java ? . . . 1.3 Bagaimana Java bisa merubah hidup saya ? 2 Aplikasi Hello World 2.1 Membuat dan Menggunakan Aplikasi Java 2.1.1 Membuat File Sumber . . . . . . 2.1.2 Kompilasi File Sumber . . . . . . 2.1.3 Mengeksekusi Aplikasi . . . . . . 2.1.4 Bagaimana Selanjutnya ? . . . . . 2.2 Anatomi Aplikasi Java . . . . . . . . . . 2.2.1 Komentar pada code Java . . . . . 2.2.2 Pendenisian Sebuah Class . . . . 2.2.3 Metoda main . . . . . . . . . . . 2.2.4 Penggunaan class dan objek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
3 3 3 4 4 5 7 7 7 7 7 7 8 8 8 8 9 11 11 11 11 12 12
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
3 Applet Hello World 3.1 Membuat File Sumber Java . . . . . . . . . . . 3.2 Kompilasi File Sumber . . . . . . . . . . . . . 3.3 Membuat File HTML yang mengandung Applet 3.4 Mengeksekusi Applet . . . . . . . . . . . . . . 3.5 Bagaimana selanjutnya . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
13
15 16 17 18 20 21 21 22 22 22 23
iv 5 Dasar Bahasa 5.1 Variabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 Tipe Data . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.2 Nama Variabel . . . . . . . . . . . . . . . . . . . . . . 5.1.3 Lingkup . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.4 Inisialisasi Variabel . . . . . . . . . . . . . . . . . . . . 5.1.5 Variabel final . . . . . . . . . . . . . . . . . . . . . . 5.1.6 Pertanyaan dan Latihan: Variabel . . . . . . . . . . . . 5.1.7 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2.1 Operator Aritmatika . . . . . . . . . . . . . . . . . . . 5.2.2 Operator Relasi dan Syarat . . . . . . . . . . . . . . . . 5.2.3 Operator Geser dan Logika . . . . . . . . . . . . . . . . 5.2.4 Operator assignment . . . . . . . . . . . . . . . . . . . 5.2.5 Operator Lain . . . . . . . . . . . . . . . . . . . . . . . 5.2.6 Pertanyaan dan Latihan: Operator . . . . . . . . . . . . 5.2.7 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Ekspresi, Pernyataan dan Blok . . . . . . . . . . . . . . . . . . 5.3.1 Ekspresi . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.2 Pernyataan . . . . . . . . . . . . . . . . . . . . . . . . 5.3.3 Blok . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3.4 Rangkuman . . . . . . . . . . . . . . . . . . . . . . . . 5.3.5 Pertanyaan dan Latihan: Ekspresi, Pernyataan dan Blok 5.3.6 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Pernyataan Kontrol Alur . . . . . . . . . . . . . . . . . . . . . 5.4.1 Pernyataan while dan do-while . . . . . . . . . . . . 5.4.2 Pernyataan for . . . . . . . . . . . . . . . . . . . . . . 5.4.3 Pernyataan if/else . . . . . . . . . . . . . . . . . . . 5.4.4 Pernyataan switch . . . . . . . . . . . . . . . . . . . . 5.4.5 Pernyataan Exception Handling . . . . . . . . . . . . . 5.4.6 Pernyataan Pencabangan . . . . . . . . . . . . . . . . . 5.4.7 Rangkuman Pernyataan Kontrol Alur . . . . . . . . . . 5.4.8 Pertanyaan dan Latihan: Kontrol Alur . . . . . . . . . . 5.4.9 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . . .
DAFTAR ISI
27 27 28 29 29 30 31 31 32 33 33 36 38 40 40 41 42 43 43 43 44 44 45 45 46 46 47 48 49 51 52 54 56 57 61 61 62 64 66 66 67 68 69 70 70 71 73 74 75 75 76 77 78 81 82 82 83 84
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dasar-Dasar Objek 6.1 Siklus Berlakunya Objek . . . . . . . . . . . . . . . . . . . . . . . 6.1.1 Pembuatan Objek . . . . . . . . . . . . . . . . . . . . . . . 6.1.2 Penggunaan Objek . . . . . . . . . . . . . . . . . . . . . . 6.1.3 Membersihkan Objek yang tak digunakan . . . . . . . . . . 6.1.4 Rangkuman Pembuatan dan Penggunaan Objek . . . . . . . 6.1.5 Pertanyaan dan Latihan: Membuat dan Menggunakan Objek 6.1.6 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2 Character dan String . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.1 Mengapa class two string ? . . . . . . . . . . . . . . . . . . 6.2.2 Membuat String dan StringBuffer . . . . . . . . . . . . 6.2.3 Metoda Accessor . . . . . . . . . . . . . . . . . . . . . . . 6.2.4 Modikasi StringBuffer . . . . . . . . . . . . . . . . . . 6.2.5 Mengkonversi Objek ke String . . . . . . . . . . . . . . . . 6.2.6 Mengkonversi String ke Bilangan . . . . . . . . . . . . . . 6.2.7 String dan Kompiler Java . . . . . . . . . . . . . . . . . . . 6.2.8 Rangkuman String . . . . . . . . . . . . . . . . . . . . . . 6.2.9 Pertanyaan dan Latihan: String . . . . . . . . . . . . . . . . 6.2.10 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3 Bilangan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4 Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4.1 Membuat dan Menggunakan Array . . . . . . . . . . . . . 6.4.2 Array dari Objek . . . . . . . . . . . . . . . . . . . . . . . 6.4.3 Array dari Array . . . . . . . . . . . . . . . . . . . . . . . iv
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
DAFTAR ISI 6.4.4 6.4.5 6.4.6 Mengkopi Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Rangkuman mengenai Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pertanyaan dan Latihan: Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
v 85 85 86 87 87 87 88
7 Generic 7.1 Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.1.1 Class box sederhana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Jenis Generik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
93 93 94 94 95 95 95 95 95 95 96 97 97 98
9 Keuntungan API Applet 9.1 Menemukan dan Memuat File Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9.2 Menampilkan String Status Ringkas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10 Pertimbangan Praktis untuk Penulisan Applet 99 10.1 Batasan keamanan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 10.2 Membuat User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 11 Class Java Penting 11.1 Penggunaan String dan StringBuffer . . . . . . 11.1.1 Mengapa menggunakan class dua string 11.1.2 Membuat String dan StringBuffer . 11.1.3 Metoda Accessor . . . . . . . . . . . . 11.1.4 Merubah StringBuffer . . . . . . . . 11.1.5 Merubah Object menjadi String . . . . 11.1.6 Mengkonversi String menjadi Angka . 11.1.7 String dan kompiler Java . . . . . . . . 11.1.8 Hal menarik lainnya . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 101 102 102 103 104 105 105 105 105 107 107 107 109 112 112 114 115 115 117 118 118 121
12 Soal-Jawab UTS dan UAS, Pemrograman Komputer 12.1 UTS Genap, 2000/2001, Rabu/21-03-2001, jam 10.00-11.40 12.1.1 Soal . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1.2 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . 12.2 UTS 2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.1 Soal . . . . . . . . . . . . . . . . . . . . . . . . . . 12.2.2 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . 12.3 UAS 2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.1 Soal . . . . . . . . . . . . . . . . . . . . . . . . . . 12.3.2 Jawaban . . . . . . . . . . . . . . . . . . . . . . . . 12.4 UTS 2007 . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.1 Soal . . . . . . . . . . . . . . . . . . . . . . . . . . 12.4.2 Jawaban . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
vi
DAFTAR ISI
vi
Bagian I
Memulai
Bab 1
Fenomena Java
Java banyak ditemui di internet. Bagi pemrogram Java baru, beberapa hal yang sering ditanyakan adalah:
Bab 2
Penting Jika anda tidak tertarik dengan aplikasi Java, anda telah paham dengan konsep orientasi objek, dan anda mengerti code Java sampai saat ini, anda bebas untuk melompat ke Menulis Applet.
Metoda main dalam bahasa pemrograman Java mirip dengan fungsi main dalam C dan C++. Ketika interpreter Java mengeksekusi suatu aplikasi, eksekusi tersebut dimulai dengan memanggil metoda main. Metoda main kemudian memanggil semua metoda lain yang dibutuhkan untuk mengeksekusi aplikasi anda. Jika anda mencoba untuk menerapkan interpreter Java pada class yang tidak mempunyai metoda main, interpreter menolak dan menampilkan pesan salah seperti: In class NoMain: void main(String argv[]) is not defined Argumen pada metoda main Sebagaimana dapat dilihat pada potongan code berikut ini, metoda main menerima argumen tunggal: suatu array dengan elemen bertipe string. public static void main(String[] args) Array ini merupakan mekanisme untuk melalukan informasi dari sistem runtime ke aplikasi anda. Masing-masing string dalam array disebut sebagai command-line argument. Argumen tersebut memungkinkan pengguna merubah operasi dalam aplikasi tanpa rekompilasi. Misalnya, program pengurutan memungkinkan penguna untuk menspesikasi data diurutkan secara menurun dengan command-line argument: -descending Aplikasi Hello World mengabaikan command-line argumentnya, sehingga tidak banyak yang dapat dibahas disini. Namun demikian, anda dapat memperoleh informasi lebih lanjut, termasuk kerangka untuk pengurai command-line yang dapat anda modikasi sesuai dengan kebutuhan anda, dalam bab setting atribut program.
Penting Catatan uintuk pemrogram C dan C++: Bilangan dan tipe argumen yang dilalukan dalam metoda main pada lingkungan runtime Java berbeda dari jumlah dan tipe argumen yang dilalukan pada fungsi main untuk C dan C++. Untuk informasi lebih lanjut lihat command-line arguments dalam bab mengenai setting atribut program.
Disini dibahas bagaimana aplikasi Hello World menggunakan class dan object. Jika anda belum memahami konsep orientasi objek, anda bisa bingung disini. Jika demikian, silahkan untuk membaca bab Konsep Pemrograman Berorientasi Obje Aplikasi Hello World merupakan program Java paling sederhana yang dapat anda tulis dan berfungsi dengan baik. Karena kesederhanaannya, tidak ada class lain kecuali HelloWorldApp. Namun demikian, kebanyakan program yang dibuat biasanya kompleks dan membutuhkan class lain dan code Java pendukung. Aplikasi Hello World ternyata menggunakan class lain class System yang merupakan bagian dari API (Application Programming Interface) yang tersedia pada lingkungan Java. Class System menyediakan akses bebas system untuk fungsi yang tergantung pada system. Untuk informasi mengenai class System, lihat Akses ke sumber system. Penggunaan Metoda Class atau Variabel Mari kita lihat potongan program System.out.println("Hello World!"); Tulisan System.out adalah nama lengkap dari variabel out dalam class System. Perhatikan bahwa aplikasi tidak pernah melakukan instance terhadap class System dan bahwa out diacu langsung dari nama class. Hal ini adalah karena out adalah variabel class variabel berkaitan dengan class tidak dengan instance dari class. Anda dapat pula menghubungkan metoda dengan class metoda class. Untuk mengacu variabel class dan metoda, anda menggabungkan nama class dan nama dari metoda class atau variabel class bersama dengan titik (.).
Metoda dan variabel yang bukan metoda class atau variabel class disebut sebagai metoda instance dan variabel instance. Untuk mengacu pada metoda dan variabel instance, anda harus mengacu pada metoda dan variabel dari suatu objek. Ketika variabel out milik System adalah variabel class, ia mengacu pada instance dari class PrintStream (suatu class yang tersedia dalam lingkungan pengembangan Java) yang mengimplementasi stream output standard. Ketika class System dimuat dalam aplikasi, ia melakukan instance pada PrintStream dan memberi objek PrintStream baru pada variabel class out. Karena anda sudah mempunyai suatu instance dari suatu class, anda dapat memanggil salah satu dari metoda instance: System.out.println("Hello World!"); Sebagaimana anda lihat, anda mengacu metoda dan variabel instance mirip dengan cara anda mengacu pada metoda dan variabel class. Anda menggabungkan suatu acuan objek (out) dan nama dari metoda atau variabel (println) bersama dengan sebuah titik (.). Kompiler Java memungkinkan anda menggabungkan acuan terhadap class dengan metoda dan variabel instance, menghasilkan susunan seperti pada program contoh: System.out.println("Hello World!"); Baris tersebut menampilkan Hello World! pada stream output standard dari aplikasi yang berkaitan. Rangkuman Metoda class atau variabel class berkaitan dengan class tertentu. Sistem runtime mengalokasikan variabel class sekali per class, tidak tergantung pada banyaknya instance yang terdapat pada class tersebut. Anda mengakses variabel dan metoda class melalui class. Metoda instance atau variabel instance berkaitan dengan objek tertentu (suatu instance dari suatu class). Setiap kali anda membuat suatu objek, objek baru memperoleh salinan dari setiap variabel instance yang didenisikan dalam classnya. Anda mengakses variabel dan metoda instance melalui objek.
10
Bab 3
12
12
Bagian II
13
Bab 4
Penting Secara umum, objek adalah suatu kesatuan yang menyimpan keadaan (informasi) dan memberi berbagai operasi (sifat) untuk memeriksa atau merubah keadaan tersebut. Objek ditandai dengan adanya sejumlah operasi dan keadaan yang mengingat efek dari operasi tersebut.
2. Objek-objek perangkat lunak saling berinteraksi dan berkomunikasi dengan menggunakan pesan (message). 3. Dalam tinjauan pemrograman, class adalah cetak biru atau prototype yang mendenisikan variabel dan metoda yang umum untuk semua objek yang bertipe tertentu.
Penting Secara umum, class merupakan template (cetakan) dari berbagai objek dan menggambarkan cara objekobjek tersebut disusun secara internal.
4. Suatu class menurunkan keadaan dan sifat dari superclass-nya. Penurunan merupakan mekanisme alamiah dan sangat berguna untuk mengorganisasi/menstrukturkan program. 5. Interface (antar muka) adalah kontrak dalam bentuk kumpulan metoda dan deklarasi konstan. Jika suatu class mengimplementasi suatu antar-muka, ia menjanjikan untuk mengimplementasikan semua metoda yang dideklarasikan pada antar-muka itu. 6. Bagaimana konsep ini diterjemahkan kedalam code ? Sub bab ini akan menunjukkannya pada applet kecil dan menunjukkan anda code yang menciptakan objek, mengimplentasi class, mengirim pesan, membuat superclass, dan mengimplementasikan suatu interface. 7. Pertanyaan dan Latihan: Konsep orientasi objek. Uji pemahaman anda mengenai objek, class, pesan dan lain-lain dengan melakukan beberapa latihan dan menjawab beberapa pertanyaan. 15
16
4.1 Objek
Sesuai dengan istilah orientasi objek, objek merupakan kunci untuk pemahaman teknologi berorientasi objek. Anda dapat melihat sekeliling anda sekarang dan melihat banyak contoh dari objek dunia nyata: meja anda, televisi anda, sepeda anda dan lain-lain. Objek dunia-nyata ini mempunyai 2 sifat yang sama: mereka semua mempunyai keadaan (state) dan sifat (behavior). Misalkan, anjing mempunyai keadaan (nama, warna) dan sifat (menggonggong). Sepeda mempunyai keadaan (gigi sekarang, jumlah gigi, dua roda) dan sifat (mengerem, percepatan, perlambatan, merubah gigi). Objek perangkat lunak merupakan model berdasarkan objek dunia-nyata yang mempunyai keadaan dan sifat. Objek perangkat lunak mempertahankan keadaannya pada variabel (variables) dan mengimplementasikan sifatnya dalam metoda (methods). Penting Objek adalah sekumpulan perangkat lunak dari variabel dan metoda yang berkaitan. Anda dapat menyatakan objek dunia-nyata dengan menggunakan objek perangkat lunak. Anda mungkin ingin menyatakan anjing dalam dunia-nyata sebagai objek perangkat lunak dalam suatu program animasi atau suatu sepeda dunia-nyata sebagai objek perangkat lunak dalam program yang mengontrol suatu sepeda latihan elektronik. Namun demikian, anda dapat pula menggunakan objek perangkat lunak untuk memodelkan konsep abstrak. Misalkan, suatu kejadian (event) adalah objek yang umum digunakan dalam sistem window GUI untuk menyatakan aksi pengguna ketika menekan tombol mouse atau keyboard.
Metoda/sifat
Variabel/keadaan
00 11 00 11 00 11 00 11 00 11 00 11
Metoda/Sifat
Gambar 4.1: Representasi visual umum dari objek perangkat lunak. Segala sesuatu yang diketahui objek perangkat lunak (keadaan) dan dapat dilakukan (sifat) dinyatakan dengan variabel dan metoda dalam objek. Objek perangkat lunak yang memodelkan sepeda dunia-nyata anda mempunyai variabel yang mengindikasikan keadaan sepeda pada saat tersebut: kecepatannya 10 mph, putaran pedal 90 rpm, dan berada pada gigi kelima. Variabel dan metoda ini dikenal secara formal sebagai variabel instance dan metoda instance untuk membedakannya dari variabel class dan metoda class (dibahas pada subbab mengenai class). Sepeda perangkat lunak juga mempunyai metoda mengerem, mengubah putaran pedal dan merubah gigi (sepeda tidak mempunyai metoda untuk merubah kecepatan sepeda karena kecepatannya hanya merupakan efek samping dari gigi, kekuatan pengemudi menggenjotnya, apakah remnya dipakai dan bagaimana kecuraman bukit.). Model sepeda sebagai suatu objek perangkat lunak dapat dilihat pada Gambar 4.2. Segala sesuatu yang tidak diketahui/dilakukan objek tidak dimasukkan dalam objek tersebut. Misalkan, sepeda anda (mungkin) tidak mempunyai nama, tidak dapat berlari dengan kaki atau menggonggong. Oleh karenanya, tidak ada variabel atau metoda untuk keadaan dan sifat tersebut dalam class sepeda. Sebagaimana dapat dilihat dalam Gambar 4.1 dan 4.2, variabel objek merupakan pusat objek. Metoda mengelilingi dan menyembunyikan inti objek dari objek lain dalam program. Pengelompokkan variabel objek dalam lingkungan pelindung yang berasal dari metodanya disebut enkapsulasi. Biasanya, enkapsulasi digunakan untuk menyembunyikan implementasi rinci yang tidak penting dari objek lain. Ketika anda ingin merubah gigi pada sepeda anda, anda tidak perlu mengetahui mekanisme kerja gigi, anda hanya perlu mengetahui tuas mana yang perlu digerakkan. Demikian pula pada program perangkat lunak, anda tidak perlu mengetahui bagaimana suatu class diimplementasikan, anda hanya perlu mengetahui metoda mana yang perlu dipanggil. Maka implementasi rinci dapat diubah setiap saat tanpa mengganggu bagian lain dari program yang bersangkutan. October 13, 2009 16
4.2. PESAN/STIMULUS
17
Rem
Ubah gigi
Ubah irama
11 00 00 11 00 11 00 11 00 11 00 11 00 11
Gambar 4.2: Model sepeda sebagai suatu objek perangkat lunak. Konsep sesuai dengan Gambar 4.1dimana inti yang merupakan variabel dibungkus dengan selaput pelindung yang merupakan metodaadalah representasi ideal dari suatu objek yang sangat berguna untuk sistem berorientasi objek. Namun demikian, sering untuk implementasi atau alasan esiensi, suatu objek mungkin membuka variabel atau menyembunyikan beberapa metodanya. Dalam banyak bahasa, termasuk Java, suatu objek dapat memilih untuk membuka variabelnya untuk objek lain sehingga memungkinkan objek lain tersebut memeriksa dan bahkan merubah variabel. Juga, suatu objek dapat memilih untuk menyembunyikan metoda dari objek lain sehingga mencegah objek lain tersebut memanggil metoda tersebut. Suatu objek dapat mempunyai kontrol lengkap mengenai pembatasan akses variabel dan metodanya. Penting Enkapsulasi variabel dan metoda yang berhubungan kedalam suatu kumpulan perangkat lunak yang rapih adalah ide sederhana namun sangat berguna karena dua keuntungan: 1. Modularitas: code sumber untuk suatu objek dapat ditulis dan dikembangkan secara terpisah dari dari code sumber untuk objek lain. Juga, suatu objek dapat dengan mudah diberikan pada bagian lain dalam sistemanda dapat memberikan sepeda anda pada orang lain dan sepeda tersebut masih tetap berfungsi. 2. Penyembunyian informasi: Suatu objek mempunyai suatu antarmuka public sehingga objek lain dapat menggunakannya untuk berkomunikasi dengannya. Namun objek dapat memanfaatkan informasi private sehingga metoda dapat diubah setiap saat tanpa mempengaruhi objek lain yang tergantung kepadanyaanda tidak perlu memahami mekanisme gigi pada sepeda anda untuk menggunakannya (lihat Gambar 4.1).
4.2 Pesan/Stimulus
Suatu objek tunggal sendiri biasanya tidak berguna dan sering merupakan komponen dari program yang lebih besar yang mengandung banyak objek lain. Melalui interaksi dari objek-objek ini, programer memperoleh fungsi yang lebih tinggi dan sifat yang lebih rumit. Sepeda anda yang tersandar didinding garasi hanya merupakan kumpulan paduan titanium dan karet; yang tidak mungkin melakukan apapun sendiri. Sepeda hanya berguna bila objek lain (anda) berinteraksi dengannya (mulai mengayuh). Objek perangkat lunak saling berinteraksi dan berkomunikasi melalui pengiriman pesan. Ketika objek A ingin agar objek B melakukan sesuatu pada salah satu dari metoda di objek B, objek A mengirimkan pesan ke objek B (lihat Gambar 4.3). Terkadang, objek penerima memerlukan informasi lebih sehingga ia mengetahui dengan tepat apa yang harus dilakukanmisalnya, ketika anda ingin mengganti gigi pada sepeda anda, anda harus menunjukkan gigi mana yang anda inginkan. Informasi ini diberikan bersama dengan pesan sebagai parameter. Gambar 4.4 menunjukkan 3 komponen untuk melakukan hal tersebut: 1. Objek dimana pesan dialamatkan (SepedaAnda) 2. Nama metoda yang harus dilakukan (gantiGigi) 3. Parameter-parameter yang dibutuhkan oleh metoda (rendah).
17
18
Pesan
00 11 0 1 00 11 0 1 11 00 00 11 00 11 0 1 00 11 00 11 0 1 00 11 01 1 00 1 0 01 1
Objek A
Objek B
1 gantiGigi(rendah) 0 0 1 0 1 0 1 00 11 00 11 0 1 0 1 00 11 00 11 11 00 00 11 00 11 0 1 00 11 0 001 11
SepedaAnda
00 11 0 1 00 11 11 00 00 11 0 1 00 11 00 11 0 1 00 11 0 1 0 1 0 1 0 01 1
Anda
Gambar 4.4: Anda mengirim pesan ke SepedaAnda agar SepedaAnda melakukan gantiGigi ke gigi rendah. Ketiga komponen tersebut merupakan informasi yang cukup untuk objek penerima untuk melakukan metoda yang diinginkan. Tidak ada informasi lain yang dibutuhkan.
Penting Keuntungan pesan adalah: 1. Sifat dari objek dinyatakan melalui metodanya, sehingga pemberian pesan mendukung semua interaksi (yang mungkin) antar objek. 2. Objek tidak perlu berada pada proses atau bahkan mesin yang sama untuk saling mengirimkan dan menerima pesan.
4.3 Class
Dalam dunia nyata, anda sering mempunyai banyak objek dengan jenis yang sama. Misalnya, sepeda anda hanyalah satu dari banyak sepeda di dunia. Dengan menggunakan istilah orientasi objek, kita katakan bahwa objek sepeda anda adalah instance dari class objek yang dikenal dengan nama sepeda (lihat Gambar 4.5 sebagai gambaran umum sebuah objek). Sepeda mempunyai beberapa keadaan (gigi, irama genjot, dua roda) dan sifat (ganti gigi, rem). Namun demikian, masing-masing keadaan sepeda tidak tergantung dan bisa beda dari sepeda lain (lihat Gambar 4.6). Ketika membuat sepeda, pabrik memanfaatkan kenyataan bahwa sepeda mempunyai beberapa karakteristik yang sama karena pembuatan sepeda dari cetakbiru yang samakarena hal demikian adalah lebih esien dibandingkan penggunaan satu cetakbiru untuk satu sepeda. Dalam perangkat lunak berorientasi objek, dimungkinkan untuk mempunyai banyak objek dengan jenis yang sama karena karakteristik yang sama: segiempat, data pegawai, klip video dan sebagainya. Seperti pembuat sepeda, anda dapat memanfaatkan kenyataan bahwa objek dengan jenis yang sama adalah sama dan anda dapat membuat satu cetakbiru dari objek-objek itu. Cetakbiru perangkat lunak untuk objek disebut sebagai class. October 13, 2009 18
4.3. CLASS
19
API publik
11 00 00 11 00 11 00 11 00 11 00 11 00 11 00 11
API publik
rem
11 00 00 11 00 11 00 11 00 11 00 11 11 00 0 1 0 1 0 1 0 1 00 11 0 1 00 11 0 1
SepedaKu
ganti gigi
laju=10 gigi=5
1 0 0 1 0 1 0 1 0 1 0 1 11 00 0 1 00 11 0 1 rem 00 11 00 11 00 11 00 11 00 11
SepedaMu
ganti gigi
laju=15 gigi=2
Gambar 4.6: Objek SepedaKu dan SepedaMu yang berasal dari class yang sama.
Penting Suatu class adalah cetakbiru atau prototipe yang mendenisikan variabel dan metoda yang digunakan bersama untuk semua objek dari suatu jenis tertentu. Misalkan, anda dapat membuat suatu class sepeda yang mendeklarasikan beberaoa variabel instance untuk mengandung gigi sekarang, irama genjot sekarang dan seterusnya untuk masing-masing objek sepeda. Class tersebut juga mendeklarasikan dan memberi implementasi untuk metoda instance yang memungkinkan pengendara sepeda merubah gigi, rem, dan merubah irama genjot. Nilai dari variabel instance diberikan oleh masing-masing instance dari class. Maka, sesudah anda membuat class sepeda, anda harus membuat instance dari class tersebut sebelum anda dapat menggunakannya. Ketika anda membuat instance dari suatu class, anda membuat suatu objek dari jenis tersebut dan sistem mengalokasikan memori untuk variabel instance yang dideklarasikan oleh class tersebut. Lalu, anda dapat memanggil metoda instance dari objek tersebut untuk membuatnya melakukan sesuatu. Instance dari class yang sama mempunyai implementasi metoda instance yang sama (implementasi metoda tidak diduplikasi pada basis perobjek) yang berada pada class itu sendiri. Sebagai tambahan terhadap variabel dan metoda instance, class dapat pula mendesikan variabel class dan metoda class. Anda dapat mengakses variabel dan metoda class dari suatu instance dari class atau secara langsung dari suatu classanda tidak harus melakukan instance untuk menggunakan variabel dan metoda class. Metoda class dapat beroperasi hanya pada variabel classmereka tidak mempunyai akses ke variabel instance atau metoda instance. Sistem membuat suatu salinan tunggal dari semua variabel class dari suatu class pada saat pertama kali menemui class tersebut dalam suatu programsemua instance dari class tersebut mempunyai variabel class yang sama. Misalkan bahwa semua sepeda mempunyai jumlah gigi yang sama. Dalam kasus ini, mendenisikan suatu variabel instance untuk jumlah gigi adalah tidak esienmasing-masing instance mempunyai salinan variabel sendirisendiri, namun nilainya sama untuk setiap instance. Dalam situasi demikian, anda dapat mendenisikan suatu variabel class yang mengandung jumlah gigi. Semua instance mengakses variabel ini. Jika satu objek merubah variabel, variabel tersebut berubah untuk semua objek lain dengan tipe itu.
19
Anda mungkin memperhatikan bahwa ilustrasi objek dan class terlihat mirip antara satu sama lainnya. Memang, perbedaan antara class dan objek sering merupakan sumber kebingungan. Dalam dunia nyata, jelas bahwa class tidak merupakan objek yang digambarkan oleh class tersebutcetakbiru dari suatu sepeda bukanlah sepeda. Namun demikian, perbedaannya dalam perangkat lunak agak lebih sulit. Hal ini sebagian karena objek perangkat lunak hanya model elektronik dari objek dunia-nyata atau konsep abstrak. Tetapi, hal tersebut juga karena banyak orang menggunakan istilah objek secara inkonsisten dan menggunakannya untuk mengacu pada class dan instance sekaligus. Keuntungan Class Objek memberi manfaat modularitas dan penyembunyian informasi. Class memberi manfaat penggunaan kembali (reusability). Pabrik sepeda menggunakan kembali cetakbiru berkali-kali untuk membuat banyak sepeda. Pemrogram perangkat lunak menggunakan class yang sama, yang berarti code yang sama, berkali-kali untuk menghasilkan banyak objek.
4.4 Inheritance
Secara umum, objek didenisikan dalam class. Anda mengetahui banyak mengenai objek dengan mengetahui class-nya. Bahkan, bila anda tidak mengetahui apakah anu itu, jika saya katakan itu adalah sebuah sepeda, maka anda akan tahu bahwa itu mempunyai dua roda, setang dan pedal.
Sepeda
0 1 0 1 0 1 0 1 11 00 0 1 0 1 11 00 00 11 001 11 00 11 0 00 11 0 1 00 11 0 001 11
00 11 0 1 00 11 0 1 11 00 00 11 0 1 11 00 00 11 00 11 00 11 00 11 0 1 00 11 0 001 11
0 1 0 1 0 1 0 1 11 00 0 1 0 1 11 00 00 11 00 11 00 11 00 11 0 1 00 11 0 001 11
0 1 0 1 0 1 0 1 11 00 0 1 0 1 11 00 00 11 00 11 00 11 00 11 0 1 00 11 0 001 11
Sepeda Gunung
Sepeda Balap
Sepeda Tandem
Gambar 4.7: Pewarisan sifat dari class Sepeda ke class SepedaGunung, Sepeda balap dan SepedaTandem. Sistem berorientasi objek melangkah lebih jauh dan memungkinkan class didenisikan berdasarkan class lain. Misalnya, sepeda gunung, sepeda balap dan sepeda tandem adalah berbagai jenis sepeda yang berbeda. Dalam istilah orientasi objek, sepeda gunung, sepeda balap dan sepeda tandem adalah subclass dari class sepeda. Dengan lain kalimat class sepeda adalah superclass dari class sepeda gunung, sepeda balap dan sepeda tandem. Masing-masing subclass mewarisi keadaan (dalam bentuk deklarasi variabel) dari superclass. Sepeda gunung, sepeda balap dan sepeda tandem memiliki bersama beberapa keadaan: irama genjot, kecepatan, dll. Masingmasing subclass juta memiliki bersama beberapa metoda dari superclassnya. Sepeda gunung, sepeda balap dan sepeda tandem memeiliki bersama beberapa sifat: rem dan pengubahan kecepatan pedal, misalnya. Namun demikian, subclass tidak hanya dibatasi pada keadaan dan sifat yang diberikan oleh superclassnya. Subclass dapat menambah variabel dan metoda selain yang diwarisi oleh superclassnya. Sepeda tandem mempunOctober 13, 2009 20
4.5. INTERFACE
21
yai dua dudukan dan dua perangkat setang; beberapa sepeda gunung mempunyai tambahan perangkat gigi dengan perbandingan gigi yang lebih rendah. Subclass dapat pula menumpuk (override) metoda yang diwariskan dan memberikan implementasi khusus pada metoda tersebut. Misalkan, jika anda mempunyai sepeda gunung dengan tambahan perangkat gigi baru, anda dapat menumpuk metoda ganti gigi sehingga pengendara dapat menggunakan gigi tambahan baru tersebut. Anda tidak dibatasi hanya pada satu lapis pewarisan. Tree pewarisan, atau hirarki class dapat dibuat sedalam dibutuhkan. Metoda dan variabel diwarisi melalui tingkatan. Secara umum, semakin dalam hirarki class muncul, sifatnya menjadi lebih khusus. Keuntungan Pewarisan Berikut ini adalah keuntungan dari pewarisan: 1. Subclass memberikan sifat khusus berdasarkan elemen umum yang berasal dari superclass. Melalui penggunaan pewarisan, pemrogram dapat menggunakan kembali code dalam superclass berkali-kali. 2. Pemrogram dapat mengimplementasikan superclass yang disebut sebagai class abstrak yang mendenisikan sifat generik. Superclass abstrak mendenisikan dan sebagian bisa mengimplementasi sifat, namun sebagian besar tidak didenisikan dan diimplementasikan. Pemrogram lain dapat memenuhi rincian dengan subclass khusus.
4.5 Interface
Dalam bahasa Inggris, interface adalah perangkat atau sistem yang digunakan oleh sistem yang tak-terhubung untuk saling berinteraksi. Sesuai dengan denisi ini, beberapa contoh lain adalah 1. kontrol remote adalah interface antara anda dengan perangkat televisi. 2. bahasa Indonesia adalah interface antara 2 orang Indonesia. Dalam bahasa pemrograman Java, interface adalah perangkat yang menghubungkan objek tak-terhubung untuk saling berinteraksi. Interface analog dengan protokol. Sebenarnya, bahasa berorientasi objek lain juga mempunyai interface, namun biasanya mereka memanggil protokol interface. Class sepeda dan hirarkinya mendenisikan hal-hal yang dapat dan tidak dapat dilakukannya. Namun sepeda berinteraksi dengan dunia lain melalui cara lain. Misalkan, sepeda dalam toko dapat diatur melalui program inventory. Program inventory tidak perduli mengenai rincian class kecuali harga dan nomor inventory. Program inventory menset protokol komunikasi. Protokol ini berbentuk seperangkat konstanta dan denisi metoda yang disimpan dalam interface. Interface inventory akan mendenisikan, namun tidak mengimplementasikan, metoda yang mencetak dan mengambil harga eceran, memberikan nomor inventory, dan lain sebagainya. Untuk bekerja dengan program inventory, class sepeda harus memenuhi protokol ini dengan mengimplementasikan interface. Ketika class mengimplementasikan interface, class mengimplementasikakn semua metoda yang didenisikan pada interface. Maka, class sepeda akan memberi implementasi untuk metoda yang mencetak dan mengambil harga eceran, memberikan nomor inventory, dan lain sebagainya. Anda menggunakan interface untuk mendenisikan protokol dari sifat yang dapat diimplementasikan oleh class dimanapun dalam hirarki class. Interface berguna untuk : 1. Menangkap kemiripan antar class tak-terhubung tanpa memaksakan hubungan buatan. 2. Mendeklarasikan metoda yang akan diimplementasikan. 3. Menampakkan penghubung tanpa menampakkan class yang dihubungkan.
21
22
4.7.2 Latihan
Gunakan pelajaran yang anda peroleh dari javadocs untuk membuat modikasi pada applet ClickMe: import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class ClickMe extends Applet implements MouseListener { private Spot spot = null; private static final int RADIUS = 7; public void init() { addMouseListener(this); } public void paint(Graphics g) { //draw a black border and a white background g.setColor(Color.white); g.fillRect(0, 0, getSize().width - 1, getSize().height - 1); g.setColor(Color.black); g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); //draw the spot g.setColor(Color.red); if (spot != null) { g.fillOval(spot.x - RADIUS, spot.y - RADIUS, RADIUS * 2, RADIUS * 2); } } public void mousePressed(MouseEvent event) { if (spot == null) { spot = new Spot(RADIUS); } spot.x = event.getX(); spot.y = event.getY(); repaint(); } public void mouseClicked(MouseEvent event) {} public void mouseReleased(MouseEvent event) {} public void mouseEntered(MouseEvent event) {} public void mouseExited(MouseEvent event) {} } Untuk mengkompile program ini, anda juga perlu le Spot.java: public class Spot { public int size; public int x, y; public Spot(int intSize) { October 13, 2009 22
4.7. PERTANYAAN DAN LATIHAN: KONSEP OBJECT-ORIENTED size = intSize; x = -1; y = -1; } } Penting Latihan ini adalah latihan membaca code, menebak dan mencari class dan metoda dari javadocs. Kami belum memberi anda informasi rinci mengenai bagaiman menulis code Java dan apa arti keseluruhannya. Namun anda mungkin akan heran bahwa anda dapat memanfaatkan code ini. Penekanan dari latihan ini adalah untuk membiasakan anda menggunakan javadocs dan membaca code. Jangan kuatir jika anda tidak dapat menyelesaikan latihan ini. Jangan kuatir jika penyelesaian anda tidak sama dengan jawaban kami. Bandingkan penyelesaian tersebut sehingga anda lebih berpengalaman dalam membaca code dan mungkin belajar lebih mengenai API pada platform Java. 1. Modikasi applet untuk menggambar kotak hijau, bukan kotak merah. 2. Modikasi applet untuk menampilkan nama anda dengan warna ungu, bukan merah.
23
4.7.3 Jawaban
Anda dapat menemukan informasi yang diperlukan untuk menjawab pertanyaan dan menyelesaikan latihan dalam dokumentasi API untuk class Color. Jawaban Pertanyaan 1. Jawab: Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.white, Color.yellow 2. Anda menspesikasikannya dengan menggunakan model warna RGB (Red-Green-Blue). Dalam RGB, ungu adalah: 0.5; 0.0; 0.5. Penyelesaian Latihan 1. Lihat penyelesaian: import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class ClickMeGreen extends Applet implements MouseListener { private Spot spot = null; private static final int RADIUS = 7; public void init() { addMouseListener(this); } public void paint(Graphics g) { //draw a black border and a white background g.setColor(Color.white);
23
24
24
4.7. PERTANYAAN DAN LATIHAN: KONSEP OBJECT-ORIENTED public public public public } void void void void mouseClicked(MouseEvent event) {} mouseReleased(MouseEvent event) {} mouseEntered(MouseEvent event) {} mouseExited(MouseEvent event) {}
25
25
26
26
Bab 5
Dasar Bahasa
Program BasicDemo berikut ini menambahkan bilangan dari 1 sampai dengan 10, lalu menampilkan hasilnya: public class BasicsDemo { public static void main(String[] args) { int sum = 0; for (int current = 1; current <= 10; current++) { sum += current; } System.out.println("Sum = " + sum); } } Output dari program di atas adalah: Sum = 55 Program sekecil itu sudah dapat menunjukkan banyak dasar bahasa pemrograman Java termasuk variabel, operator dan pernyataan kontrol alur seperti banyak terdapat pada bahasa pemrograman C++.
5.1 Variabel
Variabel adalah suatu data yang diberi nama (diberi identier). Prinsip deklarasi dan lingkupnya sangat mirip dengan variabel pada bahasa pemrograman C++. Berikut ini adalah program MaxVariablesDemo yang mendeklarasikan 8 variabel dengan tipe yang berbeda dalam metoda main: public class MaxVariablesDemo { public static void main(String args[]) { // integers byte largestByte = short largestShort int largestInteger long largestLong =
// real numbers float largestFloat = Float.MAX_VALUE; double largestDouble = Double.MAX_VALUE; // other primitive types char aChar = S; boolean aBoolean = true; // display them all System.out.println("The largest byte value is " + largestByte); System.out.println("The largest short value is " + largestShort); System.out.println("The largest integer value is " + largestInteger); 27
28
} Output dari program ini adalah: The The The The The The The The largest byte value is 127 largest short value is 32767 largest integer value is 2147483647 largest long value is 9223372036854775807 largest float value is 3.40282e+38 largest double value is 1.79769e+308 character S is upper case. value of aBoolean is true
Anda dapat menggunakan nilai primitif secara langsung pada program anda. Misalkan, jika anda perlu memberikan nilai 4 pada variabel bilangan bulat, anda dapat menuliskan : int anInt = 4; Digit 4 merupakan nilai bilangan bulat literal. Berikut ini adalah beberapa contoh lain dari penggunaan nilai literal dari berbagai tipe primitif: Secara umum, digit tanpa titik (desimal) merupakan bilangan bulat. Anda dapat menyatakannya sebagai long integer dengan meletakkan L atau l sesudah bilangan. L lebih baik karena tidak mirip dengan digit 1. Sederetan digit dengan titik desimal merupakan bilangan dengan tipe double. Jika anda ingin menspesikannya sebagai float, anda dapat memberikan f atau F sesudah bilangan tersebut. Huruf literal dinyatakan sebagai huruf tunggal Unicode yang diapit dengan tanda kutip tunggal. Dua literal Boolean adalah true dan false. October 13, 2009 28
5.1. VARIABEL
29
Tabel 5.2: Contoh nilai literal Literal 178 8864L 37.266 37.266D 87.363F 26.77e3 c true false Tipe Data int long double double oat double char boolean boolean
Array, class dan interface adalah variabel dengan tipe reference. Berbeda dengan variabel bertipe primitif, variabel dengan tipe reference merupakan reference/acuan terhadap address/alamat dari nilai atau sekumpulan nilai yang diwakili oleh variabel. Reference disebut juga sebagai pointer, atau alamat memori dalam bahasa pemrograman lain. Bahasa pemrograman Java tidak mendukung penggunaan alamat secara eksplisit seperti C++.
5.1.3 Lingkup
Lingkup variabel adalah daerah pada program dimana variabel dapat diacu dengan nama sederhananya. Lingkup menentukan kapan sistem membuat dan menghapus memori untuk variabel. Lokasi deklarasi variabel dalam program menentukan lingkupnya: 1. variabel anggota 2. variabel lokal 3. parameter metoda 4. parameter exception-handler. Variabel anggota adalah anggota dari class atau objek. Ia dideklarasikan dalam class namun diluar dari metoda atau konstruktor. Lingkup variabel anggota adalah seluruh deklarasi dalam class. Namun, deklarasi dari anggota perlu muncul sebelum digunakan dan penggunaannya adalah dalam bentuk pernyataan inisialisasi anggota. Deklarasi variabel lokal dilakukan dalam blok code. Secara umum, lingkup dari variabel lokal meluas dari deklarasinya sampai ke akhir dari blok tersebut dimana variabel tersebut dideklarasikan. Dalam program MaxVariablesDemo, semua variabelnya yang dideklarasikan dalam metoda main adalah variabel lokal. Lingkup dari masing-masing variabel dalam program tersebut meluas dari deklarasinya ke akhir metoda main.
29
30
Gambar 5.1: Lingkup variabel. Parameter adalah argumen formal untuk metoda atau konstruktor dan digunakan untuk melalukan nilai ke metoda dan konstruktor. Lingkup parameter adalah keseluruhan metoda atau konstruktor yang mampunyai parameter tersebut. Parameter Exception-handler serupa dengan parameter namun merupakan argumen terhadap suatu exceptionhandler (bukan metoda atau konstruktor). Lingkupnya adalah blok code yang diapit oelh kurung kurawal yang mengikuti pernyataan catch. Pertimbangkan potongan program berikut: if (...) { int i = 17; ... } System.out.println("The value of i = " + i);
// error
Baris terakhir tidak akan berhasil dikompilasi karena variabel lokal i berada di luar lingkup. Lingkup dari i berada pada blok code yang diapit kurung kurawal. Variabel i tidak lagi berlaku sesudah tutup kurung kurawal tersebut. Perbaikannya adalah: 1. deklarasi variabel diletakkan di luar blok pernyataan if, atau 2. panggilan metoda println dipindahkan kedalam blok pernyataan if.
30
5.1. VARIABEL // other primitive types char aChar = S; boolean aBoolean = true;
31
Parameter dan parameter exception-handler tidak dapat diinisialisasi dengan cara tersebut. Nilai parameter di set oleh pemanggil yang menggunakan parameter tersebut.
31
32
5.1.7 Jawaban
Pertanyaan 1. Nama variabel yang berlaku adalah: anInt i i1 thing1 ONE_HUNDRED something2do 2. Jawab: args, sum, current. 3. Tipe data dari args adalah String[], yang berarti bahwa ia merupakan array dari string. sum dan current keduanya dideklarasikan sebagai int yang merupakan tipe bilangan bulat. 4. args mempunyai lingkup dalam keseluruhan metoda main. sum adalah variabel lokal yang berlaku dari deklarasinya sampai ke akhir metoda main. current berlaku dari deklarasinya sampai akhir loop for. Latihan Berikut ini adalah penyelesaian dari ketiga latihan: public class MinVariablesDemo { public static void main(String args[]) { // integers byte smallestByte = short smallestShort int smallestInteger long smallestLong =
// real numbers float smallestFloat = Float.MIN_VALUE; double smallestDouble = Double.MIN_VALUE; // other primitive types char aChar = S; boolean aBoolean = false; // display them all System.out.println("The System.out.println("The System.out.println("The System.out.println("The
byte value is " + smallestByte); short value is " + smallestShort); integer value is " + smallestInteger); long value is " + smallestLong);
System.out.println("The smallest float value is " + smallestFloat); System.out.println("The smallest double value is " + smallestDouble); if (Character.isLowerCase(aChar)) { System.out.println("The character " + aChar + " is lower case."); } else { System.out.println("The character " + aChar + " is upper case."); } System.out.println("The value of aBoolean is " + aBoolean); } } October 13, 2009 32
5.2. OPERATOR
33
5.2 Operator
Operator melakukan fungsi terhadap satu, dua atau tiga operand. Operator yang membutuhkan satu operand disebut sebagai unary operator. Misalkan, ++ adalah operator unari yang menambahkan nilai satu dari operand. Operator yang membutuhkan dua operand adalah operator biner. Misalkan, = adalah operator biner yang memberi nilai dari operand di ruas kanan ke operand di ruas kiri. Operator ternari adalah operand yang membutuhkan 3 operand. Bahasa pemrograman Java mempunyai 1 operator ternari, ?:, yang merupakan singkatan dari pernyataan if-else. Operator unari mendukung notasi awalan (prex) atau akhiran (postx). Notasi awalan adalah operator muncul sebelum operand: operator op //prefix notation
Semua operator biner menggunakan notasi inx, yang berarti bahwa operator muncul di antara operand: op1 operator op2 //infix notation
Operator ternary juga inx; masing-masing operator muncul di antara operand: op1 ? op2 : op3 //infix notation
Sebagai tambahan melakukan operasi, operator memberikan nilai. Nilai pemberian dan tipenya tergantung dari operator. Misalkan, operator aritmatika, yang melakukan operasi aritmatika dasar seperti penambahan dan pengurangan, mengembalikan/memberikan bilangan sebagai hasil dari operasi aritmatika. Tipe data yang dikembalikan oleh operator aritmatika tergantung pada operand nya: Jika anda menambahkan 2 bilangan bulat, anda akan memperoleh bilangan bulat juga.
33
34
//multiplying numbers System.out.println("Multiplying..."); System.out.println(" i * j = " + (i * j)); System.out.println(" x * y = " + (x * y)); //dividing numbers System.out.println("Dividing..."); System.out.println(" i / j = " + (i / j)); System.out.println(" x / y = " + (x / y)); //computing the remainder resulting from dividing numbers System.out.println("Computing the remainder..."); System.out.println(" i % j = " + (i % j)); System.out.println(" x % y = " + (x % y)); //mixing types System.out.println("Mixing types..."); System.out.println(" j + y = " + (j + y)); System.out.println(" i * x = " + (i * x)); } } Keluarannya adalah: Variable values... i = 37 j = 42 x = 27.475 y = 7.22 Adding... i + j = 79 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 types... j + y = 49.22 i * x = 1016.58 Perhatikan bahwa ketika bilangan bulat dan bilangan pecahan digunakan sebagai operand untuk operasi aritmatika tunggal, hasilnya adalah bilangan pecahan. Bilangan bulat secara implisit dikonversikan menjadi bilangan pecahan sebelum operasi berlangsung. Tabel berikut adalah rangkuman dari tipe data yang dikembalikan oleh operator aritmatika berdasarkan tipe data dari operand. Konversi yang diperlukan terjadi sebelum operasi dilakukan. Sebagai tambahan dari bentuk biner untuk + dan -, masing-masing operator ini mempunyai versi unari yang melakukan operasi berikut: Dua operator aritmetika pintas adalah ++ yang menaikkan operand dengan 1, dan -- yang mengurangi operand dengan 1. Keduanya dapat muncul sebelum (prex) atau sesudah (postx) operand. Versi prex ++op / --op, menghitung nilai operand sesudah operasi penambahan/pengurangan. Versi postx adalah sebaliknya. Berikut ini adalah program SortDemo yang menggunakan ++ dua kali dan -- sekali: public class SortDemo { October 13, 2009 34
5.2. OPERATOR
35
Tabel 5.3: Rangkuman tipe data yang dikembalikan Hasil Tipe long int double float Tipe Data Operand Tidak satu operand pun float atau double; paling tidak, satu operand bertipe long. Tidak satu operand pun float atau double; tidak satu operand pun bertipe long. paling tidak, satu operand bertipe double. paling tidak, satu operand bertipe float; tidak satu operand pun bertipe double.
Tabel 5.4: Versi Unari untuk + dan Operator + Penggunaan +op -op Penjelasan merubah op menjadi int untuk byte, short, atau char mengurangkan op
public static void main(String[] args) { int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 }; for (int i = arrayOfInts.length; --i >= 0; ) { for (int j = 0; j < i; j++) { if (arrayOfInts[j] > arrayOfInts[j+1]) { int temp = arrayOfInts[j]; arrayOfInts[j] = arrayOfInts[j+1]; arrayOfInts[j+1] = temp; } } } for (int i = 0; i < arrayOfInts.length; i++) { System.out.print(arrayOfInts[i] + " "); } System.out.println(); } } Program ini meletakkan 10 nilai bilangan bulat ke dalam array, struktur berukuran tetap, yang dapat menyimpan berbagai nilai dengan tipe yang sama, lalu mengurutkannya. Keluarannya adalah: 3 8 12 32 87 127 589 622 1076 2000 Mari kita pelajari bagaimana program tersebut menggunakan operator -- untuk mengontrol loop terluar. Berikut ini adalah pernyataan tersebut: for (int i = arrayOfInts.length; --i >= 0; ) { ... } Pernyataan for adalah konstruksi loop yang akan anda temui nanti. Yang penting diperhatikan adalah kelangsungan proses loop sepanjang nilai yang dikembalikan oleh --i adalah lebih besar atau sama dengan 0. Menggunakan prex -- berarti bahwa iterasi terakhir dari loop terjadi ketika i sama dengan 0. Jika kita menggunakan versi postx dari --, iterasi terakhir dari loop ini terjadi ketika i=-1, yang tidak benar untuk program ini karena i digunakan sebagai indeks array dan -1 bukan merupakan indeks array yang berlaku. Dua loop lain menggunakan versi postx dari ++. Dalam kedua kasus, prex atau postx tidak menjadi masalah, karena nilai yang dikembalikan oleh operator tidak digunakan. Jika nilai return tidak digunakan untuk apapun, versi postx sering digunakan. Tabel berikut adalah rangkumannya:
35
36
Tabel 5.5: Rangkuman operator ++ dan -Penggunaan op++ ++op op---op Keterangan Menambahkan op dengan 1; mengevaluasi nilai op sebelum dinaikkan Menambahkan op dengan 1; mengevaluasi nilai op sesudah dinaikkan Mengurangkan op dengan 1; mengevaluasi nilai op sebelum dikurangkan Mengurangkan op dengan 1; mengevaluasi nilai op sesudah dikurangkan
3 bilangan bulat dan menggunakan operator relasi untuk membandingkannya: public class RelationalDemo { 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); //greater than System.out.println("Greater System.out.println(" i > System.out.println(" j > System.out.println(" k >
than..."); j = " + (i > j)); i = " + (j > i)); j = " + (k > j));
//greater than or equal to 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
//less than System.out.println("Less than..."); System.out.println(" i < j = " + (i < j)); System.out.println(" j < i = " + (j < i)); System.out.println(" k < j = " + (k < j));
36
5.2. OPERATOR //less than or equal to System.out.println("Less than or System.out.println(" i <= j = System.out.println(" j <= i = System.out.println(" k <= j =
37
equal to..."); " + (i <= j)); " + (j <= i)); " + (k <= j));
//equal to System.out.println("Equal to..."); System.out.println(" i == j = " + (i == j)); System.out.println(" k == j = " + (k == j)); //not equal to System.out.println("Not equal to..."); System.out.println(" i != j = " + (i != j)); System.out.println(" k != j = " + (k != j)); } } Keluarannya adalah: Variable values... i = 37 j = 42 k = 42 Greater than... i > j = false j > i = true k > j = false Greater than or equal to... i >= j = false j >= i = true k >= j = true Less than... i < j = true j < i = false k < j = false Less than or equal to... i <= j = true j <= i = false k <= j = true Equal to... i == j = false k == j = true Not equal to... i != j = true k != j = false
//false //true
//true //false
Operator relasi sering digunakan dengan operator syarat untuk membuat pernyataan pengambilan keputusan. Bahasa ini mendukung 6 operator syarat: 5 biner dan 1 unari, sebagaimana tertera pada Tabel. Program berikut menggunakan operator && untuk menentukan apakah indeks array berada diantara kedua batasnya. Ia menentukan apakah kedua indeksnya adalah lebih dari atau samadengan 0 dan kurang dari NUM ENTRIES, yang sebelumnya didenisikan sebagai nilai konstanta: 0 <= index && index < NUM_ENTRIES Jika kedua operator adalah boolean, operator & melakukan operasi yang sama dengan operasi yang dilakukan oleh &&. Namun, & selalu mengevaluasi kedua operatornya dan mengembalikan true jika keduanya bernilai true. Proses yang analog juga berlaku antara operand yang mengapit operator dan . Jika operand nya adalah bilangan, & dan melakukan manipulasi bit.
37
38
Tabel 5.7: Operator Syarat Penggunaan op1 && op2 op1 || op2 ! op op1 & op2 op1 | op2 op1 op2 Mengembalikan true jika op1 dan op2 adalah true, secara bersyarat mengevaluasi op2 op1 atau op2 adalah true, secara bersyarat mengevaluasi op2 op adalah false op1 dan op2 adalah true, selalu mengevaluasi op1 dan op2 op1 atau op2 adalah true, selalu mengevaluasi op1 dan op2 op1 dan op2 berbeda; salah satu bernilai true, sedangkan lainnya false
Penggunaan op1 >> op2 op1 << op2 op1 >>> op2
oleh operand di sebelah kanan. Penggeseran terjadi dalam arah sesuai yang ditunjukkan oleh operator. Sebagai contoh, pernyataan berikut menggeser bit dari bilangan bulat 13 ke kanan dengan satu posisi: 13 >> 1; Representasi biner dari 13 adalah 1101. Hasil dari operasi geser tersebut adalah 1101 digeser kekanan dengan satu posisi 0110, atau 6 dalam desimal. Angka 0 paling kiri dimunculkan karena digit totalnya adalah 4. Tabel 5.9 menunjukkan 4 operator yang berguna untuk melakukan fungsi bitwise pada operandnya. Jika Tabel 5.9: Operator untuk fungsi bitwise Penggunaan op1 & op2 op1 | op2 op1 hat op2 op1 op2 Operasi bitwise and bitwise or bitwise xor bitwise komplemen
operandnya adalah bilangan bulat, operasi & melakukan fungsi AND bitwise pada masing-masing pasangan paralel dari bit pada masing-masing operand. Fungsi AND menset bit hasilnya menjadi 1 jika bit pada kedua operand nya adalah 1. Misalkan anda ingin melakukan operasi AND pada 13 dan 12, seperti ini: 13 & 12. Hasilnya adalah 12 karena representasi biner dari 12 adalah 1100, dan representasi biner dari 13 adalah 1101, sehingga 1101 & 1100 -----1100 //13 //12 //12
Jika kedua operandnya adalah bilangan, operator melakukan operasi inclusive or, dan melakukan operasi exclusive or atau xor. Inclusive or adalah jika salah satu bit adalah 1, hasilnya adalah 1. Exclusive or adalah jika kedua operandnya berbeda, hasilnya adalah 1. Akhirnya, operator complement membalik nilai dari masing-masing bit operand: jika bit operand adalah 1, hasilnya adalah 0 dan sebaliknya. October 13, 2009 38
5.2. OPERATOR
39
Manipulasi bitwise sangat berguna untuk pengaturan ag boolean. Misalkan, program anda mempunyai beberapa ag boolean yang mengindikasikan status dari berbagai komponen dalam program anda: apakah terlihat, bisa ditarik dan lain-lain. Daripada mendenisikan variabel boolean secara terpisah untuk menyimpan masing-masing ag, anda dapat mendenisikan variabel tunggal, flag, untuk semuanya sekaligus. Masing-masing bit dalam flag mewakili statusnya. Manipulasi bit dapat dilakukan untuk menset dan memperoleh masing-masing ag. 1. Ambil konstanta yang menunjukkan berbagai ag dari program anda. Flag ini seharusnya merupakan kelipatan 2 untuk memastikan bahwa masing-masing bit digunakan hanya sekali. 2. Denisikan variabel flag yang bitnya akan di set sesuai dengan status masing-masing ag. 3. Contoh berikut menginisialisasi flag menjadi 0, yang berarti bahwa semua ag adalah false (tak satupun bit yang diset). static static static static final final final final int int int int VISIBLE = 1; DRAGGABLE = 2; SELECTABLE = 4; EDITABLE = 8;
int flags = 0; 4. Untuk menset ag visible ketika sesuatu menjadi terlihat, anda dapat menggunakan pernyataan: flags = flags | VISIBLE; 5. Untuk memeriksa visibilitasnya, anda dapat menuliskan: if ((flags & VISIBLE) == VISIBLE) { ... } Berikut ini adalah program lengkapnya: public class BitwiseDemo { static static static static final final final final int int int int VISIBLE = 1; DRAGGABLE = 2; SELECTABLE = 4; EDITABLE = 8;
public static void main(String[] args) { int flags = 0; flags = flags | VISIBLE; flags = flags | DRAGGABLE; if ((flags & VISIBLE) == VISIBLE) { if ((flags & DRAGGABLE) == DRAGGABLE) { System.out.println("Flags are Visible and Draggable."); } } flags = flags | EDITABLE; if ((flags & EDITABLE) == EDITABLE) { System.out.println("Flags are now also Editable."); } } } Keluarannya adalah: Flags are Visible and Draggable. Flags are now also Editable.
39
40
// real numbers float largestFloat = Float.MAX_VALUE; double largestDouble = Double.MAX_VALUE; // other primitive types char aChar = S; boolean aBoolean = true; Bahasa pemrograman Java juga memberi beberapa operator assignment pintas yang memungkinkan anda melakukan aritmatika, geser, atau operasi bitwise dan operator assignment semuanya sekaligus dengan satu operator. Misalkan anda ingin menambahkan bilangan ke suatu variabel dan memberikan hasilnya kembali ke variabel tersebut, seperti ini: i = i + 2; Anda dapat meringkas pernyataan tersebut dengan menggunakan operator +=: i += 2; Hal ini juga berlaku bagi operator-operator lain.
Pernyataan if-else ringkas Operator ?: merupakan operator syarat yang merupakan singkatan dari pernyataan if-else: op1 ? op2 : op3 Operator ?: mengembalikan op2 jika true atau op3 jika false. Operator [] Anda menggunakan kurung kotak untuk mendeklarasikan array, membuat array dan mengakses elemen tertentu dalam sebuah array. Berikut ini adalah contoh deklarasi array: float[] arrayOfFloats = new float[10]; October 13, 2009 40
5.2. OPERATOR
41
Pernyataan di atas mendeklarasikan suatu array yang dapat menyimpan 10 bilangan pecahan. Berikut ini adalah cara untuk mengakses elemen ke-7 dari array tersebut: arrayOfFloats[6]; Perhatikan bahwa indeks array dimulai pada 0. Operator . Operator dot mengakses anggota instans dari suatu objek atau anggaota class dari suatu class. Operator () Ketika mendeklarasikan atau memanggil metoda, anda melampirkan argumen metoda di antara kurung. Anda dapat menspesikasi daftar argumen yang kosong dengan menggunakan (). Operator (type) Operator ini mengkonversi nilai ke tipe yang dispesikasikan. Operator new Anda dapat menggunakan operator new untuk membuat objek atau array baru. Berikut ini adalah contoh pembuatan objek Integer baru dari class Integer dalam paket java.lang: Integer anInteger = new Integer(10); Operator instanceof Operator ini memeriksa apakah operator pertama merupakan instans dari operator kedua: op1 instanceof op2 op1 adalah merupakan nama dari objek dan op2 adalah nama dari class. Suatu objek adalah instans dari suatu class jika objek tersebut secara langsung atau tidak langsung merupkan keturunan dari class tersebut.
41
42 Latihan 1. Tuliskan program untuk memeriksa apakah bilangan pecahan adalah nol.
2. Tuliskan program untuk menghitung jumlah ekuivalen dolar Amerika jika diberikan sejumlah rupiah.
5.2.7 Jawaban
Jawaban Pertanyaan 1. [], >, [], + 2. Jawab: (a) i adalah 11, dan n adalah 0. (b) i adalah 11, dan n adalah 1. 3. i adalah 2. 4. i adalah 8.
Penyelesaian Latihan 1. public class FloatTest { public static void main(String[] args) { float f = 100.0f; float MAX = 0.001f; float MIN = -MAX; System.out.print(String.valueOf(f)); if ((f < MAX) && (f > MIN)) { System.out.println(" is pretty darn close to 0."); } else { System.out.println(" is not close to 0."); } } } 2. import java.text.DecimalFormat; //DecimalFormat is discussed in //http://java.sun.com/docs/books/tutorial/java/data/decimalFormat.html public class CurrencyExchange { static double FRANCS_PER_DOLLAR = 6.85062; public static void main(String[] args) { DecimalFormat formatter = new DecimalFormat("###,###.00"); double numFrancs = 10000000.0; double numDollars = numFrancs/FRANCS_PER_DOLLAR; System.out.println(formatter.format(numFrancs) + "FF is equal to $" + formatter.format(numDollars) + "."); } } October 13, 2009 42
43
5.3.1 Ekspresi
Ekspresi melakukan kerja program. Ekspresi dapat digunakan untuk menghitung, memberi nilai kepada variabel dan untuk mengontrol aliran eksekusi. Tugas ekspresi adalah 1. melakukan komputasi sesuai dengan elemen ekspresi 2. mengembalikan nilai sebagai hasil dari komputasi. Dari program contoh MaxVariablesDemo pada halaman 27, kita lihat potongannya: ... // other primitive types char aChar = S; boolean aBoolean = true; // display them all System.out.println("The largest byte value is " + largestByte); ... if (Character.isUpperCase(aChar)) { ... } Ekspresi dan nilai yang dikembalikan dari potongan program tersebut dapat dilihat pada Tabel 5.11. Tabel 5.11: Ekspresi dari program MaxVariablesDemo Ekspresi aChar = S "The largest byte value is " + largestByte Character.isUpperCase(aChar) Aksi assign karakter S ke aChar menggabungkan 2 string largestByte dikonversi ke string memanggil metoda isUpperCase Nilai yang dikembalikan nilai aChar sesudah assignmen The largest byte value is 127
true
Bahasa pemrograman Java memungkinkan anda untuk membuat ekspresi dan pernyataan gabungan dari berbagai ekspresi yang lebih kecil selama tipe data yang diperlukan oleh satu bagian sesuai dengan tipe data dari bagian lainnya. Berikut ini adalah contoh gabungan ekspresi: x * y * z Pada contoh ini, urutan dimana ekspresi dievaluasi tidak penting karena hasil dari perkalian adalah tidak tergantung dari urutan. Namun demikian, hal ini tidak selalu benar. Untuk memastikan urutan eksekusi, dapat digunakan kurung yang menunjukkan prioritas eksekusi, seperti: (x + y)/ 100 Tabel 5.12 menunjukkan precedence.
5.3.2 Pernyataan
Pernyataan secara kasar serupa dengan kalimat dalam bahasa alamiah. Pernyataan membentuk satuan lengkap dari eksekusi. Kalimat berikut ini dapat dibuat menjadi pernyataan dengan mengakhiri ekspresi dengan titik-koma
43
44
Tabel 5.12: Precedence operator postx operator unari pembuatan / cast perkalian penambahan geser relasi kesamaan bitwise AND bitwise exclusif OR bitwise inclusif OR logical AND logical OR syarat assignment [] . ( params) expr + + expr + + expr expr + expr expr ! new (type)expr /% + << >> >>> < > <= >= instanceof == ! = & && ?: = += = = /= %= &= = | = <<= >>= >>>=
1. ekspresi assignment 2. penggunaan ++ atau 3. pemanggilan metoda 4. ekspresi pembuatan objek Pernyataan semacam di atas disebut sebagai pernyataan ekspresi. Berikut ini adalah contoh dari pernyataan ekspresi: aValue = 8933.234; aValue++; System.out.println(aValue); Integer integerObject = new Integer(4); //assignment statement //increment statement //method call statement //object creation statement
Sebagai tambahan dari pernyataan ekspresi di atas, ada 2 macam pernyataan lain: 1. Pernyataan deklarasi yang mendeklarasikan variabel. Anda telah sering melihatnya pada berbagai contoh, misalnya double aValue = 8933.234; // declaration statement 2. Pernyataan kontrol alur yang mengatur urutan kapan pernyataan tertentu dieksekusi. Loop for dan if merupakan contoh dari pernyataan kontrol alur.
5.3.3 Blok
Blok adalah kumpulan nol atau lebih pernyataan di antara kurung kurawal buka dan tutup. Berikut ini adalah potongan program yang diambil dari program MaxVariablesDemo pada halaman 27: if (Character.isUpperCase(aChar)) { System.out.println("The character " + aChar + " is upper case."); } else { System.out.println("The character " + aChar + " is lower case."); }
5.3.4 Rangkuman
Ekspresi adalah sederetan variabel, operator, panggilan metoda yang mengevaluasi nilai tunggal. Anda dapat menuliskan ekspresi majemuk dengan menggabungkan ekspresi selama tipe yang diperlukan oleh semua operator yang terlibat dalam ekspresi majemuk tersebut adalah benar. Ketika menuliskan ekspresi majemuk, tunjukkan secara eksplisit dengan menggunakan kurung mengenai operator mana yang dioperasikan terlebih dahulu. October 13, 2009 44
45
Jika anda memilih untuk tidak menggunakan kurung, urutan proses ditentukan oleh presedens. Pernyataan membentuk satuan lengkap untuk eksekusi dan diakhiri dengan titik-koma. Terdapat 3 jenis pernyataan yaitu pernyataan ekspresi, deklarasi dan kontrol alur. Anda dapat mengelompokkan 0 atau lebih pernyataan bersamasama dalam blok dengan kurung kurawal. Walaupun tidak diperlukan, dianjurkan untuk menggunakan blok pada pernyataan kontrol alur walaupun hanya ada satu pernyataan dalam blok.
5.3.6 Jawaban
Jawaban Pertanyaan 1. Jawab: i > 0 i = 0 i++ (float)i i == 0 "aString" + i 2. (a) false (b) Penyelesaian Latihan public class OperatorEx { public static void main(String[] args) { int i = 10; if ((i-- % 5)>0) { System.out.println("true"); } else { System.out.println("false"); } } } (i-- % 5) > 0 [boolean] [int] [int] [float] [boolean] [String]
45
46
Dalam subbab ini, anda akan mempelajari notasi berikut untuk menggambarkan bentuk umum dari pernyataan kontrol alur: control flow statement details { statement(s) } Secara teknis, kurung kurawal tidak dibutuhkan jika blok mengandung hanya satu pernyataan. Namun, dianjurkan untuk selalu menggunakan kurung tersebut karena code lebih mudah dibaca dan mencegah terjadinya kesalahan ketika memodikasi code.
47
Nilai yang dicetak pada baris terakhir adalah: Copy this strin. Bahasa ini mempunyai pernyataan lain yang mirip dengan pernyataan while, yaitu pernyataan do-while. Sintaks umumnya adalah: do { pernyataan } while (ekspresi); Terlihat bahwa do-while mengevaluasi ekspresi di bawah loop. Jadi pernyataan dalam blok do-while dieksekusi paling tidak sekali. Berikut ini adalah contoh program dengan hasil seperti program WhileDemo, namun ditulis dengan menggunakan do-while: public class DoWhileDemo { public static void main(String[] args) { String copyFromMe = "Copy this string until you " + "encounter the letter g."; StringBuffer copyToMe = new StringBuffer(); int i = 0; char c = copyFromMe.charAt(i); do { copyToMe.append(c); c = copyFromMe.charAt(++i); } while (c != g); System.out.println(copyToMe); } } Keluarannya adalah:Copy this strin.
Loop for sering digunakan untuk mengiterasi elemen dalam array, atau karakter dalam string. Program ForDemo menggunakan pernyataan untuk mengiterasi elemen dalam array dan mencetaknya: public class ForDemo { public static void main(String[] args) { int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076,
47
for (int i = 0; i < arrayOfInts.length; i++) { System.out.print(arrayOfInts[i] + " "); } System.out.println(); } } Keluarannya adalah : 32 87 3 589 12 1076 2000 8 622 127. Penting Anda dapat mendeklarasikan variabel lokal dalam ekspresi initialization untuk loop for. Lingkup dari variabel ini meluas dari deklarasinya ke akhir blok for. Jika variabel untuk kontrol loop tersebut tidak diperlukan diluar loop, terbaik adalah mendeklarasikan variabel dalam ekspresi initialization. Nama i, j dan k sering digunakan sebagai kontrol tersebut; pendeklarasiannya dalam ekspresi initialization membatasi lingkup berlakunya dan mengurangi kemungkinan munculnya kesalahan.
48
5.4. PERNYATAAN KONTROL ALUR int testscore = 76; char grade; if (testscore >= 90) { grade = A; } else if (testscore >= 80) grade = B; } else if (testscore >= 70) grade = C; } else if (testscore >= 60) grade = D; } else { grade = F; } System.out.println("Grade = } } Output dari program ini adalah : Grade = C
49
{ { {
" + grade);
Anda dapat memperhatikan bahwa nilai testscore dapat memenuhi lebih dari satu ekspresi dalam pernyataan if majemuk: 76 >= 70 dan 76 >= 60. Namun, sejalan dengan runtime, sistem memproses pernyataan tersebut sebagai berikut: setelah kondisi dipenuhi, pernyataan yang sesuai dieksekusi (grade = C;), dan kontrol melalui pernyataan if tanpa mengevaluasi kondisi sisanya. Bahasa ini mendukung operator ? :, yang merupakan versi ringkas dari pernyataan if. Ingat pernyataan dari program MaxVariablesDemo di halaman 27: if (Character.isUpperCase(aChar)) { System.out.println("The character " + aChar + " is upper case."); } else { System.out.println("The character " + aChar + " is lower case."); } Berikut ini adalah cara penulisannya dengan menggunakan operator ? : System.out.println("The character " + aChar + " is " + (Character.isUpperCase(aChar) ? "upper" : "lower") + "case."); Operator ? : mengembalikan string upper jika metoda isUpperCase mengembalikan true. Sebaliknya, ia mengembalikan string lower. Hasilnya digabung dengan bagian lain dari pesan yang akan ditampilkan. Penggunaan ? : memang masuk akal disini karena pernyataan if adalah sekunder dari panggilan terhadap metoda println. Setelah terbiasa menggunakannya, code menjadi lebih mudah dibaca.
49
50 case case case case case case case case } } } 5: 6: 7: 8: 9: 10: 11: 12:
Pernyataaan switch mengevaluasi ekspresi dalam hal ini nilai month dan mengeksekusi pernyataan case yang sesuai. Maka, keluaran dari program adalah August. Sebagai alternatif, pernyataan if dapat digunakan sebagai pengganti pernyataan switch: int month = 8; if (month == 1) { System.out.println("January"); } else if (month == 2) { System.out.println("February"); } . . . // and so on Penentuan penggunaan pernyataan if atau switch dapat didasarkan pada kejelasan dan faktor lain. Pernyataan if biasa digunakan untuk membuat keputusan berdasarkan kondisi dan nilai yang banyak, sedangkan switch hanya berdasarkan nilai bilangan bulat tunggal. Juga, nilai untuk masing-masing case dalam pernyataan switch harus tunggal. Hal penting lain untuk pernyataan switch adalah pernyataan break sesudah masing-masing case. Masingmasing pernyataan break mengakhiri pernyataan switch, dan alur kontrol berlanjut ke pernyataan pertama sesudah blok switch. Pernyataan break diperlukan karena tanpanya, pernyataan case diakses terus secara berurutan. Berikut ini adalah ilustrasi mengapa perlu menggunakan break: public class SwitchDemo2 { public static void main(String[] args) { int month = 2; int year = 2000; int numDays = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDays = 31; break; case 4: case 6: case 9: case 11: numDays = 30; break; case 2: if ( ((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0) ) numDays = 29; else October 13, 2009 50
5.4. PERNYATAAN KONTROL ALUR numDays = 28; break; } System.out.println("Number of Days = " + numDays); } } Keluaran dari program ini adalah Number of Days = 29
51
Secara teknis, break terakhir tidak diperlukan karena aliran akan keluar dari pernyataan switch biar bagaimanapun. Namun, dianjurkan untuk menggunakan break untuk pernyataan case untuk mengurangi kemungkinan kesalahan jika tiba-tiba anda ingin menambahkan pernyataan case nantinya. Akhirnya, anda dapat menggunakan pernyataan default pada akhir dari switch untuk menangani semua nilai yang tidak secara eksplisit ditangani oleh satu dari pernyataan case. int month = 8; . . . switch (month) { case 1: System.out.println("January"); break; case 2: System.out.println("February"); break; case 3: System.out.println("March"); break; case 4: System.out.println("April"); break; case 5: System.out.println("May"); break; case 6: System.out.println("June"); break; case 7: System.out.println("July"); break; case 8: System.out.println("August"); break; case 9: System.out.println("September"); break; case 10: System.out.println("October"); break; case 11: System.out.println("November"); break; case 12: System.out.println("December"); break; default: System.out.println("Hey, thats not a valid month!"); break; }
51
52
5.4. PERNYATAAN KONTROL ALUR { 12, 1076, 2000, 8 }, { 622, 127, 77, 955 } }; int searchfor = 12; int i = 0; int j = 0; boolean foundIt = false; search: for ( ; i < arrayOfInts.length; i++) { for (j = 0; j < arrayOfInts[i].length; j++) { if (arrayOfInts[i][j] == searchfor) { foundIt = true; break search; } } }
53
if (foundIt) { System.out.println("Found " + searchfor + " at " + i + ", " + j); } else { System.out.println(searchfor + "not in the array"); } } } Keluaran dari program ini adalah: Found 12 at 1, 0 Sintaks bisa sedikit membingungkan. Pernyataan break mengakhiri pernyataan berlabel; ia tidak memindahkan alur kontrol ke label. Alur kontrol pindah ke pernyataan sesudah pernyataan berlabel yang bersangkutan. Pernyataan continue Anda dapat menggunakan pernyataan continue untuk meloncati iterasi pada saat tertentu. Bentuk tak-berlabel meloncati ke akhir blok loop terdalam dan mengevaluasi ekspresi boolean yang mengontrol loop, meloncati sisa iterasi dalam loop. Program ContinueDemo memeriksa huruf pada buffer string. Jika karakter pada saat tertentu bukanlah p, pernyataan continue meloncati sisa iterasi dan proses berlanjut ke karakter berikutnya. Jika p, program menambah cacahan dan mengkonversi p menjadi huruf besar: public class ContinueDemo { public static void main(String[] args) { StringBuffer searchMe = new StringBuffer( "peter piper picked a peck of pickled peppers"); int max = searchMe.length(); int numPs = 0; for (int i = 0; i < max; i++) { //interested only in ps if (searchMe.charAt(i) != p) continue; //process ps numPs++; searchMe.setCharAt(i, P); } System.out.println("Found " + numPs + " ps in the string.");
53
54 System.out.println(searchMe); } } Keluarannya adalah: Found 9 ps in the string. Peter PiPer Picked a Peck of Pickled PePPers
Bentuk berlabel dari continue meloncati iterasi dari loop terluar yang berlabel. Program ContinueWithLabelDemo menggunakan loop bersarang untuk mencari substring dalam string lain. Dua loop bersarang dibutuhkan: satu untuk mengiterasi substring dan satu lainnya untuk mengiterasi string yang diperiksa. Program ini menggunakan continue berlabel untuk meloncati iterasi dari loop terluar: public class ContinueWithLabelDemo { public static void main(String[] args) { String searchMe = "Look for a substring in me"; String substring = "sub"; boolean foundIt = false; int max = searchMe.length() - substring.length(); test: for (int i = 0; i <= max; i++) { int n = substring.length(); int j = i; int k = 0; while (n-- != 0) { if (searchMe.charAt(j++) != substring.charAt(k++)) { continue test; } } foundIt = true; break test; } System.out.println(foundIt ? "Found it" : "Didnt find it"); } } Keluarannya adalah Found it Pernyataan return Anda menggunakan return untuk keluar dari metoda. Alur kontrol mengembalikan proses ke pernyataan setelah panggilan pada metoda pemanggil. Pernyataan return mempunyai dua bentuk: yang mengembalikan nilai dan yang tidak. Untuk mengembalikan nilai, letakkan nilai (atau ekspresi yang menghitung nilai) sesudah kata kunci return: return ++count; Tipe data dari nilai yang dikembalikan oleh return harus sesuai dengan tipe dari nilai return dari deklarasi metoda. Jika metoda dideklarasikan sebagai void, gunakan bentuk return yang tidak mengembalikan nilai: return;
5.4. PERNYATAAN KONTROL ALUR 2. pernyataan if-else, 3. pernyataan switch, 4. pernyataan exception-handling 5. pernyataan pencabangan Loop
55
Gunakan pernyataan while untuk mengiterasi pada blok pernyataan ketika ekspresi boolean bernilai true. Ekspresi dievaluasi pada bagian atas dari loop: while (boolean expression) { statement(s) } Gunakan pernyataan do-while untuk mengiterasi pada blok pernyataan ketika ketika ekspresi boolean bernilai true. Ekspresi dievaluasi pada bagian bawah dari loop, sehingga pernyataan dalam blok do-while dieksekusi paling tidak sekali: do { statement(s) } while (expression); Pernyataan for mengiterasi blok pernyataan, dan mengandung inisialisasi ekspresi, kondisi berhenti, dan ekspresi penambahan: for (initialization ; termination ; increment) { statement(s) } Pernyataan Pembuat Keputusan Bahasa pemrograman Java mempunyai dua pernyataan pembuat keputusan: if-else dan switch. Pernyataan yang lebih bersifat umum adalah if; penggunaan switch untuk membuat keputusan pilihan majemuk tergantung pada satu nilai bilangan bulat tunggal. Berikut ini adalah pernyataan if yang paling mendasar dengan blok pernyataan dieksekusi jika ekspresi boolean adalah true: if (boolean expression) { statement(s) } Berikut ini adalah pernyataan if dengan pernyataan else. Pernyataan if mengeksekusi blok pertama jika ekspresi boolean true; jika tidak, ia mengeksekusi blok kedua: if (boolean expression) { statement(s) } else { statement(s) } Anda dapat menggunakan else if untuk membuat pernyataan if gabungan: if (boolean expression) { statement(s) } else if (boolean expression) { statement(s) } else if (boolean expression) { statement(s) } else { statement(s) } Pernyataan switch mengevaluasi ekspresi bilangan bulat dan mengeksekusi pernyataan case yang sesuai:
55
56 switch (integer expression) { case integer expression: statement(s) break; ... default: statement(s) break; } Pernyataan Exception-Handling Gunakan pernyataan try, catch dan finally untuk menangani perkecualian: try { statement(s) } catch (exceptiontype name) { statement(s) } catch (exceptiontype name) { statement(s) } finally { statement(s) } Pernyataan Pencabangan
Pernyataan ini mengubah alur kontrol dalam program ke pernyataan berlabel. Anda memberi label pernyataan dengan menempatkan identier legal (label) diikuti dengan titik-dua sebelum pernyataan: statementName: someJavaStatement; Gunakan bentuk tak-berlabel untuk pernyataan break untuk mengakhiri pernyataan switch, for, while atau do-while terdalam: break; Gunakan bentuk berlabel untuk pernyataan break untuk mengakhiri pernyataan switch, for, while atau do-while bagian luar: break label; Pernyataan continue mengakhiri iterasi dari loop terdalam dan mengevaluasi ekspresi boolean yang mengontrol loop: continue; Pernyataan continue berlabel mengakhiri iterasi dari loop berlabel continue label; Gunakan return untuk mengakhiri metoda: return; Anda dapat mengembalikan nilai ke pemanggil dengan menggunakan return berikut nilai: return value;
57
3. Lihat program WhileDemo pada halaman 46 dan DoWhileDemo pada halaman 47. Apa keluaran dari masingmasing program jika anda mengubah nilai dari masing-masing string copyFromMe menjadi golly gee. this is fun. Jelaskan. Latihan Pertimbangkan potongan program berikut: if (aNumber >= 0) if (aNumber == 0) System.out.println("first string"); else System.out.println("second string"); System.out.println("third string"); 1. Jika aNumber adalah 3, apa keluarannya ? 2. Tuliskan program test yang mengandung potongan program tersebut; buat aNumber 3. Apakah output dari program ? Apakah tepat seperti yang anda perkirakan ? Jelaskan. 3. Dengan menggunakan spasi dan line break, reformat potongan program tersebut agar kontrol alur lebih mudah dipahami. 4. Gunakan kurung kurawal untuk memperjelas code dan mengurangi kemungkinan error oleh pengembang code berikutnya.
5.4.9 Jawaban
Jawaban Pertanyaan 1. SortDemo mengandung 4 pernyataan kontrol. Secara berurutan: 2 pernyataan for, 1 pernyataan if dan 1 pernyataan for. 2. == seharusnya digunakan, bukan =. Jika anda coba untuk mengkompilenya, kompiler akan memperingatkan anda nilai boolean yang dibutuhkan, bukan nilai bilangan bulat. 3. Berikut ini adalah program yang sudah dimodikasi berdasarkan program WhileDemo dan DoWhileDemo. public class NewWhileDemo { public static void main(String[] args) { String copyFromMe = "golly gee. this is fun."; StringBuffer copyToMe = new StringBuffer(); int i = 0; char c = copyFromMe.charAt(i); while (c != g) { copyToMe.append(c); c = copyFromMe.charAt(++i); } System.out.println(copyToMe); } } public class NewDoWhileDemo { public static void main(String[] args) { String copyFromMe = "golly gee. this is fun."; StringBuffer copyToMe = new StringBuffer();
57
58
int i = 0; char c = copyFromMe.charAt(i); do { copyToMe.append(c); c = copyFromMe.charAt(++i); } while (c != g); System.out.println(copyToMe); } } Program NewWhileDemo menampilkan baris kosong karena huruf pertama adalah g, sehingga loop tidak dimasuki dan tidak ada karakter yang dilampirkan ke copyToMe. Program NewDoWhileDemo menampilkan golly karena g pertama diabaikan, dan yang kedua mengakhiri loop tanpa menambah g kedua ke string. Penyelesaian Latihan 1. Penyelesaian: second string third string 2. Penyelesaian: public class NestedIf { public static void main(String[] args) { int aNumber = 3; if (aNumber >= 0) if (aNumber == 0) System.out.println("first string"); else System.out.println("second string"); System.out.println("third string"); } } Keluarannya: second string third string 3 lebih dari atau sama dengan 0, sehingga eksekusi berlangsung ke pernyataan if kedua. Test pernyataan if kedua gagal karena 3 tidak sama dengan 0. Maka kalimat else berlangsung. Maka, second string ditampilkan. println terakhir berada di luar pernyataan if, sehingga ia selalu dieksekusi. Jadi third string selalu tampil. 3. Penyelesaian: if (aNumber >= 0) if (aNumber == 0) System.out.println("first string"); else System.out.println("second string"); System.out.println("third string"); 4. Penyelesaian dengan menggunakan konvensi code Sun: October 13, 2009 58
5.4. PERNYATAAN KONTROL ALUR if (aNumber >= 0) { if (aNumber == 0) { System.out.println("first string"); } else { System.out.println("second string"); } } System.out.println("third string");
59
59
60
60
Bab 6
Dasar-Dasar Objek
Pembahasan berikut adalah mengenai pembahasan umum mengenai siklus berlakunya objek. Informasi berikut berlaku untuk semua objek, termasuk cara pembuatan objek, penggunaan dan akhirnya mengenai cara sistem membersihkan objek ketika objek tersebut sudah tidak digunakan.
62 Width of rect_one: 100 Height of rect_one: 200 Area of rect_one: 20000 X Position of rect_two: Y Position of rect_two: X Position of rect_two: Y Position of rect_two:
23 94 40 72
Subbab ini menggunakan contoh di atas untuk menjelaskan mengenai siklus kehidupan dari objek dalam program. Dari sini, anda dapat mempelajari cara untuk menulis program yang menggunakan objek dan cara sistem melakukan pembersihan.
6.1. SIKLUS BERLAKUNYA OBJEK Inisialisasi suatu objek Berikut ini adalah class Point public class Point { public int x = 0; public int y = 0; //A constructor! public Point(int x, int y) { this.x = x; this.y = y; } }
63
Class ini mengandung konstruktor tunggal. Anda dapat mengenali konstruktor karena ia mempunyai nama yang sama dengan class dan tidak mempunyai tipe return. Konstruktor pada class Point mengambil 2 argumen bilangan bulat sebagaimana dideklarasikan dengan pernyataan int x, int y. Pernyataan berikut memberikan 23 dan 94 sebagai nilai dari argumen tersebut: Point origin_one = new Point(23, 94); Berikut ini adalah class Rectangle yang mengandung 4 konstruktor: public class Rectangle { public int width = 0; public int height = 0; public Point origin; //Four constructors public Rectangle() { origin = new Point(0, 0); } public Rectangle(Point p) { origin = p; } public Rectangle(int w, int h) { this(new Point(0, 0), w, h); } public Rectangle(Point p, int w, int h) { origin = p; width = w; height = h; } //A method for moving the rectangle public void move(int x, int y) { origin.x = x; origin.y = y; } //A method for computing the area of the rectangle public int area() { return width * height; } } Masing-masing konstruktor memungkinkan anda memberikan nilai awal untuk aspek yang berbeda dari rectangle: titik pusat, lebar, tinggi; ketiganya; atau tidak sama sekali. Jika class mempunyai konstruktor multipel, mereka mempunyai nama yang sama namun banyak argumen atau tipe yang berbeda. Misalkan, kita punya pernyataan:
63
Kompiler mengetahui bahwa konstruktor pada class Rectangle membutuhkan argumen Point diikuti dengan argumen 2 bilangan bulat. Hal ini menginisialisasi variabel origin pada Rectangle menjadi sama dengan objek Point yang diacu oleh origin one. Pernyataan ini juga menset lebar menjadi 100 dan tinggi 200. Disana ada 2 reference terhadap objek Point yang sama; objek dapat mempunyai reference multipel. Reference multipel dapat mengacu pada objek yang sama. Baris berikutnya memanggil konstruktor yang membutuhkan 2 argumen bilangan bulat, yang memberikan nilai awal untuk width dan height. Jika anda memeriksa pernyataan dalam konstruktor, anda akan melihat bahwa ia membuat objek Point baru dengan nilai x dan y yang diinisialisasi dengan 0: Rectangle rect_two = new Rectangle(50, 100); Konstruktor Rectangle yang digunakan dalam pernyataan berikut tidak membutuhkan argumen, sehingga ia diberi nama konstruktor tak-berargumen: Rectangle rect = new Rectangle(); Jika class tidak secara eksplisit mendeklarasikan konstruktor, platform Java secara otomatis memberikan konstruktor tak-berargumen (disebut sebagai default constructor), yang tidak mengerjakan apapun. Oleh karenanya, semua class paling tidak mempunyai satu konstruktor.
System.out.println("Width of rect_one: " + rect_one.width);System.out.println("Height of rect_one: " + rect Usaha untuk menggunakan nama sederhana width dan height pada class CreateObjectDemo tidak berlaku, karena variabel tersebut hanya berada pada lingkup objek sehingga mengakibatkan error kompiler. Program akan menggunakan pernyataan yang sama untuk menampilkan informasi mengenai rect two. Objek dengan tipe yang sama mempunyai salinannya masing-masing dari variabel instans. Maka masing-masing objek Rectangle mempunyai variabel dengan nama origin, width dan height. Ketika anda mengakses suatu variabel instans melalui referensi objek, anda mengacu pada objek tersebut. Dua objek rect one dan rect two pada program CreateObjectDemo mempunyai variabel origin, width dan height yang berbeda. Bagian pertama dari nama berkualitas. objectReference, harus merupakan acuan terhadap objek. Anda dapat menggunakan nama variabel reference disini sebagaimana pada contoh terdahulu, atau anda dapat menggunakan sembarang pernyataan yang mengembalikan acuan objek. Ingat bahwa operator new mengembalikan acuan (reference) terhadap objek. Maka anda dapat menggunakan nilai yang dikembalikan dari new untuk mengakses variabel objek baru: int height = new Rectangle().height; Pernyataan ini membuat objek Rectangle baru dan segera memperoleh tingginya. Intinya, pernyataan tersebut menghitung tinggi default dari Rectangle. Sebagai catatan, sesudah pernyataan ini dieksekusi, program tidak lagi mempunyai reference terhadap Rectangle yang dibuat, karena program tidak pernah menyimpan reference pada variabel. Objek tidak direferensi, sehingga sumber dayanya dapat didaur ulang oleh platform Java. October 13, 2009 64
65
Manipulasi langsung pada variabel objek melalui objek dan class lain sebaiknya dihindari karena mungkin diperoleh nilai yang tidak masuk akal. Misalkan, pertimbangkan class Rectangle dari subbab terdahulu. Dengan menggunakan class tersebut, anda dapat membuat rectangle dengan lebar dan tinggi yang negatif. Secara ideal, selain dengan memungkinkakn manipulasi langsung, class dapat memberikan metoda dimana objek lain dapat memeriksa atay merubah variabel. Metoda ini memastikan bahwa nilai variabel adalah masuk akal untuk objek dengan tipe yang bersangkutan. Class Rectangle dapat memberikan metoda dengan nama setWidth, setHeight, getWidth dan getHeight untuk menset dan memperoleh lebar dan tinggi. Metoda ini akan melaporkan kesalahan bila pemanggil mencoba menset lebar dan tinggi dengan bilangan negatif. Keuntungan lain dari penggunaan metoda dibandingkan dengan akses langsung adalah bahwa class dapat merubah tipe dan nama variabel yang digunakan untuk menyimpan lebar dan tinggi tanpa menimbulkan efek pada client. Bahasa pemrograman Java memberikan mekanisme akses kontrol dimana class dapat menentukan akses langsung apa yang dapat dilakukan. Class seharusnya melindungi variabel terhadap manipulasi langsung dengan objek lain jika manipulasi tersebut dapat menghasilkan nilai yang tidak masuk akal untuk objek dengan tipe yang bersangkutan. Perubahan pada variabel ini seharusnya dikontrol dengan pemanggilan metoda. Jika class menjamin akses terhadap variabelnya, anda dapat berasumsi bahwa anda dapat memeriksa dan merubah variabel tersebut tanpa efek buruk. Untuk mempelajari lebih lanjut mengenai mekanisme kontrol akses, silahkan lihat subbab yang relevan. Juga dengan membuat variabel dapat diakses, mereka menjadi bagian dari API class, yang berarti bahwa penulis dari class tidak seharusnya merubah nama atau tipe-nya. Memanggil Metoda Milik Objek Anda juga menggunakan nama berkualitas untuk memanggil metoda dari objek. Untuk membentuk nama berkualitas dari metoda, anda melampirkan nama metoda pada referensi objek, dengan titik diantaranya. Anda juga perlu menggunakan argumen di dalam kurung. Jika metoda tersebut tidak membutuhkan argumen apapun, gunakan kurung kosong: objectReference.methodName(argumentList); atau objectReference.methodName(); Class Rectangle mempunyai 2 metoda: area untuk menghitung luasan rectangle dan move untuk merubah origin dari rectangle. Berikut ini adalah code CreateObjectDemo yang memanggil 2 metoda ini: System.out.println("Area of rect_one: " + rect_one.area()); ... rect_two.move(40, 72); Pernyataan pertama memanggil metoda area dari rect one dan menampilkan hasilnya. Baris kedua memindahkan rect two karena metoda move memberikan nilai baru pada origin.x dam origin.y dari objek. Variabel instans objectReference harus merupakan reference terhadap objek. Anda dapat menggunakan nama variabel, namun anda juga dapat menggunakan pernyataan sembarang yang mengembalikan reference objek. Operator new mengembalikan referensi objek, sehingga anda dapat menggunakan nilai yang dikembalikan dari new untuk memanggil metoda dari objek yang baru: new Rectangle(100, 50).area() Pernyataan new Rectangle(100, 50) mengembalikan referensi yang mengacu pada objek Rectangle. Sebagaimana terlihat, anda dapat menggunakan notasi dot untuk memanggil metoda area dari Rectangle yang baru untuk menghitung area dari segiempat yang baru. Beberapa metoda, seperti area, mengembalikan nilai. Untuk metoda yang mengembalikan nilai, anda dapat menggunakan panggilan metoda dengan pernyataan. Anda dapat memberi nilai yang dikembalikan pada variabel, menggunakannya untuk membuat keputusan, atau mengontrol loop. Pernyataan berikut memberikan nilai yang dikembalikan oleh area ke variabel: int areaOfRectangle = new Rectangle(100, 50).area(); Perhatikan bahwa menggunakan metoda pada objek tertentu adalah sama dengan mengirimkan pesan pada objek tersebut. Dalam kasus ini, objek tersebut adalah rectangle yang dikembalikan oleh konstruktor. Sedikit mengenai akses metoda,.... Metoda pada class Point dan Rectangle semuanya dideklarasikan sebagai public, sehingga mereka dapat diakses oleh sembarang class lain. Terkadang, class perlu untuk membatasi
65
66
akses ke metodanya. Misalkan, class mungkin mempunyai metoda yang hanya subclass yang diperbolehkan mengakses. Class dapat menggunakan mekanisme yang sama untuk mengontrol akses terhadap metodanya karena ia menggunakan akses kontrol pada variabelnya.
67
67
68 } }
Berapa reference terhadap objek tersebut muncul sesudah code dieksekusi ? Apakah objek-objek tersebut berhak untuk pengumpulan sampah ? ... Point point = new Point(2,4); Rectangle rectangle = new Rectangle(point, 20, 20); point = null; ... 3. Bagaimana program menghapus objek yang dibuatnya ? Latihan 1. Perbaiki program SomethingIsWrong pada pertanyaan 1. 2. Diberikan class berikut public class NumberHolder { public int anInt; public float aFloat; } Tuliskan code yang membuat instans dari class tersebut, inisialisasi kedua variabel anggotanya, dan tampilkan nilai untuk masing-masing anggota variabel.
6.1.6 Jawaban
Jawaban Pertanyaan 1. Code tidak pernah membuat objek Rectangle. Dengan program sederhana ini, kompiler menghasilkan peringatan. Namun, dalam situasi yang lebih realistis, myRect mungkin diinisialisasi ke null dalam satu tempat, misalkank di konstruktor dan digunakan kemudian. Dalam kasus itu, program akan dapat dikompilasi, namun menghasilkan NullPointerException pada saat runtime. 2. Ada satu reference terhadap objek Point dan satu terhadap objek Rectangle. Tak satupun yang berhak memanfaatkan pengumpulan sampah. 3. Program tidak secara eksplisit menghapus objek. Program dapat menset semua reference ke objek ke null sehingga menjadi berhak memanfaatkan pengumpulan sampah. Namun, program tidak menghapus objek. Penyelesaian Latihan 1. Penyelesaian: public class SomethingIsRight { public static void main(String[] args) { Rectangle myRect = new Rectangle(); myRect.width = 40; myRect.height = 50; System.out.println("myRects area is " + myRect.area()); } } 2. Penyelesaian: public class NumberHolderDisplay { public static void main(String[] args) { NumberHolder aNumberHolder = new NumberHolder(); aNumberHolder.anInt = 1; October 13, 2009 68
69
69
70
6.2. CHARACTER DAN STRING String palindrome = "Dot saw I was Tod";
71
Anda dapat juga membuat objek String seperti halnya objek lainnya: gunakan operator new dan konstruktor. Class String memberikan beberapa konstruktor yang memungkinkan anda memberi nilai awal dari string, dengan menggunakan sumber yang berbeda seperti array dari karakter, array dari byte atau buffer string. Berikut ini adalah contoh pembuatan string dari array karakter: char[] helloArray = { h, e, l, l, o }; helloString = new String(helloArray); System.out.println(helloString); Baris terakhir menghasilkan tampilan: hello Anda harus selalu menggunakan new untuk membuat buffer string. Program StringsDemo pada halaman 70 menghasilkan buffer string yang diacu oleh dest, menggunakan konstruktor yang menset kapasitas buffer: String palindrome = "Dot saw I was Tod"; int len = palindrome.length(); StringBuffer dest = new StringBuffer(len); Pernyataan di atas menghasilkan buffer string dengan kapasitas awal sama dengan panjang dari string yang diacu dengan nama palindrome. Hal ini memastikan hanya satu alokasi memori untuk dest karena ia cukup besar untuk mengandung karakter yang akan disalin. Dengan menginisialisasi kapasitas buffer string dengan perkiraan yang baik, anda dapat meminimalkan banyak memori yang digunakan. Hal ini membuat program anda menjadi lebih esien karena alokasi memori merupakan operasi yang relatif mahal.
71
1. Untuk class String Sebagai tambahan dari accessor length dan charAt seperti dibahas terdahulu, class String mempunyai 2 accessor yang mengembalikan posisi dalam string: indexOf dan lastIndexOf. Metoda indexOf mencari kedepan dari awal string, sedangkan lastIndexOf sebaliknya. Metoda indexOf dan lastIndexOf sering digunakan dengan substring, yang memberikan substring dari string. Class berikut mengilustrasikan penggunaan lastIndexOf dan substring untuk mengisolasi bagian yang berbeda dari lename. // This class assumes that the string used to initialize // fullPath has a directory path, filename, and extension. // The methods wont work if it doesnt. public class Filename { private String fullPath; private char pathSeparator, extensionSeparator; public Filename(String str, char sep, char ext) { fullPath = str; pathSeparator = sep; extensionSeparator = ext; } public String extension() { int dot = fullPath.lastIndexOf(extensionSeparator); return fullPath.substring(dot + 1); } public String filename() { int dot = fullPath.lastIndexOf(extensionSeparator); int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(sep + 1, dot); } public String path() { int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(0, sep); } } Berikut ini adalah program kecil yang membuat objek Filename dan memanggil semua metodanya: public class FilenameDemo { public static void main(String[] args) { Filename myHomePage = new Filename("/home/mem/index.html",/, .); System.out.println("Extension = " + myHomePage.extension()); System.out.println("Filename = " + myHomePage.filename()); System.out.println("Path = " + myHomePage.path()); } } Outputnya adalah: Extension = html Filename = index Path = /home/mem Metoda extension menggunakan lastIndexOf untuk melokalisasi kemunculan terakhir dari titik pada lename. Kemudian, substring menggunakan nilai yang diberikan oleh lastIndexOf untuk mengambil October 13, 2009 72
73
extension lenameyaitu substring dari titik ke akhir dari string. Code ini mengasumsikan bahwa lename mempunyai titik, jika tidak, maka lastIndexOf memberi -1, dan metoda substring melempar StringIndexOutOfBoundsException. Juga, perhatikan bahwa extensi menggunakan dot + 1 sebagai argumen dalam substring. Jika karakter titik adalah karakter terakhir dalam string, maka dot + 1 samadengan panjang dari string yang ternyata satu lebih besar daripada indeks terakhir dalam string (karena indeks dimulai dengan 0). Namun, substring menerima indeks samadengan namun tidak lebih besar daripada panjang string dan menginterpretasikan sebagai akhir dari string. Sementara metoda dalam contoh di atas menggunakan hanya satu versi dari metoda lastIndesOf, class String mendukung 4 versi yang berbeda dari metoda indexOf dan lastIndexOf. Keempat versi tersebut bekerja sebagai berikut: (a) indexOf(int character) (b) lastIndexOf(int character) Memberikan indeks dari kemunculan pertama (terakhir) dari karakter tertentu. (c) indexOf(int character, int from) (d) lastIndexOf(int character, int from) Mengembalikan indeks dari kemunculan pertama (terakhir) dari karakter yang bersangkutan, mencari maju (mundur) dari indeks tertentu. (e) indexOf(String string) (f) lastIndexOf(String string) Mengembalikan indeks dari kemunculan pertama (terakhir) dari string tertentu. (g) indexOf(String string, int from) (h) lastIndexOf(String string, int from) Mengembalikan indeks dari kemunculan pertama (terakhir) dari String yang bersangkutan, mencari maju (mundur) dari indeks tertentu 2. Untuk class StringBuffer Seperti String, StringBuffer memberikan metoda accessor length dan charAt. Sebagai tambahan dari kedua accessor tersebut, StringBuffer juga mempunyai metoda capacity. Metoda capacity berbeda dari panjang karena capacity memberikan banyaknya ruang yang dialokasikan. Misalkan, kapasitas StringBuffer dalam metoda reverseIt tidak pernah berubah, sedangkan panjang dari StringBuffer bertambah satu untuk setiap iterasi dalam loop: public class ReverseString { public static String reverseIt(String source) { int i, len = source.length(); StringBuffer dest = new StringBuffer(len); for (i = (len - 1); i >= 0; i--) dest.append(source.charAt(i)); return dest.toString(); } }
73
Jika karakter yang dilampirkan menyebabkan StringBuffer tumbuh diluar kapasitasnya, StringBuffer mengalokasikan memori lebih. Karena alokasi memori merupakan operasi yang relatif mahal, anda dapat membuat code anda lebih esien dengan menginisialisasi kapasitas StringBuffer dengan perkiraan yang masuk akal, sehingga meminimalkan banyaknya proses alokasi memori. Misalkan, metoda reverseIt membuat StringBuffer dengan kapasitas awal samadengan ukuran string sumber untuk memastikan hanya satu alokasi memori untuk dest. Versi dari metoda append yang digunakan pada reverseIt merupakan satu-satunya metoda StringBuffer yang melampirkan data pada akhir StringBuffer. Ada beberapa metoda append yang melampirkan data dari berbagai tipe seperti float, int, boolean, dan bahkan Object, pada akhir StringBuffer. Data dikonversikan ke string sebelum operasi append muncul. Berikut ini adalah contoh dua proses penting: 1. Menyisipkan karakter. Suatu saat, anda mungkin ingin menyisipkan data ke tengah StringBuffer. Anda dapat melakukannya dengan metoda insert, seperti berikut: StringBuffer sb = new StringBuffer("Drink Java!"); sb.insert(6, "Hot "); System.out.println(sb.toString()); Hasilnya adalah: Drink Hot Java! Anda dapat melihat bahwa anda dapat menentukan indeks sebelum anda menyisipkan data. Pada contoh tersebut, Hot perlu disisipkan sebelum J dalam Java. Indeks dimulai dari 0, sehingga indeks J adalah 6. Untuk menyisipkan data pada awal StringBuffer, gunakan indeks 0. Untuk menambahkan data pada akhir StringBuffer, gunakan indeks samadengan ukuran StringBuffer pada saat itu atau gunakan append. 2. Menset karakter. Kegunaan lain dari modier StringBuffer adalah setCharAt, yang menggantikan karakter pada lokasi tertentu pada StringBuffer dengan karakter yang ditentukan pada daftar argumen. setCharAt berguna ketika anda ingin menggunakan StringBuffer kembali.
75
2. Metoda valueOf Untuk kenyamanan, class String memberikan metoda valueOf. Anda dapat menggunakan valueOf untuk mengkonversi variabel dengan tipe berbeda menjadi String. Misalkan, untuk mencetak nilai dari pi: System.out.println(String.valueOf(Math.PI));
75
76
String dan StringBuffer memberikan cara lain untuk memanipulasi data string, termasuk penggabungan, perbandingan, substitusi dan konversi menjadi huruf besar/kecil. java.lang.String dan java.lang.StringBuffer merangkum semua metoda dan variabel yang didukung oleh kedua class ini. Berikut ini adalah program Palindrome yang menentukan apakah suatu string merupakan palindrome. Program ini menggunakan banyak metoda dari class String dan StringBuffer: public class Palindrome { public static boolean isPalindrome(String stringToTest) { String workingCopy = removeJunk(stringToTest); String reversedCopy = reverse(workingCopy); return reversedCopy.equalsIgnoreCase(workingCopy); } protected static String removeJunk(String string) { int i, len = string.length(); StringBuffer dest = new StringBuffer(len); char c; for (i = (len - 1); i >= 0; i--) { c = string.charAt(i); if (Character.isLetterOrDigit(c)) { dest.append(c); } } return dest.toString(); } protected static String reverse(String string) { StringBuffer sb = new StringBuffer(string); return sb.reverse().toString(); } October 13, 2009 76
77
public static void main(String[] args) { String string = "Madam, Im Adam."; System.out.println(); System.out.println("Testing whether the following " + "string is a palindrome:"); System.out.println(" " + string); System.out.println(); if (isPalindrome(string)) { System.out.println("It IS a palindrome!"); } else { System.out.println("It is NOT a palindrome!"); } System.out.println(); } } Keluarannya adalah Testing whether the following string is a palindrome: Madam, Im Adam. It IS a palindrome!
77
78 Latihan
1. Tunjukkan 2 cara untuk menggabungkan 2 string berikut agar menjadi string Hi, mom.: String hi = "Hi, "; String mom = "mom."; 2. Tuliskan program untuk menghitung nama depan dari nama lengkap dan menampilkannya. 3. Anagram adalah kata atau anak kalimat yang dibuat dengan memindahkan huruf dari satu kata atau anak kalimat; misalkan, parliament adalah anagram dari partial men dan software adalah anagram dari swear oft. Tuliskan program untuk menentukan apakan satu string merupakan anagram dari string lain. Ruang kosong dan tanda baca diabaikan. 4. Buatlah program sederhana untuk mengurutkan kata.
6.2.10 Jawaban
1. Panjangnya adalah panjang string awal + 16, maka 26 + 16 = 42. 2. Untuk string berikut: String hannah = "Did Hannah see bees? Hannah did."; (a) 32. (b) e. (c) hannah.charAt(15) 3. Panjangnya 3 karakter: car. Ia tidak termasuk spasi sesudah car. 4. Jawab: 1.si 2.se 3.swe 4.sweoft 5.swear oft Penyelesaian Latihan 1. hi.concat(mom) dan hi + mom. 2. Penyelesaian: public class ComputeInitials { public static void main(String[] args) { String myName = "Fred F. Flintstone"; StringBuffer myInitials = new StringBuffer(); int length = myName.length(); for (int i = 0; i < length; i++) { if (Character.isUpperCase(myName.charAt(i))) { myInitials.append(myName.charAt(i)); } } System.out.println("My initials are: " + myInitials); } } 3. Penyelesaian: October 13, 2009 78
6.2. CHARACTER DAN STRING /** * This class compiles with v 1.2 and 1.3, but not previous * versions, because its sort method uses the Arrays class, * which was added in 1.2. To make Anagram work with early * versions of the Java platform, you need to reimplement * the sort method. */ public class Anagram {
79
/** * Tests whether the passed-in strings are anagrams -* containing the exact same number of each letter. * Punctuation, case, and (obviously) order dont matter. * * @return true if the strings are anagrams; otherwise, false */ public static boolean areAnagrams(String string1, String string2) { String workingCopy1 = removeJunk(string1); String workingCopy2 = removeJunk(string2); workingCopy1 = workingCopy1.toLowerCase(); workingCopy2 = workingCopy2.toLowerCase(); workingCopy1 = sort(workingCopy1); workingCopy2 = sort(workingCopy2); return workingCopy1.equals(workingCopy2); } /** * Removes punctuation, spaces -- everything except letters * and digits from the passed-in string. * * @return a stripped copy of the passed-in string */ protected static String removeJunk(String string) { int i, len = string.length(); StringBuffer dest = new StringBuffer(len); char c; for (i = (len - 1); i >= 0; i--) { c = string.charAt(i); if (Character.isLetterOrDigit(c)) { dest.append(c); } } return dest.toString(); } /** * Sorts the passed-in string. Reimplement this method * if you want to use this class in pre-Java-2 versions * of the platform. * * @return a sorted copy of the passed-in string
79
80
Gambar 6.1: Diagram alur untuk pengurutan 2 kata. pengurutan kata (dengan 2 input kata) adalah: October 13, 2009 80
6.3. BILANGAN public class Order { public static void main(String[] args) { int i,j,len; String s1="duduk"; String s2="diri"; len=s1.length()<s2.length()?s1.length():s2.length(); for(i=0;i<len;i++) { String s3=s1.substring(i,i+1); String s4=s2.substring(i,i+1); j=s3.compareTo(s4); if(j==0)continue; else if (j<0) { System.out.println(s1); break; } else { System.out.println(s2); break; } } } }
81
6.3 Bilangan
Untuk bekerja dengan data numerik, anda menggunakan class bilangan. Class Number adalah superclass dari semua class bilangan dalam platform Java. Subclassnya meliputi Float, Integer, dan lain-lain. Subbab ini bermula dengan diskusi mengenai class Number dalam java.lang dan subclassnya. Khususnya, subbab ini menerangkan mengenai mengapa anda perlu class ini, menunjukkan metoda umum dan variabel class yang biasa digunakan, dan menunjukkan cara mengkonversi instans ke string. Sebagai tambahan, subbab ini membicarakan mengenai class lain yang mungkin anda perlukan jika anda menggunakan bilangan. Misalkan, jika anda perlu menampilkan bilangan dalam format khusus, anda dapat menggunakan class NumberFormat dan DecimalFormat dalam java.text. Juga, class Math dalam java.lang mengandung metoda class yang menggunakan fungsi matematika diluar yang diberikan oleh bahasa ini. Class ini mempunyai fungsi trigonometri, fungsi eksponensial, dan lain sebagainya. Class bilangan: 1. Number 2. Byte 3. Double 4. Float 5. Integer 6. Long 7. Short 8. BigDecimal 9. BigInteger Bungkus untuk tipe data lain (agar lengkap): 1. Boolean 2. Character
81
6.4 Array
Array adalah struktur yang mengandung berbagai nilai dengan tipe yang sama. Panjang dari array diperoleh ketika array dibuat (pada saat runtime). Sesudah pembuatan, array mempunyai struktur dengan panjang yang tetap. Jika anda ingin menyimpan data dengan tipe berbeda dalam satu struktur, atau jika anda perlu struktur dengan ukuran yang dapat diubah secara dinamik, gunakan implementasi Collection, seperti Vector.
// assign a value to each array element and print for (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.print(anArray[i] + " "); } System.out.println(); } } Subsubbab berikut ini membahas: 1. Pendeklarasian variabel untuk mengacu array 2. Pembuatan array 3. Pengaksesan elemen array 4. Mengambil ukuran array 5. Penginisialisasi array Pendeklarasian variabel untuk mengacu pada array Baris berikut dari program sederhana pada halaman 82 mendeklarasi variabel array: int[] anArray; // declare an array of integers
Seperti deklarasi untuk variabel dengan tipe lain, deklarasi array mempunyai 2 komponen: tipe dan nama dari array. Type array ditulis sebagai type[], dengan type adalah tipe data dari elemen yang dikandung dalam array, dan [] menunjukkan bahwa ini adalah array. Perhatikan bahwa semua elemen dalam array adalah bertipe sama. Program pada halaman 82 menggunakan int[], sehingga array dengan nama anArray akan digunakan untuk menyimpan data bilangan bulat. Berikut ini adalah deklarasi untuk array untuk tipe data lain: float[] anArrayOfFloats; boolean[] anArrayOfBooleans; Object[] anArrayOfObjects; String[] anArrayOfStrings; Sebagaimana dengan deklarasi untuk variabel dengan tipe lain, deklarasi untuk variabel array tidak mengalokasikan memori untuk menyimpan elemen array. Program contoh harus memberi nilai pada anArray sebelum namanya mengacu pada suatu array. October 13, 2009 82
83
Anda membuat array secara eksplisit dengan menggunakan operator new. Pernyataan berikut dalam program contoh pada halaman 82 mengalokasikan array dengan memori yang cukup untuk 10 elemen bilangan bulat dan memasukkannya dalam variabel anArray yang telah dideklarasikan lebih dahulu: anArray = new int[10]; // create an array of integers
Secara umum, ketika membuat array, anda harus menggunakan operator new, plus tipe data dari elemen array, plus banyaknya elemen yang diinginkan dalam kurung kotak: new elementType[arraySize] Jika pernyataan new dihilangkan dari program contoh, kompiler akan memberi pesan salah seperti berikut dan kompilasi akan gagal: ArrayDemo.java:4: Variable anArray may not have been initialized. Mengakses elemen array Ketika memori telah dialokasikan untuk array, program memberikan nilai untuk elemen array: for (int i = 0; i < anArray.length; i++) { anArray[i] = i; System.out.print(anArray[i] + " "); } Bagian ini menunjukkan pengaksesan elemen array, baik melalui pemberian nilai ataupun mengambil nilai. Hal ini dapat dilakukan dengan melampirkan kurung kotak diantara nama array. Nilai diantara kurung kotak menunjukkan indeks dari elemen yang diakses. Sebagai catatan, indeks array dimulai dari 0 dan berakhir dengan panjang array dikurangi satu. Mengambil ukuran array Untuk memperoleh ukuran array, anda menuliskan arrayname.length Hati-hati: Pemrogram baru cenderung menggunakan length diikuti dengan sepasang kurung kosong. Hal ini adalah salah karena length bukan metoda. length adalah property pada platform Java untuk semua array. Loop for pada program contoh di halaman 82 mengiterasi masing-masing elemen dari anArray. Loop for menggunakan anArray.length untuk menentukan waktu untuk berhenti. Penginisialisasi Array Bahasa pemrograman Java mempunyai jalur singkat untuk membuat dan menginisialisasi array, seperti berikut: boolean[] answers = { true, false, true, true, false }; Panjang dari array ditentukan oleh banyaknya nilai diantara kurung kurawal.
83
84
Program ini membuat dan mengisi array dengan satu pernyataan. Namun, anda dapat membuat array tanpa meletakkan elemen apapun padanya. Hal ini dapat menyebabkan kesulitan yang sering ditemui oleh pemula ketika menggunakan array yang mengandung objek. Pertimbangkan baris berikut: String[] anArray = new String[5]; Sesudah baris ini dieksekusi, array anArray muncul dan mempunyai ruang yang cukup untuk menyimpan 5 objek string. Namun, array belum mengandung string apapun. Program harus secara eksplisit membuat string dan meletakkannya dalam array. Hal ini kelihatannya sudah jelas, namun, banyak pemula berasumsi bahwa baris pernyataan tersebut membuat 5 string kosong pada array tersebut. Mereka mungkin saja menuliskan pernyataan berikut yang kemudian akan menghasilkan NullPointerException: String[] anArray = new String[5]; for (int i = 0; i < anArray.length; i++) { // ERROR: the following line gives a runtime error System.out.println(anArray[i].toLowerCase()); } Problem ini mungkin terjadi ketika array dibuat dalam konstruktor atau penginisialisasi lain yang kemudian digunakan ditempat lain dalam program tersebut.
6.4. ARRAY //print matrix for (int i = 0; i < aMatrix.length; i++) { for (int j = 0; j < aMatrix[i].length; j++) { System.out.print(aMatrix[i][j] + " "); } System.out.println(); } } }
85
Anda perlu memberikan ukuran dari array primer ketika anda membuat array. Anda tidak perlu memberikan ukuran sub-array sampai anda membuatnya.
85
86 7. Untuk memperoleh ukuran array, anda gunakan atribut length. 8. Elemen dalam array dapat diakses melalui indeksnya. 9. Indeks dimulai dari 0 dan berakhir pada ukuran array dikurangi satu.
10. Untuk mengkopi array, gunakan metoda arraycopy dalam class System.
86
Bab 7
Generic
7.1 Pendahuluan
Pada suatu projek perangkat lunak yang tidak sederhana, bug selalu muncul. Perencanaan, pemrograman dan testing yang matang mengurangi kemunculannya, namun entah bagaimana, mereka selalu menemukan cara untuk bersembunyi dalam code anda. Kemunculannya akan semakin jelas jika anda mengembangkannya sehingga program tersebut semakin besar dan kompleks. Untungnya, beberapa bug lebih mudah dideteksi. Bug yang muncul pada saat kompilasi, akan mudah diketahui karena anda akan langsung dapat melihatnya ketika code di kompilasi. Kemunculannya terlihat karena munculnya pesan error, sehingga anda dapat memperbaikinya dengan segera. Bug yang muncul pada saat run lebih sulit dideteksi karena tidak selalu muncul dan pesan error nya tidak selalu jelas. Generic menambah kestabilan code anda dengan membuat lebih banyak bug yang terdeteksi pada saat kompilasi. Beberapa programer memilih mempelajari generic dengan mempelajari Java Collections Framework; karena pada akhirnya, generic sangat digunakan oleh class tersebut. Namun, karena kita belum sampai pada collections, bab ini akan terpusat pada koleksi sederhana yang dapat dibuat dari dasar. Pendekatan ini akan menunjukkan tata bahasa dan terminologi yang diperlukan untuk memahami generic.
87
BAB 7. GENERIC
Program BoxDemo1 membuat object Integer, melalukan ke add, dan meberi nilai dengan objek serupa ke someInteger dengan menggunakan nilai kembalian melalui get. Ia kemudian mencetak nilai objek (10) pada output standard. Kita tahu bahwa peleburan dari Object ke Integer adalah benar karena kita lihat bahwa prosedurnya sudah sesuai dengan dokumentasi. Namun ingat, kompiler tidak tahu mengenai hal ini: kompiler percaya saja bahwa peleburannya benar. Lagipula, ia tidak akan mencegah pemrogram ceroboh untuk melalukan objek dengan jenis yang salah, misalnya String: public class BoxDemo2 { public static void main(String[] args) { // ONLY place Integer objects into this box! Box integerBox = new Box(); // Imagine this is one part of a large application // modified by one programmer. integerBox.add("10"); // note how the type is now String // ... and this is another, perhaps written // by a different programmer Integer someInteger = (Integer)integerBox.get(); System.out.println(someInteger); } } Dalam BoxDemo2 kita simpan angka 10 sebagai String, yang bisa saja bisa diperoleh GUI dari pengguna. Namun, peleburan dari Object ke Integer terlewatkan. Jelas, hal ini merupakan bug, namun proses kompilasi tetap berlangsung dan anda tak akan tahu masalah ini sampai pada saat di jalankan (run), yaitu ketika aplikasi mendadak berhenti dengan ClassCastException: Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at BoxDemo2.main(BoxDemo2.java:6) Kesalahan semacam ini dapat dihindari dengan penggunaan generic.
89
Sebagaimana anda lihat, kita telah mengganti kemunculan Object dengan T. Untuk mengacu class generik dari code anda, anda harus melakukan generic type invocation, yang menggantikan T dengan nilai nyata, seperti Integer: Box<Integer> integerBox; Anda dapat menganggap generic type invocation serupa dengan as being similar to an ordinary method invocation, but instead of passing an argument to a method, youre passing a type argument Integer in this case to the Box class itself. Like any other variable declaration, this code does not actually create a new Box object. It simply declares that integerBox will hold a reference to a Box of Integer, which is how BoxInteger is read. An invocation of a generic type is generally known as a parameterized type. To instantiate this class, use the new keyword, as usual, but place Integer between the class name and the parenthesis: integerBox = new Box<Integer>(); Or, you can put the entire statement on one line, such as: BoxInteger integerBox = new BoxInteger(); Once integerBox is initialized, youre free to invoke its get method without providing a cast, as in BoxDemo3: public class BoxDemo3 { public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); integerBox.add(new Integer(10)); Integer someInteger = integerBox.get(); // no cast! System.out.println(someInteger); } } Furthermore, if you try adding an incompatible type to the box, such as String, compilation will fail, alerting you to what previously would have been a runtime bug: BoxDemo3.java:5: add(java.lang.Integer) in Box<java.lang.Integer> cannot be applied to (java.lang.String) integerBox.add("10"); ^ 1 error Its important to understand that type variables are not actually types themselves. In the above examples, you wont nd T.java or T.class anywhere on the lesystem. Furthermore, T is not a part of the Box class name. In fact during compilation, all generic information will be removed entirely, leaving only Box.class on the lesystem. Well discuss this later in the section on Type Erasure Also note that a generic type may have multiple type parameters, but each parameter must be unique within its declaring class or interface. A declaration of BoxT,T, for example, would generate an error on the second occurrence of T, but BoxT,U, however, would be allowed. Type Parameter Naming Conventions By convention, type parameter names are single, uppercase letters. This stands in sharp contrast to the variable naming conventions that you already know about, and with good reason: Without this convention, it would be difcult to tell the difference between a type variable and an ordinary class or interface name. The most commonly used type parameter names are: * E - Element (used extensively by the Java Collections Framework) * K - Key * N - Number * T - Type * V Value * S,U,V etc. - 2nd, 3rd, 4th types Youll see these names used throughout the Java SE API and the rest of this tutorial.
89
90
BAB 7. GENERIC
90
Bagian III
Menulis Applet
91
Bab 8
Tinjauan Applet
Bab ini membahas bagian dari applet. Setiap applet diimplementasikan dengan membuat subclass dari class Applet. Gambar menunjukkan tingkatan pewarisan dari class Applet. Tingkatan ini menentukan hal dan cara yang dapat dilakukan applet sebagaimana akan dijelaskan kemudian.
94
public void paint(Graphics g) { //Draw a Rectangle around the applets display area. g.drawRect(0, 0, size().width - 1, size().height - 1); //Draw the current string inside the rectangle. g.drawString(buffer.toString(), 5, 15); } }
95
8.4 Metoda untuk Drawing dan Event Handling 8.5 Metoda untuk Menambah Komponen UI 8.6 Yang dapat dan tidak dapat dilakukan Applet
Subbab ini memberi tinjauan mengenai keterbatasan dan kemampuan applet. Rinciannya dapat dibaca pada bab mengenai batasan keamanan.
95
<APPLET CODE=AppletSubclass.class WIDTH=anInt HEIGHT=anInt> </APPLET> Tag ini memberitahu browser untuk memuat applet dengan bernama AppletSubclass. Berikut ini adalah Gambar yang menunjukkan tempat le class applet, relatif terhadap dokumen HTML yang mengandung tag <APPLET>. Sebagaimana ditunjukkan pada gambar, kecuali applet dideklarasikan berada dalam paket, le classnya harus berada pada directory yang sama dengan direktori dimana le HTML berada (yang mempunyai tag <APPLET>). Ketika Java-enabled browser memasuki tag <APPLET>, ia menyediakan area tampilan dengan lebar dan tinggi yang ditentukan untuk applet, memuat bytecodes untuk subclass Applet yang dispesikasi, membuat instans dari subclass, dan kemudian memanggil metoda init dan start dari instans. Tag <APPLET> mempunyai banyak pilihan yang dapat anda gunakan untuk mengatur eksekusi applet anda. Misalkan, anda dapat meletakkan le applet anda dalam arsip. Anda dapat pula menspesikasi parameter yang akan dilalukan untuk applet.
8.8 Kesimpulan
96
Bab 9
98
Tanpa Pernyataan Paket dalam Code Applet suatu Direktori imgDir a.gif file Class
98
Bab 10
100
4. Applet tidak dapat memulai program pada tuan rumah yang mengeksekusinya: Sekali lagi applet dapat bekerja denga aplikasi server-side sebagai gantinya. 5. Applet tidak dapat membaca sifat sistem yang tertentu: Lihat pembahasan mengenai pembacaan sifat sistem untuk informasi lebih lanjut. 6. Jendela yang dibawa applet terlihat berbeda dengan jendela yang dibawa aplikasi: Jendela applet mempunyai teks peringatan dan salah satu dari balok berwarna atau image. Hal ini membantu pengguna untuk membedakan jendela applet dari aplikasi yang sudah mapan. Gambar 10.1 dan 10.2 menunjukkan jendela yang dibawa program yang dapat beroperasi sebagai applet dan sebagai aplikasi. Gambar 10.1 menunjukkan tampilan jendela ketika program dijalankan pada platform Solaris. Gambar 10.2 diperoleh ketika program menjalankan applet dengan browser Solaris Netscape Navigator 2.0.
100
Bab 11
102
2. menggunakan metoda accessor untuk memperoleh informasi mengenai String atau StringBuffer 3. merubah StringBuffer dan 4. mengkonversi satu jenis string ke lainnya.
103
Banyak String dibuat dari literal. Ketika kompiler menemukan sederetan huruf yang diapit dengan tanda kutip ganda, kompiler membuat objek String dengan nilai sesuai dengan teks yang muncul di antara tanda kutip. Ketika kompiler menemukan literal string berikut, ia membuat objek String yang nilainya adalah Gobbledy gook. "Gobbledy gook." Anda dapat pula membuat objek String seperti anda membuat objek Java lain dengan menggunakan katakunci new. new String("Gobbledy gook."); Membuat StringBuffer Metoda konstruktor yang digunakan oleh reverseIt untuk menginisialisasi dest membutuhkan argumen bilangan bulat untuk menunjukkan ukuran awal dari StringBuffer baru. StringBuffer(int length) reverseIt dapat saja menggunakan konstruktor default StringBuffer yang tidak memerlukan panjang buffer ditentukan pada awalnya. Namun, lebi esien untuk memberikan panjang buffer secara spesik jika anda mengetahuinya, sebagai ganti dari alokasi memori yang lebih setiap kali anda melampirkan huruf dalam buffer tersebut.
103
Sebagai tambahan dari length dan charAt, String mendukung sejumlah metoda accessor lain yang memberi akses ke substring dan indeks dari huruf tertentu pada String.StringBuffer mempunyai perangkat metoda accessor serupa.
105
105
106
106
Bab 12
d) 41
2. Untuk String sekolah yang diberikan pada soal nomor 1, tentukan nilai yang diberikan oleh sekolah.charAt(18) a) A b) a c) B d) b 3. Keluaran dari pernyataan "Mengapa kamu selalu ribut saja ?".substring(14,18) adalah a) ela 4. Diakhir loop: int j=0,k; for (k=0;k<10;k++);j=2*k; nilai j adalah a) 20
b) elal
c) elalu
d) selalu
b) 18
c) 30
d) pesan error
5. Untuk sekumpulan bilangan yang sudah dimasukkan melalui keyboard, potongan diagram alur pada Gambar 12.1 berguna untuk mencari nilai a) rata-rata b) maksimum c) minimum d) jumlah 6. Nilai j diakhir loop: int j=0,k; for (k=0,k<10;k++)j=2*k; a) 20 b) 18 107 c) 30 d) pesan error
108
hasil=bilangan[0] i=1
hasil>bilangan[i] ?
tidak
ya hasil=bilangan[i] i++
ya
i<banyak ? tidak
Gambar 12.1: Potongan diagram alur untuk soal no. 5. 7. Nilai fvar di akhir potongan program berikut: float fvar=0.0;int k=0; do{fvar=fvar*2.0;k=k+2;}while(k<10); a) 0 b) 2.0 c) 8.0 d) 0.5
8. Nilai fvar di akhir potongan program berikut: float fvar=0.0;int k=0; while(k<10){fvar=fvar*2.0;k=k+2;} a) 0 b) 2.0 c) 8.0 d) 0.5
9. Pada potongan program berikut int i,hitung=0;for(i=0;i<10;i++);{hitung=hitung+2;} System.out.println(hitung); Berapakah harga hitung pada posisi System.out.println tersebut ? a) 20 b) 2 c) 30 10. Pada potongan program float a=1.5,b=2.5,x=4.5,y=3.5;if(x>=y)a=b;System.out.println(a); keluaran (output)-nya adalah a) 2.5 b) 1.5 11. Pada potongan program berikut ini: float a, b, c; if(a>b) c=a; else c=b; Jika a=5.1 dan b=1.5, maka nilai c menjadi a) 5.1 b) 1.5 October 13, 2009 108
d) 0
c) 0
d) pesan error
c) 0
d) 51
12.1. UTS GENAP, 2000/2001, RABU/21-03-2001, JAM 10.00-11.40 12. Potongan program StringBuffer sb = new StringBuffer("terbit"); sb.insert(sb.length(),"terang");System.out.println(sb); menghasilkan: a) terbit terang 13. Potongan program StringBuffer sb = new StringBuffer("terbit"); sb.append(" terang");System.out.println(sb); menghasilkan tampilan: a) terbit terang 14. Potongan program String s = "selamat selama ...";System.out.println(s.indexOf("lama")); menghasilkan tampilan: a) 10 15. Potongan program StringTokenizer st = new StringTokenizer("dunia tenang damai"); st.nextToken();System.out.println(st.nextToken()); menghasilkan tampilan: a) dunia Uraian
109
b) terbitterang
c) terang terbit
d) terangterbit
b) terbitterang
c) terang terbit
d) terangterbit
b) 11
c) 2
d) 3
b) tenang
c) damai
d) dunia tenang
Buatlah program aplikasi sederhana untuk mengurutkan dua kata dalam kalimat "dodo duduk" Untuk mendapatkan nilai penuh, perhatikan hal berikut : 1. Masukan dilakukan dalam bentuk kalimat dengan dua kata pada awal program. 2. Keluaran yang merupakan kata berurut secara alfabetik ditampilkan pada layar monitor.
12.1.2 Jawaban
Pilihan Ganda 1) 2) 3) 4) 5) Uraian Berikut ini adalah program lengkap untuk jawaban soal uraian: import java.util.*; public class Urut2 { public static void main(String[] args) { int i,j,len; System.out.println("\nPROGRAM PENGURUTAN 2 KATA SECARA ALFABETIK,"); System.out.println("DENGAN BATASAN: KATA TERSEBUT TIDAK SAMA"); String stringAwal="dodo duduk"; StringTokenizer st=new StringTokenizer(stringAwal); c d b a c 6) 7) 8) 9) 10) d a a b a 11) 12) 13) 14) 15) a b a c b
109
110
} Sebagai perbandingan (tidak dibutuhkan pada jawaban), berikut ini adalah program lengkap yang berlaku untuk input kalimat dengan jumlah kata yang lebih bebas (tergantung inputnya): import java.util.*; public class Urut1 { public static void main(String[] args) { int index,index1,index2,banyak,i,j,len,jumlahKata,kata, indexMin,indexBuang; String stringAwal="saya sedang duduk sedangkan kamu berdiri di samping"; StringBuffer sb=new StringBuffer(""); StringTokenizer st=new StringTokenizer(stringAwal);//untuk batas iterasi StringBuffer sb0=new StringBuffer(stringAwal); for(int k=0;k<st.countTokens();k++){ String s1=new String(sb0.toString());//banyak kata selalu berkurang 1 // Memasukkan kata ke dalam kumpulan string StringTokenizer st1=new StringTokenizer(s1); jumlahKata=st1.countTokens();//jumlah kata selalu berkurang 1 String stringArray[]; stringArray=new String[jumlahKata]; index=0; while(st1.hasMoreTokens()){ String s2=st1.nextToken(); stringArray[index]=s2; index++; } indexMin=0; String min=stringArray[indexMin]; for(kata=1;kata<jumlahKata;kata++) { len=stringArray[kata].length()<min.length()? stringArray[kata].length():min.length();//ambil banyak huruf min. for(i=0;i<len;i++) October 13, 2009 110
12.1. UTS GENAP, 2000/2001, RABU/21-03-2001, JAM 10.00-11.40 { String s3=min.substring(i,i+1); String s4=stringArray[kata].substring(i,i+1); j=s3.compareTo(s4); if(j==0)continue; else if (j<0) { break; } else { min=stringArray[kata]; indexMin=kata; break; } } } indexBuang=s1.indexOf(min); sb0.delete(indexBuang,indexBuang+min.length()); sb.append(min); sb.append(" "); } System.out.println("\nPROGRAM PENGURUTAN HURUF SECARA ALFABETIK,"); System.out.println("DENGAN BATASAN: TIDAK ADA KATA YANG SAMA"); System.out.println(sb); } }
111
111
112
2. Semua nilai var[i][j] dengan 0 i 3 dan 0 j 10 adalah nol kecuali nilai a) var[3][10] b) var[0][0] c) var[0][2] 3. Keluarannya jika pernyataan fungsi(1,2) diganti dengan fungsi(3,10): a) 0 b) 1 c) error 4. Keluaran dari potongan program berikut
public void fungsi(int a){a=2*a;} public static void main(String[] z) {int d=3; fungsi(d);System.out.println(d);} a) 2 b) 3 c) 5 d) 6
6. Berapakah harga hitung pada posisi System.out.println() berikut ? int i,hitung=0;for(i=0;i<10;i++);{hitung=hitung+2;} System.out.println(hitung); a) 20 b) 2 c) 30 d) 0
7. Keluaran (output) dari potongan program berikut adalah float a=1.5,b=2.5,x=4.5,y=3.5;if(x==y)a=b; System.out.println(a); a) 2.5 October 13, 2009 b) 1.5 112 c) 0 d) 3.5
12.2. UTS 2007 8. Nilai c pada potongan program berikut float a=5.1, b=1.5, c; if(a=b) c=a; else if(a<b) c=b; else c=0.0; a) 5.1 9. Nilai j diakhir loop: int j=0,k; for (k=0;k<10;k++)j=3*k; a) 20 b) 27 c) 30 d) 13 b) 1.5 c) 0.0 d) 51
113
10. Pada potongan program berikut ini: int i,j,k; if(i==j){if(k==j) a=b; else x=c;}else{b=c;} pernyataan a=b dieksekusi jika a) i!=j b) i==j; dan k==j 11. Nilai j diakhir loop adalah: int j=0,k; for (k=0;k<10;k++);j=3+k; a) 20 b) 27 c) 30 d) 13
d) k==j
12. Hasil dari potongan program berikut int p, q, r, s, t; p=10; q=20; r=q; s=p; q=p; t=q; p=r; a) p=20; q=10 13. Keluaran dari pernyataan "Mengapa kamu selalu ribut saja ?".substring(14,18) adalah a) ela 14. Diakhir loop: int j=0,k; for (k=0;k<10;k++);j=2*k; nilai j adalah a) 20 15. Nilai j diakhir loop: int j=0,k; for (k=0,k<10;k++)j=2*k; a) 20 b) 18 c) 30 d) pesan error b) p=10; q=10 c) p=20; q=20 d) p=10; q=20
b) elal
c) elalu
d) selalu
b) 18
c) 30
d) pesan error
16. Nilai fvar di akhir potongan program berikut: float fvar=0.0;int k=0; do{fvar=fvar*2.0;k=k+2;}while(k<10); a) 0 b) 2.0 c) 8.0 d) 0.5
17. Nilai fvar di akhir potongan program berikut: float fvar=0.0;int k=0; while(k<10){fvar=fvar*2.0;k=k+2;} a) 0 18. Pada potongan program b) 2.0 c) 8.0 d) 0.5
113
114
c) 0
d) pesan error
19. Pada potongan program berikut ini: float a, b, c; if(a>b) c=a; else c=b; Jika a=5.1 dan b=1.5, maka nilai c menjadi a) 5.1 b) 1.5 20. Potongan program String s = "selamat selama ...";System.out.println(s.indexOf("lama")); menghasilkan tampilan: a) 10 Uraian Pilih satu diantara 4 soal. Pastikan anda bisa mengerjakan pilihan anda secara tuntas dalam waktu yang diberikan. Pekerjaan yang tidak tuntas hanya diberi nilai 15 (untuk setiap pilihan). Jika dikerjakan lebih dari satu, maka yang dinilai hanya yang tuntas dengan nilai tertinggi. Untuk semua soal, masukkan dilakukan melalui keyboard dan keluaran ditampilkan di layar komputer. 1. (25pts) Buat program untuk menghitung jumlah dari sekumpulan bilangan bulat 2. (30pts) Sama dengan soal 1, namun jumlahkan hanya bilangan bulat yang bernilai genap saja 3. (35pts) Sama dengan soal 2, namun gunakan fungsi main, baca, proses dan tulis. Catatan: fungsi main memanggil fungsi lainnya dan fungsi main mengandung loop (berarti tidak menggunakan array untuk bilangan yang bisa saja berupa pecahan). 4. (40pts) Sama dengan soal 3, namun fungsi main tidak boleh mengandung loop. (berarti gunakan array untuk bilangan yang bisa saja berupa pecahan).
c) 0
d) 51
b) 11
c) 2
d) 3
12.2.2 Jawaban
Pilihan Ganda 1) 2) 3) 4) 5) b d c b d 6) 7) 8) 9) 10) b b c b b 11) 12) 13) 14) 15) d a b a d 16 17 18 19 20 a a a a c
114
115
5. Berapakah harga hitung pada posisi System.out.println() berikut ? int i,hitung=0;for(i=0;i<10;i++);{hitung=hitung+2;} System.out.println(hitung); a) 20 b) 2 c) 30 d) 0
6. Keluaran (output) dari potongan program berikut adalah float a=1.5,b=2.5,x=4.5,y=3.5;if(x==y)a=b; System.out.println(a); a) 2.5 b) 1.5 c) 0 d) 3.5
7. Nilai c pada potongan program berikut float a=5.1, b=1.5, c; if(a=b) c=a; else if(a<b) c=b; else c=0.0; a) 5.1 8. Nilai j diakhir loop: int j=0,k; for (k=0;k<10;k++)j=3*k; a) 20 b) 27 c) 30 d) 13 b) 1.5 c) 0.0 d) 51
9. Pada potongan program berikut ini: int i,j,k; if(i==j){if(k==j) a=b; else x=c;}else{b=c;} pernyataan a=b dieksekusi jika a) i!=j b) i==j; dan k==j
11. Hasil dari potongan program berikut int p, q, r, s, t; p=10; q=20; r=q; s=p; q=p; t=q; p=r; a) p=20; q=10 b) p=10; q=10 c) p=20; q=20 d) p=10; q=20
12. Cara untuk membuat texteld tak dapat diedit pada saat program di run adalah dengan memberikan a) setEditable(true) b) setNoEditable() c) setUnEditable(false) d) setEditable(false) 13. Keluaran dari pernyataan "Mengapa kamu selalu ribut saja ?".substring(14,18) adalah a) ela 14. Diakhir loop: int j=0,k; for (k=0;k<10;k++);j=2*k; nilai j adalah a) 20 15. Nilai j diakhir loop: int j=0,k; for (k=0,k<10;k++)j=2*k; a) 20 b) 18 c) 30 d) pesan error b) 18 c) 30 d) pesan error b) elal c) elalu d) selalu
16. Nilai fvar di akhir potongan program berikut: float fvar=0.0;int k=0; do{fvar=fvar*2.0;k=k+2;}while(k<10); a) 0 b) 2.0 c) 8.0 d) 0.5
17. Nilai fvar di akhir potongan program berikut: float fvar=0.0;int k=0; while(k<10){fvar=fvar*2.0;k=k+2;} a) 0 18. Pada potongan program float a=1.5,b=2.5,x=4.5,y=3.5;if(x>=y)a=b;System.out.println(a); keluaran (output)-nya adalah a) 2.5 b) 1.5 19. Pada potongan program berikut ini: float a, b, c; if(a>b) c=a; else c=b; Jika a=5.1 dan b=1.5, maka nilai c menjadi a) 5.1 b) 1.5 20. Potongan program String s = "selamat selama ...";System.out.println(s.indexOf("lama")); menghasilkan tampilan: a) 10 October 13, 2009 b) 11 116 c) 2 d) 3 c) 0 d) 51 c) 0 d) pesan error b) 2.0 c) 8.0 d) 0.5
117
Buatlah program visual dengan tampilan seperti terlihat pada Gambar 12.2 untuk menghitung jumlah nilai dari suku-suku pada deret aritmetika. Komponen visual sesuai tapi tidak berfungsi memperoleh nilai 30. Fungsi sesuai,
Nilai Awal
Beda
text field
Gambar 12.2: Tampilan untuk soal uraian. AL menunjukkan bahwa Action Listener berada pada komponen visual didekatnya. Artinya: proses perhitungan akan dilakukan dan ditampilkan ketika komponen visual tersebut di klik atau tekena cursor atau lainnya (sesuai kreativitas). tetapi layout tidak sesuai memperoleh nilai 30. Upah tulis adalah 20. Betul semua baik layout maupun fungsi nya, akan memperoleh nilai 40
12.3.2 Jawaban
Pilihan Ganda 1) 2) 3) 4) 5) d b c d b 6) 7) 8) 9) 10) b c b b d 11) 12) 13) 14) 15) a d b a d 16 17 18 19 20 a a a a c
117
118
2. Jika pernyataan a=1.1; diganti menjadi a=-1.1;, keluaran dari program adalah a) 1.1 b) 2.2 c) 5.5 3. Jika pernyataan a=1.1; diganti menjadi a=2.2;, keluaran dari program adalah a) 1.1 b) 2.2 c) 5.5 4. Jika pernyataan a=1.1; diganti menjadi a=11.1;, keluaran dari program adalah a) 1.1 b) 2.2 c) 5.5 5. Jika pernyataan a=1.1; diganti menjadi a=-11.1;, keluaran dari program adalah a) 1.1 b) 2.2 c) 5.5
118
12.4. UTS 2007 Diberikan program berikut untuk 5 soal berikut: class A{ public double a, b, c; public static void main(String[] args){ a=1.1; b=2.2; tulis(); } public void tulis(){ if(a>b){ c = 5.0 * a; }else if(a=b){ c = 100.0; }else{ c = a; } System.out.println(c); } } 6. Keluaran dari program adalah a) 1.1 b) 2.2
119
c) 5.5
7. Jika pernyataan a=1.1; diganti menjadi a=-1.1;, keluaran dari program adalah a) 1.1 b) 2.2 c) 5.5 8. Jika pernyataan a=1.1; diganti menjadi a=2.2;, keluaran dari program adalah a) 1.1 b) 2.2 c) 5.5 9. Jika pernyataan a=1.1; diganti menjadi a=11.1;, keluaran dari program adalah a) 1.1 b) 2.2 c) 5.5 10. Jika pernyataan a=1.1; diganti menjadi a=-11.1;, keluaran dari program adalah a) 1.1 b) 2.2 c) 5.5 Diberikan program berikut untuk 5 soal berikut: class A{ public int a, b; public A(int a, int b){ this.a = a; this.b = b; }//ini adalah konstruktor public void tulisC(){ if(a<b){ c = 5 * a; }else if(a=b){ c = 100; }else{ c = a; } System.out.println(c); } } class B{ public static void main(String[] args){
119
120
11. Keluaran dari program adalah a) 2 b) 3 12. Jika pernyataan A objectDariClassA = new A(2, 3); diganti menjadi A objectDariClassA = new A(3, 2); keluaran dari program adalah a) 2 b) 3
c) 10
d) 100
c) 10
d) 100
13. Jika pernyataan A objectDariClassA = new A(2, 3); diganti menjadi A objectDariClassA = new A(-3, -3); keluaran dari program adalah a) 2 b) 3 c) 10 14. Jika pernyataan System.out.println(c); diganti menjadi System.out.println(b); keluaran dari program adalah a) 2 b) 3 15. Jika pernyataan System.out.println(c); diganti menjadi System.out.println(a); keluaran dari program adalah a) 2 b) 3 16. Keluaran (output) dari potongan program berikut adalah float a=1.5,b=2.5,x=4.5,y=3.5;if(x==y)a=b; System.out.println(a); a) 2.5 b) 1.5 c) 0
d) 100
c) 10
d) 100
c) 10
d) 100
d) 3.5
17. Nilai c pada potongan program berikut float a=5.1, b=1.5, c; if(a=b) c=a; else if(a<b) c=b; else c=0.0; a) 5.1 b) 1.5 c) 0.0 d) 51
18. Pada potongan program berikut ini: int i,j,k; if(i==j){if(k==j) a=b; else x=c;}else{b=c;} pernyataan a=b dieksekusi jika a) i!=j b) i==j; dan k==j 19. Pada potongan program float a=1.5,b=2.5,x=4.5,y=3.5;if(x>=y)a=b;System.out.println(a); keluaran (output)-nya adalah a) 2.5
d) k==j
b) 1.5
c) 0
d) 4.5
20. Pada potongan program berikut ini: float a, b, c; if(a>b) c=a; else c=b; Jika a=5.1 dan b=1.5, maka nilai c menjadi a) 5.1 b) 1.5
c) 0
d) 51
120
121
Pilih satu diantara 4 soal. Pastikan anda bisa mengerjakan pilihan anda secara tuntas dalam waktu yang diberikan. Pekerjaan yang tidak tuntas hanya diberi nilai 15 (untuk setiap pilihan). Jika dikerjakan lebih dari satu, maka yang dinilai hanya yang tuntas dengan nilai tertinggi. Untuk semua soal, masukkan berupa bilangan bulat sembarang kecuali nol dilakukan melalui keyboard dan keluaran ditampilkan di layar komputer. 1. (25pts) Buat program untuk menghitung perkalian dari sekumpulan bilangan yang habis dibagi 3 2. (30pts) Sama dengan soal 1, namun kalikan hanya bilangan yang habis dibagi 3 dan bernilai negatif saja 3. (35pts) Sama dengan soal 2, namun gunakan fungsi/method main, baca, proses dan tulis. Sebagai catatan: Fungsi baca digunakan untuk membaca input. Fungsi proses digunakan untuk proses perhitungan. Fungsi tulis digunakan untuk menampilkan output. Fungsi main memanggil fungsi lainnya dan fungsi main mengandung loop (berarti tidak menggunakan array untuk bilangan). Untuk loop (yang merupakan proses berulang) silahkan gunakan for atau while. Nama class yang digunakan untuk semua nomor uraian ini tetap sama (berarti gunakan hanya satu class saja dengan nama sesuai dengan kreatitas masing-masing). 4. (40pts) Sama dengan soal 3, namun fungsi main tidak boleh mengandung loop. Loop boleh diletakkan difungsi lainnya (berarti gunakan array untuk bilangan).
12.4.2 Jawaban
Pilihan Ganda 1) 2) 3) 4) 5) Uraian 1. package uts2009_1; import java.util.Scanner; public class Main { public static void main(String[] args) { String str=""; Integer perkalian = 1; Scanner in = new Scanner(System.in); while (! (str = in.next()).equals("$")) { Integer sementara = Integer.valueOf(str); if(sementara%3==0){ perkalian = perkalian * Integer.valueOf(str); } } System.out.println("hasil perkaliannya adalah " + perkalian); } } 2. package uts2009_2; import java.util.Scanner; public class Main { public static void main(String[] args) { a d 6) 7) 8) 9) 10) a d 11) 12) 13) 14) 15) c b d b a 16 17 18 19 20 b c b a a
121
122
3. package uts2009_3; import java.util.Scanner; public class Main public static public static public static { Integer sementara; String str; Integer perkalian;
public static void main(String[] args) { perkalian = 1; Scanner in = new Scanner(System.in); while (! (str = in.next()).equals("$")) { baca(); proses(); } tulis(); } public static void baca(){ sementara = Integer.valueOf(str); } public static void proses(){ if( (sementara%3==0) && (sementara<0) ){ perkalian = perkalian * sementara; } } public static void tulis(){ if(perkalian==1){ System.out.println("Tidak ada yang bisa dikalikan, maaf"); }else{ System.out.println("hasil perkaliannya adalah " + perkalian); } } October 13, 2009 122
123
} 4. package uts2009_4; import java.util.Scanner; import java.util.ArrayList; public class Main public static public static public static { ArrayList bilangan; String str; Integer perkalian;
public static void main(String[] args) { baca(); proses(); tulis(); } public static void baca(){ bilangan = new ArrayList(); Scanner in = new Scanner(System.in); int counter = 0; Integer sementara; while (! (str = in.next()).equals("$")) { sementara = Integer.valueOf(str); bilangan.add(sementara); } } public static void proses(){ perkalian = 1; for(int i=0; i<bilangan.size(); i++){ if( ((Integer)bilangan.get(i)%3==0) && ((Integer)bilangan.get(i)<0) ){ perkalian = perkalian * (Integer)bilangan.get(i); } } } public static void tulis(){ if(perkalian==1){ System.out.println("Tidak ada yang bisa dikalikan, maaf"); }else{ System.out.println("hasil perkaliannya adalah " + perkalian); } } } Sebagai catatan: (a) Digunakan ArrayList agar ukuran array bisa di tambah (b) Method get dalam class ArrayList mengembalikan Object, sehingga perlu dilakukan cast(peleburan) ke Integer. Caranya adalah dengan menuliskan (Integer) didepan bilangan.get(i).
123