Bab I - Pendahuluan Mengenal Bahasa Pemrograman Java

Ukuran: px
Mulai penontonan dengan halaman:

Download "Bab I - Pendahuluan Mengenal Bahasa Pemrograman Java"

Transkripsi

1 Java untuk Pemula Bahasa pemrograman Java adalah bahasa pemrograman berorientasi objek yang mirip dengan bahasa C++ dan Smalltalk. Java bersifat netral, tidak bergantung pada suatu platform, dan mengikuti prinsip WORA (Write Once and Run Anywhere). Tidak seperti C atau C++, Anda dapat menulis program dalam bahasa Java, cukup sekali mengkompilasi dan dapat dijalankan pada berbagai sistem operasi, seperti Windows, Linux, Solaris, MacOS. Sebaliknya bahasa C++ bergantung pada suatu platform, karena mengharuskan kita mengkompilasi program tersebut pada setiap sistem operasi yang dituju. Bab I - Pendahuluan Mengenal Bahasa Pemrograman Java Sejarah Java Java dipelopori oleh James Gosling, Patrick Naughton, Chris Warth, Ed Frank, dan Mike Sheridan dari Sun Microsystems, Inc pada tahun Mereka membutuhkan kurang lebih 18 bulan untuk membuat versi pertamanya. Bahasa ini pada awalnya disebut Oak tapi kemudian diubah menjadi Java pada tahun 1995 karena nama Oak telah dijadikan hak cipta dan digunakan sebagai bahasa pemrograman lainnya. Antara pembuatan Oak pada musim gugur 1992 hingga diumumkan ke publik pada musim semi 1995, banyak orang yang terlibat dalam desain dan evolusi bahasa ini. Bill Joy, Arthur van Hoff, Jonathan Payne, Frank Yellin, dan Tim Lindholm merupakan kontributor kunci yang mematangkan prototipe aslinya. Java Modern Java telah digunakan dalam banyak hal dan telah membuktikan keberadaannya pada abad ke 21. Saat ini, Java digunakan bermacam jenis aplikasi seperti aplikasi embedded, aplikasi keuangan, desktop, simulasi pesawat, pemrosesan citra, game, aplikasi perusahaan terdistribusi yang disebut J2EE dan masih banyak lagi. Java Virtual Machine (JVM) Java Virtual Machine merupakan aplikasi sederhana yang ditulis dalam bahasa C untuk mengeksi program yang ditulis dalam bahasa Java. Pada saat kompilasi (perubahan dari bahasa tingkat tinggi ke bahasa lebih rendah), program tersebut diubah menjadi KODE BYTE. Kemudian pada saat eksekusi, JVM membaca kode byte tersebu dan mengubahnya menjadi bahasa mesin yang dimengerti oleh sistem operasi tempat program tersebut dijalankan.

2 Karena JVM sangat bergantung pada platformnya (bahasa mesin merupakan bahasa level rendah yang hanya dimengerti oleh suatu mesin tertentu, misalnya Intel, tapi tidak dapat dimengerti oleh mesin lain, seperti Macintosh), byte code ini dapat dibuat untuk terbebas dari kungkungan platform tertentu. Code byte yang dihasilkan dalam proses kompilasi bahasa Java akan selalu sama untuk setiap sistem operasi atau jenis mesinnya, tetapi JVM akan mengubah kode byte tersebut menjadi bahasa mesin tujuannya. Just In Time Compiler (JIT) Meskipun Java didesain untuk diinterpretasi, secara teknis tidak ada yang menghalangi Java untuk dikompilasi menjadi bahasa mesin seperti bahasa-bahasa pemrograman lainnya. Sun menyediakan kompiler Just In Time Compiler (JIT) untuk mengkompilasi kode byte itu menjadi bahasa mesinnya pada saat yang bersamaan dengan eksekusinya. Walaupun demikian, pendekatan JIT ini menghasilkan kemampuan yang lebih dibandingkan dengan interpretasi biasa. Kelebihan Java Posted Sab, 02/07/ :34 by belajarprogram Versi ramah cetak Bahasa pemrograman lain yang telah ada sebelum Java lahir sudah merupakan bahasa yang baik dan mudah dipelajasi oleh programmer profesional. Akan tetapi para programmer ini menginginkan sesuatu yang baru yang memiliki banyak hal yang menyelesaikan masalah mereka. Utamanya adalah keamanan kode mereka. Hal ini melahirkan pikiran yang revolusioner untuk menemukan bahasa pemrograman lain yang disebut Java. Tidak hanya keamanan tapi juga beberapa hal yang sering disebut sebagai Java-Buzzwords. Kata-kata ini menjelaskan berbagai fitur tambahan dan beberapa hal yang membuat Java demikian sukses dan diterima oleh dunia perangkat lunak. Berikut ini adalah penjelasan serta keuntungan dari kata-kata tersebut. Sederhana dan Berorientasi Objek Seperti diuraikan sebelumnya, Java lahir dari suatu pemikiran mendalam akan bahasa pemrograman yang ada pada saat itu, seperti C dan C++. Hal ini akan memudahkan programmer profesional untuk dapat mengerti lebih jelas tentang Java, fungsionalitas, dan lain sebagainya apabila ia memiliki pengetahuan dasar tentang C++ dan konsep pemrograman berorientasi objek. Tujuannya agar konsep dasar dari teknologi Java dapat dimengerti dengan mudah, dan programmer dapat segera menghasilkan sesuatu sedini mungkin. Tidak hanya ini, penemu Java memastikan bahwa Java juga bermula dari bahasa pemrograman dasar yang sudah ada pada saat itu. Kemudian mereka membuang berbagai fitur yang rumit dan membingungkan. Bahasa pemrograman Java didesain sejak awal untuk menjadi bahasa yang berorientasi objek. Setelah kira-kira 30 tahun, akhirnya teknologi objek menjadi kenyataan dan

3 diterima oleh sebagian besar komunitas pemrograman. Konsep berorientasi objek memungkinkan pembuatan software yang kompleks, berbasis network, sehingga dapat disimpulkan bahwa teknologi Java menghasilkan platform pembuatan perangkat lunak yang baik dan efisien serta berorientasi objek. Keuntungan yang Anda dapat dari Java Mulai dengan cepat: Java merupakan bahasa pemrograman berorientasi objek, mudah dipelajari, terutama untuk programmer yang sudah menguasai C atau C++ Tulis lebih sedikit program: Jumlah kelas, jumlah metode, dll, menunjukkan bahwa program yang ditulis dalam bahasa pemrograman Java memiliki jumlah 4 kali lipat lebih kecil dari program sama yang ditulis dalam bahasa C++ Tulis program lebih baik: Bahasa pemrograman Java menganjurkan praktek membuat program yang baik, dan automatic garbage collection membantu Anda untuk menghindari kebocoran memori. Orientasi objeknya, arsitektur komponen JavaBeans, dan jangkauannya yanga luas, API yang mudah diperluas, memungkinkan Anda menggunakan kode yang ada. Membuat program dengan lebih cepat: Bahasa pemrograman Java lebih mudah dari C++, pemrograman akan menjadi 2 kali lipat lebih cepat, dengan jumlah baris yang jauh lebih sedikit. Menghindari kebergantungan pada platform tertentu: Anda dapat menjalankan program Anda pada banyak platform dengan TIDAK menggunakan library yang ditulis spesifik untuk platform tertentu. Tulis sekali, jalankan di mana saja: Karena aplikasi yang ditulis dalam bahasa Java dikompilasi ke dalam kode byte yang bebas platform, aplikasi yang ditulis dapat jalan secara konsisten pada platform apa saja. Distribusikan software Anda dengan mudah: Dengan Java Web Start, pengguna program Anda akan dapat menggunakan aplikasi Anda dengan mudah. Sistem pengecekan versi otomatis pada saat program dimulai menjamin pengguna Anda selalu menjalankan versi terkini. Apabila versi baru tersedia, Java Web Start akan melakukan instalasi secara otomatis. Bab II - Instalasi Software yang digunakan : Eclipse 3.4 Ganymede digunakan dalam situs ini sebagai IDE (integrated development environment) atau Java 6 SDK

4 Eclipse IDE Posted Sab, 02/07/ :36 by belajarprogram Versi ramah cetak Eclipse merupakan komunitas open source yang bertujuan menghasilkan platform pemrograman terbuka. Eclipse terdiri dari framework yang dapat dikembangkan lebih lanjut, peralatan bantu untuk membuat dan memanage software sejak awal hingga diluncurkan. Platform Eclipse didukung oleh ekosistem besar yang terdiri dari vendor tekonologi, start-up inovatif, universitas, riset institusi serta individu. Banyak orang mengenal Eclipse sebagai IDE (integrated development environment) untuk bahasa Java, tapi Eclipse lebih dari sekedar IDE untuk Java. Komunitas Eclipse memiliki lebih dari 60 proyek open source. Proyek-proyek ini secara konsep terbagi menjadi 7 categori : Enterprise Development Embedded and Device Development Rich Client Platform Rich Internet Applications Application Frameworks Application Lifecycle Management (ALM) Service Oriented Architecture (SOA) Secara umum Eclipse digunakan untuk membangun software inovatif berstandar industri, dan alat bantu beserta frameworknya membantu pekerjaan menjadi lebih mudah. Lisensi Eclipse menggunakan EPL (Eclipse Public License), yaitu lisensi yang memungkinkan organisasi untuk menjadikan Eclipse sebagai produk komersialnya, dan pada saat yang sama meminta orang yang melakukan perubahan untuk mengkontribusikan hasilnya kembali kepada komunitas. Instalasi Anda membutuhkan Java 5 JRE untuk menjalankan Eclipse. Download Eclipse IDE for Java Developers untuk menggunakan kode pada situs Belajar Java ini. Gunakan utility pada sistem operasi anda untuk membuka kompresi file tersebut ke dalam hard disk anda. Catatan untuk Windows: Apabila Anda menggunakan utilitas kompresi file yang berasal dari Windows XP atau Windows Vista itu sendiri, kadang kala utilitas tersebut tidak berhasil membuka file dengan nama yang panjang. Jika

5 Anda mengalami masalah dekompresi Eclipse pada Windows, letakkan hasil dekompresi pada root directory (misalnya C:\eclipse) atau gunakan software dekompresi lain yang gratis seperti 7-Zip Menjalankan Eclipse untuk pertama kali Posted Sab, 02/07/ :12 by belajarprogram Versi ramah cetak Menjalankan Eclipse untuk pertama kali Cari file bernama eclipse.exe (pada Windows) atau eclipse (pada Ubuntu) kemudian double-click Pada saat Eclipse pertama kali dijalankan, Eclipse akan menanyakan workspace, yaitu folder tempat proyek dan data diletakkan. Anda bisa menempatkan di mana saja asalkan jangan di dalam folder Eclipse itu sendiri. Click Browse dan pilih folder yang ada inginkan. Tik "Use this as default and do not ask again" Halaman pembuka akan muncul. Klik "Workspace", tombol paling kanan berbentuk anak panah untuk masuk ke dalam workspace Anda. Program Java pertama Anda Klik "File -> New -> Java Project" Isi nama proyek (misalnya SelamatDatang), kemudian klik "Finish" Setelah Eclipse membuat proyek untuk Anda, di bagian kiri workspace Anda akan melihat struktur direktori proyek Anda yang dimulai dengan nama proyek, folder src, dan folder JRE System Library Klik kanan pada folder src, kemudian "New -> Package" Isi nama package (misalnya selamatdatang), kemudian klik "Finish" Klik kanan lagi pada folder selamatdatang, kemudian "New -> Class" Isi nama class (misalnya SelamatDatang) Karena class ini adalah class utama yang akan langsung dijalankan oleh JRE (Java Runtime Environment), click "public static void main(string[] args)" pada bagian "Which method stubs would you like to create?"

6 Klik "Finish" Eclipse akan membuat program kosong yang berisi package dan class sesuai dengan nama yang Anda masukkan pada tahap sebelumnya Sekarang ketik program berikut di bawah "// TODO" System.out.println("Selamat Datang!"); Kemudian simpan hasilnya Menjalankan program Java pertama Anda

7 Untuk menjalankan program Anda, klik "Run -> Run" Di bagian bawah pada tab yang berjudul "Console" hasil program Anda ditampilkan Program ini akan menampilkan tulisan Selamat Datang! seperti pada gambar berikut ini Sisipan Sisipan Ukuran selamatdatang-class.gif KB Mengimport proyek ke dalam Eclipse Posted Sab, 02/07/ :55 by belajarprogram Versi ramah cetak Dalam situs ini, akan ada beberapa program yang cukup panjang dan mungkin menyusahkan Anda apabila harus mengetik satu per satu. Anda dapat juga mendownload berkas terkompresi untuk kemudian diimport ke dalam Eclipse. Download file ini ke komputer Anda Ukuran

8 Pada Eclipse, klik "New -> Import -> General -> Existing Project into Workspace" Lalu tik "Select Archieve", pilih file yang telah Anda download tersebut, dan klik "Finish" Instalasi Subversive, Plugin SVN untuk Eclipse Posted Sel, 04/14/ :48 by belajarprogram Versi ramah cetak Untuk menggunakan contoh kode pada situs ini, Anda juga bisa menggunakan Subversion untuk mengambil file langsung dari gudang SVN. Untuk menginstall Plugin Subversive, dengan melakukan langkah-langkah berikut ini :

9 1. Klik "Help -> Software Updates -> Available Software" 2. Klik tombol "Add Site", kemudian masukkan alamatnya sebagai berikut : 3. Setelah mengambil data plugin yang tersedia, pilih beberapa plugin seperti pada gambar berikut, lalu klik "Install" : 4. Window baru akan muncul, klik "Finish", jangan lupa untuk mengaccept license agreementnya.

10 Menguji Koneksi SVN Posted Sel, 04/14/ :47 by belajarprogram Versi ramah cetak Setelah Anda berhasil melakukan instalasi plug-in Subversive, langkah-langkah berikut ini akan membimbing Anda untuk menguji koneksi ke gudang (repository) kode pada SVN server. 1. Klik "New -> Project -> SVN -> Checkout Project from SVN" 2. Klik "Create a new repository location" 3. Masukkan 4. Pilih folder selamatdatang dan klik Finish

11 5. Project baru akan tersedia di sebelah kiri workspace Anda. Klik "Run -> Run" dan pilh "Java Application" untuk menjalankan program ini. 6. Selamat, Anda telah mempersiapkan software yang diperlukan. Bab III - Memulai Java Posted Sab, 02/07/ :06 by belajarprogram Versi ramah cetak Program komputer adalah rangkaian instruksi yang diberikan agar komputer dapat bekerja. Suatu pekerjaan yang mungkin sederhana bagi manusia tidak dapat dimengerti oleh komputer. Manusia harus memberikan petunjuk kepada komputer bagaimana melakukan suatutugas dalam bentuk bahasa pemrograman. Bahasa pemrograman berbeda dengan bahasa manusia, karena komputer membutuhkan aturan yang lebih baku apa yang boleh dan apa yang tidak boleh dalam suatu bahasa pemrograman. Aturan ini disebut sintaks bahasa. Sintaks bahasa pemrograman ditentukan berdasarkan apa yang bisa dilakukan oleh komputer, misalnya loop (perulangan), cabang (branch), atau fungsi. Hanya program dengan sintaks yang benar yang dapat dikompilasi atau diinterpretasi yang pada akhirnya bisa dijalankan di komputer. Kompiler akan memberikan pesan kesalahan apabila ada kesalahan dalam sintaks sehingga kita memperbaikinya. Untuk menjadi programmer yang sukses, kita harus mengerti secara detail sintaks dari bahasa pemrograman yang kita akan gunakan. Tetapi, sintaks hanya sebagian cerita. Kita ingin program yang kita buat berjalan sesuai dengan yang kita inginkan. Artinya program tersebut harus benar secara logika. Program yang benar secara logika disebut memiliki semantik yang benar. Di situs ini kita akan mempelajari tentang sintaks dan semantik dari dari setiap bahasa pemrograman Java. Sintaks mudah dihafal, tetapi semantik lebih seperti perasaan. Untuk itu, coba download dan jalankan contoh-contoh program sehingga kita dapat memahami bagaimana setiap program bekerja. Melihat lebih dekat SelamatDatang Posted Sab, 02/07/ :52 by belajarprogram Versi ramah cetak Applikasi SelamatDatang memiliki 4 komponen, yaitu : definisi paket (package) komentar

12 definisi kelas (class) metode main package selamatdatang; public class SelamatDatang { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub System.out.println("Selamat Datang!"); Mari kita bahas satu per satu. Definisi paket (package) package selamatdatang; Package dalam Java merupakan kumpulan dari berbagai kode yang terangkum dalam satu paket. Untuk memudahkan penulisan dan pembagian logika suatu program, satu paket terbagi menjadi beberapa berkas (file) di mana setiap file memiliki fungsi atau tugas yang sangat khusus, misalnya satu file berfungsi untuk mendeklarasikan konstanta dan kelas, sementara file yang lain berisi implementasi kelas dan prosedurnya. Pada contoh aplikasi SelamatDatang di atas, paket ini hanya berisi satu buah file yang isinya terdiri dari satu kelas dan satu metode. Definisi paket tidak selalu diperlukan, tetapi hal ini merupakan kebiasaan baik untuk melatih kita berfikir secara logis dan sistematis. Komentar /** args */ // TODO Auto-generated method stub Komentar tidak akan diproses oleh kompiler tetapi berguna bagi programmer lain. Bahasa Java memiliki 3 jenis komentar : /* text */ Compiler akan mengabaikan kata kata antara /* dan */ /** documentation */ Ini merupakan komentar yang dipergunakan khusus untuk dokumentasi. Kompiler akan mengabaikan komentar dari /* hingga */. Alat

13 bantu javadoc akan memproses komentar dokumentasi untuk membuat dokumentasi secara otomatis dari sumber program. // text Kompiler akan mengabaikan segala sesuatu dari // hingga akhir baris Definisi Kelas public class SelamatDatang {... Kelas merupakan bagian integral dari bahasa Java karena Java merupakan bahasa berorientasi objek. Setiap aplikasi harus terdiri dari satu kelas. Di sini kita definisikan kelas SelamatDatang sebagai kelas utama. Metode main Dalam bahasa pemrograman Java, setiap aplikasi harus memiliki satu buah metode main yang bentuknya seperti berikut : public static void main(string[] args) {... Metode main mirip dengan fungsi main pada bahasa C/C++ di mana fungsi ini merupakan pintu gerbang dimulanya suatu program. Metoda main dapat dipanggil dengan menyertakan variabel, baik hanya satu variabel, banyak variabel atau bahkan tidak ada sama sekali. Yang terakhir adalah perintah berikut untuk menampilkan Selamat Datang pada komputer Anda. System.out.println("Selamat Datang!"); Perintah tersebut menggunakan pustaka inti Java, yaitu kelas Sistem. Variabel dan Tipe Data Posted Min, 02/08/ :10 by belajarprogram Versi ramah cetak Nama merupakan hal penting dalam teknik pemrograman. Dalam suatu program, nama digunakan untuk menyebut sesuatu. Untuk menggunakan "sesuatu" tersebut, programmer harus mengerti bagaimana aturan pemberian nama dan aturan untuk menggunakan nama tersebut dalam programnya. Atau dengan kata lain, programmer harus mengerti sintaks dan semantik dari nama.

14 Menurut aturan sintaks Java, nama merupakan rangkaian dari 1 atau lebih karakter. Harus dimulai dengan huruf dan harus terdiri dari huruf, angka atau karakter garis bawah '_'. Berikut ini adalah contoh nama yang diperbolehkan: N n rate x15 quite_a_long_name HelloWorld Hurus kecil dan huruf besar dianggap berbeda, sehingga HelloWorld, helloworld, HELLOWORLD, dan helloworld adalah nama yang berbeda-beda. Beberapa kata tertentu merupakan nama yang memiliki kegunaan tertentu oleh Java, dan tidak dapat dipergunakan oleh programmer. Kata-kata ini disebut reserved words (kata-kata cadangan) misalnya: class, public, static, if, else, while, dan lain-lain. Hal lain yang penting adalah compound names atau nama campuran, yaitu yang merupakan nama biasa yang dihubungkan dengan titik, misalnya System.out.println. Idenya adalah "sesuatu" pada Java dapat terdiri dari "sesuatu" yang lain. Nama System.out.println artinya System menampung out dan out menampung println. Kita sebut "sesuatu" sebagai identifier (pengenal) tidak peduli apakah ia berupa nama tunggal atau campuran. Program melakukan manipulasi data yang disimpan dalam memori. Dalam bahasa mesin, data hanya bisa diambil dengan menyebut alamatnya di memori. Dalam bahasa pemrograman tingkat tinggi seperti Java, nama bisa digunakan untk mengganti alamat data tersebut di memori. Tugas komputer adalah untuk melacak di mana data tersebut di simpan, sedangkan programmer menggunakan nama untuk memerintahkan komputer mengambil data tersebut dari memori. Nama yang digunakan seperti ini disebut variable. Variabel sebenarnya berarti lebih kompleks. Variabel bukan isi dari data, tapi lokasi di memori yang menyimpan data tersebut. Variabel bisa diibaratkan sebagai kotak penyimpanan data, bukan isi kotaknya. Karena data di dalam kotak bisa berubah, variabel hanya dapat dipercaya pada satu saat saja, walaupun tempatnya selalu sama. Dalam bahasa Java, satu-satunya cara untuk memasukkan data ke dalam variabel adalah dengan menggunakan assignment statement, atau pernyataan pemberian nilai. Pernyataan ini berbentuk: variable = ekspresi; di mana ekspresi menyatakan apapun yang berhubungan dengan nilai suatu data. Ketika komputer menjalankan instruksi ini, komputer akan menghitung dan menyimpan hasilnya ke dalam variabel. Contoh: kecepatan = 40;

15 Variable dalam pernyataan di atas adalah kecepatan dan ekspresinya adalah angka 40. Komputer menghitung pernyataan ini dan menyimpan 40 ke dalam variabel kecepatan, dan mengganti apapun yang telah disimpan sebelumnya. Sekarang misalnya kita ingin melakukan perhitungan yang lebih kompleks: jarak = kecepatan * waktu Di sini, * merupakan operasi perkalian. Komputer mengambil data yang disimpan dalam variabel kecepatan dan waktu, melakukan perkalian, dan menyimpan hasilnya dalam jarak. Variabel dalam bahasa Java didesign untuk menyimpan hanya 1 jenis tipe data. Kompiler akan menampilkan kesalahan sintax apabila variabel ini dicoba untuk diberi tipe data jenis lain. Oleh karena itu Java disebut bahasa pemrograman bertipe kuat atau strongly typed language. Ada 8 tipe data primitif dalam bahasa Java. Jenis Data Deskripsi Hanya bisa boolean berisi benar atau salah Karakter char Unicode byte Bilangan bulat short Bilangan bulat int Bilangan bulat long Bilangan bulat Ukuran Minimum Maksimum 1-bit 16-bit 8-bit 16-bit 32-bit 64-bit float Bilangan riil 32-bit double Bilangan riil 64-bit e e e e+308 Suatu variabel baru dapat digunakan apabila telah dideklarasikan. Pernyataan deklarasi variabel digunakan untuk mendeklarasikan satu atau lebih variabel dan memberinya nama. Ketika komputer mengeksekusi deklarasi variabel, komputer akan menyediakan ruangan di memori kemudian menyimpan alamat ini sesuai dengan nama variabel yang diberikan. Deklarasi variable berbentuk seperti : nama_tipe nama_variabel;

16 nama_variabel dapat berupa sebuah nama variabel atau beberapa nama sekaligus yang dipisah dengan koma. Gaya pemrograman yang baik yaitu dengan mendeklarasikan satu variabel dalam satu pernyataan, kecuali variabel tersebut berhubungan erat satu sama lain. Misalnya: float num; String nama; String nama; boolean bol; int x,y; Atau pendeklarasian variabel bisa juga dilakukan sekaligus dengan pemberian nilainya, seperti pada contoh berikut: int num = 1000; char ch = 'e'; float angka = ; boolean bol = true; Jenis-jenis Variabel Java memiliki beberapa jenis variabel yang dapat dikelompokkan sebagai berikut : Literal Instance Variables (tidak statis). Dalam bahasa pemrograman berorientasi objek, objek menyimpan variabel yang tidak dideklarasikan dengan kata kunci static dalam kategori non-statis, atau dapat berubah-ubah. Suatu kelas dapat dijelmakan ke dalam beberapa objek. Nilai yang terkandung dalam variabel tak-statis ini berbeda untuk setiap objeknya. Class Variables (statis). Variabel ini merupakan bagian integral dari suatu kelas, dan tidak ada satu objek pun yang dapat menyatakan kepemilikan atas variabel ini. Variabel yang dideklarasikan sebagai statis digunakan bersama oleh semua objek. Variabel ini lebih bersifat global yang nilainya sama untuk setiap objek pada kelas yang bersangkutan. Local Variables. Variabel ini didefinisikan di dalam suatu metoda (method) atau dalam suatu prosedur. Variabel ini bersifat lokal karena hanya dapat diakses oleh metoda atau prosedur tersebut. Parameter. Paramater atau argumen adalah variabel yang digunakan pada saat suatu metoda atau prosedur dipanggil. Parameter berguna untuk memberikan nilai awal untuk diteruskan (pass) ke dalam suatu prosedur atau metoda.

17 Pada bagian ini akan dijelaskan tentang literal, yaitu rangkaian kata atau huruf yang menyatakan suatu nilai. Misalnya int angka = 10; Pada pernyataan di atas, yang dinamakan literal adalah 10, karena 10 berarti bilangan bulat atau integer. Pada bahasa pemrograman java, terdapat beberapa jenis literal yang melambangkan bilangan bulat, riil, kalimat, atau boolean. Literal Bilangan Bulat Bilangan bulat dapat dilambangkan dalam beberapa bentuk. Bilangan bulat biasa dilambangkan dengan deretan angka yang dimulai dengan angka yang bukan nol. int angka = -10; Bilangan oktal adalah bilangan bulat berbasis 8, yang berarti hanya dapat terdiri dari angka-angka 0 hingga 7. Bilangan oktal ditulis seperti bilangan bulat biasa dimulai dengan 0. // 22 basis delapan atau 18 dalam desimal int angka = 022; Bilangan heksadesimal adalah bilangan berbasis 16. Bilangan heksadesimal dilambangkan dengan 0 hingga 9 dan a hingga f dan dimulai dengan 0x. // 2a heksadesimal atau 42 dalam desimal int angka = 0x2a; Long integer. Seperti dijelaskan pada bab terdahulu long integer membutuhkan memori sebesar 64bit, yang artinya kita dapat menyimpan bilangan bulat hingga 2 ^ 64. Untuk merepresentasikan long integer, tambahkan huruf L pada akhir bilangan. int angka = 22L; Literal Karakter Kita dapat melambangkan suatu karakter dengan tanda petik tunggal misalnya a atau 3 atau =. Suatu karakter dapat juga dilambangkan dengan kode ASCII nya. Caranya dengan memulainya dengan \u00 (garis miring terbalik) kemudian diikuti dengan kode ASCII nya dalam bentuk heksadesimal. // huruf 'A' dalam ASCII char huruf = '\u0041'; Selain itu ada beberapa karakter lain selain alfabet yang dapat dilambangkan dengan escape sequence. Berikut ini beberapa contohnya.

18 \n = tombol enter atau baris baru. \r = carriage return. \t = tombol tab. \b = tombol backspace. \\ = karakter \ \ = karakter \ = karakter Literal Boolean Nilai true dan false pada java merupakan literal boolean. Suatu variabel bertipe boolean hanya dapat memiliki nilai true atau false. boolean ok = true; Ingat bahwa boolean true atau false TIDAK menggunakan tanda petik tunggal seperti ekspresi pada karakter. Literal Bilangan Riil Bilangan riil, misalnya atau , pada java dapat disimpan baik sebagai float atau double. Bilangan real dapat direpresentasikan dalam bentuk desimal biasa, pecahan, atau eksponen (dilambangkan dengan e atau E). Ukuran Rentang Presisi (jumlah digit) bytes bit float /- 3.4 x double /- 1.8 x Tipe Imbuhan akhir d atau D dan f atau F dapat pula ditambahkan untuk menentukan tipenya secara eksplisit. Berikut beberapa contohnya. double d = 3.27E+32; float f = 4f; float pi = ; Literal String String merupakan untaian huruf dan angka yang tersusun menjadi satu kalimat. Dalam bahasa java, string bukan merupakan tipe primitif, tetapi merupakan kelas. String pada

19 java tidak disimpan dalam bentuk array seperti pada C. Java menyediakan beberapa metoda untuk melakukan penggabungan, modifikasi, atau perbandingan. String ditulis di antara dua tanda petik ganda seperti contoh berikut. String salam = "Selamat Datang"; String juga dapat mengandung karakter spesial seperti dibahas pada literal karakter. Misalnya String hallo = "Selamat Datang \"Bapak Presiden\""; System.out.println("Hallo Bambang\nSelamat pagi,\nsemoga hari anda cerah\n"; Berikut ini adalah beberapa contoh lainnya. // Contoh string kosong String teks = ""; // Contoh string berisi " teks = "\""; // String dapat juga dipisah menjadi beberapa baris teks = "ini baris pertama " + "dan ini lanjutannya." Literal Null Literal terakhir pada bahasa java adalah literal null. Null merupakan kondisi di mana suatu objek tidak diberi alokasi memori. Pada saat suatu objek dideklarasikan, komputer akan mengalokasikan memori untuk objek tersebut. Apabila objek tersebut telah selesai dipergunakan, kita dapat melepas lokasi memori yang digunakan oleh objek tersebut sehingga memori itu dapat digunakan oleh objek lain. Berikut ini adalah contohnya obj = null; Literal null berfungsi memberi tahu garbage collector (pemulung memori) bahwa objek tersebut tidak lagi terpakai. Kemudian memori akan dilepaskan agar dapat digunakan oleh objek lain. Contoh Program Variabel dan Tipe Data Posted Rab, 02/11/ :58 by belajarprogram Versi ramah cetak Berikut ini adalah listing program penghitungan bunga bank. Kode program dapat anda unduh dalam bentuk zip file atau melalui SVN di alamat berikut :

20 Lihat cara mengimpor contoh-contoh program ke dalam Eclipse di Bab II - Instalasi. package bungabank; public class BungaBank { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub /* Deklarasi variable */ double pokok; // nilai investasi double sukubunga; // suku bunga bank double bunga; // nilai bunga /* Perhitungan */ pokok = 20000; sukubunga = 0.10; // sama dengan 10% bunga = pokok * sukubunga; pokok = pokok + bunga; /* Cetak hasil keluaran */ System.out.print("Bunga yang dihasilkan adalah Rp. "); System.out.println(bunga); System.out.print("Nilai investasi setelah 1 tahun adalah Rp. "); System.out.println(pokok); Berikut adalah hasil keluarannya :

21 Sisipan Ukuran Sisipan Ukuran BungaBank-src.zip 1.76 KB String, Objek dan Subrutin Posted Min, 02/08/ :29 by belajarprogram Versi ramah cetak Bagian sebelumnya memperkenalkan 8 jenis tipe data primitif dan tipe data String. Perbedaan mendasar antara tipe primitif dan String adalah : nilai dari tipe String berupa objek. Objek akan dibahas pada bagian lain mengenai kelas (class). Di bagian ini kita akan belajar bagaimana String digunakan dan juga mempelajari konsep pemrograman penting yang lain, yaitu subrutin. Subrutin adalah kumpulan instruksi program yang digabungkan sehingga memiliki fungsi tertentu. Dalam bahasa Java, setiap subrutin termasuk di dalam bagian suatu kelas atau objek. Java menyediakan kelas standar yang siap digunakan. Nilai tipe String adalah

22 objek yang memiliki kumpulan subrutin yang dapat digunakan untuk memanipulasi String tersetbut. Kita bisa memanggil subrutin tersebut tanpa harus mengerti bagaimana subrutin tersebut bekerja. Sebenarnya ini adalah tujuan subrutin, yaitu sekumpulan perintah yang memiliki fungsi tertentu tanpa harus mengetahui secara detail apa yang terjadi di dalam. Kelas terdiri dari variabel dan subrutin yang disimpan di dalamnya. Variabel dan subrutin ini disebut static member (anggota statis). Contohnya adalah pada program SelamatDatang, kelas SelamatDatang memiliki anggota main() yang merupakan anggota statis kelas itu. Anggota yang berupa static member diberi imbuhan static, seperti pada main(). Fungsi kelas yang lain adalah untuk mendeskripsikan suatu objek. Kelas di sini berfungsi seperti tipe data. Nilai yang disimpan dalam tipe data itu adalah objek. Misalnya String sebenarnya merupakan nama kelas yang disediakan bahasa Java. String juga berupa tipe data dan kalimat seperti "Selamat Datang!" adalah isi dari tipe data String. Kegunaan kelas baik sebagai gabungan subrutin ataupun sebagai objek sering membingungkan. Misalnya kelas String juga menyimpan beberapa subrutin statik selain juga sebagai tipe data. Contoh kelas standar lainnya adalah Math yang berisi kumpulan subrutin statik untuk melakukan berbagai perhitungan matematis. Kelas sebagai tipe data Kelas sebagai kumpulan subrutin dan variabel statik Kelas Math Kelas String Kelas sebagai tipe data Posted Rab, 02/11/ :09 by belajarprogram Versi ramah cetak Kelas sebagai tipe data Mari mulai dengan melihat kembali subrutin System.out.print. Subrutin ini digunakan untuk menampilkan pesan kepada user. Misalnya System.out.print("Selamat datang!") menampilkan pesan Selamat datang! merupakan salah satu kelas standar Java. Salah satu anggotanya bernama out. Karena variable ini berada di dalam kelas System, kita harus memanggilnya dengan nama lengkapnya yaitu System.out. Variabel System.out merupakan suatu objek, dan objek itu memiliki subrutin yang bernama print. Pengenal campuran System.out.print mengacu pada subrutin print di dalam objek out dalam kelas System. System

23 (Untuk melihat dari sisi lain, sebetulnya System.out merupakan objek dari kelas PrintStream. PrintStream adalah salah satu kelas standar Java. Objek dengan tipe PrintStream adalah objek tempat informasi bisa dicetak. Setiap objek yang bertipe PrintStream memiliki subrutin bernama print yang bertugas untuk mencetak sesuatu ke medium tersebut. Dalam hal ini System.out adalah tujuan tempat print dilakukan. Objek lain yang bertipe PrintStream bisa mengirim informasi ke tujuan lain, misalnya file atau network atau ke komputer lain. Ini adalah esensi dari pemrograman berorientasi objek, di mana beberapa hal yang memiliki kesamaan - dalam hal PrintStream sama-sama sebagai tempat tujuan print dapat digunakan dengan cara yang sama, yaitu memanggil subrutin print.) Karena nama variabel, nama kelas, dan nama subrutin berbentuk hampir sama, ada baiknya untuk membedakannya sehingga di kemudian hari program dapat dibaca dengan jelas. Kelas standar Java menggunakan nama yang selalu dimulai dengan huruf besar, sedangkan nama variabel dimulai dengan huruf kecil. Ini bukan sintaks Java, tetapi lebih seperti konvensi. Setiap orang bebas menggunakan konvensinya masing-masing, tetapi apabila pemrograman dilakukan secara bersama-sama, seperti pada open source programming, konvensi yang sama akan sangat memudahkan orang lain membaca dan menguji program yang kita buat. Nama subrutin juga dimulai dengan huruf kecil, sama dengan nama variabel. Tetapi subrutin harus diikuti dengan tanda buka kurung sehingga masih mudah dibedakan dengan nama variabel. Kelas sebagai kumpulan subrutin dan variabel statik Posted Rab, 02/11/ :13 by belajarprogram Versi ramah cetak Kelas sebagai kumpulan subrutin dan variabel statik Selain sebagai tipe data, kelas System juga memiliki subrutin statik yang bernama exit. Memanggil System.exit akan menghentikan jalannya program, dan digunakan apabila karena suatu hal (misalnya program telah selesai atau adanya error) program harus dihentikan. Subrutin exit menerima parameter bilangan bulat, misalnya System.exit(0) atau System.exit(1), untuk memberitahu kepada sistem operasi alasan kenapa program dihentikan. Status 0 berarti program berhenti normal tanpa adanya error, sedangkan status lain berarti ada sesuatu yang salah yang terjadi di tengah eksekusi program tersebut. Setiap subrutin melakukan fungsi tertentu. Beberapa di antaranya melakukan perhitungan lalu melaporkan hasil perhitungannya. Ada juga yang berfungsi untuk mengambil data dari tempat tertentu dan melaporkan data yang didapat. Subrutin jenis ini disebut function

24 (fungsi). Fungsi adalah subrutin yang mengembalikan (return) suatu nilai. Nilai yang dikembalikan akan digunakan lebih lanjut dalam program. Sebagai contoh adalah fungsi untuk menghitung akar kuadrat dari suatu bilangan. Java memiliki fungsi seperti itu yang disebut Math.sqrt. Fungsi ini merupakan anggota statik dari kelas yang bernama Math. Jika x adalah suatu bilangan, makan Math.sqrt(x) menghitung akar kuadrat dari x dan mengembalikan hasil perhitungannya. Karena Math.sqrt(x) mengembalikan suatu bilangan, kita tidak bisa memanggil fungsi ini seperti Math.sqrt(x); // Tidak masuk akal! Kita tentunya ingin menggunakan hasilnya untuk instruksi selanjutnya, misalnya menuliskan hasilnya di layar seperti System.out.print( Math.sqrt(x) ); layar. // Menampilkan akar kuadrat x di atau menyimpan hasilnya pada variabel lain, seperti panjangdiagonal = Math.sqrt(x); Kelas Math Posted Rab, 02/11/ :18 by belajarprogram Versi ramah cetak Kelas Math memiliki banyak fungsi statik. Beberapa yang penting di antaranya: Math.abs(x), menghitung nilai mutlak (absolut) dari x. Nilai mutlak bilangan negatif adalah bilangan positif, dan bilangan positif tetap bilangan positif. Fungsi trigonometri Math.sin(x), Math.cos(x), and Math.tan(x). (Untuk semua fungsi trigonometri, sudut memiliki satuan radian, bukan derajat) Fungsi trigonometri inverse, yang mencari sudut dari suatu nilai trigonometric, kebalikan dari fungsi trigonometri, seperti arcus sin, arcus cos, dan arcus tangen. Math.asin(x), Math.acos(x), and Math.atan(x). Math.exp(x), menghitung pangkat dari bilangan natural e, atau ex. Dan logaritma natural loge x atau ln x bisa dihitung dengan menggunakan fungsi Math.log(x). Math.pow(x,y) menghitung xy atau x pangkat y Math.floor(x) menghitung pembulatan ke bawah dari suatu bilangan riil, misalnya 3.84 akan dibulatkan ke bawah menjadi 3.0 Math.random() memilih bilangan acak di antara 0.0 dan 1.0. Komputer memiliki algoritma perhitungan tertentu yang hasilnya bilangan acak (meskipun bulan bilangan yang betul-betul acak, tetapi cukup untuk kebanyakan fungsi)

25 Paremeter (nilai di dalam kurung) fungsi-fungsi di atas bisa bertipe numerik apa saja (misalnya double, int, dll), tetapi keluarannya bertipe double, kecuali abs(x) yang tipe keluarannya sama dengan tipe parameternya. Math.random() tidak memiliki parameter, tetapi tanda kurungnya harus tetap ditulis untuk membedakan fungsi dan variabel. Contoh fungsi lain yang tidak memiliki parameter adalah System.currentTimeMillis() yang berguna untuk mengambil waktu saat ini dalam satuan milidetik, dihitung sejak 1 Januri 1970 waktu GMT. Satu milidetik sama dengan 1 per 1000 detik. Keluarannya bertipe long. Untuk menghitung waktu yang diperlukan untuk menjalankan suatu perintah, jalankan fungsi System.currentTimeMillis() sebelum dan sesudah suatu instruksi dijalankan. Perbedaannya adalah waktu yang diperlukan untuk menjalankan suatu instruksi. Contoh Kelas Math Posted Rab, 02/11/ :56 by belajarprogram Versi ramah cetak Berikut ini adalah listing program untuk melakukan beberapa perhitungan matematika, menampilkan hasilnya di layar, dan melaporkan waktu yang diperlukan untuk melakukan perhitungan tersebut. Kode program dapat anda unduh dalam bentuk zip file atau melalui SVN di alamat berikut : Lihat cara mengimpor contoh-contoh program ke dalam Eclipse di Bab II - Instalasi. package waktukomputasi; public class WaktuKomputasi { /** * Program ini akan melakukan beberapa perhitungan matematika, * menampilkan hasilnya di layar, dan melaporkan waktu yang diperlukan * untuk melakukan perhitungan tersebut * args */ public static void main(string[] args) { // TODO Auto-generated method stub long waktumulai; long waktuselesai; waktumulai = System.currentTimeMillis();

26 siku-siku double panjang, lebar, sisimiring; // sisi segitiga panjang = 18.0; lebar = 27; sisimiring = Math.sqrt(panjang*panjang + lebar*lebar); System.out.print("Segitiga siku-siku dengan panjang 18 dan lebar 27 memiliki sisi miring "); System.out.println(sisiMiring); System.out.println("\nSecara matematis, sin(x)*sin(x) + " + "cos(x)*cos(x) - 1 = 0"); System.out.println("Mari kita cek untuk x = 1 :"); System.out.print("sin(1)*sin(1) + cos(1)*cos(1) - 1 = "); System.out.println( Math.sin(1)*Math.sin(1) + Math.cos(1)*Math.cos(1) - 1 ); System.out.println("(Mungkin akan ada kesalahan desimal dalam " + "perhitungan bilangan real!)"); System.out.print("\nIni adalah bilangan acak : "); System.out.println(Math.random()); waktuselesai = System.currentTimeMillis(); System.out.print("\nTotal waktu perhitungan : "); System.out.print((waktuSelesai - waktumulai)/1000.0); System.out.println(" detik"); Berikut adalah hasil keluarannya :

27 Kelas String Posted Kam, 02/12/ :44 by belajarprogram Versi ramah cetak Nilai suatu String adalah objek. Objek ini berisi rangkaian huruf yang membentuk string. Objek tersebut juga berisi subrutin. Misalnya length adalah fungsi yang menghitung panjang suatu string, atau jumlah karakter dalam suatu string. Misalnya string str yang dideklarasikan sebagai berikut : String str; str = "Hari ini cerah sekali!" Untuk menghitung jumlah karakter dalam string str, panggil fungsi str.length() yang keluarannya bertipe int. Fungsi ini tidak membutuhkan parameter. Fungsi length merupakan anggota kelas String dan dapat digunakan oleh semua data yang bertipe String. Dan juga bisa digunakan oleh literal string, misalnya program berikut menghitung jumlah karakter dalam string "Indonesia Raya" :

28 System.out.print("Jumlah karakter dalam \"Indonesia Raya\" adalah "); System.out.print("Indonesia Raya".length()); System.out.println(" karakter"); Kelas String memiliki beberapa fungsi di antaranya : s1.equals(s2) adalah fungsi yang mengembalikan nilai boolean (true atau false). Fungsi ini akan menghasilkan true jika s2 sama dengan s1, dan salah jika tidak. Kesamaan yang diuji adalah kesamaan persis baik kapitalnya maupun urutan huruf-hurufnya. s1.equalsignorecase(s2) juga menghasilkan nilai boolean yang menguji apakah string s2 sama dengan s1 dengan tidak membandingkan kapitalnya. "Kucing".equalsIgnoreCase("kucing") menghasilkan true. s1.length(). Seperti diulas sebelumnya, fungsi ini menghitung jumlah karakter dalam string s1. s1.charat(n). N adalah integer (bilangan bulat). Fungsi ini mengembalikan karakter ke-n dari string s1. Karakter pertama dihitung sebagai posisi ke-0. s1.charat(0) berarti mengambil karakter pertama, sedangkan s1.charat(1) berarti mengambil karakter ke-2, dan seterusnya. Karakter terakhir memiliki indeks s1.length() - 1. Fungsi ini akan mengeluarkan pesan kesalahan apabila N bernilai negatif atau lebih besar dari s1.length() - 1. s1.substring(n,m), di mana N dan M bilangan bulat. Fungsi ini mengambil potongan string antara karakter ke-n hingga karakter M-1. Catatan bahwa karakter ke-m tidak ikut diambil. Misalnya, "jalan layang".substring(1,4) menghasilkan "ala". s1.indexof(s2) mengembalikan nilai integer. Fungsi ini mencari string s2 di dalam string s1, dan apabila ditemukan mengembalikan posisi awal s2 di dalam s1. Jika tidak ditemukan, fungsi ini akan mengembalikan -1. Fungsi ini bisa juga digunakan untuk mencari string s2 dalam s1 setelah posisi ke-n dalam string s1. Misalnya, "kelapa muda".indexof("a") menghasilkan 3, sedangkan "kelapa muda".indexof("a",6) menghasilkan 10. s1.compareto(s2) membandingkan s2 dan s1. Jika s1 dan s2 sama, hasilnya 0. Jika s1 kurang dari s2, hasilnya bilangan negatif, dan jika s1 lebih besar dari s2, hasilnya bilangan positif. "Kurang dari" atau "lebih dari" mengacu pada urutannya dalam abjad jika keduanya huruf kecil atau keduanya huruf besar. Jika kapitalnya berbeda, perbandingannya bergantung pada nilai ASCII-nya. s1.touppercase() adalah fungsi untuk mengubah seluruh huruf dalam s1 menjadi huruf besar. s1.tolowercase() berfungsi untuk mengubah huruf dalam s1 menjadi hurug kecil. s1.trim() adalah berfungsi menghapus karakter yang tak bisa dicetak, misalnya spasi, baris baru, enter, yang ada sebelum atau sesudah suatu kalimat. Misalnya " selamat pagi bu ".trim() menghasilkan "selamat pagi bu".

29 Untuk s1.touppercase(), s1.tolowercase(), s1.trim() nilai s1 tidak berubah. Fungsi ini melakukan perhitungan kemudian mengembalikan string baru hasil perhitungan tersebut. Kita bisa juga menggunakan tanda + menyambung 2 string. Misalnya "mata" + "hari" menjadi "matahari". Nilai yang dapat disambungkan bukan hanya string dan string, tetapi juga string dan angka, misalnya "jalan" + 2 menjadi "jalan2". Contoh Kelas String Posted Jum, 02/13/ :06 by belajarprogram Versi ramah cetak Berikut ini adalah listing program untuk melakukan beberapa contoh menggunakan kelas String, menampilkan hasilnya di layar, dan melaporkan waktu yang diperlukan untuk melakukan perhitungan tersebut. Kode program dapat anda unduh dalam bentuk zip file atau melalui SVN di alamat berikut : Lihat cara mengimpor contoh-contoh program ke dalam Eclipse di Bab II - Instalasi. package contohstring; public class ContohString { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub // demo String.length() dan operator + untuk menghubungkan karakter String str; str = "Hari ini cerah sekali!"; System.out.println("Panjang string \"" + str + "\" adalah " + str.length()); System.out.print("Jumlah karakter dalam \"Indonesia Raya\" adalah "); System.out.print("Indonesia Raya".length()); System.out.println(" karakter"); // demo equals dan compareto System.out.println("\"jambu\" = \"Jambu\"? " + "jambu".equals("jambu")); System.out.println("ignore case \"jambu\" = \"Jambu\"? " + "jambu".equalsignorecase("jambu"));

30 Berikut adalah hasil keluarannya : OPERATOR Operator Aritmatika Posted Rab, 02/11/ :29 by belajarprogram Versi ramah cetak + Operator penjumlahan (juga sebagai penyambung string) - Operator pengurangan * Operator perkalian / Operator pembagian

31 % Operator sisa pembagian Operator aritmatika digunakan untuk melakukan operasi matematika, seperti penambahan, pengurangan, pembagian, dan modulo (atau sisa pembagian). Contoh penggunaan : Simbol + * / % + Nama operator Operator penjumlahan Operator pengurangan Operator perkalian Operator pembagian Operator sisa pembagian Operator penyambung string Contoh penggunaan n = n + 1; n = n - 1; n = n * 1; n = n / 1; n = n % 1; n = "saya "+"tidur"; Contoh kode program yang dapat Anda unduh dalam bentuk zip file atau melalui SVN di alamat berikut : Lihat cara mengimpor contoh-contoh program ke dalam Eclipse di Bab II - Instalasi. package operatoraritmatika; public class OperatorAritmatika { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub int int int int x y z g = = = = 2; 5; 3; 0; g = x + y; System.out.println("Penjumlahan (x+y) : " + g); g = y - x; System.out.println("Pengurangan (y-x) : " + g); g = x * y; System.out.println("Perkalian (x*y) : " + g); g = y / x; System.out.println("Pembagian (y/x) : " + g); g = z % y; System.out.println("Sisa pembagian (z%x) : " + g); g = x + (y * (z/x));

32 System.out.println("Hasilnya sekarang : " + g); Keluaran Program : Operator Tunggal Posted Rab, 02/11/ :33 by belajarprogram Versi ramah cetak + Operator plus; menyatakan nilai positif (setiap angka tanpa tanda ini akan dianggap sebagai positif) - Operator minus; menyatakan nilai negatif, dapat pula digunakan untuk menegatifkan suatu bilangan ++ Operator kenaikan; menambah suatu bilangan dengan 1

33 -- Operator penurunan; mengurangkan suatu bilangan dengan 1! Operator lawan; membalik nilai suatu boolean Operator tunggal hanya membutuhkan satu operan untuk melakukan operasinya. Operator ini tidak dapat digunakan untuk variabel final, karena variabel final berupa konstanta yang tidak dapat diubah-ubah. Beberapa jenis operator tunggal diberikan pada tabel di bawah ini. Simbol ! Nama Operasi operator Operator plus menyatakan nilai positif Operator minus Operator kenaikan Operator penurunan Operator lawan Contoh angka = +1; menyatakan nilai negatif, dapat pula digunakan untuk menegatifkan suatu bilangan angka = -1; angka = -angka; // sekarang angka bernilai 1 menambah suatu bilangan dengan 1 angka = ++angka; mengurangkan suatu bilangan dengan 1 angka = --angka; membalik nilai suatu boolean ok =!true; Operator kenaikan dan penurunan dapat diletakkan di belakang atau di depan suatu variabel. Jika diletakkan di depan (++x atau --x), penambahan/pengurangan dilakukan sebelumnya, sedangkan apabila diletakkan di akhir (x++ atau x--) penambahan/pengurangan dilakukan setelahnya. Walau bagaimanapun pada akhirnya keduanya akan menghasilkan x = x+1 atau x = x-1. Mari kita lihat contohnya untuk membedakan lebih jelas perbedaan penempatan operator tunggal ++ dan -Contoh kode program yang dapat Anda unduh dalam bentuk zip file atau melalui SVN di alamat berikut : Lihat cara mengimpor contoh-contoh program ke dalam Eclipse di Bab II - Instalasi. package operatortunggal; public class OperatorTunggal { /** * Contoh program menggunakan operator tunggal * args */ public static void main(string[] args) {

34 // TODO Auto-generated method stub int x = 0; int y = 0; y = ++x; System.out.println("Contoh operator pada prefix (awalan)"); (akhiran)"); System.out.println(" "); System.out.println("Nilai x baru : " + x); System.out.println("Nilai y = ++x : " + y); x = 0; y = 0; y = x++; System.out.println("\nContoh operator pada sufix System.out.println(" "); System.out.println("Nilai x baru :" + x); System.out.println("Nilai y = x++ :" + y); Jalankan program tersebut dan lihat hasilnya. Apabila operator ++ diletakkan di awal (prefix), maka nilai "x" dan "y" akan sama, karena penambahan nilai "x" dilakukan terlebih dahulu, lalu hasilnya diberi kepada "y". Apabila operator ++ diletakkan di akhir (sufix), nilai "y" adalah nilai "x" terdahulu. Java akan memberi nilai "y" dengan nilai "x" sebelum operasi ++ dilakukan. Baru kemudian nilai "x" ditambahkan. Berikut ini adalah screenshot keluarannya : Operator Pembanding, Boolean dan Kondisi Posted Rab, 02/11/ :36 by belajarprogram Versi ramah cetak Operator kondisi (conditional operator) menghasilkan nilai true atau false tergantung dari variabelnya, dalam hal ini operasinya dilakukan pada dua operand. Operator boolean adalah operator kondisi yang kedua operandnya berupa nilai boolean (true atau false), sedangkan Operator Pembanding membandingkan 2 nilai seperti pada operasi matematika. Catatan : Pada objek, seperti String, operasi pembanding akan membandingkan alamat memory tempat objek itu disimpan, bukan membandingkan isinya. Untuk membandingkan isi String, gunakan equals(), equalsignorecase(), dan compareto() seperti dibahas pada bagian sebelumnya.

35 Simbol Nama operator == Sama dengan!= Tidak sama dengan > Lebih besar >= Lebih besar atau sama dengan < Lebih kecil <= Lebih kecil atau sama dengan && Conditional AND Conditional OR! NOT?: Bentuk pendek dari if-then-else Contoh b = (1 == 2); b = (1 == 2); b = (1 > 2); b = (1 >= 2); b = (1 < 2); b = (1 <= 2); b = true && false; b = true false; b =!true; Operator boolean AND Operator kondisi AND menghasilkan "true" apabila kedua operandnya bernilai "true". Jika salah satunya atau keduanya "false", operator ini menghasilkan "false". Berikut ini tabel kebenaran operasi AND. Op1 atau Exp1 Op2 atau Exp2 Hasil true true true true false false false true false false false false Operator && akan mengevaluasi Op2 (di sebelah kanan) HANYA jika operand 1 bernilai "true". Seperti terlihat dari tabel di atas, apabila Op1 (di sebelah kiri) bernilai "false", hasilnya akan selalu "false" tidak tergantung pada isi dari Op2. Operator kondisi OR Operator kondisi OR menghasilkan "true" jika salah satu operandnya bernilai "true". Jika keduanya "false", operator ini menghasilkan "false". Berikut ini table kebenaran oeprasi OR. Op1 atau Exp1 Op2 atau Exp2 Hasil true true true true false true false true true false false false

36 Operator akan mengevaluasi Op2 (di sebelah kanan) HANYA jika operand 1 bernilai "false". Seperti terlihat dari tabel di atas, apabila Op1 (di sebelah kiri) bernilai "true", hasilnya akan selalu "true" tidak tergantung pada isi dari Op2. Operator NOT Operator NOT ("!") melakukan operasi boolean NOT pada operand atau ekspresi tunggal. Operator ini mengecek nilai boolean dari suatu operand atau expresi kemudian membalik nilainya (dari true ke false atau false ke true). Berikut ini adalah tabel kebenaran operator NOT. Op1 Hasil true false false true Operator Ternary (?:) Java memiliki operator berkondisi lain yang disebut ternary "?:", yang pada dasarnya merupakan bentuk pendek dari if-then-else. Secara umum kondisi? jika_benar : jika_salah Pada dasarnya operator "?:" akan mengevaluasi "kondisi". Apabila kondisi bernilai "true", operator akan mengembalikan "jika_benar", tetapi apabila "kondisi" bernilai "false", operator akan mengembalika "jika_salah". Misalnya x = (1 > 2)? 10 : 20 Dari contoh di atas, "x" akan memiliki nilai 20, karena ekspresi (1 > 2) adalah salah (atau "false"). Contoh kode program yang dapat Anda unduh dalam bentuk zip file atau melalui SVN di alamat berikut : package operatorkondisi; public class OperatorKondisi { /** * Contoh program menggunakan operator kondisi * args */ public static void main(string[] args) { // TODO Auto-generated method stub int x = 5; int y = 10, angka = 0; boolean bl = true; if((x == 5) && (x < y)) System.out.println("Nilai x adalah " + x);

37 if((x == y) (y > 1)) System.out.println("Nilai y lebih besar dari x"); angka = bl? x : y; System.out.println("Angka yang keluar adalah " + angka); Berikut adalah hasil keluarannya : Operator Pemberi Nilai & Type Casting Posted Rab, 02/11/ :27 by belajarprogram Versi ramah cetak Operator merupakan simbol untuk melakukan perhitungan atau suatu operasi pada satu atau lebih dari satu hal. Setelah kita mendeklarasi dan mengisi suatu variabel, kita dapat menggunakan operator untuk melakukan beberapa hal seperti penambahan, pengurangan dan sebagainya.

38 Operator Pemberi Nilai = Operator pemberi nilai Operator penugasan dan pemberian nilai merupakan operator yang paling umum dalam semua bahasa pemrograman. Operator ini dilambangkan dengan "=" yang digunakan untuk memberikan nilai kepada suatu variabel di sebelah kiri operator. Jika variabel tersebut telah memiliki nilai, nilainya akan diganti dengan variabel atau angka di sebelah kanan operator. Operator ini juga dapat digunakan untuk memberikan referensi kepada suatu objek. Beberapa contoh : String nama = "Budi"; boolean dewasa = true; // buat objek baru Shape s1 = new Shape(); // beri referensi s1 kepada s2 Shape s2 = s1; // nilai sebelumnya diganti dewasa = false; Anda dapat juga memberikan nilai kepada beberapa variabel secara bersamaan. Misalnya : x = y = z = 2; x = (y + z); Operator "=" dievaluasi dari kanan ke kiri. Pada ekspresi pertama, angka 2 diberikan kepada "z", kemudian nilai yang disimpan "z" diberikan kepada "y", dan kemudian "y" ke "x" secara bersamaan. Pada ekspresi kedua, nilai hasil evaluasi pertambahan dimasukkan ke variabel "x". Pada dasarnya, kedua sisi tanda "=" harus memiliki tipe yang sama. Misalnya x = A, x dan A harus memiliki tipe yang sama. Bagaimana jika tidak, misalnya int A; short B; A = 17; B = (short)a; Pada kode di atas, B akan mengambil nilai A yang sudah dikonversi ke tipe short. Tanda (short) dalam kurung artinya menginstruksikan Java untuk mengubah nilai A menjadi short sebelum diberikan kepada B.

39 Perubahan tipe ini disebut type casting. Kita bisa mengubah tipe apa saja, tetapi karena rentang tiap tipe berbeda, maka nilainya belum tentu sama dengan nilai aslinya. Misalnya (short) adalah Untuk perubahan tipe dari bilangan real (float atau double) ke bilangan bulat, Java melakukan type casting dengan memangkas desimalnya. Jadi 3.56 akan diubah menjadi 3 dalam bilangan bulat. Nilai char juga bisa diubah ke dalam bilangan bulat, yaitu dengan menggantinya dengan bilangan Unicode-nya. Selain operasi "=", Java juga memiliki operator pemberian nilai beruntun, dan dapat digunakan oleh semua operator aritmatika, manipulasi bit, atau pergeseran bit. Misalnya pada ekspresi berikut, nilai "x" akan dijumlahkan dengan 2, kemudian hasilnya disimpan kembali ke "x". x += 2; Table berikut menunjukkan semua operator pemberian nilai yang dapat Anda gunakan sehingga kode Anda menjadi lebih efisien dan mudah dibaca. Operator += -= *= /= %= &= = ^= < <= >>= >>>= Contoh x += y; x -= y; x *= y; x /= y; x %= y; x &= y; x = y; x ^= y; x < <= y; x >>= y; x >>>= y; Ekspresi setara x = (x + y); x = (x - y); x = (x * y); x = (x / y); x = (x % y); x = (x & y); x = (x y); x = (x ^ y); x = (x < < y); x = (x >> y); x = (x >>> y); Contoh kode program yang dapat Anda unduh dalam bentuk zip file atau melalui SVN di alamat berikut : package operatorpemberinilai; public class OperatorPemberiNilai { /** * Contoh program menggunakan operator pemberi nilai (assignment operator)

40 * args */ public static void main(string[] args) { // TODO Auto-generated method stub int x = 5; int y = 10; x += y; System.out.println("Hasil penjumlahan : " + x); x -= y; System.out.println("Hasil pengurangan : " + x); x *= y; System.out.println("Hasil perkalian : " + x); x /= y; System.out.println("Hasil pembagian : " + x); x %= y; System.out.println("Sisa pembagian : " + x); x &= y; System.out.println("Hasil operasi AND : " + x); x = y; System.out.println("Hasil operasi OR : " + x); x <<= y; System.out.println("Hasil operasi pergeseran bit ke kiri :"+ x); Keluaran programnya :

41 Intermezzo : Membaca Input dari User Posted Min, 02/15/ :44 by belajarprogram Versi ramah cetak Java bukan bahasa pemrograman untuk Console (seperti DOS atau Linux), sehingga untuk mengambil input dari user diperlukan sedikit trik yang tidak sesederhana readln pada bahasa pemrograman lain. Di sini saya akan menjelaskan untuk membuat program yang bisa mengambil input dari konsol teks. Di bagian lain, setelah kita belajar pemrograman berorientasi objek, kita akan menggunakan GUI untuk mendapatkan interaksi dari user. Membaca String yang diketik oleh user di konsol Kita membutuhkan kelas yang beberapa kelas, yaitu BufferedReader, InputStreamReader, dan System.in (lawan dari System.out yang kita gunakan untuk menampilkan pesan di layar).

42 Dua kelas pertama terdapat dalam package yang dinamakan java.io. Untuk itu, kita harus menambah satu baris perintah import java.io.* yang berarti mengimport semua kelas dalam paket java.io (tanda * berarti semua). Kemudian kita harus juga membuat suatu objek dari kelas BufferedReader. Kelas BufferedReader adalah kelas abstrak yang menangani baca tulis ke suatu media. Kelas ini membutuhkan kelas lain sebagai pekerjanya, yaitu InputStreamReader. Dan InputStreamReader membutuhkan media tempat baca tulis dilakukan, yaitu System.in. Semua ini bisa dituliskan dalam satu perintah yaitu : BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Di sini variabel br merupakan objek yang merupakan jelmaan dari kelas BufferedReader. Untuk memerintahkan Java mengambil input dari user, kita gunakan fungsi readline() yang terdapat pada kelas BufferedReader, dalam hal ini terealisasi pada objek br. nama = br.readline(); Karena kita berhubungan langsung dengan sistem IO (input-output) komputer yang harus diasumsikan tidak pasti (misalnya ada masalah pada sistem keyboard, atau komputer sedang bekerja berat sehingga input dari user tidak bisa diambil), kita harus menempatkan fungsi readline() pada klausa try {... catch (IOException ioe) {... Perintah di dalam try {... adalah perintah yang kita ingin jalankan pada situasi yang "mungkin" tidak berhasil. Parameter pada catch, yaitu IOException ioe adalah jenis kesalahan yang ingin kita tangkap. Dalam hal ini kita ingin menangkap adanya kesalahan IO, yaitu kesalahan yang bertipe IOException. Perintah di dalam catch {... adalah perintah yang akan dilakukan apabila kesalahan ditangkap. Jika tidak ada kesalahan IO yang ditemukan, maka bagian ini akan dilewatkan (tidak dijalankan).

43 Mari kita lihat program akhir untuk mengambil input dari user. package ambilinputkonsol; import java.io.*; public class AmbilInputKonsol { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub System.out.print("Masukkan nama Anda : "); // buat objek baru untuk mengambil input BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // tempat di mana input dari user akan diletakkan String nama = null; try { nama = br.readline(); catch(ioexception ioe) { System.out.println("Kesalahan IO pada saat menanyakan nama Anda"); System.exit(1); System.out.println("Terima kasih, " + nama); Program tersebut dapat Anda unduh dalam bentuk zip file atau melalui SVN di Untuk menguji program tersebut, jalankan "Run -> Run" atau Ctrl-F11. Kemudian arahkan kursor Anda ke bagian bawah di kotak yang bernama Console.

44 Masukkan nama Anda, kemudian hasilnya akan ditampilkan pada baris berikutnya. Intermezzo : Mengubah String ke int dan double Posted Min, 02/15/ :32 by belajarprogram Versi ramah cetak Kita dapat mengubah tipe data String, misalnya hasil input dari konsol atau dari hasil bacaan file, ke tipe data bilangan untuk pengolahan lebih lanjut.

45 Sebagai contoh, kita akan membuat program untuk menghitung nilai investasi setelah n tahun. Input yang diminta dari user adalah : Nama Investasi awal (Rp) Bunga (%) Periode (tahun) Dengan menggunakan teknik yang sama pada contoh sebelumnya, kita bisa mengambil input tersebut menggunakan kelas BufferedReader seperti berikut. nama = br.readline(); strawal = br.readline(); strbunga = br.readline(); strperiode = br.readline(); Tetapi karena keluaran dari readline() bertipe String, kita harus mengubahnya menjadi bentuk bilangan agar dapat diproses lebih lanjut. Untuk mengubah String menjadi int, kita dapat menggunakan kelas Java Integer yang di dalamnya memiliki fungsi parseint(str). Fungsi ini dapat dipanggil dengan: periode = Integer.parseInt(strperiode); Sedangkan untuk mengubah String menjadi double, kita menggunakan kelas Java Double yang di dalamnya memiliki fungsi parsedouble(str). Fungsi ini dapat dipanggil dengan: awal = Double.parseDouble(strawal); bunga = Double.parseDouble(strbunga); Setelah semua variabel didapat dan diubah, kita baru bisa untuk memulai perhitungan. Untuk menghitung bunga bank setelah n tahun, kita bisa menggunakan rumus berikut : akhir = awal * (1 + bunga)periode Dalam Java, rumus tersebut bisa dituliskan dengan ekspresi berikut akhir = awal * Math.pow(1 + bunga,periode); Berikut ini adalah listing program lengkap yang dapat diunduh dalam bentuk zip file atau melalui SVN di alamat package hitunginvestasinperiode; import java.io.*;

46 public class HitungInvestasiNPeriode { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub // buat objek baru untuk mengambil input BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // tempat di mana input dari user akan diletakkan String nama = null; String strawal = null; String strbunga = null; String strperiode = null; try { (Rp) : "); System.out.print("Masukkan nama Anda : "); nama = br.readline(); System.out.print("Masukkan jumlah awal investasi strawal = br.readline(); 10%) : "); System.out.print("Masukkan bunga (mis 0.1 = strbunga = br.readline(); System.out.print("Masukkan periode (tahun) : "); strperiode = br.readline(); catch(ioexception ioe) { System.out.println("Kesalahan IO pada saat menanyakan nama Anda"); System.exit(1); // deklarasi variabel tipe bilangan double awal; double bunga; int periode; double akhir; // mengubah input dari Sting ke tipe data bilangan periode = Integer.parseInt(strperiode); awal = Double.parseDouble(strawal); bunga = Double.parseDouble(strbunga); // menghitung hasil investasi selama n periode akhir = awal * Math.pow(1+bunga, periode); // tampilkan hasil perhitungan di layar System.out.println(); System.out.println("Terima kasih, " + nama);

47 System.out.print("Hasil investasi Anda setelah " + periode + " tahun "); System.out.println("adalah Rp. " + akhir); Berikut ini adalah hasil keluarannya : Bab IV - Memulai Java Lebih Lanjut Struktur Kontrol Posted Min, 02/15/ :36 by belajarprogram Versi ramah cetak Komponen mendasar dari suatu program -- variabel, ekspresi, penyataan, dan pemanggilan subrutin -- telah dijelaskan pada Bab sebelumnya. Mulai dari bab ini, kita akan melihat bagaimana komponen dasar tersebut berinteraksi sehingga menjadi program yang lebih kompleks. Pada bab ini, kompleksitas program akan lebih dititikberatkan pada apa yang bisa dilakukan dari dalam sebuah subrutin. Lebih khusus, akan dijelaskan lebih lanjut tentang struktur kontrol. Struktur kontrol, yaitu perulangan (loop) dan percabangan (branch), dapat digunakan untuk mengulangi perintah berulang-ulang atau untuk memilih dua atau lebih skenario. Java memiliki beberapa struktur kontrol dan kita akan lihat secara lebih detail kemudian. Bab ini juga akan membahas tentang desain suatu program. Jika kita dihadapkan pada suatu permasalahan yang akan dipecahkan oleh program komputer, bagaimana caranya kita berfikir untuk merancang program tersebut. Kita akan melihat sebagian jawabannya di bab ini, dan kemudian akan kita gunakan dalam beberapa contoh yang tersedia. Blok, Perulangan, dan Percabangan Perancangan Algoritma Membuat kode, menguji, dan mencari kesalahan (debugging)

48 while dan do... while Perulangan for Pernyataan if Pernyataan switch Blok, Perulangan, dan Percabangan Posted Min, 02/15/ :29 by belajarprogram Versi ramah cetak Kemampuan suatu program untuk melakukan tugas kompleks dilakukan dengan menggabungkan perintah sederhana menjadi struktur kontrol. Dalam bahasa Java, ada 6 struktur tersebut, yaitu blok, perulangan while, perulangan do... while, perulangan for, pernyataan if, dan pernyataan switch. Masing-masing struktur ini sebetulnya merupakan pernyataan tunggal yang berdiri dengan sendirinya, tetapi di dalamnya terdiri dari satu atau lebih perintah sehingga keseluruhannya menjadi suatu struktur perintah. Blok Blok adalah pernyataan sederhana yang dimulai dengan { dan diakhiri dengan. Tujuannya untuk mengelompokkan beberapa perintah sehingga lebih dimengerti. Misalnya { perintah Pernyataan blok biasanya terdapat dalam struktur kontrol, tetapi sebetulnya tanpa struktur kontrol pun, blok tetap berlaku. Contoh sederhana penggunaan blok ini adalah dalam subrutin main() yang kita lakukan pada contoh-contoh sebelumnya. Berikut ini adalah 2 contoh penggunaan blok. { System.out.println("Hallo"); System.out.println("Dunia"); { // blok ini digunakan untuk menukar isi variable x dan y int temp; temp = x; x = y; y = temp;

49 Pada blok kedua, kita mendeklarasikan variable baru temp. Dalam blok kedua ini, variabel apapun yang dideklarasikan tidak akan dapat diakses dari luar blok ini. Variabel ini disebut variabel lokal, karena hanya bisa diakses dari dalam blok. Ketika komputer menjalankan program ini, komputer akan mempersiapkan memori untuk menyimpan variabel yang dideklarasikan di dalam blok ini. Ketika blok ini selesai dijalankan, komputer akan melepas memori yang digunakan dalam blok ini untuk digunakan oleh bagian program lain. Konsep "scope" atau jangkauan pada konsep pemrograman, mengacu pada bisa atau tidaknya suatu variabel dilihat oleh bagian program lain. Jangkauan suatu variabel menyatakan di bagian mana variabel ini valid atau dengan kata lain bisa diakses. Jangkauan variabel dalam suatu blok terbatas hanya pada blok tersebut. Blok sendiri sebetulnya bukan merupakan struktur kontrol. Program akan berjalan seperti biasa dari atas kebawah seperti biasa. Secara umum struktur kontrol dibagi menjadi 2 bagian, yaitu : perulangan dan percabangan. Perulangan Sebagai contoh untuk membahas tentang perulangan, kita lihat pernyataan while, yang memiliki bentuk seperti while (suatu_kondisi) { perintah Semantik pada pernyataan while tersebut adalah sebagai berikut. Ketika komputer sampai pada pernyataan while, komputer akan melakukan perhitungan pada suatu_kondisi. Apabila suatu_kondisi bernilai true, blok yang berisi perintah akan dilakukan. Setelah komputer sampai pada bagian akhir blok, komputer akan menghitung kembali suatu_kondisi. Jika masih bernilai true, maka blok tersebut akan dieksekusi, dan jika tidak, program akan melompat ke bagian program berikutnya setelah blok berakhir. Atau dengan kata lain, jika suatu_kondisi bernilai false, blok perintah tidak akan dieksekusi. Berikut ini adalah contoh untuk menulis bilangan 1 hingga 5. int angka = 1; // inisialisasi variabel, kita mulai dengan mengisi variabel angka dengan 1 while (angka <= 5) { System.out.println(angka); // cetak isi angka di layar angka = angka + 1; // tambah angka dengan 1 System.out.println("Selesai...");

50 Variabel angka kita inisialiasi (persiapkan) dan kita isi mula-mula dengan 1. Ketika program sampai pada pernyataan while, program akan mengevaluasi apakah angka <= 5. Pada saat program baru dimulai, angka masih bernilai 1, sehingga pernyataan angka <= 5 bernilai true. Dalam hal ini perintah di dalam blok akan dieksekusi, yaitu mencetak angka ke layar, kemudian menambah angka dengan 1. Sekarang angka bernilai 2. Setelah sampai pada akhir blok, program akan kembali pada awal pernyataan while. Sekarang angka bernilai 2, dan karena 2 masih kurang dari atau sama dengan 5, program akan kembali mengeksekusi perintah dalam blok. Begitu seterusnya hingga angka bernilai 6. Pada saat ini program akan berhenti melakukan perulangan dan berhenti melakukan eksekusi perintah di dalam blok tersebut, kemudian melakukan perintah berikutnya, yaitu menampilkan kata "Selesai...". Percabangan Pernyataan if memperintahkan komputer untuk memilih salah satu aksi yang akan dilakukan, tergantung pada suatu kondisi tertentu. Bentuknya dapat ditulis sebagai berikut if (suatu_kondisi) perintah_1; else perintah_2; Perintah_1 dan perintah_2 juga bisa berbentuk blok, sehingga pernyataan di atas dapat ditulis juga sebagai berikut if (suatu_kondisi) { perintah_1; else { perintah_2; Ketika komputer sampai pada pernyataan if, komputer akan menghitung apakah suatu_kondisi bernilai true. Jika iya, maka blok perintah berikutnya akan dieksekusi, dalam hal ini perintah_1. Jika tidak, maka blok setelah pernyataan else akan dieksekusi, yaitu perintah_2. Sebagai contoh, mari kita kembali pada contoh program untuk membalik nilai x dan y, dengan syarat x harus lebih besar dari y. Dalam hal ini, setelah program ini dieksekusi, nilai x akan selalu bernilai lebih kecil dari y, karena jika nilai x lebih besar, nilai x akan ditukar dengan nilai y. if (x > y) { // jika x lebih besar dari y // blok ini digunakan untuk menukar isi variable x dan y int temp; temp = x; x = y; y = temp;

51 Contoh berikut adalah program untuk menentukan apakah suatu bilangan merupakan bilangan genap atau bilangan ganjil. Dengan menggunakan operator %, yaitu sisa pembagian, kita dapat menentukan apabila sisa pembagian suatu bilangan dengan 2 adalah 0, maka bilangan tersebut merupakan bilangan genap. Jika tidak, maka bilangan tersebut adalah bilangan ganjil. if ((x % 2) == 0) { System.out.println(x + " adalah bilangan genap"); else { System.out.println(x + " adalah bilangan ganjil"); Kita akan bahas tentang struktur kontrol di bagian berikutnya. Semoga bagian ini yang merupakan bagian pendahuluan tentang struktur kontrol dapat dimengerti sehingga kita bisa mempelajari konsep yang lebih kompleks lagi. Perancangan Algoritma Posted Min, 02/15/ :06 by belajarprogram Versi ramah cetak Komputer itu bodoh! Kenapa? Karena sebagai programmer, kita harus memberikan perintah hingga sangat detail apa yang harus dikerjakan oleh komputer. Programmer adalah orang yang bertugas untuk menerjemahkan suatu tugas menjadi instruksi detail yang dapat dimengerti oleh komputer. Komputer hanya melakukan apa yang diperintahkan baris demi baris, tetapi komputer tidak bisa berfikir bagaimana melakukan suatu tugas seefisien mungkin. Untuk itu programmer baru harus dilengkapi dengan cara berfikir dan peralatan yang memungkinkan mereka untuk sukses dalam menerjemahkan suatu tugas menjadi rangkaian perintah yang bisa dimengerti oleh komputer. Program komputer itu seperti seni yang memuat suatu ide. Seorang programmer mulai dengan suatu tugas di kepalanya, misalnya menghitung sisi miring dari segitiga siku-siku. Kemudian dia akan berfikir tentang apa yang harus dilakukan untuk menyelesaikan tugas tersebut dalam bahasa manusia. Dalam hal ini misalnya, sisi miring dapat dihitung dengan mengambil akar kuadrat dari jumlah kuadrat sisi siku-sikunya. Pemecahan masalah ini kemudian diterjemahkan ke dalam bahasa pemrograman yang berupa perintah langkah demi langkah bagaimana komputer harus menyelesaikan tugas tersebut. Perintah langkah demi langkah hingga detail ini disebut algoritma. (Secara teknis, algoritma adalah kumpulan langkah-langkah sederhana yang jelas, tidak membingungkan karena hanya ada satu cara untuk melakukan langkah sederhana tersebut, dilakukan

52 selama kurun waktu tertentu. Kita tidak ingin program menghitung selamanya tanpa batas waktu.) Program ditulis dalam bahasa pemgrograman tertentu. Tetapi algoritma ditulis secara umum atau generic, dalam bahasa manusia, sehingga bisa diimplementasikan menggunakan bahasa pemrograman apapun. Atau dengan kata lain, algoritma mirip seperti ide di belakang program yang akan kita tulis. Tetapi ide tersebut harus jelas, dan memuat langkah demi langkah yang sederhana. Jadi darimana algoritma itu datang? Biasanya orang harus membuat algoritma itu. Dengan skill, latihan dan pengalaman, orang akan lebih mudah membuat suatu algoritma. Di bagian ini akan dibahas tentang bagaimana membuat suatu algoritma. Jadi bahasa Java akan kita tinggalkan sementara. Kita akan beralih untuk berfikir secara abstrak. Misalnya, kita memiliki suatu tugas di kepala. Salah satu cara untuk menyelesaikan tugas itu adalah menuliskan penyelesaiannya langkah demi langkah, dan dari sana kita membuat algoritma untuk menyelesaikan masalah itu. Kemudian dari setiap langkah tersebut, kita bisa membuat langkah-langkah lain yang lebih detail, sampai kita bisa menerjemahkan langkah-langkah itu ke dalam bahasa pemrograman. Metode ini disebut penghalusan bertahap (stepwise refinement), dan sifatnya top-down atau dari atas ke bawah. Sambil kita menambah detail pada setiap langkah, kita bisa mulai menuliskan algoritma dalam bentuk pseudocode (kode palsu) yang bentuknya tidak harus persis atau mengikuti suatu bahasa pemrograman. Misalnya, kita ambil contoh untuk menghitung rata-rata dari 5 bilangan. Kita bisa menuliskan pseudocode dalam bentuk berikut : ambil input user untuk bilangan pertama masukkan ke variabel x ambil input user untuk bilangan kedua tambahkan variabel x dengan bilangan kedua ambil input user untuk bilangan ketiga tambahkan variabel x dengan bilangan ketiga ambil input user untuk bilangan keempat tambahkan variabel x dengan bilangan keempat ambil input user untuk bilangan kelima tambahkan variabel x dengan bilangan kelima bagi variabel x dengan 5 tampilkan hasilnya di layar Algoritma di atas betul, tetapi terlalu banyak perulangan. Bagaimana jika bilangan yang akan dirata-ratakan ada 100? Kita bisa udah algoritma di atas dengan pseudocode yang lebih mudah dimengerti, misalnya while a kurang dari 5 ambil input user untuk bilangan ke-a tambahkan nilai x dengan bilangan ke-a

53 tambah a dengan 1 bagi variabel x dengan 5 tampilkan di layar Sekarang, ambil input user bisa dideskripsikan lebih jauh. Kita harus memberikan pertanyaan kepada user. Dan seperti dipelajari pada bab sebelumnya, input dari user berupa String yang harus diterjemahkan ke dalam tipe data bilangan untuk bisa dikalkulasi. Pseudocode di atas dapat ditulis ulang sebagai berikut : while a kurang dari 5 beri pertanyaan kepada user untuk memasukkan bilangan ke-a ambil input user untuk bilangan ke-a ubah input menjadi bilangan tambahkan nilai x dengan bilangan ke-a tambah a dengan 1 bagi variabel x dengan 5 tampilkan di layar Dan juga dari pelajaran sebelumnya, untuk mengambil input user, kita bisa dihadapkan pada permasalahan IO (input output). Selain itu kita juga harus menginisialisasi pembaca dan tempat meletakkan string sementara. Untuk itu, kita harus mengubah pseudocode nya menjadi seperti ini inisialisasi pembaca inisialisasi tempat string sementara while a kurang dari 5 beri pertanyaan kepada user untuk memasukkan bilangan ke-a "coba" ambil input user untuk bilangan ke-a jika ada masalah keluar dari program ubah input menjadi bilangan tambahkan nilai x dengan bilangan ke-a tambah a dengan 1 bagi variabel x dengan 5 tampilkan di layar Kemudian, perlu diperhatikan bahwa variabel a dan x tidak diketahui nilai awalnya oleh komputer. Bayangkan jika nilai a dan x ditentukan oleh komputer secara acak, bukan saja hasil rata-ratanya menjadi tak tentu, tetapi juga perulangannya menjadi tak menentu. Untuk itu kita harus tambahkan perintah untuk menginisialisasi a dan x dengan 0, sehingga pseudocodenya menjadi inisialisasi x dengan 0 inisialisasi a dengan 0 inisialisasi pembaca inisialisasi tempat string sementara while a kurang dari 5 beri pertanyaan kepada user untuk memasukkan bilangan ke-a "coba" ambil input user untuk bilangan ke-a jika ada masalah keluar dari program ubah input menjadi bilangan tambahkan nilai x dengan bilangan ke-a tambah a dengan 1

54 bagi variabel x dengan 5 tampilkan di layar Dari sini kita bisa menerjemahkan pseudocode tersebut menjadi program Java, yaitu double x = 0; int a = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String strbilangan = null; while (a < 5) { System.out.print("Masukkan bilangan ke-" + a + " : "); try { strbilangan = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti"); System.exit(1); x = x + Double.parseDouble(strbilangan); a = a + 1; x = x / 5; System.out.println("Rata-rata bilangan yang dimasukkan adalah " + x); Jangan lupa bahwa program tersebut membutuhkan paket java.io.*, sehingga kita harus menambah import java.io.* di awal kelas. Berikut ini adalah program lengkapnya dan dapat diunduh dalam bentuk zip file atau melalui SVN di alamat berikut package hitungratarata5bil; import java.io.*; public class HitungRataRata5Bil { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub double x = 0; int a = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String strbilangan = null;

55 while (a < 5) { System.out.print("Masukkan bilangan ke-" + a + " : "); try { strbilangan = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti"); System.exit(1); x = x + Double.parseDouble(strbilangan); a = a + 1; x = x / 5; System.out.println("Rata-rata bilangan yang dimasukkan adalah " + x); Untuk menguji program tersebut, jalankan "Run -> Run" atau Ctrl-F11. Kemudian arahkan kursor Anda ke bagian bawah dan klik di kotak yang bernama Console.

56 Berikut ini adalah hasil keluarannya, Anda bisa mencoba-coba dengan bilangan apapun. Membuat kode, menguji, dan mencari kesalahan (debugging) Posted Min, 02/15/ :02 by belajarprogram Versi ramah cetak Akan sangat sederhana dan indah apabila program yang kita tulis akan berjalan 100% tanpa kesalahan sama sekali. Kita tinggal memencet tombol run, dan semuanya berjalan sesuai rencana. Nyatanya tidak demikian. Coba Anda ganti salah satu dari beberapa contoh yang sudah diberikan dengan mengganti salah satu kurung { menjadi (. Kemudian pada Eclipse, jalankan dengan "Run -> Run". Lihat apa yang terjadi. Eclipse akan menampilkan pesan kesalahan, itu artinya secara sintaks, atau format penulisan program ada memiliki kesalahan, dan Anda harus memperbaikinya sebelum program bisa dijalankan.

57 Sintaks adalah salah satu cara menentukan bagaimana komputer harus bekerja. Manusia tidak membutuhkan sintaks untuk berbicara karena manusia bisa menentukan mana subjek, predikat, atau objek dengan mudah, bahkan untuk kalimat yang belum pernah dibaca atau didengar sekalipun. Bagi komputer, sintaks membantu komputer mengelola logika, mana yang merupakan variabel, mana yang berupa subrutin, mana perulangan, mana percabangan dan lain-lain. Dalam bahasa Java, yang merupakan bahasa dengan sintaks ketat, perbedaan sintaks sedikit saja membuat Java tidak mengerti apa yang dimaksud dalam program. Bagi beberapa programmer, ketidakluwesan Java mungkin menghambat, tetapi perlu diingat bahwa kesalahan hanya datang dari manusia. Ketidakluwesan Java membantu programmer harus menggunakan logika yang benar, dan tidak boleh salah dalam menggunakan variabel. Variabel yang sudah ditentukan tipenya tidak dapat diubah ditengah jalan, kecuali dengan membuat variabel baru dengan tipe yang berbeda. Debugging Ketika program Anda tidak menunjukkan kesalahan sintaks, bukan berarti program Anda bebas dari kesalahan. Program harus diuji apakah ia berjalan sesuai dengan yang diharapkan. Idealya apabila program menerima input yang tidak sesuai dengan yang diharapkan, program akan memberikan pesan kepada penggunanya tentang kesalahan tersebut, bukan tiba-tiba keluar tanpa pesan. Kita mungkin harus melakukan testing secara lebih perlahan-lahan. Apabila jumlah baris dalam program kita kecil, mungkin kesalahan tersebut dengan mudah akan kita temui.

58 Tetapi apabila program tersebut sangat besar, maka mencari kesalahan yang kelihatannya sederhana tidaklah mudah. Pencarian kesalahan ini dalam bahasa pemrograman disebut dengan "debugging", yang jika diterjemahkan ke dalam bahasa Indonesia berarti membersihkan kutu, karena kesalahan kecil dianggap sebagai kutu yang mengganggu jalannya program. Eclipse menyediakan peralatan untuk melakukan debugging, yaitu dengan menekan tombol "Run -> Debug". Dalam Eclipse, debugging yang bisa dilakukan antara lain: membuat breakpoint (tempat berhenti program), mengeksekusi satu demi satu perintah, mengeksekusi satu subrutin, melihat isi variabel saat ini, dan bahkan mengganti variabel pada saat program dijalankan. Untuk mendemonstrasikan debugging ini, mari kita gunakan program menghitung ratarata pada bagian terdahulu. Membuat breakpoint Kita bisa menjalankan program baris demi baris, tetapi sebelum kita melakukannya, kita harus memberhentikan program tersebut di satu tempat terlebih dahulu. Tempat pemberhentian program sementara ini disebut breakpoint. Untuk mengeset breakpoint, double klik bagian paling kiri dari baris di mana Anda ingin program tersebut berhenti. Misalnya pada tampilan berikut, program berhenti di baris double x=0;. Perhatikan juga bahwa baris yang diberi breakpoint memiliki tanda bulat di sampingnya.

59 Untuk menghapus breakpoint, double click lagi tanda bulat di baris yang sudah diberi breakpoint tadi. Menjalankan program hingga breakpoint Coba tekan tombol F11 atau "Run -> Debug". Pada saat Anda memulai debugging, Eclipse akan memberikan pertanyaan bahwa perspective (atau tampilan Eclipse) Anda akan diubah ke debugging perspective. Tekan Yes untuk mengubah perspective tersebut. Berikut ini adalah perspektif dalam mode debugging.

60 Perhatikan bahwa di samping tanda bulat tadi, ada tanda panah (->) yang menunjukkan saat ini komputer telah melaksanakan program hingga pada baris ini. Di samping kanan adalah daftar variabel yang dideklarasikan dalam program ini. Karena baris yang kita pilih adalah baris pertama setelah deklarasi pada subrutin main, maka hanya satu variabel yang tersedia, yaitu yang berasal dari arg. Menjalankan program langkah per langkah Apabila Anda sudah berada dalam mode debugging, Anda bisa melakukan navigasi untuk melakukan eksekusi sesuka Anda. Ada beberapa pilhan yang disediakan oleh Eclipse, semuanya terdapat dalam menu Run yaitu : Resume melanjutkan eksekusi program yang berhenti. Suspend menghentikan sementara program yang sedang jalan. Terminate menghentikan sesi debugging saat ini. Step Into mengeksekusi SATU perintah atau masuk ke dalam subrutin. Step Over mengeksekusi SATU perintah. Jika perintah tersebut merupakan perintah panggilan subrutin, maka subrutin tersebut akan dieksekusi tanpa masuk ke dalam subrutin yang dipanggil tersebut. Step Return mengeksekusi seluruh perintah pada subrutin ini kemudian kembali kepada pemanggilnya.

61 Run to Line menjalankan program dari baris tempat berhentinya program sekarang hingga baris yang Anda tentukan. Atau jika di antaranya terdapat breakpoint lagi, maka program akan berhenti di breakpoint tersebut. Mari kita coba untuk menjalankan progam satu langkah dengan menggunakan "Run -> Step Over" atau tombol F6. Berikut ini adalah screen shot setelah program maju satu langkah. Perhatikan bahwa tanda panah maju satu langkah. Dan juga karena instruksi pada baris ini adalah mendeklarasikan variabel x bertipe double, dan kemudian mengisinya dengan 0, variabel ini akan muncul di kanan atas perspektif Debug. Lakukan terus Step Over hingga program berakhir, dan Anda akan melihat langkah demi langkah bagaimana program dijalankan secara bertahap. Perlu diingat, pada saat program sampai pada instruksi untuk mengambil input Anda, klik bagian bawah (tab yang bernama Console), dan masukkan angka sebagai input kemudian tekan Enter. Lihat bagaimana variabel di kanan atas berubah sesuai dengan input yang Anda berikan.

62 Melihat dan mengubah isi variabel Di sini saya jalankan program setiap baris hingga a = a + 1 seperti pada gambar berikut. Kemudian, saya ingin memperpanjang perulangan, sehingga bukan melakukan 5 kali perulangan, tetapi 6 kali, yaitu dengan mengubah nilai a menjadi -1. Ini bisa dilakukan yaitu dengan mengklik nilai dari a, yang semula 0, kemudian diganti menjadi -1, seperti pada screen shot berikut.

63 Setelah diganti coba jalankan program hingga selesai, misalnya dengan "Run -> Resume". Jangan lupa untuk memasukkan inputnya di bagian Console. Lihat sekarang bilangan ke-0 ditanyakan 2 kali, yang artinya user diperintahkan untuk memasukkan 6 bilangan. Tentunya hasil rata-ratanya salah, karena perhitungan rata-rata dilakukan dengan rumus x = x/5, dalam hal ini seharusnya adalah 6. Setelah selesai melakukan debugging, Anda mungkin ingin mengubah perspektif kembali seperti semula. Caranya, di bagian paling kanan (lihat gambar dibawah), klik tanda >> kemudian pilihan akan muncul. Klik perspektif Java untuk mengubahnya menjadi tampilan semula. while dan do... while Posted Sen, 02/16/ :51 by belajarprogram Versi ramah cetak Pernyataan while Pernyataan while telah diperkenalkan pada bagian sebelumnya. Perulangan while memiliki bentuk while (suatu_kondisi) perintah

64 perintah bisa juga berupa blok yang berisi kumpulan perintah-perintah di antara { dan. perintah ini disebut juga dengan inti perulangan. Inti perulangan akan terus dieksekusi selama suatu_kondisi bernilai true. suatu_kondisi ini disebut juga penguji perulangan. Ada beberapa hal yang mungkin jadi pertanyaan. Apa yang terjadi jika suatu_kondisi sudah bernilai false sejak pertama kali komputer sampai pada pernyataan ini? Dalam hal ini blok perulangan tidak akan dieksekusi sama sekali. Program akan melompat ke perintah berikutnya di luar blok perulangan. Lalu apa yang terjadi jika suatu_kondisi bernilai false di tengah-tengah perulangan, apakah program keluar dari perulangan saat itu juga? Dalam hal ini, tentunya tidak. Program akan mengeksekusi semua perintah hingga akhir blok selesai. Setelah itu program akan kembali ke pernyataan while, dan setelah mengevaluasi kembali suatu_kondisi, dan jika hasilnya salah, baru program akan melompat ke perintah berikutnya di luar blok. Mari kita ubah sedikit algoritma yang kita buat di bagian sebelumnya. Kali ini kita akan membuat program yang menghitung rata-rata dengan cara menanyakan suatu bilangan kepada user, kemudian program akan berhenti jika masih ada data yang akan diproses. Inisialisasi jumlah dengan 0 Inisialisasi n (berapa data yang dimasukkan user) dengan 0 while (masih ada data yang akan diproses): Minta input dari user Tambah jumlah dengan input dari user Tambah n dengan 1 Bagi jumlah dengan n untuk menghitung rata-rata Cetak rata-rata ke layar Pertanyaan berikutnya, bagaimana menentukan masih ada data yang akan diproses? Cara yang paling mudah adalah melihat apakah nilai yang dimasukkan user bernilai 0. Nol di sini bukan termasuk data yang akan dijumlahkan tetapi bertugas sebagai sinyal bahwa tidak ada lagi data yang harus dimasukkan. Lalu bagaimana kita harus menguji bahwa data yang dimasukkan bernilai 0 atau bukan? (Ingat, kita baru menanyakan data di dalam blok perulangan. Pada saat komputer pertama kali menemui perulangan while, komputer tidak tahu apa-apa.) Dalam hal ini, kita akan sedikit ubah algoritma kita seperti berikut : Inisialisasi jumlah dengan 0 Inisialisasi n (berapa data yang dimasukkan user) dengan 0 Minta input dari user while (input tidak sama dengan 0): Tambah jumlah dengan input dari user Tambah n dengan 1 Minta input dari user Bagi jumlah dengan n untuk menghitung rata-rata Cetak rata-rata ke layar

65 Pada dasarnya, kita tanyakan user terlebih dahulu sebelum perulangan while. Dengan cara ini, kita bisa mendapat nilai input untuk dievaluasi pada pernyataan while. Di dalam perulangan while, kita tempatkan pertanyaan untuk mendapat input dari user di akhir perulangan. Artinya, setelah kita memproses input dari user, kita akan tanyakan lagi kepada user untuk mendapatkan kondisi untuk mengevaluasi kondisi while berikutnya. Perhatikan juga bahwa ketika 0 dimasukkan, program tidak akan menghitung nilai 0 lagi. Di algoritma sebelumnya, nilai 0 akan ikut dijumlahkan dan n akan bertambah 1, padahal 0 bukan data. Nol hanya berfungsi sebagai sinyal bahwa perulangan harus selesai. Masalah ini sangat amat umum ditemui oleh programmer, karena menghitung satu demi satu ternyata tidak mudah. Untuk itu debugger diperlukan untuk melihat lebih detail apa yang dilakukan oleh komputer. Kita bisa ubah algoritma di atas menjadi program Java sebagai berikut. (Seperti biasa program ini bisa diunduh dalam bentuk zip file atau di alamat SVN berikut: ) package ratarata; import java.io.*; public class RataRata { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub double jumlah = 0; double bilangan = 0; int n = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String strbilangan = null; berhenti"); System.out.print("Masukkan bilangan pertama : "); try { strbilangan = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program System.exit(1); // mengubah input menjadi double agar bisa diproses lebih lanjut bilangan = Double.parseDouble(strbilangan); while (bilangan!= 0) { jumlah += bilangan; jumlah + bilangan n++; // sama dengan : jumlah = // sama dengan : n = n+1

66 // tanya user input System.out.print("Masukkan bilangan berikutnya (atau 0 untuk mengakhiri) : "); try { strbilangan = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti"); System.exit(1); // mengubah input menjadi double agar bisa diproses lebih lanjut bilangan = Double.parseDouble(strbilangan); // hitung rata-rata double ratarata = jumlah/n; // cetak hasilnya ke layar if (n == 0) { System.out.println("Data kosong, rata-rata tidak bisa dihitung"); else { System.out.println("Anda memasukkan " + n + " data"); System.out.println("Rata-rata bilangan yang dimasukkan adalah " + ratarata); Berikut hasil keluarannya : Pernyataan do... while Kadang-kadang akan lebih mudah menulis perulangan jika penguji perulangan dilakukan di akhir badan perulangan. Dalam hal ini badan perulangan akan dieksekusi terlebih dahulu tanpa memperdulikan apakah suatu kondisi bernilai true atau false. Pengujian dilakukan di akhir setelah suatu kondisi didapat dalam eksekusi perulangan pertama kali. Pernyataan do... while pada dasarnya merupakan pernyataan while terbalik, dengan bentuk.

67 do perintah while (suatu_kondisi); Atau apabila perintah berbentuk blok kumpulan perintah-perintah, bisa juga ditulis dalam bentuk do { perintah-perintah while (suatu_kondisi); Perlu diingat bahwa pernyataan do... while diakhiri dengan tanda ; di akhir while. Contoh sederhana adalah program bermain game, di mana game akan menanyakan apakah user ingin bermain lagi. do { main game tanya user apakah ingin main lagi while (user menjawab ya); Jika suatu saat Anda harus menulis kondisi pada pernyataan while seperti ini while (jawaban == true), Anda bisa mengganti pernyataan ini menjadi while (jawaban). Menguji apakah jawaban sama dengan true sama artinya dengan melihat apakah jawaban berisi "true". Demikian juga dengan while (jawaban == false), bisa diganti dengan while (! jawaban). Seperti dijelaskan pada bab tentang operator boolean, operator! membalik isi dari boolean, misalnya dari true menjadi false atau sebaliknya. Dengan menuliskan while (!jawaban) berarti sama dengan menguji apakah jawaban berisi false. Pernyataan do... while memberikan keleluasaan kepada Anda untuk berekspresi dengan lebih lugas. Sebenarnya, untuk memecahkan suatu masalah dengan perulangan do... while juga bisa diekspresikan dengan perintah while, demikian juga sebaliknya. do perintah while (suatu_kondisi); bisa dituliskan dalam bentuk perintah while (suatu_kondisi) perintah Demikian juga dengan while (suatu_kondisi) perintah

68 bisa juga dituliskan dalam bentuk if (suatu_kondisi) { do { perintah while (suatu_kondisi); tanpa merubah aliran program sama sekali. Pernyataan break dan continue Pernyataan while dan do... while menguji kondisi di awal atau di akhir badan perulangan. Pengujian bisa juga dilakukan di tengah-tengah badan perulangan, kemudian memerintahkan program untuk keluar dari badan perulangan saat itu juga. Caranya dengan menggunakan perintah break<code>, sehingga program seperti <code>while (suatu_kondisi) perintah bisa ditulis dalam bentuk while (true) perintah if (!suatu_kondisi) break; <code> Apa makna dari program di atas? <code>while (true) artinya memerintahkan program untuk melakukan perulangan selamanya, karena true tidak akan berubah. Di tengah-tengah program, kita uji apakah suatu_kondisi bernilai false. Jika ya, maka perintah break akan dieksekusi yang menyebabkan program keluar dari badan perulangan ke perintah berikutnya di luar badan perulangan. Kadang-kadang gaya penulisan ini lebih masuk akal ketimbang gaya penulisan baku seperti while atau do... while, tapi tentu saja ini tergantung dari cara pikir masingmasing programmer dan juga masalah yang akan dipecahkan. Pernyataan while atau do... while dapat dibuat bertingkat, misalnya membuat blok while dalam blok while. while (suatu_kondisi) { perintah while (kondisi_lain) { perintah_lain while (kondisi_lain_lagi) { perintah_baru

69 Apabila perintah break diberikan, maka program akan keluar dari perulangan yang berada persis di atasnya. Misalnya, apabila perintah break diberikan setelah perintah_lain maka program akan keluar dari dalam perulangan while (kondisi_lain). Perlu diingan juga apabila perintah break diberikan di dalam pernyataan if, maka program akan keluar dari perulangan yang persis di atasnya. Selain perintah break yang secara langsung menghentikan perulangan, perintah continue digunakan untuk menghentikan operasi saat itu, mengabaikan perintah hingga perulangan berakhir, kemudian kembali kepada perintah while lagi. Misalnya, while (suatu_kondisi) { perintah continue; perintah_lagi perintah_lain_lagi Perulangan akan menjalankan perintah, mengabaikan perintah_lagi dan perintah_lain_lagi, kemudian kembali kepada pernyataan while untuk mengevaluasi apakah suatu_kondisi bernilai true. Jika ya perulangan akan diteruskan. Tetapi karena ada perintah continue, artinya selama perulangan tersebut berjalan, perintah_lagi dan perintah_lain_lagi tidak akan pernah dieksekusi. Perulangan for Posted Jum, 02/20/ :07 by belajarprogram Versi ramah cetak Kita akan membahas bentuk perulangan lain, yaitu perulangan for. Setiap bentuk perulangan for dapat diubah menjadi bentuk perulangan while dengan fungsi yang sama tanpa mengubah alur program. Tetapi tergantung dari permasalahan yang akan kita pecahkan, menulis program dengan for akan membuat alur program lebih mudah dipahami. Misalnya, kita akan menghitung Kita bisa ekspresikan program tersebut dalam bentuk i = 1; jumlah = 0; while (i <= 100) { jumlah += i; i++;

70 Perulangan ini dapat ditulis juga dengan jumlah = 0; for (i = 1; i <= 100; i++) jumlah += i Apa point-point penting yang kita lihat dari perubahan ini? Pertama mari kita lihat bentuk penggunaan while yang umum dilakukan inisialisasi variabel while (suatu_kondisi_variabel) { perintah update_variabel Di sini perulangan while memiliki 3 komponen penting, yaitu inisialisasi, yaitu memberikan nilai awal suatu variabel, suatu_kondisi_variabel, yaitu pengujian bahwa perulangan akan terus dilakukan selama kondisi ini bernilai true, dan terakhir update_variabel, yaitu instruksi mengubah nilai kondisi variabel untuk membatasi perulangan sehingga akan selesai suatu saat, tidak berulang terus menerus. Pada perulangan for, ketiga komponen ini dirangkai menjadi satu dalam bentuk for (inisialisasi_variabel; kondisi_variabel; update_variabel) perintah atau jika perintah merupakan blok yang terdiri dari banyak perintah, dapat dituliskan juga dalam bentuk for (inisialisasi_variabel; kondisi_variabel; update_variabel) { banyak_perintah Di sini inisialisasi variabel bisa berupa apa saja yang berbentuk perintah, misalnya memberikan variabel dengan nilai awal tertentu, dalam bentuk variabel = nilai_awal. kondisi_variabel harus berbentuk pernyataan boolean seperti suatu_kondisi pernyataan while. Sedangkan update_variabel juga berbentuk perintah. pada inisialisasi_variabel, kondisi_variabel, atau update_variabel dapat dikosongkan dan tidak harus selalu diisi. Bagian yang tidak diisi yang selalu digantikan dengan true, yang artinya perulangan akan terus dieksekusi tanpa henti. Untuk menghentikannya, perintah break harus diberikan ditengah-tengah badan perulangan. Bentuk paling umum dari perulangan for adalah menghitung. Biasanya perulangan ini memiliki bentuk seperti

71 for (variabel = nilai_minimum; variabel <= nilai_maksimum; variabel++) { perintah Perhatikan bagian terakhir adalah menaikkan nilai variabel dengan 1, yang artinya perulangan akan dimulai dengan nilai_minimum, diakhiri dengan nilai_maksimum dengan jeda 1. Contoh, jika kita ingin berhitung 2,5,8,11,14,17, atau dengan kata lain, mulai dari 2 hingga 17 dengan jeda 3, kita bisa mengekspresikan for dengan for (i = 2; i <= 17; i += 3) { System.out.println(i); Untuk menghitung mundur, kita bisa menggunakan perintah seperti for (i = 20; i >= 0; i--) { System.out.println(i); Atau jika kita ingin menghitung maju dan mundur pada saat yang bersamaan, misalnya i dari 1 hingga 10 dan j dari 10 hingga 1, kita bisa ekspresikan dengan for (i = 1, j = 10; i <= 10; i++, j--) { System.out.println(i + " " + j); Catatan penting! Variabel yang akan digunakan, dalam contoh di atas i dan j, adalah variabel yang harus dideklarasikan sebelumnya. Java adalah bahasa pemrograman ketat, yang artinya semua harus didefinisikan dengan jelas sebelum digunakan. Untuk banyak kasus, deklarasi variabel dan perulangannya bisa dilakukan serentak pada bagian inisialisasi variabel. Misalnya for (int i = 1; i <= 10; i++) { System.out.println(i) Perhatikan ada imbuhan int di depan inisialisasi variabel i, yang merupakan deklarasi variabel i dengan tipe data int sekaligus menginisialisasi nilainya dengan 1. Perulangan for bertingkat Seperti pada perulangan while, perulangan for pun dapat dilakukan bertingkat, artinya perulangan for di dalam perulangan for. Kita ambil contoh sederhana misalnya membuat tabel perkalian seperti

72 Program untuk membuat tabel perkalian tersebut bisa diekspresikan dengan algoritma pseudocode sebagai berikut untuk setiap baris i = 1,2,3...,12 cetak perkalian i dengan 1,2,3..12 cetak baris baru Kalau kita jabarkan lebih lanjut, perintah kedua juga merupakan perulangan dari 1 hingga 12, sehingga algoritma di atas bisa kita tulis sebagai untuk setiap baris i = 1,2,3...,12 untuk setiap kolom j = 1,2,3...,12 cetak i*j cetak baris baru Kita bisa terjemahkan ke dalam bahasa Java sebagai for (int i = 1; i <= 12; i++) { for (int j = 1; j <= 12; j++) { System.out.print(i*j + " "); System.out.println(""); Berikut ini adalah contoh program yang bisa diunduh dalam bentuk zip file atau dari gudang SVN di alamat : package tabelperkalian; public class TabelPerkalian { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub for (int i = 1; i <= 12; i++) { for (int j = 1; j <= 12; j++) { System.out.print(i*j + " "); System.out.println("");

73 Berikut ini hasil kelurannya: Pernyataan if Posted Min, 02/22/ :19 by belajarprogram Versi ramah cetak Pernyataan if merupakan salah satu pernyataan percabangan pada Java, dengan bentuk umum seperti if (suatu_kondisi) perintah1 else perintah2 Seperti biasa, perintah1 dan perintah2 bisa berbentuk blok yang terdiri dari beberapa perintah. Pernyataan if merupakan bentuk percabangan 2 arah. Bagian else yang terdiri dari kata "else" dan perintah2 tidak selalu harus ada. Perhatikan bahwa baik perintah1 dan perintah2 bisa merupakan pernyataan if itu sendiri. Ada beberapa hal menarik yang mungkin berguna. Ambil contoh dalam pernyataan berikut if (x > 0) if (y > 0) System.out.println("perintah1"); else System.out.println("perintah2");

74 Pertama-tama, komputer tidak peduli bagaimana Anda memformat paragraf dan indentasi dari pernyataan if tersebut. Java akan menganggap else terkait dengan if terdekat, sehingga kode di atas akan dianggap seperti if (x > 0) if (y > 0) System.out.println("perintah1"); else System.out.println("perintah2"); di program di atas akan dianggap bagian dari pernyataan jika y > 0, padahal yang kita maksud adalah else jika x > 0. Untuk memperbaikinya, kita tambahkan tanda kurung { sehingga menjadi else if (x > 0) { if (y > 0) System.out.println("perintah1"); else System.out.println("perintah2"); Kedua pernyataan tersebut memiliki arti yang berbeda. Jika x <= 0, pada kode pertama Java tidak mencetak apa-apa ke layar, sedangkan kode kedua java akan mencetak "perintah2". Lebih menarik lagi, perhatikan kode berikut if (kondisi_pertama) perintah1 else if (kondisi_kedua) perintah2 else perintah3 Lagi-lagi karena Java tidak membedakan indentasi penulisan, maka kode tersebut akan diterjemahkan Java seperti if (kondisi_pertama) perintah1 else if (kondisi_kedua) perintah2 else perintah3 Dengan kata lain perintah tersebut lebih seperti percabangan 3 arah. Komputer akan mengeksekusi hanya salah satu dari perintah1, perintah2, atau perintah3. Komputer akan mengevaluasi kondisi_pertama, jika true, maka perintah1 dieksekusi sementara perintah2 dan perintah3 diabaikan. Jika false, maka kondisi_kedua akan

75 dievaluasi. Jika true, maka perintah2 akan dieksekusi dan perintah3 diabaikan. Jika false, maka hanya perintah3 saja yang dieksekusi. Berikut ini adalah contoh penggunaan percabangan 3 arah. if (suhu < 20) System.out.println("Dingin"); else if (suhu < 30) System.out.println("Lumayan"); else System.out.println("Panas"); Kita bahkan dapat membentuk pernyataan if-else ini menjadi percabangan N arah, misalnya if (kondisi_pertama) perintah1 else if (kondisi_kedua) perintah2 else if (kondisi_ketiga) perintah3 else if (kondisi_keempat) perintah4... else if (kondisi_kenminus1) perintahnmin1 else perintahn Contoh berikut ini adalah mengurutkan 3 bilangan dari kecil ke besar. Misalnya kita mempunyai 3 variabel a,b dan c. Bilangan yang paling kecil adalah bilangan yang lebih kecil dari kedua bilangan yang lain. Sekarang mari kita rangkai logika untuk menentukan urutan bilangan dari kecil ke besar. Mula-mula kita cek apakah a lebih kecil dari b dan c, yaitu dengan pernyataan if (a < b && a <c) Jika a betul merupakan bilangan terkecil, maka kita uji apakah b lebih kecil dari c dengan perintah if (b < c) Jika a bukan bilangan terkecil, maka b atau c, salah satunya bisa merupakan bilangan terkecil. Kita hanya perlu membandingkan apakah b lebih kecil dari c dengan if (b < c)

76 Jika b lebih kecil dari c, berarti kita tahu bahwa b adalah bilangan terkecil. Tetapi kita belum tahu apakah bilangan terkecil berikutnya adalah a atau c, sehingga kita harus menguji lagi dengan if (a < c) Jika a lebih kecil dari c, maka urutannya adalah b, a, c. Jika tidak, maka urutannya adalah b, c, a. Demikian halnya apabila jika b > c, maka kita bisa tentukan urutan bilangannya. Keseluruhan logika ini, bisa kita tuangkan dalam bentuk : if (a < b && a < c) { if (b < c) System.out.println(a else System.out.println(a else if (b < c) { if (a < c) System.out.println(b else System.out.println(b else { if (a < b) System.out.println(c else System.out.println(c + " " + b + " " + c); + " " + c + " " + b); + " " + a + " " + c); + " " + c + " " + a); + " " + a + " " + c); + " " + b + " " + a); Logika di atas bisa juga dituangkan dengan cara lain, yaitu melihat urutannya. Pertama kita cek apakah a < b. Jika ya, kita tahu bahwa urutannya pasti a terlebih dahulu baru b. Kemudian kita lihat apakah c berada di sebelah kiri a atau disebelah kanan b atau di tengah-tengah. Demikian seterusnya jika urutannya b terlebih dahulu baru a. Sehingga kodenya bisa dituliskan dalam bentuk : if (a < b) { if (c < a) System.out.println(c else if (c > b) System.out.println(a else System.out.println(a else { if (c < b) System.out.println(c else if (c > a) System.out.println(b else System.out.println(b + " " + a + " " + b); + " " + b + " " + c); + " " + c + " " + b); + " " + b + " " + a); + " " + a + " " + c); + " " + c + " " + a);

77 Pernyataan switch Posted Min, 02/22/ :31 by belajarprogram Versi ramah cetak Penyataan percabangan kedua yang dimiliki Java adalah switch. Pernyataan switch lebih jarang digunakan, tetapi sering bermanfaat apabila kita ingin menuliskan percabangan multi arah. Pernyataan switch memiliki bentuk sebagai berikut switch (ekspresi) { case nilai1: perintah1 break; case nilai2: perintah2 break; case nilai3: perintah3 break; default: perintah_lain Di sini pernyataan switch akan mencari nilai ekspresi yang sesuai dengan nilai-nilai yang didaftarkan pada pernyataan case. Jika salah satu nilai ditemui, maka program akan melompat ke cabang case tersebut dan melakukan perintah yang terdapat di sana. Jika tidak ditemui, maka program akan melompat ke perintah yang terdapat pada pernyataan default. Catatan ekspresi hanya bisa berbentuk nilai bilangan bulat (int, short, dan sejenisnya) atau karakter, sehingga kita tidak bisa menggunakan switch untuk mengevaluasi ekspresi yang berbentuk String. Pernyataan break di atas sebetulnya tidak harus selalu ada. Tetapi, perintah break di sini memerintahkan komputer agar segera keluar dari blok switch apabila perintah tersebut telah selesai dilaksanakan. Apabila perintah break tidak diberikan, maka program akan terus mengeksekusi perintah lain meskipun sudah berada di luar nilai yang tertera dalam pernyataan casenya. Misalnya, lihat kode berikut ini : switch (N) case 1:

78 System.out.println("Angka break; case 2: case 3: case 4: case 5: System.out.println("Angka break; case 6: case 7: case 8: System.out.println("Angka break; default: System.out.println("Angka tersebut bernilai 1"); tersebut bernilai 2, 3, 4, atau 5"); tersebut bernilai 6, 7, atau 8"); tersebut tidak bernilai 1-8"); Salah satu aplikasi di mana pernyataan switch berguna adalah untuk memproses menu. Menu memiliki beberapa pilihan dan user akan diminta untuk memilih suatu pilihan. Kita dapat menggunakan switch untuk menginstruksikan komputer untuk melakukan tugas tertentu sesuai dengan menu yang dipilih oleh user. Jika Anda ingat pernyataan main() pada program Java, pernyataan main memiliki parameter String[] args, di mana args merupakan argumen yang diberikan pada saat program dijalankan melalui konsol. Biasanya argumen yang diberikan berupa opsi bagaimana program harus dilaksanakan. Di sini pernyataan switch juga berguna untuk memilih bagaimana program akan berjalan. Jika Anda terbiasa atau pernah bergaul dengan Linux, maka tidak asing untuk menemukan perintah pada Linux seperti "ls -l" atau "tar xfz blabla". Di sini ls atau tar adalah nama program dan "-l" atau "xfz blabla" adalah argumen yang diberikan pada saat program dijalankan. Pernyataan kosong Pernyataan kosong sebenarnya merupakan blok kosong, atau sama dengan { tanpa perintah apa-apa di dalamnya. Dalam Java, pernyataan kosong juga berarti tanda ; sehingga apabila Anda menulis kode seperti if (x > 0); perintah1 maka perintah1 akan tetap dilaksanakan walaupun x <= 0. Perintah kosong sering merupakan sumber kesalahan dan salah satu fitur yang sulit untuk dicari kesalahannya pada saat debugging. Misalnya perintah berikut for (i = 1; i <= 10; i++); System.out.println("hallo");

79 Anda berharap untuk mencetak kata hallo 10x di layar, pada kenyataannya hanya 1 hallo yang dicetak. Kenapa? Karena tanda ";" setelah for menyatakan bahwa program tidak melakukan apa-apa di dalam perulangan. Perintah System.out.println("hallo") tidak berada di dalam perulangan for, sehingga perintah ini hanya dijalankan 1x saja. Pernyataan-pernyataan lain Hingga saat ini kita sudah membahas hampir semua pernyataan yang Java sediakan. Ada beberapa yang akan kita bahas kemudian, tetapi pernyataan-pernyataan ini merupakan pernyataan lanjutan Java, seperti return yang digunakan untuk membuat subrutin sendiri, atau try...catch dan throw untuk mengontrol alur kesalahan apabila ditemui di tengah program (atau dengan kata lain eksepsi atau pengecualian), dan synchronized untuk mengatur kontrol untuk multi-threading. Beberapa kata kunci lain akan juga dibahas pada subjek tentang pemrograman berorientasi objek yang akan kita bahas kemudian. Contoh Program switch case Posted Sel, 02/24/ :34 by belajarprogram Versi ramah cetak Kita akan membuat program untuk main suit. Permainan ini terdiri dari dua pemain. Dalam permainan real, biasanya dua pemain mengadu suit dengan saling menunjukkan jari. Hanya 3 jari yang boleh dipakai: jempol, telunjuk, dan kelingking. Peraturannya : Jempol menang lawan Telunjuk, Telunjuk menang lawan Kelingking, dan Kelingking menang lawan Jempol. Dalam program ini, komputer adalah pemain pertama, sedangkan user adalah pemain kedua. Komputer akan menggunakan perintah random() untuk menghitung salah satu dari 3 pilihan. 0 berarti Jempol, 1 berarti Telunjuk, dan 2 berarti Kelingking. User akan diberikan pertanyaan untuk memasukkan J untuk Jempol, T untuk Telunjuk dan K untuk Kelingking. Kemudian dengan pernyataan switch, J, T, dan K akan diubah menjadi angka 0, 1, dan 2 seperti pada komputer. Hasil perhitungan komputer dan hasil input dari user akan dibandingkan, kemudian hasilnya siapa yang menang akan ditampilkan di layar. package mainsuit; import java.io.*; public class MainSuit { /** args

80 */ public static void main(string[] args) { // TODO Auto-generated method stub // cetak aturan main dan input dari user System.out.println("Permainan suit"); System.out.println("=============="); System.out.println("Masukkan salah satu dari 3 kemungkinan :"); System.out.println("J untuk Jempol"); System.out.println("T untuk Telunjuk"); System.out.println("K untuk Kelingking"); System.out.println(""); // baris kosong // variabel untuk mengambil input dari user BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = null; // Kita gunakan pernyataan while hingga user betul // memasukkan salah satu dari J, T, atau K boolean inputvalid = false; int suitkomputer = 0; int suituser = 0; // selama input tidak valid, jalankan perulangan ini while (!inputvalid) { System.out.print("Masukkan suit Anda "); try { input = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti"); System.exit(1); // // // if pastikan bahwa user memasukkan sesuatu dengan mengecek apakah panjang input > 0 jika tidak, maka perulangan akan dilanjutkan (input.length() > 0) { switch (input.charat(0)) { case 'j' : case 'J' : suituser = 0; inputvalid = true; // kita ganti inputvalid agar perulangan selesai break; case 't' : case 'T' : suituser = 1; inputvalid = true; // kita ganti inputvalid agar perulangan selesai break; case 'k' : case 'K' : suituser = 2; inputvalid = true; // kita ganti inputvalid agar perulangan selesai

81 break; // sekarang menghitung suit komputer // Math.random() menghasilkan nilai acak antara 0 dan 1 // jika kita kali 3, berarti menghasilkan nilai acak antara 0 dan 3 bulat menjadi // perintah (int) untuk mengubah bilangan real menjadi bilangan // dengan cara menghilangkan semua digit di belakang koma // misalnya menjadi 1 suitkomputer = (int)(math.random()*3); // suatu saat "mungkin" nilai random bernilai 3 // karena 3 tidak ada dalam suit kita, maka kita harus ubah // salah satu suit yang valid, yaitu 0, 1, atau 2 // dalam hal ini kita ganti jadi 2 if (suitkomputer == 3) { suitkomputer = 2; // menghitung siapa yang menang switch (suitkomputer) { // jika komputer Jempol case 0: // cetak suit Komputer System.out.println("Suit komputer = Jempol"); switch (suituser) { // jika user Jempol case 0: System.out.println("Seri"); break; // jika user Telunjuk case 1: System.out.println("Anda kalah"); break; // jika user Kelingking case 2: System.out.println("Anda menang"); break; break; // dari switch(suitkomputer) // jika komputer Telunjuk case 1: // cetak suit Komputer System.out.println("Suit komputer = Telunjuk"); switch (suituser) { // jika user Jempol case 0: System.out.println("Anda menang"); break; // jika user Telunjuk case 1: System.out.println("Seri");

82 break; // jika user Kelingking case 2: System.out.println("Anda kalah"); break; break; // dari switch(suitkomputer) // jika komputer Kelingking case 2: // cetak suit Komputer System.out.println("Suit komputer = Kelingking"); switch (suituser) { // jika user Jempol case 0: System.out.println("Anda kalah"); break; // jika user Telunjuk case 1: System.out.println("Anda menang"); break; // jika user Kelingking case 2: System.out.println("Seri"); break; break; // dari switch(suitkomputer) Berikut ini adalah contoh keluaran program Bab V - Subrutin Posted Min, 02/22/ :59 by belajarprogram Versi ramah cetak Pemrograman kompleks Salah satu cara yang digunakan untuk memecah permasalahan kompleks menjadi permasalahan yang lebih kecil adalah dengan subrutin. Subrutin terdiri dari sekelompok

83 perintah yang melakukan suatu tugas tertentu. Subrutin memiliki nama, sehingga bisa dipanggil suatu saat di bagian lain program. Ketika komputer mengeksekusi program, setiap kali nama subrutin tersebut dipanggil, program akan melaksanakan semua perintah di dalam subrutin tersebut. Subrutin boleh digunakan berulang-ulang, dari mana pun di dalam program, bahkan dari dalam subrutin lain. Dengan cara ini kita bisa membuat subrutin sederhana yang digunakan berulang-ulang di seluruh program. Dengan cara ini, program besar dapat dipecah menjadi bagian-bagian kecil. yang masing-masing melakukan perintah sederhana. Seperti dijelaskan sebelumnya, subrutin bisa berbentuk statik atau non-statik. Dalam bagian ini hanya subrutin statik yang akan dijelaskan lebih lanjut. Subrutin non-statik adalah inti dari pemrograman berorientasi objek, dan akan dijelaskan lebih lanjut pada bab berikutnya. Kotak Hitam Posted Min, 02/22/ :18 by belajarprogram Versi ramah cetak Subrutin terdiri dari beberapa instruksi yang melakukan suatu tugas tertentu, dikumpulkan dalam satu himpunan, dan diberi nama. Kumpulan instruksi ini bisa berupa suatu "tugas" yang cukup kompleks yang disatukan sebagai konsep. Dengan cara ini, kita tidak perlu lagi memikirkan bagaimana komputer melakukan tugas hingga sedetail mungkin. Kita hanya perlu memanggil nama subrutin tersebut untuk menjalankan suatu "tugas". Subrutin sering juga disebut dengan kotak hitam (atau black box) karena kita tidak perlu (atau tidak mau tahu) secara detail apa yang subrutin tersebut lakukan. Kita hanya ingin tahu hubungan kotak hitam tersebut dengan dunia luar. Hubungan ini disebut antar muka (interface). Di kotak itu mungkin ada tombol yang bisa kita tekan, ada keyboard yang bisa kita ketik, atau mungkin ada jendela untuk memberi dan mengambil informasi dari dalamnya. Karena kita bermaksud untuk menyembunyikan kompleksitas (dalam hal ini program yang akan kita buat), ada beberapa prinsip penting dari suatu kotak hitam : Antar muka harus sederhana, jelas, tak berbelit-belit, dan mudah dimengerti. Apa contoh kotak hitam di sekitar kita? Sebetulnya banyak, misalnya TV, handphone, DVD player, MP3 player, kulkas, AC, dan sebagainya. Kita bisa menyalakan TV, mengganti channel, menaikkan dan menurunkan volume dengan mudah tanpa harus mengetahui bagaimana TV bekerja. Sama halnya dengan AC, Anda cukup menekan

84 tombol, menaikkan dan menurunkan temperatur tanpa harus mengerti bagaimana AC bekerja. Sekarang mari kita lihat bagian dalam dari kotak hitam. Bagaimana AC atau TV bekerja disebut dengan implementasi. Aturan kedua dari suatu kotak hitam adalah : Untuk menggunakan kotak hitam, kita tidak perlu mengetahui tentang implementasi. Yang kita butuh adalah antar muka. Sebetulnya kita bisa mengganti implementasi selama apa yang dihasilkan dan apa yang diminta tetap sama. Atau dengan kata lain, perilakunya tidak berubah. Misalnya dulu TV menggunakan tabung hampa, tetapi sekarang menggunakan transistor. Tetapi perubahan implementasi (dari tabung hampa ke transistor) tidak mengubah bagaimana TV dioperasikan dan apa yang kita lihat di TV. Seperti halnya dengan program, kita bisa mengubah implementasi suatu subrutin, misalnya mengoptimasi subrutin tersebut agar lebih cepat, tanpa mengubah perilaku program secara keseluruhan, dan tanpa mengubah perilaku fungsi lain yang memanggil subrutin tersebut. Tentunya untuk membuat kotak hitam, kita perlu mengetahui detail tentang implementasinya. Kotak hitam digunakan untuk membantu baik si pembuat kotak hitam maupun penggunanya. Pada akhirnya, kotak hitam tersebut akan digunakan dalam bermacam-macam situasi. Orang yang membuat kotak hitam ini tidak perlu mengerti bagaimana kotaknya akan digunakan. Pembuatnya hanya menjamin bahwa kotak yang dibuat harus bekerja sesuai dengan yang diharapkan. Aturan ketiga dari kotak hitam : Pembuat (implementor) kotak hitam tidak perlu tahu bagaimana kotak hitam itu akan digunakan. Dengan kata lain, kotak hitam membagi dunia menjadi 2 bagian, yaitu bagian luar, untuk apa ia digunakan, dan bagian dalam, yaitu detail bagaimana ia bekerja. Antar muka kotak hitam tidak melulu harus berupa koneksi fisik antara kotak hitam dengan dunia luar. Antar muka bisa juga berupa spesifikasi yang menjelaskan apa yang dilakukan kotak hitam tersebut, dan perilakunya terhadap input yang diterimanya. Tidak cukup untuk menyebutkan bahwa TV membutuhkan colokan kabel, tetapi harus disebutkan bahwa colokan kabel digunakan untuk menyambung aliran listrik ke TV supaya TV bisa dinyalakan. Dalam bahasa pemrograman, antar muka dari suatu subrutin harus terdiri dari komponen sintaks dan semantik. Bagian sintaks dari subrutin mengandung penjelasan tentang apa yang harus diketik untuk memanggil subrutin tersebut. Dan bagian semantik menjelaskan bagaimana secara khusus apa yang akan dikerjakan oleh subrutin tersebut. Untuk menulis program yang benar, kita harus mengetahui spesifikasi sintaks dari subrutin tersebut. Untuk mengerti dan bisa menggunakan subrutin tersebut seefektif mungkin, kita harus mengetahui spesifikasi semantiknya. Kedua bagian dari subrutin tersebut bisa disebut sebagai kontrak subrutin.

85 Kontrak subrutin bisa dijelaskan seperti "Ini yang harus Anda lakukan untuk menggunakan saya, dan ini yang akan saya lakukan untuk Anda". Ketika kita menulis subrutin, komentar yang kita tulis untuk menjelaskan subrutin itu harus memuat kontrak subrutin tersebut. Kadang kala kontrak ini seringkali tidak dituliskan dengan benar, sehingga programmer yang menggunakannya harus menerka apa yang akan dilakukan. Tentu saja ini tidak efisien dan menghabiskan banyak waktu apabila kita harus menerka semua subrutin yang terdapat dalam bahasa pemrograman. Subrutin Statik dan Variabel Statik Posted Min, 02/22/ :44 by belajarprogram Versi ramah cetak Setiap subrutin yang dideklarasikan dalam Java harus dideklarasikan di dalam suatu Kelas (Class). Hal ini mungkin membuat Java sedikit tidak normal, karena dalam bahasa pemrograman lain, subrutin bisa diletakkan di mana saja termasuk di luar kelas. Salah satu dari fungsi kelas adalah menggabungkan subrutin dan variabel bersama. Dan ini tidak mudah apabila subrutin dan variabel berada di luar kelas, terutama apabila beberapa paket harus digabungkan menjadi satu seperti dalam program kompleks. Akan terdapat banyak kebingungan yang mungkin diakibatkan dari nama subrutin atau nama variabel yang sama. Subrutin yang dideklarasikan di dalam kelas disebut dengan metode (method). Di bab kemudian kita akan menggunakan istilah metode, tetapi bab ini kita akan menggunakan subrutin dalam artiannya sebagai subrutin statik. Metode akan digunakan untuk subrutin non-statik yang lebih merupakan sifat dari objek, dan bukan bagian dari kelas itu sendiri. Definisi subrutin dalam bahasa pemrograman Java dapat dituliskan dalam bentuk sifat tipe_keluaran nama_subrutin ( daftar parameter ) { perintah Kita sudah pernah mendefinisikan suatu subrutin, yaitu subrutin main(). Paling tidak kita sudah kenal bagaimana subrutin didefinisikan. yang terdapat di antara { dan disebut juga badan subrutin. Perintah ini merupakan badan atau implementasi suatu subrutin, seperti yang dibahas sebelum pada penjelasan tentang kotak hitam. Perintah ini merupakan instruksi yang akan dieksekusi oleh komputer pada saat subrutin ini dipanggil. perintah sifat adalah sifat dari subrutin itu sendiri. Beberapa sifat yang pernah kita lihat adalah static dan public. Ada lebih dari selusin sifat yang bisa diberikan kepada subrutin. Jika kita akan membuat fungsi, yaitu subrutin yang menghitung suatu nilai kemudian mengembalikan hasilnya, maka tipe_keluaran adalah tipe data dari keluaran yang

86 dihasilkan oleh fungsi tersebut. Kita akan membahas lebih lanjut tentang keluaran pada bagian berikutnya. Jika subrutin kita bukan fungsi dan tidak menghasilkan nilai apa-apa, kita gunakan tipe data spesial yang dinamakan void untuk menunjukkan bahwa tidak ada nilai keluaran yang akan dikembalikan oleh subrutin tersebut. Akhirnya kita sampai pada daftar parameter. Parameter adalah bagian dari antar muka suatu subrutin. Parameter adalah informasi yang diberikan kepada suatu subrutin dari dunia luar, untuk digunakan dalam eksekusi subrutin tersebut. Kasus sederhana misalnya televisi memiliki subrutin gantichannel(). Pertanyaan yang akan muncul adalah ganti channel ke mana? Dalam hal ini parameter dapat digunakan, misalnya channel berbentuk bilangan bulat (int) dan deklarasi subrutin gantichannel dapat berbentuk seperti public void gantichannel(int channel) {... Pernyataan tersebut berarti subrutin gantichannel() memiliki parameter channel yang bertipe int. Akan tetapi channel belum memiliki nilai. Nilainya akan diberikan pada saat subrutin ini dipanggil, misalnya dengan gantichannel(17); Daftar parameter dari suatu subrutin bisa juga kosong, atau bisa berisi lebih dari satu parameter dalam bentuk tipe_data nama_parameter Jika ada lebih dari satu parameter, maka parameter-perameter tersebut dihubungkan dengan koma. Catatan bahwa masing-masing parameter harus terdiri dari satu tipe data dan satu nama, misalnya double x, double y dan bukan double x, y. Parameter akan dijelaskan lebih lanjut pada bagian berikutnya. Berikut ini adalah beberapa contoh deklarasi subrutin yang umum dilakukan : public static void maingame() { // "public" dan "static" ada sifat; "void" adalah tipe_keluaran // "maingame" adalah nama subrutin // daftar parameternya kosong... // perintah untuk memainkan game ditulis di bagian ini int ambilndata(int N) { // tidak ada sifat, "int" adalah tipe_keluaran // "ambilndata" adalah nama subrutin // dan parameternya adalah N yang memiliki tipe data int... // perintah untuk mengambil N data ditulis di bagian ini static boolean kurangdari(double x, double y) {

87 // "static" adalah sifat, "boolean" adalah tipe_keluaran // "kurangdari" adalah nama subrutin // parameternya ada 2, yaitu x yang bertipe data double // dan y yang juga bertipe data double... // perintah untuk menguji apakah x lebih kecil dari y ditulis di sini Dalam contoh kedua perhatikan bahwa sifatnya tidak "static", dan subrutin ini tidak dibahas dalam bagian ini. Subrutin pertama memiliki sifat "public" yang artinya subrutin ini dapat dipanggil dari bagian manapun, termasuk dari luar kelas yang dimaksud. Ada lagi sifat subrutin yaitu "private" yang berarti hanya bisa dipanggil dari dalam kelas di mana subrutin tersebut didefinisikan. Sifat "public" dan "private" dinamakan penentu akses (access specifier). Jika tidak disebutkan jenis aksesnya dalam suatu definisi subrutin, maka otomatis subrutin itu memiliki sifat "package" yang artinya hanya bisa dipanggil dari paket yang sama dari kelas di mana ia didefinisikan. Sifat lain yang berkaitan dengan penentu akses adalah "protected" dan ini akan dibahas lebih lanjut pada bagian tentang pemrograman berorientasi objek. Ingatkah bahwa subrutin main() yang biasa kita gunakan dalam contoh-contoh program memiliki bentuk seperti berikut? public static main(string[] args) {... Sifatnya adalah "public" dan "static", namanya adalah "main" dan parameternya adalah args yang bertipe data array dari String. Kita akan bahas tentang array pada bagian struktur data di bab berikutnya. Menjalankan subrutin Ketika kita mendefinisikan subrutin, pada dasarnya kita memberitahu Java bahwa suatu subrutin tersedia dalam suatu kelas. Subrutin tersebut tidak dijalankan sampai ia dipanggil. (Hal ini juga berlaku untuk kelas main(), meskipun kita tinggal memanggilnya secara spesifik, tetapi sistem operasi kita akan memanggil subrutin main() pada saat program tersebut dijalankan.) Misalnya subrutin maingame() di atas dapat dipanggil seperti maingame(); Pernyataan ini dapat dipanggil di mana pun dalam kelas yang sama, meskipun dari dalam subrutin yang berbeda, misalnya dari dalam subrutin main(). Karena maingame() bersifat "public", maka subrutin ini dapat juga dipanggil dari luar kelas di mana ia dideklarasikan. Misalnya, maingame() dideklarasikan dalam kelas Gundu, maka maingame dapat dipanggil dari kelas lain seperti Gundu.mainGame();

88 Penggunaan nama kelas di sini berarti memberitahu Java di mana subrutin maingame() harus dicari (dalam hal ini di dalam kelas Gundu). Dan ini juga membedakan bahwa yang dimainkan adalah Gundu, bukan Catur.mainGame() atau UlarTangga.mainGame(). Lebih umum, untuk memanggil suatu subrutin dapat dilakukan dengan bentuk nama_subrutin(parameter); Dan untuk memanggil subrutin dari luar kelas, bisa dilakukan dalam bentuk nama_kelas.nama_subrutin(parameter); apabila subrutin tersebut memiliki sifat "static". Apabila subrutin tersebut tidak bersifat "statik" maka nama_kelas harus diganti dengan nama objek jelmaan kelas tersebut. (Akan dijelaskan lebih jauh nanti pada bab tentang pemrograman berorientasi objek). Juga, apabila tidak ada parameter yang didefinisikan, maka parameter bisa dihilangkan, tetapi tanda kurungnya () harus tetap ada meskipun kosong. Variabel Statik Suatu kelas juga bisa berisi lain hal selain subrutin, misalnya variabel. Variabel juga bisa didefinisikan di dalam subrutin, yang disebut variabel lokal. Untuk membedakannya variabel yang didefinisikan di dalam kelas disebut variabel anggota, karena variabel tersebut adalah anggota kelas. Seperti subrutin, variabel juga bisa bersifat statik atau non-statik. Di bagian ini kita hanya akan membahas variabel statik. Variabel anggota statik dimiliki oleh kelas, dan akan selalu ada selama kelas tersebut ada. Komputer akan menyiapkan memori tempat penyimpanan variabel statik pada saat Java interpreter dijalankan. Perubahan variabel statik ini akan mengubah isi memori tersebut, tidak peduli dari bagian program mana perubahan variabel ini dilakukan. Kapanpun variabel ini dipanggil, ia akan mengambil data dari memori di mana dia disimpan, tidak peduli bagian program mana yang memanggilnya. Ini berarti variabel statik bisa diisi dari subrutin satu dan dimodifikasi dari subrutin lainnya. Atau dengan kata lain, variabel statik digunakan bersama oleh seluruh bagian kelas. Variabel lokal hanya bisa dipanggil dari dalam subrutin di mana ia dideklarasikan. Deklarasi variabel anggota dapat dilakukan dengan cara yang sama seperti deklarasi variabel dalam subrutin. Kecuali, mereka juga bisa diberi attribut yang berisi sifatnya, misalnya "static", "public", atau "private". Misalnya, static int umur; static private double x;

89 Seperti halnya penentu akses pada subrutin, variabel yang bersifat "private" hanya bisa diakses dari dalam kelas yang bersangkutan, sedangkan variabel "public" dapat diakses dari manapun. Misalnya, kelas System, memiliki variabel out, sehingga bisa kita panggil dari luar dengan System.out. Ketika kita mendeklarasikan suatu variabel di dalam subrutin, kita harus memberi nilai awal untuk variabel tersebut. Akan tetapi untuk variabel anggota, Java otomatis memberi nilai awal, sehingga tidak perlu diinisialisasi terlebih dahulu. Misalnya int akan diberi nilai awal 0, karakter diberi nilai yang berupa karakter dengan nilai Unicode 0, dan String diberi nilai awal null, sementara boolean diberi nilai awal false. Kita tentu saja bisa memberi nilai awal apabila nilai awal yang diberi Java tidak cocok dengan aplikasi kita. Caranya misalnya dengan memberi nilai di awal subrutin main(). Contoh Subrutin - Mengubah Program RataRata Posted Sen, 02/23/ :46 by belajarprogram Versi ramah cetak Kita mulai dengan program RataRata yang kita bahasa pada bagian tentang while dan do... while. Perhatikan bahwa di dalam program tersebut kita harus menulis berulang-ulang untuk mendapatkan input data dari user. Sekarang kita akan pisahkan kode untuk mengambil input dari user dalam kelas yang dinamakan KonsolInput. Pertama-tama buat project baru di Eclipse yang dinamakan RataRata2. Caranya "File -> New -> Java Project" kemudian masukkan RataRata2.

90 Kemudian buat kelas baru yang dinamakan KonsolInput. "File -> New -> Class", masukkan package ratarata2 dan Name KonsolInput seperti gambar berikut : Kita akan membuat subrutin statik yang dinamakan ambildouble() yang tugasnya memberi pertanyaan kepada user, mengambil input dari user dan mengubah input dari user menjadi bilangan real (tipe data double). Kita bisa definisikan subrutin ini dengan public static double ambildouble(string pertanyaan) {... "public" dan "static" adalah sifat subrutin ini, "double" merupakan tipe data keluarannya karena kita ingin subrutin ini mengembalikan input bertipe double sehingga siap untuk digunakan. "ambildouble" adalah nama subrutin ini, dan "String pertanyaan" adalah parameternya yaitu berupa pertanyaan yang diberikan kepada user pada saat data akan diambil. Apa yang harus dilakukan sekarang? Kita ambil perintah untuk mengambil data dari RataRata yaitu : double bilangan = 0;

91 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String strbilangan = null; System.out.print("Masukkan bilangan pertama : "); try { strbilangan = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti"); System.exit(1); lanjut // mengubah input menjadi double agar bisa diproses lebih bilangan = Double.parseDouble(strbilangan); Ingat bahwa parameter "String pertanyaan" adalah pertanyaan yang akan kita ajukan kepada user, sehingga baris System.out.print("Masukkan bilangan pertama : "); kita ganti dengan System.out.print(pertanyaan); Kita akan kembalikan "bilangan" kepada si pemanggil, sehingga di akhir subrutin kita beri perintah return bilangan; yang berarti kembalikan bilangan kepada si pemanggil fungsi ini. Jangan lupa juga untuk menambahkan import java.io.*; di awal kelas karena BufferedReader adalah anggota dari paket ini. Sekarang subrutin ambildouble() menjadi seperti ini package ratarata2; import java.io.*; public class KonsolInput { public static double ambildouble(string pertanyaan) { String strbilangan = null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double bilangan; System.out.print(pertanyaan); try { strbilangan = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti");

92 System.exit(1); bilangan = Double.parseDouble(strbilangan); return bilangan; Kemudian kita buat kelas baru yang dinamakan RataRata2, seperti pada gambar berikut : Dengan menggunakan subrutin yang baru kita buat, kita modifikasi program RataRata menjadi RataRata2 sebagai berikut : package ratarata2; public class RataRata2 { /** args */ public static void main(string[] args) { // TODO Auto-generated method stub double jumlah = 0;

93 double bilangan = 0; int n = 0; bilangan = KonsolInput.ambilDouble("Masukkan bilangan pertama : "); while (bilangan!= 0) { jumlah += bilangan; bilangan n++; // sama dengan : jumlah = jumlah + // sama dengan : n = n+1 bilangan = KonsolInput.ambilDouble("Masukkan bilangan berikutnya (atau 0 untuk mengakhiri) : "); // hitung rata-rata double ratarata = jumlah/n; // cetak hasilnya ke layar if (n == 0) { System.out.println("Data kosong, rata-rata tidak bisa dihitung"); else { System.out.println("Anda memasukkan " + n + " data"); System.out.println("Rata-rata bilangan yang dimasukkan adalah " + ratarata); Perhatikan beberapa perubahan di dalam program ini. Pertama, kita hapus perintahperintah untuk mengambil input dari user karena sudah kita implementasikan pada subrutin ambildouble() di kelas KonsolInput. Di kelas RataRata2, kita panggil subrutin ambildouble() dengan perintah bilangan = KonsolInput.ambilDouble("Masukkan bilangan pertama : "); dan bilangan = KonsolInput.ambilDouble("Masukkan bilangan berikutnya (atau 0 untuk mengakhiri) : "); di mana parameternya adalah pertanyaan yang diberikan kepada user sebelum memasukkan data.

94 Hasil keluarannya sama dengan pada kelas RataRata Contoh Program Subrutin dan Variabel Statik Posted Sel, 02/24/ :51 by belajarprogram Versi ramah cetak Mari kita lihat kembali dan kita akan ubah program MainSuit pada halaman ini. Pertama-tama kita akan ubah algoritma untuk menentukan siapa yang menang. Dalam program sebelumnya, kita gunakan pernyataan switch case, yaitu kita tuliskan semua kemungkinan dalam permainan. Jika Anda ingat, Jempol dilambangkan dengan 0, Telunjuk dilambangkan dengan 1, dan Kelingking dilambangkan dengan 2. Cara lain untuk menentukan pemenangnya adalah dengan mengurangi suitkomputer dan suituser delta = suitkomputer - suituser; Apabila delta = 0, maka permainan berakhir seri. Sekarang coba masukkan apabila komputer 0 (Jempol) dan user 1 (Telunjuk). Dalam hal ini delta bernilai -1, dan ini berarti komputer menang. Dengan kata lain, apabila delta bernilai -1 maka komputer menang, dan apabila delta bernilai 1, maka user menang. Coba lagi juga komputer 0 (Jempol) dan user 2 (Kelingking). Dalam hal ini delta -2, dan ini berarti user menang sesuai dengan aturan bahwa Kelingking menang melawan Jempol. Dengan sifat seperti di atas, kita bisa ubah pernyataan switch case pada program sebelumnya dengan // menghitung siapa yang menang int delta = suitkomputer - suituser; switch (delta) { case 0:

95 seri++; System.out.println("Hasilnya : Seri"); break; case 1: case -2: usermenang++; System.out.println("Hasilnya : Anda menang"); break; case -1: case 2: komputermenang++; System.out.println("Hasilnya : Anda kalah"); break; Kemudian, kita tambahkan lagi variabel statik yang fungsinya digunakan untuk mendata berapa kali komputer menang, berapa kali Anda menang dan berapa kali seri. public static int usermenang = 0; public static int komputermenang = 0; public static int seri = 0; Kemudian kita akan pindahkan sebagian kode pada subrutin main sehingga dapat dipanggil berkali-kali tanpa harus menulis seluruh kode lagi. Kita namakan subrutin ini maingame(). Kodenya sebagai berikut : public static int usermenang = 0; public static int komputermenang = 0; public static int seri = 0; public static void maingame() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // variabel untuk mengambil input dari user String input = null; // Kita gunakan pernyataan while hingga user betul // memasukkan salah satu dari J, T, atau K boolean inputvalid = false; int suitkomputer = 0; int suituser = 0; // selama input tidak valid, jalankan perulangan ini while (!inputvalid) { System.out.print("Masukkan suit Anda "); try { input = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti"); System.exit(1);

96 // // // if pastikan bahwa user memasukkan sesuatu dengan mengecek apakah panjang input > 0 jika tidak, maka perulangan akan dilanjutkan (input.length() > 0) { switch (input.charat(0)) { case 'j' : case 'J' : suituser = 0; inputvalid = true; // kita ganti inputvalid agar perulangan selesai break; case 't' : case 'T' : suituser = 1; inputvalid = true; // kita ganti inputvalid agar perulangan selesai break; case 'k' : case 'K' : suituser = 2; inputvalid = true; // kita ganti inputvalid agar perulangan selesai break; dan 3 bulat // sekarang menghitung suit komputer // Math.random() menghasilkan nilai acak antara 0 dan 1 // jika kita kali 3, berarti menghasilkan nilai acak antara 0 // perintah (int) untuk mengubah bilangan real menjadi bilangan // dengan cara menghilangkan semua digit di belakang koma // misalnya menjadi 1 suitkomputer = (int)(math.random()*3); // suatu saat "mungkin" nilai random bernilai 3 // karena 3 tidak ada dalam suit kita, maka kita harus ubah menjadi // salah satu suit yang valid, yaitu 0, 1, atau 2 // dalam hal ini kita ganti jadi 2 if (suitkomputer == 3) { suitkomputer = 2; // menghitung siapa yang menang int delta = suitkomputer - suituser; switch (delta) { case 0: seri++; System.out.println("Hasilnya : Seri"); break; case 1: case -2:

97 usermenang++; System.out.println("Hasilnya : Anda menang"); break; case -1: case 2: komputermenang++; System.out.println("Hasilnya : Anda kalah"); break; Sekarang kita ubah subrutin main()-nya, sehingga komputer akan menanyakan Anda untuk main lagi atau tidak. Jika jawabannya ya, maka permainan akan diteruskan, dan statistik menang-kalah-seri akan ditampilkan. Jika tidak, hanya tampilkan statistiknya saja, kemudian program akan keluar. public static void main(string[] args) { // TODO Auto-generated method stub // cetak aturan main dan input dari user System.out.println("Permainan suit"); System.out.println("=============="); System.out.println("Masukkan salah satu dari 3 kemungkinan :"); System.out.println("J untuk Jempol"); System.out.println("T untuk Telunjuk"); System.out.println("K untuk Kelingking"); System.out.println(""); // baris kosong while (true) { maingame(); // tampilkan statistik System.out.println("Statistik :"); System.out.println("Komputer = " + komputermenang + " Anda = " + usermenang + " Seri = " + seri); System.out.println(""); // baris kosong // variabel untuk mengambil input dari user BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = null; System.out.print("Main lagi (Y/T)? "); try { input = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti"); System.exit(1); // keluar jika jawabannya tidak if ((input.charat(0) == 't') (input.charat(0) == 'T')) break;

98 Berikut ini hasil keluarannya Parameter Posted Sel, 02/24/ :12 by belajarprogram Versi ramah cetak Jika subrutin adalah kotak hitam, maka parameter merupakan alat atau mekanisme untuk memberikan informasi dari dunia luar ke dalam kotak. Parameter merupakan bagian dari antar muka dengan suatu subrutin. Dengan menggunakan parameter, kita dapat mengatur perilaku suatu subrutin sesuai dengan input yang diberikan. Sebagai analogi, kita ambil contoh AC -- yaitu alat yang mengatur suhu ruangan pada temperatur konstan. AC memiliki parameter, yaitu tombol remote yang digunakan untuk memasukkan suhu yang diinginkan. AC akan selalu melakukan tugas yang sama, yaitu mengatur suhu ruangan. Akan tetapi, tugas persis yang dilakukan tergantung suhu yang diterima dari remote control. Kita ambil contoh pada kelas KonsolInput pada bagian terdahulu.

99 public static double ambildouble(string pertanyaan) { String strbilangan = null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double bilangan; System.out.print(pertanyaan); try { strbilangan = br.readline(); catch (IOException ioe) { System.out.println("Kesalahan IO, program berhenti"); System.exit(1); bilangan = Double.parseDouble(strbilangan); return bilangan; Di sini subrutin ambildouble memiliki parameter tunggal yang bertipe String dan bernama pertanyaan. Ketika subrutin ini dipanggil, suatu nilai harus ikut disertakan, dan nilai ini dimasukkan dalam parameter "pertanyaan". Misalnya, subrutin dapat dipanggil dengan a = ambildouble("hallo");. Ketika komputer menjalankan perintah ini, komputer akan memasukkan "hallo" ke dalam parameter "pertanyaan", kemudian subrutin ambildouble menjalankan semua perintah di dalamnya. Jika parameter yang diberikan berupa variabel, misalnya variabel str berisi "kabar", kemudian subrutin ambildouble panggil dengan perintah ambildouble(str), maka isi dari str akan dikopi ke dalam parameter "pertanyaan" terlebih dahulu sebelum seluruh perintah dalam subrutin ambildouble dilaksanakan. Perlu dicatat bahwa istilah "parameter" digunakan dalam dua konsep berbeda tetapi berkaitan. Yang pertama adalah "parameter" digunakan untuk mendefinisikan suatu subrutin. Parameter yang digunakan pada definisi suatu subrutin disebut parameter formal. "Parameter" yang digunakan untuk memanggil suatu subrutin disebut parameter aktual. Ketika suatu subrutin dipanggil, parameter aktual akan dievaluasi, dan hasilnya akan dimasukkan ke dalam parameter formal. Parameter formal berbentuk seperti pengenal atau nama, dan bersifat seperti halnya variabel dan memiliki tipe -- misalnya int, double, atau String. Parameter aktual bersifat seperti nilai atau angka, jadi bisa berbentuk ekspresi atau perintah apapun yang menghasilkan nilai atau angka. Sewaktu kita memanggil subrutin, kita harus memberi parameter aktual untuk setiap parameter formal yang didefinisikan. Misalnya, lihat contoh berikut. static void lakukansesuatu(int N, double d, boolean b) {... // perintah lainnya di sini Subrutin ini bisa saja dipanggil dengan instruksi berikut.

100 lakukansesuatu(1, Math.random() * 3, x == 3); Ketika komputer mengevaluasi subrutin ini, pada dasarnya sama dengan menglakukan perintah-perintah berikut. { int N; double d; boolean b; N = d = b =... 1; Math.random() * 3; (x == 3); // perintah lainnya di sini Untuk memanggil subrutin, yang kita perlukan adalah nama, berapa banyak parameter formal yang dimilikinya, dan tipe dari parameter formal tersebut. Infomasi ini disebut juga tanda subrutin. Tanda subrutin lakukansesuatu dapat ditulis sebagai lakukansesuatu(int,double,boolean). Perhatikan bahwa tanda subrutin tidak memiliki nama parameter; sebetulnya jika kita hanya ingin menggunakan subrutin tersebut, nama parameter tidaklah penting, karena nama bukan merupakan bagian dari antar muka subrutin. Java agak sedikit berbeda karena memungkinkan dua atau lebih subrutin yang berbeda dalam kelas yang sama memiliki tanda subrutin yang berbeda. (Mirip seperti bahasa C+ +) Subrutin yang seperti ini disebut subrutin yang dibebanlebihkan (overloaded). Misalnya, void void void void taruh(string s) {... taruh(int i) {... taruh(double d) {... taruh(boolean b) {... Kita sudah menggunakan subrutin yang dibebanlebihkan ini misalnya pada System.out.println(). Jika kita coba ketik System.out.println pada Eclipse, Eclipse akan membantu kita untuk melihat parameter apa saja yang dibutuhkan, termasuk juga dapat menunjukkan apakah suatu subrutin dibebanlebihkan.

101 Catatan : Overload tidak berlaku pada tipe keluaran subrutin. Dua atau lebih subrutin dengan nama sama dalam suatu kelas tetapi memiliki tipe keluaran yang berbeda tidak diperbolehkan dalam Java. Misalnya, kalau kita coba definisikan 2 fungsi seperti berikut, maka Java akan memberi pernyataan kesalahan sintaks. int ambil(string s) {... boolean ambil(string s) {... double ambil(string s) {... Terakhir, hingga saat ini kita sudah mengenal 3 jenis variabel: variabel lokal, yang didefinisikan di dalam suatu blok, variabel statik, yang didefinisikan di dalam suatu kelas, dan parameter formal, yang didefinisikan pada definisi subrutin di dalam suatu kelas. Variabel lokal tidak memiliki hubungan dengan dunia luar sama sekali. Parameter digunakan untuk berhubungan dengan dunia luar sebagai alat untuk menerima nilai atau angka dari dunia luar. Perubahan nilai pada variabel lokal dan parameter tidak mempengaruhi variabel itu sendiri karena sifatnya terisolasi. Hal yang sama sekali berbeda akan terjadi apabila suatu subrutin menggunakan variabel yang didefinisikan di luar subrutin itu. Variabel tersebut hidup secara terpisah dari subrutin, dan bisa diakses oleh apapun di luar subrutin itu. Variabel ini disebut variabel global. Variabel ini terlihat oleh semua subrutin dalam kelas tersebut. Perubahan yang terjadi di sini dapat mempengaruhi cara kerja subrutin lain yang menggunakan variabel tersebut. Hal ini kita lihat pada contoh sebelumnya tentang subrutin dan variabel statik untuk menghitung statistik komputermenang, usermenang, dan seri. Tidak ada yang salah dalam menggunakan variabel global, akan tetapi kita harus terus ingat bahwa variabel global itu harus sebagai bagian dari antar muka subrutin kita dengan

102 keseluruhan dunia luar. Cara ini sebetulnya jalan belakang yang tidak terdokumentasi seperti pada definisi subrutin, yang apabila aturan-aturannya tidak dipenuhi secara disiplin mungkin akan menyebabkan bug atau kesalahan lain di luar kontrol kita. Paling tidak ada satu alasan untuk menggunakan variabel global, yaitu apabila kelas secara keseluruhan dianggap sebagai kotak hitam, akan lebih masuk akal apabila subrutin bisa mengintip sedikit keluar dan saling menukar informasi jika cara ini jauh lebih mudah diimplementasikan dan dilihat dari dunia luar. Tipe Keluaran Posted Rab, 02/25/ :06 by belajarprogram Versi ramah cetak Suatu subrutin yang mengembalikan nilai disebut fungsi. Suatu fungsi hanya dapat mengembalikan nilai dengan tipe tertentu, yang disebut tipe keluaran. Fungsi biasanya dipanggil di tempat suatu nilai atau angka ditempatkan, misalnya disebelah kanan tanda =, pada parameter sewaktu subrutin dipanggil, atau di tengah-tengah ekspresi yang panjang. Fungsi dengan tipe keluaran boolean juga bisa ditempatkan sebagai kondisi pada pernyataan if atau while. Sebetulnya boleh-boleh saja memanggil suatu fungsi sendirian tanpa diletakkan di sebelah kanan tanda =, misalnya ambildouble("hallo");. Dalam hal ini keluarannya akan diabaikan oleh komputer. Tergantung program yang akan kita buat, kadang-kadang program kita memang sengaja membuang nilai yang dikembalikan oleh fungsi karena satu dan lain hal. Untuk membuat fungsi yang mengeluarkan suatu nilai kembali kepada pemanggilnya, kita harus memberikan pernyataan return, dengan bentuk return ekspresi; Pernyataan return ini hanya boleh ditulis di dalam sebuah subrutin (termasuk subrutin main()), dan ekspresi harus menghasilkan nilai yang memiliki tipe yang sama dengan tipe keluaran yang didefinisikan pada deklarasi subrutin tersebut. Ketika komputer menjalankan pernyataan return, komputer akan menghitung "ekspresi", menghentikan eksekusi subrutin tersebut saat itu juga, dan kembali pada si pemanggil dengan membawa nilai hasil perhitungan "ekspresi". Misalnya, kita akan menghitung luas suatu lingkaran. Kita buat fungsi luaslingkaran dengan parameter jarijari dan keluarannya bertipe double, sebagai berikut : static double luaslingkaran(double jarijari) { return 3.14 * jarijari * jarijari;

103 Anggap komputer sedang melakukan perintah "ruangkosong = 20*20 luaslingkaran(10);". Ketika sampai pada bagian luaslingkaran, fungsi tersebut akan memasukkan 10 ke dalam parameter formal jarijari. Di dalam badan fungsi, ia akan menghitung 3.14 * 10.0 * 10.0 yang hasilnya Nilai ini akan dikembalikan kepada fungsi awalnya untuk menghitung "ruangkosong = 20*20 luaslingkaran(10);", sehingga fungsi ini juga bisa diganti dengan "ruangkosong = ;" Hasilnya yaitu 86 dimasukkan ke dalam variabel ruangkosong Dalam subrutin biasa -- yaitu subrutin yang tipe keluarannya void -- kita juga bisa menggunakan perintah return untuk langsung keluar dari subrutin tersebut, yaitu dengan perintah return; tanpa ekspresi. Di subrutin ini perintah return boleh diberikan jika diperlukan, akan tetapi pada fungsi perintah return wajib diberikan. Berikut ini adalah fungsi untuk menentukan nilai akhir (A, B, C, D atau E) dari nilai ujian. static char nilaialfa(double nilaiujian) { if (nilaiujian >= 90) return 'A'; else if (nilaiujian >= 80) return 'B'; else if (nilaiujian >= 70) return 'C'; else if (nilaiujian >= 60) return 'D'; else return 'E'; Perhatikan bahwa pada setiap cabang, perintah return diberikan. Ada juga beberapa programmer yang lebih suka dengan menggunakan variabel sementara kemudian perintah return diberi satu kali saja di akhir fungsi, seperti contoh berikut. static char nilaialfa(double nilaiujian) { char keluaran; if (nilaiujian >= 90) keluaran = 'A'; else if (nilaiujian >= 80) keluaran = 'B'; else if (nilaiujian >= 70) keluaran = 'C'; else if (nilaiujian >= 60) keluaran = 'D'; else keluaran = 'E'; return keluaran; Contoh di atas memiliki tipe keluaran char. Dan sebenarnya, tipe keluaran bisa bertipe apa saja, termasuk kelas, seperti String pada contoh berikut.

104 static String ulangkarakter(char c, int n) { String keluaran = ""; // tambah karakter c ke dalam String keluaran sebanyak n kali for (int i = 1; i <= n; i++) keluaran = keluaran + c; return keluaran; Fungsi di atas berfungsi untuk mengulang karakter c sebanyak n kali dan mengembalikan hasilnya. Misalnya jika fungsi di atas kita panggil dengan "ulang = ulangkarakter('a', 10);" maka ulang akan bernilai "AAAAAAAAAA" setelah fungsi ulangkarakter dijalankan. Toolbox, API, dan Paket Posted Sab, 02/28/ :05 by belajarprogram Versi ramah cetak Dengan semakin mudah digunakannya komputer, akan semakin sulit dan kompleks tugas yang harus dilakukan oleh programmer. Kita dengan mudah menulis program berbasis konsol dengan menggunakan beberapa subrutin untuk menampilkan pesan dan mengambil input dari user. GUI (graphical user interface = antarmuka pengguna berbasis grafik), seperti jendela, tombol, scroll bar, menu, kotak input teks, dan lain-lain mungkin lebih menarik bagi user. Akan tetapi programmer harus berhadapan dengan kemungkinan yang sangat amat banyak, dan lebih banyak subrutin yang harus dibuat untuk bisa mengontrol setiap komponen GUI. Seseorang yang ingin membuat program untuk Windows misalnya, harus menggunakan Toolbox Windows, yaitu koleksi dari ribuan subrutin, misalnya untuk membuka dan menutup jendela, untuk menggambar dan menulis teks, menambah tombol dan menerima respon dari user. Selain GUI ada juga subrutin yang berurusan dengan membuka, membaca, dan menulis file, berkomunikasi dengan network, dan lain-lain. Intinya di dalam toolbox terdapat segala sesuatu yang menurut kita standar. Apple dan Linux memiliki toolbox sendiri yang berbeda dengan yang disediakan oleh Windows. Setiap proyek pembuatan program akan terdiri dari inovasi (sesuatu yang sangat baru) dan menggunakan kembali sesuatu yang sudah pernah dibuat sebelumnya. Seorang programmer diberi peralatan untuk berhasil dalam proyeknya tersebut, yang paling dasar adalah apa yang diberikan oleh bahasa pemrograman itu sendiri, misalnya variabel, perulangan, dan lain-lain. Di atasnya, programmer bisa menambahkan toolbox yang berisi subrutin yang sudah ditulis untuk melakukan tugas tertentu. Alat ini, jika didesain dengan sangat baik, bisa dijadikan kotak hitam yang sesungguhnya, yaitu kotak hitam yang kita betul-betul tidak perlu tahu bagaimana dia bekerja.

105 Bagian yang inovatif adalah bagaimana merangkai alat tadi menjadi sesuatu yang berguna untuk suatu proyek atau suatu masalah yang ingin dipecahkan (pengolah kata, browser, game, dll). Ini disebut pemrograman aplikasi. Toolbox suatu software adalah juga kotak hitam. Ia memiliki antar muka dengan programmernya. Antar muka ini berisi spesifikasi tentang rutin-rutin apa saja yang ada di sana, apa parameter yang dibutuhkan, dan tugas apa yang mereka lakukan. Informasi ini disebut API (Applications Programming Interface = Antarmuka Pemrograman untuk Aplikasi). Windows API adalah spesifikasi semua subrutin yang tersedia dalam toolbox Apple. Perusahaan yang membuat hardware, misalnya sound card atau blue tooth mungkin juga akan membuat API untuk perangkat tersebut yang berisi subrutin yang diperlukan programmer untuk bisa menggunakan perangkat itu. Peneliti yang membuat program untuk menyelesaikan suatu perhitungan matematis kompleks -- misalnya persamaan diferensial -- juga akan membuat API sehingga orang lain bisa menggunakan subrutinnya tanpa harus mengerti dengan detail bagaimana perhitungan itu dilakukan. Bahasa pemrograman Java juga didukung oleh API yang cukup besar dan standar. Contoh API yang pernah kita lihat misalnya Math.random(), tipe data String, dan subrutin yang terkait. Java API standar terdiri dari subrutin untuk membuat dan mengendalikan GUI, untuk komunikasi network, baca tulis file, dan lain-lain. Mungkin lebih mudah jika API ini dianggap sebagai bagian dari bahasa Java, akan tetapi sebetulnya API terdiri dari subrutin yang bisa digunakan dalam program Java. Java merupakan bahasa yang tidak tergantung pada mesin atau sistem operasi di mana ia dijalankan. Java API yang sama harus bisa bekerja dengan semua sistem. Akan tetapi ingat bahwa yang sama adalah antar mukanya. Implementasinya bisa sangat berbeda antara satu sistem operasi dengan lainnya. Sistem Java pada suatu komputer terdiri dari implementasi pada komputer tersebut. Program Java yang kita buat memanggil subrutin pada komputer tersebut. Ketika komputer menjalankan program dan sampai pada perintah untuk memanggil subrutin pada API, komputer akan menjalankan implementasi subrutin yang sesuai dengan sistem komputer di mana program tersebut dijalankan. Artinya, kita hanya perlu belajar satu API saja untuk melakukan pemrograman pada berbagai macam komputer dan sistem operasi. Seperti subrutin pada Java, subrutin pada API standar dikelompokkan ke dalam kelas. Untuk membuat organisasi lebih baik, kelas Java dapat digabungkan menjadi paket. Kita juga bisa membuat hirarki paket yang lebih tinggi, karena paket juga bisa berisi paket lain. Kenyataannya seluruh API standar Java diimplementasikan dalam beberapa paket. Salah satu paketnya bernama "java", yang berisi paket-paket non-gui dan juga GUI berbasis AWT. Paket lain, yaitu "javax", yang ditambahkan pada versi 1.2, berisi kelas yang digunakan untuk GUI Swing.

106 Suatu paket dapat terdiri dari kelas ataupun pake lain. Paket yang terdapat di dalam paket lain disebut "sub paket". Paket java dan javax juga memiliki beberapa sub paket. Salah satu sub paket java, misalnya disebut awt. Karena awt berada di dalam paket java, nama lengkapnya adalah java.awt. Paket inilah yang sebenarnya memiliki kelas-kelas GUI AWT, seperti kelas Button yang melambangkan tombol, atau Graphics yang merupakan kumpulan rutin untuk menggambar di monitor. Karena kelas ini tergabung dalam paket java.awt, maka nama lengkapnya adalah java.awt.button dan java.awt.graphics. Demikian juga dengan javax yang memiliki sub paket yang bernama javax.swing, yang terdiri dari kelas yang bernama javax.swing.jbutton dan javax.swing.japplet. Paket java sendiri terdiri dari beberapa sub paket lain, seperti java.io yang sudah kita pakai dalam bab-bab sebelumnya, berguna untuk memberikan fasilitas input/output, java.net untuk mengendalikan komunikasi jaringan, dan java.applet mengimplementasikan fungsi dasar untuk applet. Paket yang paling dasar disebut java.lang. Di dalam paket ini terdapat kelas-kelas fundamental misalnya String dan Math. Mungkin akan lebih jelas jika kita lihat ilustrasi berikut tentang tingkatan paket java, sub paket, kelas di dalam sub paket, dan subrutin di dalam kelas. Misalkan kita akan menggunakan kelas java.awt.color dalam program. Salah satu caranya adalah dengan menggunakan nama lengkap dari kelas tersebut, misalnya java.awt.color warnakotak; untuk mendekalarasi variabel bernama warnakotak yang tipenya adalah java.awt.color. Tentu saja akan terlalu cape jika kita harus menulis nama kelas dengan lengkap setiap kali akan digunakan. Java mengijinkan kita untuk menggunakan langsung nama kelasnya jika kita berikan perintah import, seperti

107 import java.awt.color; di awal program, dan kemudian di bagian lain, kita bisa menyingkat java.awt.color hanya dengan nama kelasnya saja, sehingga menjadi Color warnakotak; (Satu-satunya keuntungan yang diberikan perintah import adalah untuk menyingkat penulisan nama kelas, bukan untuk mengimport keseluruhan kelas ke dalam program kita. Seandainya perintah import tidak kita berikan, dan kita panggil dengan nama lengkapnya, Java akan tetap bisa mengakses kelas tersebut.) Ada lagi jalan pendek untuk mengimport seluruh kelas pada suatu paket. Kita bisa import seluruh kelas di dalam paket java.awt dengan import java.awt.*; Ingat pada kode kita sebelumnya yang berbentuk seperti ini? import java.io.*; Ketika program yang akan kita buat semakin besar, maka ada kemungkinan kita harus mengimport banyak paket. Satu hal penting yang perlu diingat adalah ada kemungkinan beberapa paket memiliki nama kelas yang sama. Misalnya java.awt dan java.util memiliki kelas yang bernama List. Jika kita import kedua kelas dengan perintah java.awt.* dan java.util.*, maka nama List menjadi rancu. Jika kita mencoba membuat variabel dengan tipe data List, java akan menampilkan pesan kesalahan tentang adanya nama kelas yang membingungkan. Solusinya? Gunakan nama lengkap kelasnya, yaitu java.awt.list atau java.util.list. Karena paket java.lang.* adalah paket yang sangat penting, setiap kelas dalam java.lang akan diimport otomatis ke dalam semua program. Seakan-akan semua program dimulai dengan perintah "import java.lang.*;". Artinya, kita bisa memanggil kelas seperti String saja, bukan java.lang.string, atau Math.sqrt() bukan java.lang.math.sqrt(). Programmer juga bisa membuat paket baru. Misalnya kita akan membuat kelas yang akan diletakkan di paket yang bernama alatbantu. Maka pada awal program kita harus didefinisikan dengan perintah "package alatbantu;" Program lain yang menggunakan paket ini bisa menambah "import alatbantu.*;" untuk mengabmbil semua kelas dalam paket alatbantu. Masalahnya hal ini agak sedikit lebih rumit. Ingat bahwa ketika suatu program menggunakan kelas, maka kelas tersebut harus "tersedia" ketika program tersebut dikompilasi dan ketika program terus dieksekusi. Tentunya lebih pas tergantung dari lingkungan Java yang kita lakukan. biasanya paket yang bernama alatbantu harus berada

108 di dalam direktori alatbantu, dan direktori tersebut harus diletakkan pada direktori yang sama dengan program yang akan menggunakan kelas itu. Pada program yang menggunakan banyak kelas, maka sangat masuk akal apabila kita membagi dan mengorganisir kelas tersebut dalam satu atau beberapa paket. Dan juga masuk akal untuk membuat paket baru sebagai toolbox atau dengan kata lain membuat API baru yang belum dikover oleh API Java. (Seringkali orang yang membuat API lebih disanjung akan kehebatannya dibandingkan dengan orang yang hanya menggunakan API). Dalam program Eclipse kita, kita sudah menggunakan paket dari awal. Bab ini menjelaskan lebih detail tentang paket. Sebetulnya tidak ada salahnya kita mengorganisir setiap program yang kita buat sejak awal. Pada saat program kita besar, maka perubahan yang diperlukan untuk mengorganisir akan lebih signifikan. Tentang Deklarasi Posted Min, 03/01/ :45 by belajarprogram Versi ramah cetak Nama adalah hal yang paling dasar dalam pemrograman. Banyak sekali tetek bengek detail di dalam deklarasi dan menggunakan nama. Dalam bagian ini akan kita singgung beberapa hal penting tentang deklarasi dan penggunaan variabel pada Java. Menggabungkan Inisialisasi dan Deklarasi Ketika perintah deklarasi variabel dilaksanakan, komputer akan menyiapkan memori untuk digunakan oleh variabel ini. Memori ini harus diinisialisasi, yaitu diberi suatu nilai awal sebelum bisa digunakan dalam perintah berikutnya. Pada variabel lokal, pernyataan deklarasi sering diikuti oleh perintah pemberi nilai awal. Misalnya, int i; i = 0; // Deklarasi variabel yang bernama i // Beri nilai awal Kita bisa juga melakukan deklarasi sekaligus inisialisasi variabel tersebut. Kedua pernyataan di atas bisa kita gabung menjadi int i = 0; // Deklarasi variabel i sekaligus memberi nilai awal 0 Komputer akan tetap melakukan perintah di atas dalam dua langkah: deklarasi variabel, kemudian mengisi nilai awal 0. Nilai awal tidak harus berupa suatu bilangan, tetapi bisa juga berupa ekspresi yang menghasilkan suatu nilai. Dan juga kita boleh melakukan inisialisasi beberapa variabel sekaligus dalam 1 baris. Misalnya, int x = 0, y = 1;

109 int awal, akhir = 'A'; diinisialisasi int N = 3, M = N+2; sebelum digunakan oleh M // Ok, tapi hanya akhir yang akan // Ok, karena N sudah diberi nilai awal Fitur ini biasa ditemui pada perulangan for, karena pernyataan 1 baris ini bisa dimasukkan sebagai variabel kontrol di awal pernyataan for. Karena variabel kontrol biasanya tidak berhubungan dengan bagian program di luar perulangan, maka akan lebih praktis jika deklarasi variabel kontrol itu dilakukan di awal perulangan. Misalnya for ( int i = 0; i < 10; i++ ) { System.out.println(i); Perlu diingat bahwa ekspresi di atas merupakan singkatan dari blok berikut. Saya sengaja tambahkan { dan di awal dan akhir untuk mempertegas bahwa i hanya bersifat lokal di dalam perulangan yang tidak bisa diakses lagi setelah perulangan selesai. { int i; for ( i = 0; i < 10; i++ ) { System.out.println(i); Variabel anggota juga bisa diinisialisasi di mana dia dideklarasikan. Misalnya, public class Bank { static double sukubunga = 0.1; // sama dengan 10% static long maxpenarikan = ;.. // Perintah dan variabel lain. Variabel anggota statik akan dibuat pada saat kelas mulai dimasukkan memori oleh interpreter Java, inisialisinya pun dilaksanakan pada saat itu. Pada variabel anggota, deklarasi dan inisialisasi ini bukan hanya sekedar singkatan dari 2 perintah seperti pada variabel lokal. Pernyataan deklarasi adalah pernyataan yang bisa dibuat di luar subrutin, sedangkan inisialisasi tidak bisa dilakukan di luar subrutin. Contoh di bawah tidak diperbolehkan dalam Java. public class Bank { static double sukubunga; sukubunga = 0.1; // ILEGAL, perintah ini harus ada di dalam subrutin Karenanya, deklarasi variabel anggota biasanya juga dirangkai dengan inisialisasi nilai awalnya. Jika tidak ada nilai awal yang diberikan, maka nilai awal bawaan akan digunakan. Misalnya "static int i;" setara dengan "static int i = 0;".

110 Konstanta dan Sifat "final" Kadang-kadang dalam kondisi tertentu, kita ingin nilai suatu variabel tidak boleh berubah setelah diberi nilai awal. Misalnya, pi diinisialisasi dengan nilai , maka nilai ini akan bisa diubah oleh bagian lain dalam program. Di sini mungkin sang programmer ingin mendefinisikan suatu konstanta yang diberi nama "pi" sebagai pengganti dari bilangan Dengan cara ini, program akan lebih mudah dimengerti apabila program tersebut ditulis dalam "keliling = pi*diamater;" daripada "pokok = *diameter;". Dalam java, sifat "final" bisa digunakan pada deklarasi variabel untuk membuat nilai suatu variabel tidak bisa diubah setelah diinisialisasi. Misalnya final static double pi = ; Apabila kita mencoba mengganti isi variabel tersebut, misalnya di tengah program dengan perintah "pi = 20;" komputer akan menampilkan pesan kesalahan sintaks pada saat kompilasi. Sifat "final" boleh diberikan pada variabel lokal dan bahkan pada parameter formal, akan tetapi paling berguna apabila diberikan pada variabel anggota. Variabel anggota statik yang dideklarasikan dengan sifat "final" juga disebut sebagai konstanta yang diberi nama. Program akan jauh lebih mudah dibaca dengan menggunakan konstanta bernama ini jika diberikan pada sesuatu angka penting yang digunakan dalam program. Gaya penulisan yang dianjurkan untuk konstanta bernama ini adalah dengan menggunakan huruf besar dengan baris bawah (jika diperlukan). Misalnya final static double PI = ; Gaya penulisan seperti ini juga digunakan oleh kelas standar Java, yang di dalamnya terdapat banyak sekali konstanta bernama. Misalnya, konstanta PI sudah didefinisikan Java dalam kelas Math, yaitu Math.PI, sehingga kita tidak perlu mendefinisikannya sendiri. Contoh lain adalah memberikan nama untuk gaya huruf, seperti Font.PLAIN, Font.BOLD dan Font.ITALIC. Konstanta ini digunakan untuk menandai gaya huruf untuk digunakan oleh subrutin lain dalam kelas Font. Salah satu alasan utama untuk menggunakan konstanta bernama adalah supaya kita bisa mengubah isinya dengan cepat apabila di kemudian hari kita ingin memiliki nilai konstanta yang berbeda. Apabila nilai ini diubah, maka kita harus mengkompilasi ulang program kita, karena nilai ini tidak bisa diubah ketika program dieksekusi. Misalnya kita definisikan sukubunga pada contoh di atas sebagai konstanta bernama, yaitu

111 static final double SUKU_BUNGA = 0.1; Suatu saat misalnya 2 tahun kemudian, bank tersebut ingin mengubah suku bunganya menjadi 5% atau Kita bisa mengubah nilainya hanya di satu tempat yaitu di mana deklarasi SUKU_BUNGA berada. Kita tidak perlu mencari semua nilai 0.1 di dalam program untuk menggantinya satu per satu. Selain repot, mungkin membingungkan karena 0.1 bisa digunakan untuk nilai lainnya, bukan hanya nilai suku bunga. Aturan Penamaan dan Jangkauan (scope) Ketika deklarasi variabel dieksekusi, komputer akan menyediakan tempat di memori untuk variabel tersebut. Nama variabel dapat digunakan oleh kode program untuk mengacu pada alamat di mana data tersebut disimpan di dalam memori. Bagian di dalam kode sumber (yaitu program Java yang kita tulis, masih dalam bentuk yang dimengerti manusia sebelum dikompilasi menjadi bahasa mesin) di mana variabel tersebut valid dan bisa digunakan disebut jangkauan variabel. Bukan hanya variabel yang memiliki jangkauan, tetapi juga nama subrutin dan nama parameter formal. Untuk subrutin statik, jangkauannya lebih mudah dipahami. Jangkauan subrutin statik adalah kelas di mana ia didefinisikan. Kita bisa juga memanggil subrutin itu dari dalam kelas dirinya sendiri. Dalam pemrograman tingkat lanjut, teknik ini disebut rekursi (recursion), yaitu subrutin yang memanggil dirinya sendiri. Teknik ini digunakan dalam bab yang akan datang yang berbicara detail tentang struktur data dan algoritma. Untuk variabel anggota suatu kelas, aturannya sama, tetapi dengan sedikit pengecualian. Kita boleh memiliki variabel lokal atau parameter formal yang namanya sama dengan variabel anggota static. Jika ini terjadi, maka variabel anggota akan disembunyikan oleh Java. Dalam contoh berikut : public class Game { static int hitung; // variabel anggota static void maingame() { int hitung; // variabel lokal.. // Perintah untuk main game... // Variabel dan subrutin lain. // akhir kelas Game Kita lihat bahwa dalam subrutin maingame(), "hitung" mengacu pada dua hal yaitu variabel lokal dan variabel anggota statik. Di luar kelas Game, "hitung" hanya mengacu pada variabel anggota statik. Dalam situasi seperti ini, di dalam subrutin maingame() maka "hitung" sebagai variabel anggota akan disembunyikan oleh Java. Untuk menggunakan variabel anggota ini, kita bisa menggunakan nama lengkapnya yaitu

112 Game.hitung. Akan tetapi trik ini tidak bisa digunakan untuk variabel anggota yang tidak statik. Jangkauan parameter formal di dalam suatu subrutin berada di dalam blok di mana ia dideklarasikan. Sehingga pada "for (int i=0; i<10; i++)" variabel i hanya bisa di lihat di dalam blok perulangan for, tetapi tidak valid di luar perulangan ini meskipun pada subrutin yang sama. Akan tetapi kita tidak boleh mendeklarasikan parameter formal dengan nama yang sama dengan variabel lokal yang berlaku di sana. Misalnya, void subrutinjelek(int y) { int x; while (y > 0) { int x; // ERROR: x sudah didefinisikan sebelumnya... Dalam bahasa pemrograman lain, pernyataan di atas masih dibolehkan, yaitu dengan menyembunyikan x pada deklarasi sebelumnya. Akan tetapi pada Java, segera setelah blok yang memuat suatu variabel selesai, namanya bisa dipergunakan kembali. Misalnya. void subrutinbagus(int y) { while (y > 10) { int x;... // Jangkauan x berakhir di sini while (y > 0) { int x; // OK: Deklarasi x sebelumnya sudah kadaluarsa... Ada beberapa hal lain yang menarik di Java. Nama subrutin dan variabel boleh sama, karena komputer akan selalu dapat membedakan mana subrutin atau variabel dengan melihat tanda buka kurung '(' setelah namanya. Variabel tidak pernah menggunakan tanda kurung setelah namanya. Sehingga suatu kelas boleh memiliki variabel anggota yang bernama "hitung" dan subrutin yang bernama "hitung()". Lebih jauh lagi, nama suatu kelas boleh menggunakan nama subrutin atau variabel yang sudah ada. Komputer bisa melihat apakah suatu nama berupa kelas, variabel atau subrutin. Kelas adalah juga tipe data, sehingga suatu kelas bisa digunakan untuk

113 mendeklarasikan variabel dengan tipe kelas tersebut, atau membuat subrutin yang keluarannya bertipe kelas tersebut. Atau sebagai contoh, perintah berikut bisa diterima oleh program Java : static Gila Gila(Gila Gila) {... Gila pertama adalah tipe keluaran suatu fungsi. Gila kedua adalah nama subrutin. Yang ketiga adalah tipe data parameter, dan keempat adalah nama parameter formal. Tetapi, ingat tidak semua yang mungkin dan boleh dilakukan berarti harus dilakukan. Bab VI - Pemrograman Berorientasi Objek Posted Min, 03/01/ :13 by belajarprogram Versi ramah cetak Jika subrutin hanya melambangkan suatu tugas, objek merupakan gabungan data (dalam bentuk variabel instansi - atau "instance variable") dan beberapa tugas atau disebut "perilaku" terhadap kumpulan data tersebut (dalam bentuk metode instansi - atau "instance method"). Oleh karena itu objek merupakan stuktur baru yang dapat menangani semakin rumitnya kompleksitas suatu program Bagian ini meliputi pembuatan dan penggunaan objek dalam bahasa Java. Juga akan dibahas inti tentang pemrograman berorientasi objek, yaitu : pewarisan dan poli morfisme (perubahan wujud). Objek, Metode Instansi dan Variable Instansi Posted Sen, 03/02/ :42 by belajarprogram Versi ramah cetak Pemrograman berorientasi objek bermaksud untuk memecahkan masalah programming mirip dengan cara berfikir manusia dan bagaimana manusia berinteraksi dengan dunia. Kita telah melihat bagaimana masalah programming dipecahkan dengan membaginya menjadi instruksi-instruksi kecil yang dirangkai menjadi suatu kesatuan tugas. Cara ini disebut juga dengan pemrograman berdasarkan prosedur.

114 Pada pemrograman berorientasi objek, kita membagi masalah pemrograman berdasarkan objek atau "sesuatu" benda. Objek ini diibaratkan seperti makhluk hidup, yaitu memiliki ciri-ciri fisik dan juga perilaku. Dalam pemrograman berorientasi objek, ciri-ciri fisik ini disebut juga sebagai atribut, pada dasarnya berisi informasi tentang objek tersebut. Sedangkan perilaku disebut sebagai metode, yaitu bagaimana suatu objek bertindak atau melakukan sesuatu. Dengan cara ini diharapkan pemrograman berorientasi objek merupakan pemrograman yang lebih alami dibandingkan dengan pemrograman berorientasi prosedur, karena cara fikir kita sudah terbiasa dengan bagaimana kita berinteraksi dengan dunia. Sampai tingkat tertentu, PBO hanya merubah cara pandang programmer. Objek dalam kaitannya dengan dasar pemrograman adalah gabungan dari variabel (dalam hal ini atribut) dan subrutin (yaitu metode) yang berinteraksi dengan variabel pada objek. Banyak bahasa pemrograman lain yang juga mendukung konsep PBO, akan tetapi Java merupakan bahasa yang mendukung penuh PBO, di antaranya karena Java memiliki beberapa fitur penting yang berbeda dari bahasa standar. Untuk menggunakan fitur ini, kita harus mengubah cara pandang kita terlebih dahulu. Objek terkait erat dengan kelas. Kita telah bahas dan mencoba beberapa contoh kelas pada bab-bab sebelumnya. Seperti kita lihat pula bahwa kelas memiliki variabel dan subrutin. Jika objek juga memiliki variabel dan subrutin, lalu apa bedanya dengan kelas? Lalu mengapa kita harus memiliki cara pandang berbeda dengan cara kita melihat kelas? Sepertinya apabila kita lihat contoh-contohnya sebelumnya, perbedaannya hanya menghilangkan kata "static" dari deklarasi variabel dan subrutinnya, khan? Seperti disebutkan sebelumnya bahwa kelas mendeskripsikan suatu objek, atau lebih tepatnya, bagian non "static" mendeskripsikan suatu objek. Mungkin bahasa biologi, kelas adalah species, sedangkan objek merupakan individu. Human sapiens (nama biologi manusia) adalah kelas, sedangkan Anda, saya, ibu, bapak, pak hansip adalah objek. Masing-masing dari kita memiliki "blueprint" atau cetak biru yang sama, tetapi kita memiliki ciri-ciri yang berbeda, rambut, mata, telinga, tinggi badan, berat badan, dan juga perilaku kita saat makan, minum, belajar, dan lain-lain. Dalam sudut pandang pemrograman, kelas digunakan untuk menciptakan suatu objek. Atau dengan kata lain, kelas adalah pabrik pembuat objek. Bagian non-statik dari suatu kelas adalah bagian yang memuat detail suatu objek, yaitu apa isi variabel dan metodenya. Perbedaan kelas dan objek adalah : Objek diciptakan dan dihancurkan ketika program berjalan, sehingga kita bisa memiliki beberapa objek sekaligus. Kita lihat contoh sederhana, dimana kelas sederhana digunakan untuk menggabungkan beberapa variabel statik. Misalnya

115 class DataPenduduk { static String nama; static int umur; Pada program yang menggunakan kelas ini, hanya ada satu kopi dari setiap variabel DataPenduduk.nama dan DataPenduduk.umur. Hanya akan ada satu penduduk, karena kita menyimpan data tersebut sebagai data statik, yang artinya hanya satu tempat di memori di mana data tersebut disimpan. Kelas DataPenduduk dan variabel isinya akan ada selama program tersebut berjalan. Sekarang kita lihat kode berikut yang memiliki variabel non-statik: class DataPenduduk { String nama; int umur; Dalam hal ini tidak ada lagi yang variabel DataPenduduk.nama dan DataPenduduk.umur, karena nama dan umur bukan anggota statik kelas DataPenduduk. Jadi, tidak ada yang bisa kita lakukan dengan kelas ini sama sekali, kecuali membuat objek dari kelas ini. Setiap objek akan memiliki variable sendiri yang dinamakan "nama" dan "umur". Kita bisa membuat banyak "penduduk" karena kita bisa membuat objek untuk setiap penduduk. Misalnya setiap kali seseorang dilahirkan, kita bisa membuat objek penduduk baru. Atau jika seseorang meninggal dunia, kita bisa hapus objek tersebut. Suatu sistem yang terdiri dari kumpulan objek digunakan untuk memodelkan apa yang terjadi di alam nyata. Kita tidak bisa membuat beberapa objek dengan menggunakan variabel statik. Contoh lainnya adalah pada GUI. Bayangkan kita memiliki beberapa tombol, misalnya tombol OK, Cancel dan Apply. Masing-masing tombol ini memiliki kelas yang sama akan tetapi apa yang dilakukan tombol ini berbeda-beda. Teks yang ditampilkan (OK, Cancel atau Apply) merupakan variabel masing-masing objek. Suatu objek yang diciptakan dari suatu kelas disebut instansi dari kelas tersebut. Variabel yang dimiliki oleh objek disebut variabel instansi. Sedangkan subrutinnya disebut. (Dalam PBO subrutin disebut metode) Misalnya dalam kelas DataPenduduk di atas, kemudian kita buat suatu objek dari kelas ini, maka objek yang diciptakan disebut instansi dari kelas DataPenduduk, "nama" dan "umur" adalah variabel instansi di dalam objek tersebut. Penting untuk diingat bahwa kelas suatu objek menentukan tipe data dari variabel instansi, akan tetapi isi datanya sendiri tidak disimpan di dalam kelas, akan tetapi di dalam objek yang diciptakan, sehingga setiap objek akan memiliki data masing-masing.

116 Begitu juga dengan metode instansi, misalnya pada kelas tombol, kita memiliki metode yang dinamakan klik(). Masing-masing tombol akan melakukan tugas berbeda-beda tergantung dari objeknya. Seperti kita lihat di sini bahwa bagian statik dan non-statik dari suatu kelas merupakan hal yang sama sekali berbeda. Banyak kelas yang hanya memiliki anggota statik, atau hanya memiliki anggota non-statik. Akan tetapi kita juga bisa mencampur keduanya dalam suatu kelas. Variabel anggota statik suatu kelas juga bisa disebut variabel kelas dan metode anggota statik suatu kelas juga bisa disebut metode kelas, karena mereka adalah milik kelas dan bukan milik objek yang diciptakan dari suatu kelas. Sekarang kita gunakan contoh yang lebih real. Kita akan buat versi sederhana dari kelas Murid, dimana kita akan menyimpan informasi tentang murid yang terdaftar pada suatu sekolah. class Murid { String nama ; // nama murid double nilai1, nilai2, nilai3; // nilai ulangan murid tersebut double hitungratarata() { // hitung rata-rata nilai ulangan return (nilai1 + nilai2 + nilai3) / 3; Kita lihat bahwa semua anggota kelas tersebut bukan anggota statik, artinya kelas ini hanya bisa digunakan untuk membuat objek. Definisi kelas ini artinya bahwa di dalam objek yang akan diciptakan, akan ada variabel instansi yang bernama nama, nilai1, nilai2, dan nilai3, dan juga metode instansi yang bernama hitungratarata(). Setiap murid memiliki nilai rata-rata yang berbeda-beda. (Makanya ini disebut perilaku suatu objek berbeda-beda). Dalam Java, kelas merupakan tipe data, yaitu mirip dengan tipe data bawaan seperti int atau boolean. Jadi nama kelas bisa digunakan untuk menentukan tipe suatu variabel dalam deklarasi pernyataan, dalam parameter formal dan juga dalam tipe keluaran suatu fungsi. Misalnya, program mendefinisikan seorang murid dengan pernyataan seperti : Murid amir; Akan tetapi membuat variabel seperti di atas TIDAK menciptakan objek. Initinya, ini adalah hal Yang Sangat Amat Penting : Dalam Java, tidak ada variabel yang bisa menyimpan objek. Variabel hanya bisa menyimpan referensi (alamat di memori) suatu objek. Komputer akan menggunakan referensi ini untuk mencari objek di dalam memori. Objek diciptakan dengan pernyataan new, yang bertugas menciptakan objek kemudian mengembalikan referensi ke objek yang sudah diciptakan. Misalnya amir adalah variabel dengan tipe Murid seperti dideklarasikan di atas, maka pernyataan berikut :

117 amir = new Murid(); akan membuat objek yang merupakan instansi dari kelas Murid. Variabel amir akan menyimpan referensi ke objek yang baru saja diciptakan. Sekarang anggap variabel amir merujuk pada objek yang diciptakan dari kelas Murid. Dalam objek tersebut terdapat variabel nama, nilai1, nilai2, dan nilai3. Variabel instansi ini bisa dipanggil dengan amir.nama, amir.nilai1, amir.nilai2, dan amir.nilai3. (Ingat aturan penulisan nama lengkap, akan tetapi karena kelas ini tidak memiliki anggota statik, dan hanya objek yang diciptakan dari kelas ini memiliki variabel atau metode ini, maka nama lengkapnya diturunkan dari nama objek yang memilikinya). Misalnya, program berikut : System.out.println("Hai, " + amir.nama + ". Nilai Anda adalah : "); System.out.println(amir.nilai1); System.out.println(amir.nilai2); System.out.println(amir.nilai3); Program di atas akan mencetak nama dan nilai-nilai yang disimpan oleh objek amir. Begitu juga kita bisa menghitung rata-rata pada suatu objek dengan menggunakan amir.hitungratarata(). Sehingga untuk menghitung rata-rata murid tersebut, bisa kita perintahkan dengan: System.out.println("Nilai rata-rata Anda adalah : " + amir.hitungratarata()); Lebih umum lagi, kita bisa menggunakan amir.nama seperti layaknya variabel bertipe String, artinya kita bisa menghitung jumlah karakter dengan menggunakan amir.nama.length(). Kita juga bisa membuat variabel seperti amir untuk tidak menunjuk atau memiliki referensi ke obek mana pun. Dalam hal ini kita sebut bahwa objek amir berisi referensi kosong (null reference). Referensi kosong ini ditulis dalam Java dengan ekspresi "null". Dan kita bisa menyimpan nilai "null" pada variabel amir dengan perintah : amir = null; Dan kita juga bisa uji apakah amir berisi referensi kosong dengan perintah if (amir == null)... Jika suatu variabel berisi referensi kosong, maka tentu saja, kita tidak bisa mengambil variabel instansi dan menjalankan metode instansi, karena tidak ada objek yang dirujuk pada variabel tersebut. Misalnya jika variabel amir berisi null, maka kita tidak bisa mengambil variabel amir.nilai1.

118 Jika program kita mencoba mengakses referensi kosong secara ilegal, maka di tengahtengah jalannya program, program akan menampilkan pesan kesalahan "null pointer exception". Mari kita lihat beberapa pernyataan yang bisa digunakan dengan objek : Murid mrd1, mrd2, mrd3, mrd4; // mendeklarasikan 4 variabel yang bertipe Murid mrd1 = new Murid(); // membuat objek baru dari kelas Murid, kemudian menyimpan referensinya pada variabel mrd1 mrd2 = new Murid(); // membuat objek baru dari kelas Murid, kemudian menyimpan referensinya pada variabel mrd2 mrd3 = mrd1; // menkopi referensi" yang disimpan pada mrd1 ke mrd3 mrd4 = null; // menyimpan referensi kosong ke mrd4 mrd1.nama = "Ahmad Surahmat"; mrd2.nama = "Hamid Samsudin"; // mengisi nilai variabel instansi Setelah komputer menjalankan program tersebut, maka kira-kira memori komputer akan tampak seperti gambar berikut :

119 Gambar tersebut menunjukkan variabel dalam kotak-kotak kecil dengan nama variabelnya. Objek ditunjukkan dalam kotak dengan pojok bulat. Ketika suatu variabel berisi referensi ke suatu objek, maka nilainya adalah seperti panah yang menunjuk pada objek tersebut. Variabel mrd4 bernilai null, sehingga tidak menunjuk ke mana-mana. Panah dari mrd1 dan mrd3 menjunjuk pada objek ang sama. Ini merupakan Hal Yang Sangat Penting : Jika isi variabel suatu objek diberikan kepada variabel yang lain, maka yang dikopi hanya referensinya saja. Isi objek tidak pernah dikopi. Ketika pernyataan "mrd3 = mrd1;" dieksekusi, tidak ada objek baru yang dibuat. Akan tetapi mrd3 akan merujuk pada alamat yang sama seperti mrd1. Konsekuensinya mungkin sedikit mengejutkan. Misalnya variabel mrd1.nama dan mrd3.nama menunjuk pada variabel yang persis sama, maka apabila mrd1.nama disi dengan "Juju Juminten", maka mrd3.nama juga berisi "Juju Juminten". Sekali lagi, variabel tidak berisi objek, akan tetapi berisi referensi ke suatu objek. Kita bisa menguji beberapa objek dengan operator == dan!= untuk menguji kesamaan dan ketidaksamaan. Akan tetapi yang dicek lagi-lagi bukan isi objek, melainkan alamat memori dimana objek tersebut dijadikan referensi. Jika alamat referensi di memori sama, artinya kedua objek tersebut merujuk pada alamat memori yang sama. Ini berarti perubahan yang dilakukan pada variabel yang satu akan ikut mempengaruhi variabel yang lain. Untuk menguji isinya, maka isinya harus dibandingkan satu per satu, yaitu misalnya dengan "mrd3.nilai1 == mrd1.nilai1 && mrd3.nilai2 == mrd1.nilai2 && mrd3.nilai3 == mrd1.nilai3 && mrd3.nama.equals(mrd1.nama)" Seperti telah disebutkan sebelumnya bahwa String juga merupakan objek. Sehingga membandingkan String yang satu dengan String yang lain dengan menggunakan tanda == adalah membandingkan apakah alamat memori yang ditunjuk oleh String yang satu sama dengan alamat memori yang ditunjuk oleh String yang lain. Ingat == pada objek bukan membandingkan isi objek, tetapi membandingkan alamat memori yang ditunjuk oleh variabel tersebut. Untuk membandingkan isi String, kita dapat menggunakan String.equals() di mana parameternya adalah objek String yang akan dibandingkan. Metode ini akan membandingkan karakter per karakter dari kedua String. Misalnya, variabel salam berisi String "Selamat". Untuk menguji apakah variabel salam berisi "Selamat", bisa kita gunakan perintah salam.equals("selamat") Konsekuensi lainnya adalah apabila suatu variabel merujuk pada objek yang dideklarasikan sebagai final. Ini berarti nilai variabel itu tidak bisa berubah setelah

120 diinisialisasi, sedangkan isi variabel itu adalah rujukan ke alamat memori tempat objek berada. Dengan demikian variabel tersebut akan selalu menunjuk pada alamat memori yang sama. Akan tetapi hal ini tidak berlaku untuk objek itu sendiri. Apabila ada variabel lain yang tidak "final" tetapi menunjuk pada alamat memori yang sama, kemudian variabel ini mengubah isi objek tersebut, maka isi objek tersebut bisa berubah. Kita boleh saja untuk menulis perintah sebagai berikut. final Murid mrd = new Murid(); murid.nama = "Ahmad Basir"; Perhatikan pada kode di atas bahwa isi objek bisa diubah. Akan tetapi jika kita mencoba menulis seperti ini Murid mrd99 = new Murid(); mrd = mrd99; // ILEGAL, karena mrd adalah variabel final Konstruktor dan Inisialisasi Objek Posted Sel, 03/03/ :34 by belajarprogram Versi ramah cetak Kelas pada Java memiliki sifat yang sama sekali berbeda dengan tipe data primitif lainnya, seperti int atau boolean. Seperti disebutkan pada bagian sebelumnya, mendeklarasikan suatu variabel dengan tipe suatu kelas tidak berarti membuat objek dari kelas tersebut. Objek tersebut harus dibuat (constructed). Pada saat objek dibuat, komputer akan mencari tempat yang tidak dipakai pada memori heap untuk menempatkan objek tersebut, kemudian mengisi objek itu dengan variabel instansi. Sebagai programmer, kita tidak peduli dengan bagaimana suatu objek disimpan, akan tetapi kita ingin mengatur supaya nilai yang disimpan pada saat objek tersebut dibuat sesuai dengan keinginan kita. Dalam beberapa kasus, kita bahkan ingin suatu objek melakukan tugas tertentu untuk pertama kali begitu ia diciptakan. Variabel instansi dapat diisi dengan nilai awal pada saat ia dideklarasikan, seperti variabel lainnya. Misalnya, kelas berikut yang bernama PasanganDadu, yang melambangkan sepasang dadu. Kelas ini memiliki dua variabel instansi yang melambangkan nilai yang ditunjukkan oleh masing-masing dadu dan metode instansi untuk mengocok dadu, yaitu : class PasanganDadu { public int dadu1 = 3; // Angka pada dadu pertama public int dadu2 = 4; // Angka pada dadu kedua public void kocok() { // Kocok dadu dengan menggunakan bilangan acak antara 1 dan 6 dadu1 = (int)(math.random()*6) + 1; dadu2 = (int)(math.random()*6) + 1;

121 // akhir kelas PasanganDadu Variabel instansi dadu1 dan dadu2 diisi dengan nilai awal 3 dan 4. Inisialisasi ini dilakukan setiap kali objek PasanganDadu dibuat. Ingat bahwa kelas PasanganDadu hanya 1, akan tetapi kita bisa membuat banyak objek dari kelas ini. Setiap kali objek dibuat, objek tersebut memiliki tempat di memori sendiri, yang disebut dengan instansi objek tersebut. Perintah "dadu1 = 3" dan "dadu2 = 4" akan dieksekusi setiap kali objek dibuat. Kita bisa memodifikasi kelas PasanganDadu dengan nilai awal acak, bukan 3 dan 4 misalnya, dengan potongan kode berikut : class PasanganDadu { public int dadu1 = (int)(math.random()*6) + 1; // Angka pada dadu pertama public int dadu2 = (int)(math.random()*6) + 1; // Angka pada dadu kedua public void kocok() { // Kocok dadu dengan menggunakan bilangan acak antara 1 dan 6 dadu1 = (int)(math.random()*6) + 1; dadu2 = (int)(math.random()*6) + 1; // akhir kelas PasanganDadu Karena inisialisasi dilakukan setiap kali objek dibuat, maka setiap objek akan memiliki nilai yang berbeda-beda hasil dari instruksi Math.random() pada inisialisasi variabel instansi. Untuk inisialisasi variabel static, hal ini tidak mungkin dilakukan, karena hanya ada 1 variabel statik untuk 1 kelas, tidak peduli berapa pun banyaknya objek yang dibuat. Jika variabel instansi tidak kita beri nilai awal, maka nilai bawaan akan diberikan secara otomatis. Tipe data numerik (int, double, dll) memiliki nilai bawaan 0; boolean bernilai awal false; dan char bernilai awal karakter dengan kode Unicode 0. Variabel instansi juga bisa bertipe suatu objek. Dalam hal ini, variabel tersebut bernilai awal null. (Ingat bahwa String adalah objek, sehingga nilai awalnya adalah null). Objek dibuat dengan operator new, misalnya program yang ingin menggunakan objek PasanganDadu dapat menggunakan perintah berikut : // deklarasi variabel dan pembuatan objek dilakukan sekaligus PasanganDadu dadu = new PasanganDadu(); Pada contoh di atas, new PasanganDadu() adalah perintah untuk membuat objek, meletakkannya di memori dan menyimpan alamat objek ini di memori pada variabel dadu. Bagian ekspresi PasanganDadu() mirip seperti memanggil subrutin. Sebetulnya itulah yang terjadi, yaitu program memanggil subrutin spesial yang dinamakan konstruktor (constructor). Mungkin Anda heran karena kita tidak melihat adanya subrutin bernama PasanganDadu(). Akan tetapi semua kelas memiliki konstruktor, yang jika kita

122 tidak buat secara khusus, Java akan menambahkannya secara otomatis, yang disebut konstruktor bawaan. Konstruktor bawaan melakukan hal-hal umum seperti mengalokasi memori, mengisi nilai variabel instansi dengan nilai bawaannya, dan mengembalikan alamat objek yang dibuat di memori. Jika kita menginginkan hal lain yang ikut dilaksanakan ketika suatu objek dibuat, maka kita harus membuat konstruktor sendiri. Bagaimana cara mendefinisikan konstruktor? Konstruktor dideklarasikan mirip dengan deklarasi subrutin, dengan 3 perkecualian. Konstruktor tidak memiliki tipe keluaran (void pun tidak dibolehkan. Namanya harus sama dengan nama kelas di mana ia dideklarasikan. Sifat yang bisa digunakan hanya sifat akses, yaitu public, private, dan protected (static tidak diperbolehkan). Di lain pihak, konstruktor memiliki blok yang terdiri dari kumpulan perintah seperti pada subrutin. Kita bisa menggunakan perintah apapun seperti pada subrutin biasa, termasuk memiliki satu atau lebih parameter formal. Sebetulnya salah satu alasan untuk menggunakan parameter adalah kita bisa membuat beberapa konstruktor yang menerima data dalam berbagai bentuk, sehingga objek yang kita buat bisa dinisialisasi dengan cara yang berbeda-beda sesuai dengan kondisi dan kebutuhan dari program yang akan kita buat. Misalnya, kelas PasanganDadu di atas kita ubah sehingga kita bisa memberi nilai awal sendiri. Dalam hal ini kita buat konstruktor yang menerima 2 nilai sebagai nilai awal dadu, yaitu nilai1 dan nilai2. class PasanganDadu { public int dadu1; // Angka pada dadu pertama public int dadu2; // Angka pada dadu kedua public PasanganDadu(int nilai1, int nilai2) { // Konstruktor, mengambil nilai1 dan nilai2 sebagai nilai awal untuk dadu1 dan dadu2 dadu1 = nilai1; dadu2 = nilai2; public void kocok() { // Kocok dadu dengan menggunakan bilangan acak antara 1 dan 6 dadu1 = (int)(math.random()*6) + 1; dadu2 = (int)(math.random()*6) + 1; // akhir kelas PasanganDadu Konstruktor dideklarasikan dalam bentuk "public PasanganDadu(int nilai1, int nilai2)...", tanpa tipe keluaran dan dengan nama yang sama dengan nama kelas. Ini adalah cara Java mengenal suatu konstruktor dan membedakannya dengan subrutin biasa. Konstruktor ini memiliki 2 parameter yang harus diisi ketika konstruktor dipanggil. Misalnya, PasanganDadu dadu = new PasanganDadu(1,2);

123 Membuat objek baru yang variabel intansinya dadu1 dan dadu2 bernilai 1 dan 2. Karena sekarang kita telah membuat konstruktor, kita tidak bisa lagi membuat objek dengan perintah "new PasanganDadu()". Java akan membuat konstruktor bawaan apabila tidak ada satupun konstruktor yang didefinisikan. Akan tetapi, kita bisa membuat konstruktor lain di kelas tersebut, karena suatu kelas bisa terdiri dari beberapa konstruktor asalkan parameternya berbeda. Sekarang kita akan modifikasi lagi kelas tersebut dengan 2 konstruktor, yang mana apabila tidak ada parameter yang diberikan, maka objek tersebut akan mengisi nilai dadu1 dan dadu2 dengan bilangan acak. class PasanganDadu { public int dadu1; // Angka pada dadu pertama public int dadu2; // Angka pada dadu kedua public PasanganDadu() { // Isi dadu1 dan dadu2 dengan bilangan acak, dengan memanggil metode // kocok() kocok(); public PasanganDadu(int nilai1, int nilai2) { // Konstruktor, mengambil nilai1 dan nilai2 sebagai nilai awal untuk // dadu1 dan dadu2 dadu1 = nilai1; dadu2 = nilai2; public void kocok() { // Kocok dadu dengan menggunakan bilangan acak antara 1 dan 6 dadu1 = (int) (Math.random() * 6) + 1; dadu2 = (int) (Math.random() * 6) + 1; // akhir kelas PasanganDadu Sekarang kita bisa memilih bagaimana membuat objek, yaitu dengan "new PasanganDadu()" atau dengan "new PasanganDadu(x,y)", di mana x dan y adalah ekpresi bernilai int. Kelas ini, bisa digunakan dalam program lain yang membutuhkan sepasang dadu. Program tersebut tidak lagi harus memanggil fungsi (int)(math.random()*6) + 1 karena perintah ini sudah diimplementasikan di dalam kelas PasanganDadu. Bagi programmer, teknik seperti ini mempermudah pemecahan masalah dengan mengelompokkannya menjadi ciri dan perilaku suatu objek.

124 Berikut ini adalah contoh program lain yang menggunakan objek PasanganDadu() untuk menghitung berapa kali kocok akan menghasilkan jumlah nilai yang sama. Program lengkapnya bisa diunduh di sini untuk diimport ke dalam Eclipse. public class KocokDuaPasangDadu { /** args */ public static void main(string[] args) { PasanganDadu dadupertama = new PasanganDadu(); // pasangan dadu pertama PasanganDadu dadukedua = new PasanganDadu(); // pasangan dadu kedua int jumlahkocokan; // untuk mengitung berapa kali dua pasang dadu // tersebut dikocok int total1; // hitung berapa kali dadu pertama muncul int total2; // hitung berapa kali dadu kedua muncul jumlahkocokan = 0; do { dadupertama.kocok(); // kocok dadu pertama total1 = dadupertama.dadu1 + dadupertama.dadu2; // hitung jumlahnya System.out.println("Pasangan dadu pertama berjumlah " + total1); jumlahnya dadukedua.kocok(); // kocok dadu pertama total2 = dadukedua.dadu1 + dadukedua.dadu2; // hitung System.out.println("Pasangan dadu pertama berjumlah " + total2); jumlahkocokan++; System.out.println(); // cetak baris kosong while (total1!= total2); System.out.println("Butuh " + jumlahkocokan + " kocokan hingga pasangan " + " dadu pertama dan kedua berjumlah sama"); Keluarannya adalah sebagai berikut

125 Konstruktor adalah subrutin, tetapi bukan subrutin biasa, dan bukan metode instansi, karena konstruktor tidak dimiliki oleh suatu objek. Karena tugasnya membuat objek, maka konstruktor dijalankan sebelum objek dibuat. Konstruktor mirip dengan subrutin anggota statik, tetapi dia tidak bisa dideklarasikan "static". Bahkan menurut spesifikasi Java, konstruktor bukan anggota suatu kelas sama sekali. Tidak seperti subrutin lain, konstruktor hanya bisa dipanggil melalui operator "new", dalam bentuk new nama_kelas(parameter); di sini "parameter" boleh kosong. Hasil keluarannya adalah alamat memori di mana objek yang baru dibuat tersebut disimpan. Seringkali, kita akan simpan hasil keluarannya di dalam suatu variabel, atau bisa juga hasil keluarannya diberikan ke dalam suatu fungsi sebagai parameter. Memanggil konstruktor lebih rumit daripada memanggil subrutin atau fungsi biasa. Halhal berikut sangat membantu untuk lebih memahami apa yang dilakukan oleh konstruktor ketika ia dipanggil untuk membuat suatu objek: 1. Pertama, komputer memberi daerah pada memori yang tidak digunakan, cukup untuk dipakai oleh objek yang akan dibuat

126 2. Komputer akan mengisi variabel instansi objek tersebut dengan nilai bawaannya. Jika deklarasi variabel instansi pada kelas memiliki nilai awal tertentu, maka nilai tersebut akan dimasukkan sebagai nilai awalnya. 3. Parameter aktual pada konstruktor (jika ada) akan dievaluasi dan nilainya diberikan kepada parameter formal konstruktor tersebut. 4. Perintah pada konstruktor (jika ada) akan dilaksanakan. 5. Referensi objek akan dikembalikan kepada si pemanggil. Hasil keluarannya adalah referensi ke objek yang baru saja dibuat. Kita bisa gunakan referensi ini untuk mengambil data pada variabel instansi objek tersebut atau memanggil metode instansinya. Contoh lain, mari kita ganti kelas Murid pada bagian sebelumnya. Kita akan tambahkan konstruktor dan juga kita ganti variabel instansi "nama" menjadi bersifat privat. class Murid { private String nama; // Nama murid public double nilai1, nilai2, nilai3; // Nilai-nilai ujian Murid(String namamurid) { // Konstruktor objek Murid nama = namamurid; public String getnama() { // Metode untuk mengambil variabel anggota yang bersifat private // misalnya variabel instansi nama return nama; public double hitungratarata() { // Hitung rata-rata ulangan return (nilai1 + nilai2 + nilai3) / 3; // akhir kelas Murid Objek bertipe Murid berisi informasi tentang murid tertentu. Konstruktor kelas ini memiliki parameter bertipe String yaitu nama murid yang akan kita buat. Objek bertipe Murid ini bisa dibuat dengan pernyataan seperti: mrd1 = new Murid("Ahmad Surahmat"); mrd2 = new Murid("Hamid Samsudin") Pada versi aslinya, isi variabel nama harus diisi dengan perintah terpisah setelah objek dibuat. Masalahnya programmer tidak selalu ingat untuk mengisi nilai nama. Pada versi baru di atas, setiap kali kita membuat objek, parameter namamurid harus disertakan, karena ini dideklarasikan pada konstruktornya. Dengan demikian potensi bug karena kelalaian programmer dapat dihilangkan dengan mudah.

127 Contoh keamanan lainnya adalah dengan membuat variabel instansi nama bersifat private. Ini berarti variabel ini tidak bisa diakses oleh dunia luar secara langsung. Variabel ini hanya bisa diambil nilainya dengan metode instansi getnama, dan karena tidak bisa diakses langsung dari luar, maka isi variabel ini tidak bisa diganti dari luar kelas. Sekali objek Murid dibuat, maka namanya tidak bisa diganti selama murid tersebut ada. Pemulung Memori (Garbage Collector) Posted Rab, 03/04/ :14 by belajarprogram Versi ramah cetak Hingga saat ini kita hanya berbicara tentang membuat objek. Lalu bagaimana menghapus objek? Pada bahasa pemrograman Java, destruksi (lawan konstruksi yang berarti menghancurkan) objek dilakukan secara otomatis. Objek dibuat di dalam memori heap, dan bisa diakses hanya melalui referensi yang disimpan oleh variabel. Apa yang akan dilakukan jika variabel tersebut hilang, misalnya selesai melakukan tugas dalam subrutin, sehingga referensi ke objek tersebut juga hilang? Perhatikan contoh berikut ini. Murid mrd = new Murid("Joko Susanto"); mrd = null; Di baris pertama, referensi objek baru akan disimpan pada variabel mrd. Pada baris berikutnya, isi variabel mrd diisi dengan null (atau referensi kosong), sehingga referensi ke objek yang baru kita buat menjadi hilang. Dalam kondisi seperti ini, komputer tidak bisa lagi menunjuk kepada objek yang baru dibuat tersebut, karena refernsinya hilang. Atau dengan kata lain, objek tersebut tidak akan pernah bisa dipakai lagi. Java menggunakan prosedur yang dinamakan pemulung memori (garbage collector) untuk mengambil memori di mana suatu objek tidak lagi bisa diakses oleh program. Sistem komputer harus bertanggung jawab terhadap pengaturan memori, bukan programmer, untuk melacak objek yang menjadi "sampah". Pada contoh di atas, sangat mudah dilihat bahwa objek Murid telah menjadi sampah. Biasanya dalam kenyataan sehari-hari, sangat sulit untuk melacak mana objek sampah dan mana yang ukan. Jika suatu objek telah selesai digunakan, mungkin akan ada beberapa variabel yang masih menyimpan referensi ke objek tersebut. Suatu objek baru menjadi sampah apabila semua referensi yang merujuk pada objek tersebut hilang. Dalam beberapa bahasa pemrograman lain, programmer diharuskan untuk mengatur sampahnya sendiri. Akan tetapi, mencoba mengatur penggunaan memori secara manual sangat sulit, dan sering menimbulkan bug yang tidak terduga. Programmer mungkin tidak sengaja menghapus objek tersebut, meskipun ada variabel lain yang masih merujuk pada objek tersebut. Ini disebut kesalahan pointer tak bertuan, dan kesalahannya akan fatal apabila objek yang akan diakses tak lagi berada di alamat memori tersebut.

128 Tipe kesalahan lain adalah kebocoran memori, yang mana programmer lupa menghapus objek yang tidak lagi digunakan. Ini akan berakibat pada penuhnya memori dengan sampah yang tidak bisa lagi diakses karena referensinya telah hilang. Jika dibiarkan, maka lambat laun seluruh memori komputer akan habis, sehingga komputer bisa berhenti total. Karena Java memiliki pemulung memori, kesalahan seperti itu tidak mungkin terjadi. Pemulung memori sudah dibicarakan sejak lama, dan sudah digunakan pada beberapa bahasa pemrograman sejak tahun 1960-an. Anda mungkin bertanya kenapa tidak semua bahasa pemrograman menggunakan pemulung memori? Dulu, pemulung memori membutuhkan waktu pemrosesan yang lama, sehingga penggunaannya akan mengurangi kinerja program secara keseluruhan. Akan tetapi riset terbaru telah menemukan teknik pemulungan memori yang lebih canggih, dan ditambah dengan kecepatan komputer yang makin tinggi, pemulung memori menjadi suatu hal yang sangat realistis. Pewarisan, Polimorfisme, dan Kelas Abstrak Posted Kam, 03/05/ :08 by belajarprogram Versi ramah cetak Kelas melambangkan cetak biru objek yang memiliki kesamaan struktuk dan perilaku. Kelas menentukan struktur suatu objek melalui variabel yang terkandung dalam setiap objek, dan menentukan perilaku melalui metode instansi yang merupakan perilaku suatu objek. Ide utama dari pemrograman berorientasi objek -- yang membedakannya dari pemrograman tradisional -- adalah menciptakan kelas yang memiliki hanya beberapa (tidak semua) struktur dan perilaku. Kemiripan ini diekspresikan dalam bentuk pewarisan dan polimorfisme (perubahan bentuk). Istilah pewarisan berarti suatu kelas bisa mewariskan sebagian atau keseluruhan struktur dan perilaku kelas lain. Jika kelas B adalah kelas turunan dari kelas A, maka kita bisa juga menyebut kelas A adalah kelas super dari kelas B. Kelas turunan bisa memiliki struktur atau perilaku tambahan dari kelas supernya. Atau bahkan kelas turunan bisa mengubah atau mengganti perilaku kelas supernya. Hubungan antara kelas turunan dan kelas super sering dilukiskan dalam bentuk diagram di mana kelas turunan digambarkan di bawah kelas supernya, dan dihubungkan dengan garis penghubung dengan tanda segitiga yang diletakkan di dekat kelas supernya.

129 Dalam bahasa Java, ketika kita membuat suatu kelas, kita bisa menyatakan bahwa kelas tersebut merupakan kelas turunan dari kelas lain. Jika kita buat kelas yang bernama "B" dan kita ingin kelas ini menjadi kelas turunan dari kelas "A", kita akan tulis dalam bentuk : class B extends A {.. // tambahan atau perubahan. // struktur dan perilaku dari kelas A. Beberapa kelas dapat menurunkan kelas yang sama. Kelas-kelas turunan ini masingmasing disebut kelas saudara, yaitu diwariskan dari satu kelas super yang sama. Struktur dan perilaku kelas super ini akan dimiliki oleh masing-masing turunannya. Pada diagram berikut, kelas B, C, dan D adalah kelas saudara. Pewarisan juga bisa dilakukan beberapa kali, atau suatu kelas bisa memiliki cucu, buyut, dan seterusnya. Pada diagram, kelas E merupakan kelas turunan kelas D, sehingga kelas E adalah "cucu" dari kelas A. Kelas E masih bisa disebut turunan dari kelas A, walaupun bukan merupakan turunan langsungnya.

130 Mari kita buat sebuah contoh. Kita akan membuat program yang berhubungan dengan kendaraan bermotor, yang meliputi mobil, truk, dan motor. Program tersebut memiliki kelas yang dinamakan Kendaraan yang melambangkan semua jenis kendaraan bermotor. Kelas Kendaraan memiliki variabel instansi seperti nomorpolisi dan pemilik dan metode instansi yang bernama gantipemilik. Variabel dan metode instansi ini bisa digunakan oleh segala jenis kendaraan bermotor. Ada 3 kelas turunannya yaitu Mobil, Truk dan Motor yang akan menyimpan variabel dan metode khusus untuk setiap jenis kendaraan. Kelas Mobil misalnya memiliki variabel jumlahpintu, kelas Truk memiliki variabel jumlahroda, dan kelas Motor memiliki variabel jumlahtak. Kelas-kelas ini bisa dideklarasikan dalam Java dalam bentuk class Kendaraan { int nomorpolisi; Orang pemilik; // (anggap kelas Orang telah dibuat sebelumnya) void gantipemilik(orang pemilikbaru) { class Mobil extends Kendaraan { int jumlahpintu;...

131 class Truk extends Kendaraan { int jumlahroda;... class Motor extends Kendaraan { int jumlahtak; // 2-tak atau 4-tak... Anggap mobilku adalah variabel dengan tipe Mobil akan dideklarasikan dan diinisialisasi dengan pernyataan berikut Mobil mobilku = new Mobil(); Dengan deklarasi seperti ini, maka program akan bisa mengakses mobilku.jumlahpintu, karena jumlahpintu adalah variabel instansi dari kelas Mobil. Akan tetapi karena kelas Mobil merupakan turunan dari kelas Kendaraan, maka mobil ini juga memiliki stuktur dan perilaku dari kendaraan. Artinya program juga bisa mengakses mobilku.nomorpolisi, mobilku.pemilik, dan menjalankan metode mobilku.gantipemilik() Dalam dunia nyata mobil, truk dan motor memang kendaraan (bukan hanya pada program). Dalam arti objek yang memiliki tipe Mobil atau Truk atau Motor juga secara otomatis objek bertipe Kendaraan. Fakta penting berikutnya : Variabel yang dapat diisi referensi ke objek suatu kelas A juga dapat diisi referensi ke objek kelas turunan dari kelas A.

132 Efek praktis dari penyataan ini adalah, objek dengan tipe Mobil dapat diisi ke dalam variabel bertipe Kendaraan, atau dengan kata lain perintah berikut adalah valid Kendaraan kendaraanku = mobilku; atau bahkan juga perintah berikut Kendaraan kendaraanku = new Mobil(); Setelah pernyataan di atas, variabel kendaraanku berisi referensi ke objek Kendaraan, yang kebetulan merupakan instansi dari kelas turunannya, yaitu kelas Mobil. Objek akan "mengingat" bahwa yang disimpan dalam variabel tersebut adalah objek bertipe Mobil, bukan Kendaraan. Informasi tentang objek apa yang disimpan pada memori ikut disertakan bersama objek tersebut, sehingga variabel yang bertipe Kendaraan akan tahu dengan pasti tipe objek yang dirujuknya. Kita juga dapat menguji jenis objek yang disimpan suatu variabel dengan menggunakan operator instanceof. Misalnya if (kendaraanku instanceof Mobil) {... menguji apakah objek yang dirujuk pada variabel kendaraanku merupakan objek bertipe Mobil. Kebalikannya, pernyataan berikut tidak bisa dilakukan mobilku = kendaraanku; karena kendaraanku bisa bertipe objek lain seperti Truk atau Motor. Apabila kita tahu persis bahwa kendaraanku bertipe Mobil, kita bisa menggunakan casting, untuk memberi tahu komputer untuk memperlakukan variabel kendaraanku memiliki tipe Mobil. Jadi kita bisa gunakan perintah mobilku = (Mobil)kendaraanku; Atau kita juga bisa mengakses ((Mobil)kendaraanku).jumlahPintu. Mari kita gunakan kelas ini dalam program, dan kita ingin mencetak informasi yang sesuai dengan suatu kendaraan. Misalnya: System.out.println("Data Kendaraan:"); System.out.println("Nomor polisi: " + kendaraanku.nomorpolisi); if (kendaraanku instanceof Mobil) System.out.println("Jenis kendaraan: Mobil"); Mobil m = (Mobil)kendaraanku; System.out.println("Jumlah pintu: " + m.jumlahpintu); else if (kendaraanku instanceof Truk) { System.out.println("Jenis kendaraan: Truk"); Truk t = (Truk)kendaraanku ; System.out.println("Jumlah roda: " + t.jumlahroda);

133 else if (kendaraanku instanceof Motor) { System.out.println("Jenis kendaraan: Motor"); Motor sm = (Motor)kendaraanku ; System.out.println("Jumlah tak: " + sm.jumlahtak); Lihat bahwa untuk setiap jenis objek, komputer akan menguji satu per satu tipe objek yang disimpan dalam kendaraanku. Jika kendaraanku[code] merujuk pada objek bertipe Truk maka casting [code](mobil)kendaraanku akan menampilkan pesan kesalahan. Contoh lain, mari kita buat program untuk menggambar suatu bentuk geometri pada layar. Misalnya bentuk geometri tersebut terdiri dari persegi panjang, oval, dan kotak bersudut lingkar dengan berbagai warna. Kelas yang akan kita buat adalah PersegiPanjang, Oval, dan KotakLingkar. Ketiga kelas tersebut memiliki kelas super yang sama yang disebut BentukGeometris. Kelas BentukGeometris memiliki variabel instansi warna, lokasi, dan ukuran. Untuk mengganti warna kita bisa mengganti variabel instansi warna pada kelas ini, kemudian menjalankan metode instansi gambar() untuk menggambar bentuk tersebut dengan warna baru: class BentukGeometris { Color warna; // Warna suatu bentuk geometri // (Kelas Color diimport dari paket java.awt) void setwarna(color warnabaru) { // Metode untuk mengganti warna warna = warnabaru; // ganti nilai variabel instansi gambar(); // gambar ulang bentuk geometris ini, dengan warna baru void gambar() { // metode untuk menggambar??? // perintaha apa yang harus diletakkan di sini?

134 ... // variabel dan metode instansi lain // akhir kelas BentukGeometris Sekarang metode gambar() mungkin menjadi serba salah. Masalahnya, setiap bentuk digambar dengan cara berbeda. Metode setwarna() dapat digunakan oleh semua bentuk. Lalu bagaimana komputer tahu bagaimana menggambar bentuk tersebut jika metode gambar() dipanggil? Mudahnya, kita bisa jawab dengan : Komputer akan menjalankan perintah gambar() dengan meminta bentuk tersebut untuk menggambar sendiri. Setiap objek bentuk tahu apa yang harus dilakukan untuk menggambar dirinya. Dalam prakteknya, ini berarti setiap kelas turunan dari kelas BentukGeometris memiliki metode gambar() sendiri-sendiri, yaitu : class PersegiPanjang extends BentukGeometris { void gambar() {... // perintah untuk menggambar persegi panjang... // metode atau variabel lain class Oval extends BentukGeometris { void gambar() {... // perintah untuk menggambar oval... // metode atau variabel lain class KotakLingkar extends BentukGeometris { void gambar() {... // perintah untuk menggambar kotak bersudut lingkar... // metode atau variabel lain Jika gambarku adalah variabel bertipe BentukGeometri, variabel ini bisa merujuk pada objek dengan bertipe PersegiPanjang, Oval, atau KotakLingkar. Ketika program dijalankan, isi variabel gambarku akan berubah-ubah, tergantung pada objek yang dirujuknya. Suatu saat di tengah program, jika perintah gambarku.gambar() dijalankan, maka metode gambar() akan dijalankan tergantung pada isi variabel gambarku saat itu. Kita tidak akan bisa menebak metode apa yang akan dipanggil pada suatu saat hanya dengan membaca program tersebut, karena kita tidak pernah tahu isi variabel gambarku pada suatu saat tertentu. Misalnya perintah gambar() berada dalam suatu perulangan yang dijalankan berkali-kali. Maka akan sangat mungkin perintah gambarku.gambar() dipanggil berulang-ulang tetapi dengan objek yang berbeda-beda. Kita sebut metode gambar() bersifat polimorfis. Suatu metode disebut polimorfis jika aksi yang dilakukan oleh suatu metode berbeda-beda tergantung pada objek aktual pada

135 saat metode itu dijalankan. Polimorfisme adalah fitur utama dalam pemrograman berorientasi objek. Mungkin akan lebih mudah dimengerti jika kita ganti bahasanya : Dalam PBO, memanggil metode sering disebut juga dengan mengirim pesan kepada suatu objek. Objek tersebut merespon pesan tersebut dengan melaksanakan metode yang sesuai. Pernyataan "gambarku.gambar();" adalah pesan yang dikirim ke objek gambarku. Karena objek tersebut tahu jenis objeknya sendiri, dia akan tahu bagaimana merespon pesan tersebut. Dari sudut pandang ini, komputer akan selalu mengeksekusi perintah "gambarku.gambar();" dengan cara yang sama, yaitu dengan mengirim pesan. Pesan tersebut bergantung pada siapa yang menerima pesan tersebut. Dengan kata lain, objek merupakan sesuatu yang memiliki perilaku aktif, yaitu sesuatu yang bisa mengirim dan menerima pesan. Polimorfisme dianggap sebagai sifat yang natural jika dilihat dari sudut pandang ini. Polimorfisme juga berarti bahwa beberapa objek dapat merespon suatu pesan dengan cara yang berbeda-beda. Salah satu keindahan dari poliformisme adalah kita bisa membuat kode program tanpa harus mengetahui persis apa yang akan dilakukan program saat kita menulis program tersebut. Jika kita ingin menambah objek lain, misalnya segitiga, maka kita cukup menulis kelas turunan baru dan membuat metode gambar() sendiri. Secara otomatis, program akan tahu jika kita beri perintah "gambarku.gambar()" maka metode gambar() pada kelas segitiga akan dijalankan apabila gambarku menunjuk pada objek yang memiliki kelas segitiga. Ketika suatu objek, misalnya PersegiPanjang, Oval, atau KotakLingkar, harus menggambar dirinya sendiri, metode gambar() yang sesuai dengan objek yang menerima pesan akan dilaksanakan. Pertanyaannya, apa yang harus kita isi pada metode gambar() di kelas BentukGeometri? Jawabannya: kosongkan saja. Intinya kelas BentukGeometri adalah kelas abstrak, karena tidak ada cara untuk menggambar BentukGeometri. Apabila kelas tersebut telah direalisasikan dalam suatu bentuk, misalnya PersegiPanjang, barulah objek tersebut bisa menggambar sesuatu. Lalu kenapa kita harus mendeklarasikan metode gambar() di kelas BentukGeometri? Jawabannya, itu harus ada karena metode ini dibutuhkan untuk memanggil metode setwarna() pada kelas BentukGeometri. Program kita akan menampilkan pesan kesalahan jika kita berikan perintah gambarku.gambar(), karena gambarku bertipe BentukGeometri, apabila di dalam kelas ini tidak ada metode yang bernama gambar(). Kita bisa menyebut kelas BentukGeometri merupakan kelas abstrak. Kelas abstrak adalah kelas yang tidak bisa digunakan untuk membuat suatu objek, dan hanya digunakan untuk membuat kelas turunan. Kelas abstrak hanya ada untuk mengekspresikan sifat umum yang dimiliki oleh kelas-kelas turunannya.

136 Demikian juga, kita bisa menyebut metode gambar() pada kelas BentukGeometri merupakan metode abstrak, karena metode ini bukan untuk dipanggil. Akan tetapi metode ini ada untuk memberi tahu komputer bahwa semua kelas turunannya mengerti dan bisa menjalankan metode gambar(). dan metode gambar() secara sematik merupakan kelas dan metode abstrak. Kita juga bisa memberi tahu komputer secara langsung dengan memberi sifat "abstract" pada definisinya. Untuk metode abstrak, blok perintahnya diganti dengan titik koma (;). Metode ini harus diimplementasikan secara detail pada kelas turunannya. BentukGeometri Perhatikan contoh berikut. abstract class BentukGeometri { Color warna; void setwarna(color warnabaru) { // metode untuk mengganti warna suatu bentuk warna = warnabaru; // ganti isi variabel instansi warna gambar(); // menggambar kembali suatu bentuk dengan warna baru abstract void gambar(); // metode abstrak yang harus diimplementasikan // pada kelas turunannya... // variabel dan metode instansi lainnya // akhir kelas BentukGeometri Setelah kita buat seperti ini, kita tidak bisa lagi membuat objek langsung dari kelas BentukGeometri. Dalam Java, setiap kelas yang kita buat akan memiliki kelas super, atau dengan kata lain setiap kelas merupakan turunan dari kelas lain. Jika kita tidak memberi kelas supernya (melalui operator extends), maka kelas tersebut otomatis memiliki kelas super Object, yaitu kelas bawaan yang sudah didefinisikan dalam paket java.lang. Kelas Object adalah satu-satunya kelas yang tidak memiliki kelas super. Jadi dengan demikian, perintah class Kelasku {... sama artinya dengan

137 class Kelasku extends Object {... Semua kelas akan merupakan turunan langsung atau tidak langsung dari kelas Object. Artinya suatu obek yang merupakan kelas apapun dapat direferensikan oleh variabel bertipe Object. Kelas Objek memiliki sifat-sifat umum yang dapat digunakan oleh semua objek. Kelas Object adalah kelas yang paling abstrak dari kelas-kelas lainnya. Kelas Object digunakan dalam beberapa kasus di mana kumpulan objek yang sangat umum ingin diolah. Misalnya, Java memiliki kelas standar java.util.arraylist yang merupakan kumpulan Objects. ArrayList akan dibahas kemudian dalam topik tentang struktur data dan algoritma. Kelas ini digunakan untuk menampung kumpulan objek, tak ditentukan jumlahnya, dan bisa diperbanyak ketika objek baru ditambahkan. Objek yang dapat ditampung pada dasarnya adalah semua objek dari beragam kelas. Kita dapat juga membuat program untuk menampung semua BentukGeometri yang telah digambar di layar dalam kontainer ArrayList. Milsanya ArrayList kita bernama kumpulangambar. Suatu objek dengan tipe BentukGeometri misalnya gambarku dapat ditambahkan ke dalam kumpulan ini dengan menggunakan perintah "kumpulangambar.add(gambarku);". Gambar tersebut dapat dibuang dari dalam kumpulan dengan perintah "kumpulangambar.remove(gambarku);". Jumlah obejk dalam kumpulangambar dapat diubah dengan perintah "kumpulangambar.size()". Juga kita bisa mengambil gambar ke-n dari dalam kumpulangambar dengan perintah "kumpulangambar.get(n);". Perlu diingat bahwa metode tersebut akan mengembalikan objek bertipe Object bukan BentukGeometri, dan sebetulnya kontainer ini bisa menampung objek apa saja, bukan hanya BentukGeometri, sehingga untuk mengambil objek ke-n yang kemudian kita letakkan dalam variabel bertipe BentukGeometri, kita bisa gunakan perintah gambarku = (BentukGeometri)kumpulanGambar.get(n); Katakan misalnya kita ingin menggambar semua objek dengan berbagai tipe di dalam kumpulan tersebut, kita bisa gunakan perulangan for sederhana (sekaligus memberi contoh betapa indagnya PBO dan polimorfisme), yaitu dengan : for (int n = 0; n < kumpulangambar.size(); n++) { BentukGeometri bg = (BentukGeometri)kumpulanGambar.get(n); bg.gambar(); Penutup Dalam pemrograman sehari-hari, terutama bagi programmer yang baru belajar dan bekerja dengan objek, penurunan kelas akan sering digunakan. Salah satunya adalah untuk memperluas kegunaan suatu kelas, yang disesuaikan dengan situasi dan kondisi permasalahan yang kita hadapi. Kita bisa membuat kelas baru yang merupakan turunan kelas yang sudah ada, menambah beberapa variabel dan metode instansi baru, yaitu dengan operator extends seperti dijelaskan sebelumnya pada bagian ini.

138 Secara umum, sintaksnya adalah dalam bentuk class kelas_turunan extends kelas_yang_sudah_ada {... // tambahan atau perubahan variabel dan metode instansi Kita akan lihat nanti bahwa banyak kelas-kelas standar pada Java yang digunakan hanya sebagai kelas dasar yang untuk dikembangkan lebih jauh oleh kita sebagai programmer this dan super Posted Sab, 03/07/ :16 by belajarprogram Versi ramah cetak Meskipun ide dasar dari pemrograman berorientasi objek merupakan konsep yang cukup sederhana dan jelas, akan tetapi untuk memahaminya dengan baik kita membuthkan lebih banyak waktu. Sayangnya, banyak sekali detail yang harus diulas di luar konsep dasarnya. Bagian ini dan bagian berikutnya akan berbicara tentang hal-hal detail, yang tidak perlu dikuasai dalam waktu singkat, akan tetapi pengenalan tentang hal detail ini sangat berguna paling tidak sebagai bahan referensi. Variabel spesial this dan super Anggota statik suatu kelas bisa digunakan langsung di dalam kelas tersebut. Untuk digunakan di kelas lain, maka ia harus dipanggil dengan nama lengkapnya dalam bentuk "namakelas.namaanggota", misalnya "System.out" adalah variabel anggota statik dengan nama "out" di dalam kelas "System". Kita bisa menggunakan nama lengkap kelas tersebut di manapun, bahkan dari dalam kelas yang sama, misalnya karena nama anggota tersebut disembunyikan oleh variabel lokal yang namanya sama. Variabel dan metode instansi juga bisa digunakan langsung di dalam kelas tersebut, misalnya suatu variabel instansi bisa digunakan langsung oleh metode instansi di kelas yang sama. Anggota instansi juga memiliki nama lengkap akan tetapi ingat bahwa anggota instansi dimiliki oleh objek, bukan kelas. Sehingga untuk memanggil suatu anggota instansi, kita harus menggunakan nama objek yang diciptakan dari kelas tersebut, dalam bentuk namaobjek.namaanggota. Akan tetapi, misalnya kita sedang menulis metode instansi di suatu kelas. Bagaimana caranya kita memanggil anggota instansi kelas yang sama jika kita belum tahu nama objek apa yang diciptakan dari kelas ini? Java memiliki variabel spesial yang dinamakan "this" yang bisa digunakan untuk kasus di atas. Variabel ini digunakan pada suatu objek untuk memanggil metode atau variabel instansi pada objek yang sama. Maksudnya, this, merujuk pada "objek ini" yaitu objek di mana metode sedang dijalankan. Jika x adalah variabel instansi dalam suatu objek, maka this.x adalah nama lengkap variabel tersebut jika dipanggil dari dalam objek yang

139 sama. Jika metode suatumetode() adalah metode instansi pada suatu objek, maka this.suatumetode() bisa digunakan untuk memanggil metode tersebut dari objek yang sama. Ketika komputer menjalankan perintah tersebut, komputer akan mengganti variabel this dengan objek yang berjalan pada saat itu. Salah satu kegunaaan this adalah pada konstruktor, misalnya : public class Murid { private String nama; // Nama murid public Murid(String nama) { // Konstruktor, membuat murid dengan nama yang diberikan this.nama = nama;.. // Variabel dan metode lain.. Dalam konstruktor di atas, variabel instansi nama disembunyikan oleh parameter formal yang bernama sama. Akan tetapi, variabel instansi masih tetap bisa dipanggil dengan nama lengkapnya, this.nama. Cara ini merupakan cara yang lazim, artinya kita tidak perlu mengganti nama parameter formal dengan nama lain agar namanya tidak bentrok dengan nama salah satu variabel instansinya. Kita bisa menggunakan nama parameter formal yang sama persis dengan variabel instansinya. Ada lagi kegunaan lain dari this. Ketika kita sedang menulis metode instansi, kita ingin memberikan objek sebagai parameter aktual. Dalam hal ini, kita bisa menggunakan this sebagai parameter aktualnya. Misalnya, kita ingin mencetak suatu objek sebagai string, kita bisa menggunakan perintah "System.out.println(this);". Atau kita ingin mengisi nilai this ke dalam variabel lain. Pokoknya, kita bisa melakukan segala hal seperti layaknya variabel kecuali mengganti isinya. Java juga memiliki variabel spesial yang dinamakan "super" untuk digunakan dalam metode instansi. Variabel super digunakan dalam kelas turunan. super mengacu pada objek di mana metode tersebut berada, akan tetapi ia merupakan bagian dari kelas super dari objek tersebut. Suatu kelas bisa ditambah atau dimodifikasi dari kelas turunannya. Variabel super hanya mengacu pada bagian objek sebelum ia ditambah atau dimodifikasi, atau dengan kata lain bentuk aslinya sebelum dia diturunkan, yang dalam hal ini sama dengan kelas supernya. Misalnya kita akan menulis suatu kelas, dan kelas tersebut memiliki metode instansi bernama suatumetode(). Pernyataan super.suatumetode() berarti menjalankan suatumetode() pada kelas supernya. Jika tidak ada metode sutumetode() pada kelas supernya, Java akan menampilkan pesan kesalahan sintaks.

140 Alasan mengapa Java memiliki variabel super adalah karena banyak hal yang mungkin tersembunyi pada kelas turunan. Misalnya karena kita mengimplementasikan fungsi lain pada kelas turunan dengan nama yang sama (dalam kaitannya dengan polimorfisme, misalkan). Ketika kita membuat metode baru pada kelas turunan yang memiliki nama dan jenis parameter yang sama dengan metode pada kelas supernya, metode dari kelas super akan disembunyukan. Dalam bahasa pemrograman, metode ini menimpa (override) metode dari kelas supernya. Variabel super bisa digunakan untuk mengakses metode aslinya yang didefinisikan di kelas supernya. Kegunaan utama dari super biasanya untuk memperluas kegunaan metode yang sudah ada, bukan menggantinya secara keseluuruhan. Metode baru bisa menggunakan super untuk menjalankan instruksi pada kelas supernya, kemudian menambahkan instruksi lain pada kelas turunannya. Misalnya, kita memiliki kelas PasanganDadu yang memiliki metode kocok. Kemudian kita akan membuat kelas turunan yaitu DaduGrafis yang berfungsi untuk menggambar dadu pada layar. Metode kocok() dalam DaduGrafis harus melakukan apa yang dilakukan oleh PasanganDadu, dengan tambahan perintah untuk menggambar dadu tersebut di layar. Kita bisa tulis definisi kelas DaduGrafis dalam bentuk : public class DaduGrafis extends PasanganDadu { public void kocok() { // Mengocok dadu, kemudian menggambarnya di layar super.kocok(); // Panggil metode kocok() di kelas PasanganDadu gambar(); // Gambar ulang dadu.. // Metode dan variabel lain, termasuk metode gambar(). Dengan cara ini kita bisa memperluas apa yang dilakukan oleh metode kocok() pada kelas supernya tanpa mengetahui dengan detail apa yang dilakukan langkah per langkah di kelas supernya. Konstuktor pada Kelas Turunan Konstruktor tidak bisa diturunkan, artinya jika kita membuat kelas turunan dari suatu kelas, konstruktor pada kelas supernya tidak termasuk bagian yang diturunkan. Jika kita ingin konstruktor tersebut pada kelas turunannya, maka kita harus membuat kembali konstruktor tersebut di kelas yang baru. Jika tidak, maka Java akan membuat konstruktor standar tanpa parameter apa-apa. Hal ini mungkin menjadi masalah jika konstruktor pada kelas supernya melakukan banyak tugas. Artinya kita harus mengulang kembali menuliskan semua instruksi pada kelas supernya di kelas turunan yang baru. Masalahnya akan lebih rumit jika kita tidak

141 mengetahui sama sekali apa yang dilakukan kelas supernya, misalnya apabila tidak ada kode sumbernya. Cara yang paling mudah adalah menggunakan super. Di baris pertama konstruktor baru kita di kelas turunannya, kita bisa menggunakan super untuk memanggil konstruktor kelas supernya. Sintaksnya sedikit aneh dan membingungkan, dan hanya bisa digunakan untuk satu situasi saja : Sintaksnya mirip seperti memanggil subrutin super (meskipun sebenarnya super bukan subrutin dan kita tidak bisa memanggil konstruktor seperti kita memanggil subrutin biasa). Misalnya kelas PasanganDadu memiliki konstruktor yang memiliki dua parameter bertipe int. Maka kita bisa membuat konstruktor pada kelas DaduGrafis seperti : public class DaduGrafis extends PasanganDadu { public DaduGrafis() { // Konstruktor kelas ini super(3,4); // Panggil konstruktor dari kelas PasanganDadu // dengan parameter 3 dan 4 inisialisasigrafis(); // Lakukan inisialisasi grafis // untuk digunakan pada kelas DaduGrafis.. // Konstruktor, variabel dan metode instansi lain. Antar Muka (interface), Kelas Bertingkat, dan Detail Lain Posted Min, 03/08/ :11 by belajarprogram Versi ramah cetak Antar Muka Beberapa bahasa pemrograman berorientasi objek, misalnya C++, membolehkan suatu kelas memiliki dua atau lebih kelas super. Hal ini disebut pewarisan ganda (multiple inheritance). Pada ilustrasi berikut, kelas E memiliki kelas super A dan B, sedangkan kelas F memiliki 3 kelas super.

142 Pewarisan ganda seperti ini tidak diperbolehkan pada Java. Desainer Java ingin menjaga agar bahasa Java tetap sederhana, dan mereka merasa pewarisan ganda ini sangat kompleks dengan keuntungan yang tidak begitu besar. Akan tetapi, Java memiliki fitur lain yang bisa digunakan seperti halnya pewarisan berganda, yaitu antar muka (interface). Kita telah mengenal istilah "antar muka" sebelumnya, yaitu dalam konteks umum tentang kotak hitam dan subrutin. Antar muka suatu subrutin terdiri dari nama, jenis keluarannya, jumlah dan tipe parameternya. Informasi ini dibutuhkan jika kita ingin memanggi subrutin tersebut. Suatu subrutin juga memiliki implementasi : yaitu blok yang berisi perintah yang akan dijalankan ketika subrutin ini dipanggil. Dalam Java, kata interface adalah kata kunci yang memiliki arti tambahan. Suatu interface dalam hal ini adalah antar muka yang terdiri dari subrutin tanpa implementasi apa-apa. Suatu kelas dapat mengimplementasi suatu interface dengan memberikan kode detail pada setiap subrutin yang ditulis pada interface tersebut. Berikut adalah contoh interface Java sederhana : public interface Gambar { public void gambar(graphics g); Deklarasi di atas mirip dengan definisi suatu kelas, akan tetapi isi metode gambar() dikosongkan. Suatu kelas yang mengimplementasi interface ini, yaitu interfacegambar, harus mengisi implementasi metode gambar() ini. Tentunya kelas tersebut juga bisa memiliki variabel dan metode lain. Misalnya, class Garis implements Gambar { public void gambar(graphics g) {... // perintah untuk menggambar garis... // variabel dan metode lain Kelas apapun yang mengimplementasi antar muka Gambar[code] harus memberikan detail apa yang akan dilakukan oleh metode [code]gambar(). Objek yang diciptakan dari kelas tersebut akan memiliki metode gambar(). Perlu diingat bahwa hanya menambah metode gambar() saja tidak cukup. Definisi kelas yang ingin

143 mengimplementasikan suatu interface harus menulis "implements Gambar" dalam definisi kelasnya. Suatu kelas bisa menurunkan hanya satu kelas lain, akan tetapi suatu kelas bisa mengimplementasikan lebih dari suatu antar muka. Sebenarnya, suatu kelas bisa menurunkan kelas lain dan mengimplementasikan satu atau lebih antar muka sekaligus. Misalnya class LingkaranBerwarna extends Lingkaran implements Gambar, BerisiWarna {... Intinya adalah meskipun interface bukan kelas, akan tetapi interface mirip dengan kelas. suatu interface mirip seperti kelas abstrak, yaitu kelas yang hanya digunakan untuk membuat kelas lain, bukan untuk membuat objek. Subrutin pada suatu interface merupakan metode abstrak yang harus diimplementasikan pada kelas kongkrit yang mengimplementasikan interface tersebut. Seperti kelas abstrak, meskipun kita tidak bisa membuat objek dari interface, akan tetapi suatu variabel dapat bertipe suatu interface. Misalnya, jika Gambar adalah suatu interface, dan jika Garis dan LingkaranBerwarna adalah kelas yang mengimplementasikan Gambar, maka kita bisa menulis kode seperti : Gambar gambarku; // Deklarasi variabel dengan tipe Gambar. // Variabel ini bisa diisi objek yang // mengimplementasi interface Gambar gambarku = new Garis(); // gambarku berisi objek dengan kelas Garis gambarku.gambar(g); // memanggil metode gambar() dari kelas Garis gambarku = new LingkaranBerwarna(); dengan gambarku.gambar(g); LingkaranBerwarna // Sekarang gambarku berisi objek // kelas LingkaranBerwarna // memanggil metode gambar() dari kelas Variabel dengan tipe Gambar boleh merujuk pada kelas apapun yang mengimplementasikan antar muka Gambar. Pernyataan di atas seperti "gambarku.gambar(g)" boleh ditulis karena gambarku adalah variabel dengan tipe Gambar, dan setiap objek bertipe Gambar pasti memiliki metode gambar(). Catatan bahwa tipe data merupakan sesuatu yang biasa digunakan untuk mendeklarasikan variabel. Tipe data juga digunakan untuk memberikan tipe suatu parameter pada subrutin, atau sebagai tipe keluaran suatu fungsi. Pada Java, tipe data bisa berupa kelas, interface, atau salah satu dari 8 tipe data primitif. Dari semuanya, hanya kelas yang bisa digunakan untuk membuat objek baru.

144 Kita biasanya tidak perlu menulis interface kita sendiri hingga program kita menjadi sangat kompleks. Akan tetapi ada beberapa interface yang sudah disediakan oleh Java yang mungkin bisa digunakan atau diimplementasi dalam program kita. Kelas Bertingkat Suatu kelas merupakan blok bangunan suatu program, yang melambangkan suatu ide beserta data dan perilaku yang dimilikinya. Kadang-kadang kita mungkin berasa sedikit aneh untuk membuat kelas kecil hanya untuk menggabungkan beberapa data. Akan tetapi kadang-kadang kelas-kelas kecil ini sering bermanfaat dan penting. Untungnya Java membolehkan kita untuk membuat kelas di dalam kelas lain, sehingga kelas-kelas kecil ini tidak perlu berdiri sendiri. Kelas kecil ini menjadi bagian dari suatu kelas besar yang bisa melakukan hal-hal kompleks lainnya. Kelas kecil ini misalnya berguna untuk mendukung operasi yang akan dikerjakan oleh kelas besarnya. Dalam Java, kelas bertingkat atau kelas bagian dalam adalah kelas yang ditulis di dalam definisi kelas lain. Kelas bagian dalam ini bisa memiliki nama atau anonim (tanpa nama). Kelas bagian dalam yang memiliki nama tampak seperti kelas biasa, tetapi ia ditulis di dalam kelas lain. (Kelas bagian dalam ini juga bisa memiliki kelas bagian dalam yang lain, akan tetapi ingat akan konsekuensi kerumitannya apabila kita membuat terlalu banyak tingkatan). Seperti komponen lain dalam suatu kelas, kelas bagian dalam yang memiliki nama bisa berupa kelas statik atau kelas non-statik. Kelas bertingkat statik merupakan bagian dari struktur statik dari kelas yang menaunginya. Kelas tersebut bisa digunakan di dalam kelas induknya untuk membuat objek seperti biasa. Jika tidak dideklarasikan sebagai private, makan kelas tersebut juga bisa digunakan dari luar kelas induknya. Jika digunakan dari luar kelas induknya, namanya harus jelas mencantumkan nama kelas induknya. Mirip seperti komponen statik dari suatu kelas : kelas bertingkat statik adalah bagian kelas di mana kelas tersebut mirip dengan variabel anggota statik lainnya di dalam kelas tersebut. Misalnya, suatu kelas bernama ModelRangkaKawat melambangkan kumpulan garis dalam ruang 3 dimensi. Misalnya kelas ModelRangkaKawat memiliki kelas bertingkat statik yang bernama Garis yaitu sebuah garis. Maka dari luar kelas ModelRangkaKawat, kelas Garis akan dipanggil sebagai ModelRangkaKawat.Garis. Kelas ModelRangkaKawat dan kelas bagian dalamnya dapat dituliskan seperti berikut : public class ModelRangkaKawat {... // anggota lain kelas ModelRangkaKawat static public class Garis { // Melambangkan garis dari titik (x1,y1,z1) // ke titik (x2,y2,z2) dalam ruang 3-dimensi double x1, y1, z1; double x2, y2, z2;

145 // akhir kelas Garis... // anggota lain kelas ModelRangkaKawat // akhir kelas ModelRangkaKawat Di dalam kelas ModelRangkaKawat, objek Garis bisa dibuat dengan konstruktor "new Garis()". Di luar kelas, perintah "new ModelRangkaKawat.Garis()" harus digunakan. Kelas bertingkat statik memiliki akses penuh kepada anggota dari kelas induknya, termasuk ke anggota private. Mungkin ini juga motivasi sebagian orang untuk membuat kelas bertingkat, karena kelas bagian dalamnya bisa mengakses anggota private kelas lain tanpa harus membuat variabel atau metode anggotanya menjadi public. Ketika kita mengkompilasi definisi kelas di atas, dua file kelas akan dibuat. Meskipun definisi kelas Garis berada di dalam ModelRangkaKawat, akan tetapi kelas Garis akan disimpan dalam file terpisah. Nama file kelas Garis akan menjadi ModelRangkaKawat$Garis.class Kelas bertingkat yang tidak statik, pada prakteknya, tidak jauh berbeda dengan kelas bertingkat statik, akan tetapi kelas bertingkat non-statik berkaitan dengan suatu objek, bukan kelas induknya. Anggota non-statik dari suatu kelas sebenarnya bukan merupakan bagian dari kelas itu. Hal ini juga berlaku untuk kelas bertingkat non-statik seperti juga bagian kelas non-statik lainnya. Anggota non-statik suatu kelas menjelaskan apa yang akan disimpan dalam objek yang diciptakan dari kelas tersebut. Hal ini juga berlaku (secara logis) dari kelas bertingkat non-statik. Dengan kata lain, setiap objek yang diciptakan dari kelas induknya memiliki kopi kelas bertingkat masing-masing. Kopi ini memiliki akses ke semua variabel dan metode instansi objek tersebut. Dua objek kelas bagian dalam pada dua objek induk merupakan objek berbeda karena metode dan variabel instansi yang bisa diakses berasal dari objek yang berbeda. Pada dasarnya, aturan untuk menentukan kapan suatu kelas bisa dimasukkan ke dalam kelas lain sebagai kelas statik atau non-statik adalah : Jika kelas tersebut perlu menggunakan variabel atau metode instansi suatu objek (bukan variabel atau metode statik kelas), maka kelas tersebut harus dibuat non-statik, jika tidak maka harus dibuat statik. Dari luar kelas induknya, kelas bertingkat non-statik harus dipanggil dalam bentuk namavariabel.namakelasbertingkat, misalnya namavariabel adalah variabel yang merujuk pada objek yang memiliki kelas bertingkat tersebut. Sebetulnya cara ini agak langka. Kelas bertingkat non-statik biasanya digunakan hanya di dalam kelas induknya, sehingga bisa diakses dengan nama yang sederhana.

146 UNtuk membuat objek yang merupakan kelas bertingkat non-statik, kita harus membuat objek yang merupakan kelas induknya. (Ketika bekerja di dalam kelas, objek "this" akan secara otomatis digunakan). Objek dari kelas bertingkat tersebut dihubungkan secara permanen dengan objek dari kelas induknya, dan memiliki akses penuh atas anggota kelas induknya. Mari lihat contoh berikut, dan mungkin bisa memberi pemahaman lebih baik bagaimana kelas bertingkat non-statik sebetulnya merupakan hal yang sangat alami. Misalnya suatu kelas yang melambangkan permainan kartu. Kelas ini memiliki kelas beringkat yang melambangkan para pemainnya. Struktur MainKartu bisa berbentuk seperti : class MainKartu { // Melambangkan permainan kartu class Pemain { // Melambangkan salah satu pemain game ini... // akhir kelas Pemain private Tumpukan tumpukan; // Tumpukan kartu... // akhir kelas MainKartu Jika game adalah variabel dengan tipe MainKartu, maka game memiliki kelas Pemain[code] sendiri. Dalam metode instansi objek [code]mainkartu, objek Pemain bisa dibuat dengan perintah "new Pemain()", seperti halnya kelas biasa. (Objek Pemain bisa dibuat di luar kelas MainKartu dengan perintah seperti "new game.pemain()", tapi ini jarang dilakukan). Objek Pemain memiliki akses ke variabel instansi tumpukan dalam objek MainKartu. Masing-masing objek MainKartu memiliki tumpukan dan Pemain sendiri-sendiri. Pemain kartu pada game tersebut akan menggunakan tumpukan kartunya sendiri sedangkan pemain kartu pada game yang lain akan menggunakan tumpukan kartu lain lagi. Jika Pemain merupakan kelas bertingkat statik, maka pemain tersebut akan bermain di semua permainan kartu, yang tentu saja tidak mungkin terjadi. Dalam beberapa kasus, mungkin kita harus menulis kelas bertingkat dan kemudian menggunakan kelas tersebut hanya 1 kali dalam program kita. Apakah berguna membuat kelas bertingkat jika begini kondisinya? Mungkin ya mungkin tidak. Dalam kasus seperti ini kita juga bisa membuat kelas bertingkat anonim. Kelas anonim dapat dibuat dengan menggunakan variasi dari operator new dengan bentuk new kelassuper_atau_interface () { metode_dan_variabel

147 Konstruktor ini membuat suatu kelas baru tanpa memberi nama, dan pada saat yang sama membuat objek dari kelas tersebut. Bentuk operator [code] seperti ini bisa digunakan dalam pernyataan apapun di mana pernyataan new biasa digunakan. Maksud dari pernyataan di atas adalah untuk membuat : "objek baru di dalam suatu kelas yang namanya sama dengan kelassuper_atau_interface dengan ditambah dengan metode_dan_varaibel baru." Artinya pernyataan di atas sama dengan membuat objek baru dengan konfigurasi yang baru pula. Kita juga bisa membuat kelas anonim yang diturunkan dari interface. Dalam hal ini, kelas anonim tersebut harus mengimplementasikan semua metode yang dideklarasikan oleh interface tersebut. Kelas anonim sering digunakan untuk menangani event pada GUI (graphical user interfaces). Misalnya interface Gambar seperti didefinisikan di awal bagian ini. Misalnya kita ingin membuat objek berupa gambar bujur sangkar berisi warna merah dengan ukuran 100 x 100 piksel. Daripada membuat kelas baru kemudian menggunakan kelas tersebut untuk membuat objek, kita bisa menggunakan kelas anonim untuk membuat objek sekaligus dalam satu pernyataan : Gambar kotakmerah = new Gambar() { void gambar(graphics g) { g.setcolor(color.red); g.fillrect(10,10,100,100); ; Tanda titik koma (;) di akhir pernyataan ini bukan bagian dari definisi suatu kelas, tapi merupakan bagian dari pernyataan secara keseluruhan. Ketika kelas Java dikompilasi, setiap kelas bertingkat anonim akan dibuat dalam file kelas terpisah. Jika nama kelas utama adalah KelasUtama, misalnya, maka nama file kelas untuk setiap kelas bertingkat anonimnya menjadi KelasUtama$1.class, KelasUtama$2.class, KelasUtama$3.class dan seterusnya. Sifat Akses dalam Kelas Suatu kelas dapat dideklarasikan sebagai public, yang bisa diakses dari manapun. Beberapa kelas harus dideklarasikan sebagai publik, misalnya sebagai aplikasi desktop biasa, sehingga sistem operasi bisa menjalankan prosedur main() nya. Kelas pada applet misalnya harus juga dideklarasikan sebagai public supaya bisa diakses oleh web browser.

148 Jika suatu kelas tidak dideklarasikan sebagai public maka ia hanya akan bisa diakses dari paket yang sama. Bagian ini membahas tentang paket. Kelas yang tidak ditulis dalam suatu paket tertentu akan dimasukkan dalam paket default. Suatu paket seharusnya terdiri dari beberapa kelas yang saling berhubungan. Beberapa dari kelas ini memang sengaja dibuat public agar bisa diakses dari desktop atau program lain misalnya. Bagian lain, yang merupakan bagian internal dari bagaimana paket tersebut bekerja dan tidak boleh disentuh dari luar, tidak boleh dibuat menjadi public. Paket adalah salah satu jenis dari kotak hitam, dan kelas public dalam paket tersebut adalah antar muka dengan dunia luarnya. Variabel atau metode anggota suatu kelas juga bisa dideklarasikan sebagai public yang juga berarti bisa diakses dari manapun. Variabel atau metode anggota ini juga bisa dideklarasikan sebagai private yang artinya hanya bisa diakses dari dalam kelas di mana dia dideklarasikan. Membuat variabel menjadi private memastikan bahwa tidak ada bagian lain yang akan bisa mengubah variabel ini kecuali dari dalam kelas atau objek itu sendiri. Jika kita tidak memberikan sifat akses pada metode atau variabel anggota tertentu, maka ia akan otomatis bisa diakses oleh semua kelas dalam paket yang sama. Ada satu jenis sifat akses lain yang bisa digunakan pada variabel atau metode anggota kelas, yaitu protected. Sifat protected digunakan apabila kita ingin variabel atau metode anggota tersebut bisa diakses oleh turunan kelas tersebut. Artinya lebih leluasa dari private tapi lebih ketat daripada public. Kelas yang didesain untuk diturunkan, biasanya memiliki anggota protected. Anggota protected digunakan untuk menambah fondasi bagi kelas turunannya, akan tetapi tetap tak terlihat dari dunia luar. Menggabungkan Statik dan Non-Statik Seperti disebutkan sebelumnya, kelas dapat memiliki dua kegunaan yang sangat berbeda. Kelas bisa digunakan untuk menggabungkan variabel dan subrutin statik. Atau juga bisa digunakan sebagai produsen pembuat objek. Variabel dan subrutin non-statik dalam suatu kelas akan menentukan metode dan variabel instansi pada objek yang diciptakan dari kelas tersebut. Dalam banyak kasus, suatu kelas dapat melakukan salah satu atau kedua fungsi tersebut secara bersamaan. Dalam hal anggota statik dan non-statik digabung dalam satu kelas, kelas tersebut mengharapkan adanya interaksi antara bagian statik dan bagian non-statik dari suatu kelas. Misalnya, metode instansinya menggunakan variabel statik atau memanggil subrutin statik. Metode instansi dimiliki oleh suatu objek, bukan oleh kelas tersebut. Karena kita bisa membuat banyak objek dari suatu kelas, di mana setiap objek yang diciptakan memiliki metode instansi masing-masing. Akan tetapi akan hanya ada satu variabel statik yaitu yang dimiliki oleh suatu kelas. Dengan demikian, kita memiliki banyak objek yang bisa mengakses variabel statik tersebut bersama-sama.

149 Misalnya anggap kita akan menulis kelas PasanganDadu yang menggunakan kelas Random seperti pada bagian sebelumnya untuk mengocok dadu. Objek PasanganDadu perlu mengakses objek Random. Akan tetapi membuat objek Random untuk setiap objek PasanganDadu adalah terlalu berlebihan, karena fungsinya hanya digunakan untuk menghasilkan nilai acak saja. Solusi yang bagus adalah dengan menggunakan variabel static yang digunakan oleh semua objek yang dibuat dari kelas PasanganDadu. Misalnya pada kode berikut ini : class PasanganDadu { private static Random randgen = new Random(); // (Catatan: java.util.random telah diimpor sebelum kelas ini dibuat) public int dadu1; public int dadu2; // Angka pada dadu pertama // Angka pada dadu kedua public PasanganDadu() { // Konstruktor. Membuat pasangan dadu dengan angka // awal berupa bilangan acak kocok(); public void kocok() { // Kocok dadu dengan membuat masing-masing dadu // bernilai bilangan acak 1 hingga 6 dadu1= randgen.nextint(6) + 1; dadu2= randgen.nextint(6) + 1; // akhir kelas PasanganDadu Contoh lain adalah kelas Murid yang digunakan pada bagian sebelumnya. Kita tambahkan variabel instansi nomormurid yaitu nomor unik yang berbeda untuk setiap murid. Untuk itu kita perlu melacak nomor baru yang belum dipakai dengan variabel nomorberikutnya yang berbentuk variabel statik sehingga semua objek akan mengacu pada variabel yang sama. Ketika objek baru dibuat, objek baru akan mengambil nilai nomorberikutnya untuk dijadikan nomormurid yang baru. public class Murid { private String nama; // Nama murid private int nomormurid; // nomor murid unik public double ujian1, ujian2, ujian3; // Nilai ujian private static int nomorberikutnya = 0; // simpan nomor murid berikutnya Murid(String namabaru) { // Konstruktor objek Murid: // memberi nama, dan memberi nomor murid baru nama = namabaru; nomorberikutnya++; nomormurid = nomorberikutnya;

150 public String getnama() { // Fungsi untuk mengambil isi variabel instansi private: nama return nama; public int getnomormurid() { // Fungsi untuk membaca isi nomormurid return nomormurid; public double hitungratarata() { // Hitung rata-rata nilai ujian return (ujian1 + ujian2 + ujian3) / 3; // akhir kelas Murid Inisialisasi "nomorberikutnya = 0" hanya dilakukan satu kali, yaitu ketika kelas ini pertama kali dipanggil (pada saat program dijalankan). Ketika objek baru bertipe Murid dibuat, dan di dalam konstruktor perintah "nomorberikutnya++;", maka nomor berikutnya akan disimpan untuk digunakan pada objek baru lainnya. Ketika objek pertama dibuat, nilai nomorberikutnya akan bernilai 1. Ketika objek kedua dibuat, nilai nomorberikutnya bernilai 2, dan seterusnya. Konstruktor akan menyimpan nilai baru nomorberikutnya pada variabel instansinya sendiri yang tidak di-share dengan objek-objek lain yaitu nomormurid. Dengan cara ini setiap murid baru akan selalu memiliki nomormurid baru yang berbeda satu dengan yang lain. Bab VII - Kebenaran dan Ketangguhan Program Posted Jum, 03/13/ :54 by belajarprogram Versi ramah cetak Kita sering sekali menemukan program komputer yang gagal. Kesalahan sedikit dapat membuat program berperilaku tidak sesuai dengan yang diharapkan atau bahkan mati total. Kita sendiri sering mengalaminya. Dan kita sering mendengar berita atau cerita tentang kesalahan suatu software yang menyebabkan pesawat jatuh, sambungan telepon putus seketika, atau bahkan (dalam kasus yang langka) menyebabkan kematian orang. Program sebetulnya tidak sejelek yang kita pikir. Mungkin kita tidak bisa membuat program yang sama sekali bebas dari masalah, akan tetapi pemrograman yang baik dan alat pemrograman yang didesain dengan baik akan membantu kita membuat program dengan masalah yang sesedikit mungkin. Bagian ini akan membahas tentang program yang "benar" dan "tangguh". Kita juga akan melihat pengecualian (exceptions), yaitu

151 salah satu alat dalam bahasa Java yang dapat membantu kita membuat program yang "tangguh" tersebut. Pengenalan tentang Program yang Benar dan Tangguh Posted Jum, 03/13/ :01 by belajarprogram Versi ramah cetak Suatu program disebut "benar" jika ia menyelesaikan suatu tugas sesuai dengan desainnya. Program disebut "tangguh" jika ia bisa menangani suatu situasi yang tidak biasa dengan cara yang masuk akal. Misalnya, suatu program didesain untuk membaca angka yang diketik oleh user, kemudian menampilkan angka dengan urutan tertentu. Program tersebut benar jika ia bekerja untuk angka berapa pun. Program tersebut tangguh jika program tersebut bisa menangani input yang salah, misalnya jika user memasukkan sesuatu yang bukan angka, misalnya, dengan cara memberi tahu user bahwa input yang dia masukkan salah, dan mengabaikan input yang salah tersebut. Program yang tidak tangguh akan keluar tiba-tiba atau memberikan keluaran yang tidak bermakna dalam kondisi tertentu. Semua program harusnya bekerja dengan benar. (Program yang dibuat untuk mengurutkan angka tetapi tidak mengurutkan dengan benar adalah program yang tidak berguna). Program tidak selalu harus tangguh secara total. Akan tetapi tergantung pada siapa yang akan menggunakan dan bagaimana program tersebut digunakan. Misalnya, program kecil yang digunakan hanya oleh Anda sendiri tidak harus tangguh total, karena kita tahu batas-batas dan bagaimana program tersebut bekerja. Kebenaran suatu program sebenarnya lebih sulit dari apa yang kita bayangkan. Seorang programmer mencoba membuat program sesuai dengan spesifikasi tentang bagaimana sebuat program "seharusnya" bekerja. Hasil kerja programmer tersebut benar jika program yang ia buat bekerja sesuai dengan spesifikasinya. Tapi apakah itu berarti program tersebut benar? Bagaimana jika ternyata spesifikasinya kurang lengkap atau salah? Program yang benar seharusnya merupakan implementasi dari spesifikasi yang lengkap dan benar. Pertanyaannya apakah spesifikasi tersebut lengkap dan sesuai dengan yang diinginkan tercakup di luar domain ilmu komputer. Banyak pengguna komputer memiliki pengalaman di mana program tidak bekerja atau crash. Dalam banyak hal, masalah tersebut hanya mengganggu saja, tapi kadang-kadang masalahnya lebih kompleks dari itu, misalnya hilangnya data atau uang. Jika komputer diberi tugas penting, konsekuensinya akan lebih serius apabila program tersebut berperilaku tidak normal.

152 Beberapa tahun yang lalu, kegagalan dua misi ruang angkasa ke Mars masuk dalam berita. Kedua kegagalan tersebut dipercaya karena masalah pada software, akan tetapi pada kedua kasus tersebut masalahnya bukan pada program yang tidak benar. Pada bulan September 1999, Orbiter Iklim Mars terbakar di atmosfer Mars karena data yang ditulis dalam satuan Inggris (inci, kaki, dll) dimasukkan ke dalam program komputer yang didesain untuk menerima input satuan Metrik (sentimeter, kilometer, dll). Beberapa bulan kemudian, Pendarat Kutub Mars jatuh karena softwarenya mematikan mesinnya terlalu cepat. Program yang dibuat seharusnya bisa mendeteksi tumpuan ketika pesawat mendarat dan baru kemudian mematikan mesin. Akan tetapi, roda pendarat kemungkinan macet yang menyebabkan program pemati mesin aktif sebelum pesawat menyentuh tanah. Sistem yang lebih tangguh akan mengecek terlebih dahulu ketinggian pesawat sebelum mesin dimatikan. Masih banyak beberapa kisah tentang masalah yang disebabkan oleh jeleknya desain atau implementasi suatu software. Silakan lihat buku Computer Ethics karangan Tom Forester dan Perry Morrison untuk melihat beberapa insiden yang pernah terjadi. (Buku ini menceritakan tentang isu etika dalam bidang komputer. Buku ini mungkin penting sekali untuk dibaca oleh orang yang berkecimpung dalam dunia ilmu komputer). Pada tahun 1985 dan 1986, satu orang tewas dan beberapa lainnya terluka karena overdosis radiasi, pada saat melakukan perawatan radiasi dengan mesin radiasi yang komputernya tidak diprogram dengan benar. DI kasus lain, selama 10 tahun hingga tahun 1992, sekitar 1000 pasien kanker menerima dosis radiasi sekitar 30% lebih rendah dari yang diberikan dokter karena kesalahan pemrograman. Pada tahun 1985, sebuah komputer di Bank of New York menghancurkan data-data transaksi sekuritas yang sedang berjalan karena adanya kesalahan pada program. Butuh kurang dari 24 jam untuk memperbaiki program tersebut, akan tetapi pada saat itu, bank sudah kehilangan sekitar 5 juta US dollar karena bunga overnight yang harus dipinjam untuk mengkover masalah tersebut. Pemrograman sistem kendali inersia dari pesawat tempur F-16 bisa membalik pesawat dari atas ke bawah ketika digunakan di atas khatulistiwa, untungnya masalah ini sudah ditemukan dalam simulasi. Pemindai luar angkasa Mariner 18 hilang karena kesalahan di satu baris program. Kapsul luar angkasa Gemini V salah mendarat beberapa ratus kilometer lebih jauh karena programmer lupa untuk memasukkan perputaran bumi ke dalam perhitungan. Pada tahun 1990, layanan telephon jarak jauh AT&T terganggu di seluruh Amerika Serikat ketika program komputer yang baru dijalankan terbukti memiliki bug. Contoh-contoh di atas adalah beberapa yang pernah terjadi. Masalah software adalah masalah yang sangat umum. Sebagai programmer, kita harus mengerti kenapa itu bisa terjadi dan bagaimana cara mengatasinya.

153 Salah satu bagian dari masalahnya dapat dilacak kepada bahasa pemrogramannya itu sendiri, begitu kata para penemu Java. Java didesain untuk memberikan proteksi terhadap beberapa jenis kesalahan. Bagaimana caranya suatu bahasa pemrograman menghindari kesalahan? Mari kita lihat beberapa contohnya. Bahasa pemrograman terdahulu tidak membutuhkan variabel untuk dideklarasikan. Pada bahasa pemrograman tersebut, ketika suatu nama variabel digunakan dalam program, variabel akan otomatis dibuat. Mungkin ini terlihat lebih mudah dan nyaman daripada harus mendeklarasikan variabel beserta tipenya terlebih dahulu. Akan tetapi, ada konsekuensinya : Kesalahan ketik sedikit saja akan membuat komputer menciptakan variabel baru yang sebetulnya tidak kita inginkan. Kesalahan seperti ini pernah terjadi dan mengakibatkan hilangnya pesawat ruang angkasa. Dalam bahasa pemrograman FORTRAN, perintah "DO 20 I = 1,5" adalah pernyataan pertama dari suatu perulangan. Sekarang, spasi tidak lagi suatu hal yang penting pada bahasa FORTRAN, sehingga perintah ini akan sama dengan "DO20I=1,5". Di lain pihak, perintah "DO20I=1.5" dengan tanda titik bukan koma, merupakan pernyataan pemberi nilai yang memberi nilai 1.5 ke dalam variabel DO20I. Misalnya ada kesalahan dalam mengetik koma menjadi titik, bisa jadi akan menyebabkan suatu roket meledak sebelum diluncurkan. Karena FORTRAN tidak memerlukan variabel untuk dideklarasi, kompilernya akan senang menerima perintah "DO20I=1.5". Ia akan membuat variabel baru bernama DO20I. Jika FORTRAN membutuhkan variabel untuk dideklarasikan di awal, kompiler akan mengeluarkan pesan kesalahan di awal karena variabel DO20I tidak pernah dideklarasikan sebelumnya. Hampir semua bahasa pemrograman saat ini perlu mendeklarasikan variabel sebelum digunakan, akan tetapi masih ada beberapa fitur pada bahasa pemrograman yang bisa menyebabkan kesalahan. Java sudah membuang fitur ini. Beberapa orang tidak suka karena ini membuat Java menjadi kurang feksibel dan kurang ampuh. Walaupun mungkin kritik ini benar, meningkatnya tingkat keamanan dan ketangguhan suatu program mungkin lebih dipentingkan dalam beberapa hal. Pertahanan yang paling baik untuk mencegah beberapa macam jenis kesalahan adalah mendesain bahasa pemrograman di mana membuat kesalahan tidak mungkin sama sekali. Dalam kasus lain, di mana kesalahan tidak bisa dihilangkan sama sekali, bahasa pemrograman bisa didesain sehingga apabila kesalahan terjadi, maka kesalahan ini akan dapat dideteksi secara otomatis. Paling tidak cara ini akan mencegah kesalahan tersebut membuat bencana yang lebih besar, karena akan memberi peringatan kepada programmer bahwa ada sesuatu bug yang harus diperbaiki. Mari lihat beberapa contoh yang diberikan Java untuk mengatasi permasalahan ini. Suatu array dibuat dengan beberapa lokasi, dimulai dengan 0 hingga ke indeks maksimumnya. Kita tidak dibolehkan untuk menggunakan lokasi array di luar rentang yang sudah dibuat. Pada Java, jika kita memaksakan untuk melakukan itu, sistem akan

154 otomatis mendeteksi hal ini. Pada bahasa pemrograman lain seperti C dan C++, programmer diberi keleluasaan penuh untuk memastikan bahwa indeks array berada di dalam rentang tersebut. Misalnya suatu array, A, memiliki tiga lokasi A[0], A[1], dan A[2]. Maka A[3], A[4], dan berikutnya adalah lokasi pada memori di luar array tersebut. Pada Java, apabila kita mencoba untuk menyimpan data pada A[3], Java akan mendeteksi ini. Program akan dihentikan saat itu juga (kecuali kesalahan ini "ditangkap" yang akan dibahas kemudian). Pada bahasa C atau C++, komputer akan diam saja dan melakukan penyimpanan di lokasi ini. Hasilnya akan tidak bisa diprediksi. Konsekuensinya akan jauh lebih berat daripada jika program berhenti (Kita akan diskusikan tentang tumpahan buffer di bagian ini nanti). Pointer (penunjuk memori) juga merupakan kesalahan pemrograman yang paling sulit. Dalam Java, variabel dari suatu objek menyimpan pointer atau rujuan ke alamat memori di mana objek tersebut disimpan, atau isinya bisa juga null. Jika kita mencoba untuk menggunakan nilai null seperti layaknya rujukan ke objek sungguhan, maka sistem komputer akan mendeteksinya. Dalam bahasa pemrograman lain, lagi-lagi, adalah tanggung jawab programmer untuk mencegah digunakannya rujukan ke null. Pada komputer Macintosh lama, alamat null merupakan alamat ke lokasi di memori dengan alamat 0. Program dapat menggunakan memori di dekat alamat 0. Sayangnya, Macintosh menyimpan data penting tentang sistem di lokasi tersebut. Mengubah data di lokasi tersebut akan membuat sistem crash atau hang, bukan hanya program tersebut saja tetapi keseluruhan sistem operasi akan berhenti. Kesalahan pointer lain adalah jika isi pointer menunjuk pada tipe data yang salah atau lokasi di memori yang tidak memiliki objek sama sekali. Kesalahan seperti ini tidak mungkin dalam bahasa Java, karena programmer tidak diperbolehkan untuk mengganti pointer sama sekali. Di dalam bahasa pemrograman lain, programmer bisa mengganti lokasi pointer ke lokasi lain, intinya, ke lokasi memori manapun. Jika tidak dilakukan dengan benar, pointer ini bisa menunjuk pada lokasi berbahaya atau menghasilkan sesuatu yang tidak bisa diperkirakan. Kesalahan lain yang bisa terjadi pada Java adalah kebocoran memori. Pada Java, sewaktu tidak ada lagi pointer yang merujuk ke pada suatu objek, objek tersebut akan diambil oleh pemulung memori, sehingga memori tersebut dapat digunakan lagi oleh bagian program lain. Dalam bahasa pemrograman lain, programmer bertanggung jawab untuk mengembalikan memori yang tidak digunakan kepada sistem operasi. Jika programmer tidak melakukannya, makan memori yang tidak terpakai akan terakumulasi, sehingga jumlah memori yang tersedia akan berkurang. Ini adalah salah satu contoh masalah umum yang terjadi pada komputer Windows di mana banyak sekali kebocoran memori yang terjadi, sehingga komputer harus direstart ulang setiap beberapa hari. Banyak program yang terjangkit masalah tumpahan buffer (buffer overflow error). Tumpahan buffer sering menjadi berita utama karena hal ini sering mengakibatkan kompromi masalah keamanan komputer. Ketika komputer menerima data dari komputer lain dari network atau internet misalnya, data tersebut akan disimpan dalam buffer.

155 Buffer adalah bagian memori yang telah dialokasikan program untuk menyimpan data tersebut. Tumpahan buffer terjadi jika data yang diterima lebih banyak dari jumlah data yang bisa ditampung oleh buffer. Pertanyaannya adalah kapan ini terjadi? Jika kesalahan ini bisa dideteksi oleh program atau program yang mengatur lalu lintas network, maka satu-satunya kemungkinan adalah pada karena kesalahan transmisi data pada network. Masalah utamanya terjadi ketika program tidak bisa mendeteksi tumpahan buffer secara benar. Dalam hal ini, software terus mensuplai data ke memori meskipun buffer telah terisi penuh, dan data lebihnya disimpan pada bagian memori yang tidak dialokasikan untuk buffer tersebut. Bagian memori yang tertunpah tersebut mungkin digunakan untuk fungsi lain. Mungkin juga digunakan untuk menyimpan data penting lain. Atau bahkan mungkin menyimpan kode program itu sendiri. Ini yang akan menjadi masalah keamanaan. MIsalnya tumpahan buffer ini menimpa bagian dari program. Ketika komputer mengeksekusi bagian program yang telah diganti, maka sebetulnya komputer akan menjalankan data yang diterima dari komputer lain. Data ini bisa berisi apa saja. Bisa jadi program untuk menghentikan komputer atau bahkan mengendalikan komputer. Programmer jahat yang bisa menemukan kesalahan tumpahan memori dalam software pengendali network bisa menggunakan lubang ini untuk menjalankan program-program jahatnya. Untuk software yang ditulis dalam Java, kesalahan tumpahan buffer tidak dimungkinkan. Bahasa Java tidak mungkin menyimpan data di memori yang tidak dialokasikan kepadanya. Untuk bisa menyimpan data, komputer membutuhkan pointer yang menunjuk pada lokasi memori yang belum terpakai, atau menggunakan lokasi array yang berada di luar lokasi yang disediakan untuk array tersebut. Seperti dijelaskan sebelumnya, kedua kemungkinan tersebut tidak diperbolehkan sama sekali pada Java. (Akan tetapi, masih mungkin kesalahan seperti ini muncul pada kelas standar Java, karena beberapa metode pada kelas ini sebenarnya ditulis dalam bahasa C bukan Java). Sudah jelas desain bahasa bisa membantu mencegah kesalahan atau membantu mendeteksi masalah yang mungkin terjadi. Atau dibutuhkan pengujian, misalnya menguji apakah pointer bernilai null. Beberapa programmer mungkin merasa harus mengorbankan kecanggihan dan efisiensi. Akan tetapi, ada banyak situasi di mana keamanan merupakan prioritas utama. Java didesain untuk situasi seperti ini. Ada satu bagian di mana desainer Java tidak memasukkan pendeteksi masalah secara otomatis, yaitu perhitungan numerik. Pada Java, nilai suatu bilangan int dinyatakan dalam bilangan biner 32-bit. Dengan 32 bit, maka terdapat kurang lebih 4 milyar bilangan yang bisa dibentuk. Nilai int memiliki rentang antara hingga Apa yang terjadi jika hasil perhitungan berada di luar rentang ini? Misalnya, berapa ? Dan berapa * 2? Jawaban yang benar secara matematis berada di luar nilai int. Contoh-contoh di atas disebut tumpahan bilangan bulat (integer overflow). Dalam banyak kasus, tumpahan bilangan bulat termasuk suatu kesalahan. Akan tetapi Java tidak otomatis mendeteksi kesalahan tersebut. Misalnya, perhitungan akan bernilai negatif (Apa yang terjadi sebenarnya adalah

156 bit tambahan di luar bit ke-32 diabaikan. Nilai yang lebih besar dari akan "terpotong" sehingga menjadi nilai negatif. Secara matematis, hasilnya akan selalu merupakan sisa pembagian dari pembagian dengan 232). Banyak kesalahan program yang disebabkan oleh kesalahan semacam ini. Program tersebut benar, akan tetapi tidak bisa menangani bilangan lebih besar daripada 32 bit. Contoh sederhana adalah kesalahan Y2K sebenarnya merupakan kesalahan yang mirip dengan ini. Untuk jenis bilangan real seperti double, masalahnya bahkan lebih kompleks lagi. Bukan hanya tumpahan yang mungkin terjadi. Untuk jenis double, rentangnya berlaku hingga Nilai yang lebih dari nilai ini tidak "terpotong" menjadi negatif. Akan tetapi ia akan diubah menjadi suatu konstanta yang bernilai tak berhingga. Nilai Double.POSITIVE_INFINITY dan Double.NEGATIVE_INFINITY melambangkan nilai positif tak hingga dan negatif tak hingga. Nilai spesial lainnya dari tipe data double adalah Doube.NaN atau bukan bilangan (not a number), yang melambangkan suatu nilai yang tidak berarti. Misalnya pembagian dengan 0 atau akar kuadrat suatu bilangan negatif. Kita bisa menguji apakah suatu variabel berisi bukan bilangan dengan memanggil fungsi yang bertipe keluaran boolean, yaitu Double.isNaN(x). Untuk bilangan real, ada komplikasi tambahan yaitu hampir semua bilangan real hanya bisa dilambangkan dalam bentuk pendekatan. Bilangan real bisa memiliki jumlah digit di belakang koma yang tak terhingga banyaknya. Nilai bertipe double biasanya akurat sekitar 15 digit di belakang koma. Bilangan real 1/3, misalnya, berarti , dan bilangan ini tidak bisa digantikan dengan bilangan dengan jumlah bit terbatas. Perhitungan dengan bilangan real biasanya memiliki kesalahan akurasi. Sebenarnya, jika kita kurang berhati-hati, akan menyebabkan perhitungan sama sekali salah. Ada bidang tertentu dalam ilmu komputer yang dinamakan analisis numerik yang berkonsentrasi pada algoritma untuk memanipulasi bilangan real. Tidak semua kesalahan yang mungkin terjadi bisa dideteksi otomatis oleh Java. Lebih jauh, bahkan ketika suatu kesalahan bisa dideteksi secara otomatis, reaksi standar dari sistem adalah melaporkan kesalahan dan menghentikan jalannya program. Ini bukan ciri program yang tangguh! Sehingga programmer harus mempelajari teknik untuk mencegah dan mengatasi kesalahan. Topik ini akan dibahas pada bab ini. Membuat Program yang Benar Posted Jum, 03/13/ :03 by belajarprogram Versi ramah cetak Program benar tidak jadi dengan sendirinya. Ia membutuhkan perencanaan dan perhatian kepada detail untuk mencegah kesalahan dalam program. Ada beberapa teknik yang bisa digunakan oleh programmer untuk meningkatkan kebenaran suatu program.

157 Dalam beberapa kasus, kita bisa membuktikan bahwa program tersebut benar. Yaitu dengan menggunakan pembuktian secara matematis bahwa urutan penghitungan yang dilakukan program akan selalu menghasilkan hasil yang benar. Pembuktian yang komprehensive sangat sulit dibuat karena secara praktek pembuktian semacam ini hanya bisa dilakukan pada program yang cukup kecil. Seperti telah disebutkan sebelumnya, program yang benar menurut spesifikasi tidak berguna apabila spesifikasinya salah. Artinya, bahkan dalam pemrograman sehari-hari pun, kita harus terus mencari ide dan teknik yang bisa kita gunakan untuk membuktikan bahwa program yang kita tulis adalah benar. Ide dasarnya adalah proses (process) dan keadaan (state). Suatu keadaan terdiri dari semua informasi yang terkait dengan eksekusi suatu program pada saat tertentu. Keadaan mencakup, misalnya, nilai semua variabel pada program, keluaran yang telah diproduksi, input yang sedang diambil, dan posisi dalam di mana program tersebut sedang dieksekusi. Proses adalah urutan keadaan yang harus dilalui oleh komputer ketika menjalankan suatu program. Dari sudut pandang ini, arti suatu pernyataan dalam suatu program dapat diekspresikan dalam akibat apa yang dihasilkan dari eksekusi suatu perintah terhadap keadaan saat itu. Sebagai contoh sederhana, arti dari pernyataan "x = 7;" adalah setelah pernyataan ini dieksekusi, nilai dari variabel x adalah 7. Kita bisa yakin tentang fakta ini, sehingga fakta ini bisa dijadikan salah satu bukti matematis. Sebenarnya, kita juga seringkali bisa menilai suatu program dan menyimpulkan bahwa suatu fakta adalah benar pada saat tertentu pada eksekusi suatu program. Misalnya, perhatikan perulangan berikut : do { N = Math.random(); while (N <= 0.5); Setelah perulangan selesai, kita yakin betul bahwa nilai variabel N pasti lebih besar dari 0.5. Perulangan tidak bisa berhenti jika kondisi ini tidak tercapai. Bukti ini merupakan bagian dari arti perulangan while. Lebih umum, jika perulangan while menggunakan pengujian "while (kondisi)" maka bisa dipastikan bahwa setelah perulangan selesai kondisi bernilai false. Kemudian kita bisa menggunakan fakta ini untuk menyimpulkan apa yang akan terjadi ketika eksekusi program berlanjut. (Dengan perulangan, kita juga harus memastikan kapan perulangan tersebut akan berakhir. Hal ini harus dipikirkan lebih lanjut secara terpisah). Suatu fakta yang pasti benar setelah bagian program dieksekusi disebut kondisi akhir dari bagian program tersebut. Kondisi akhir adalah fakta yang bisa kita gunakan untuk menyimpulkan tentang perilaku suatu program. Kondisi akhir suatu program secara keseluruan adalah fakta yang bisa dibuktikan ketika program selesai dieksekusi. Suatu program bisa dibuktikan bahwa ia melakukan fungsinya dengan benar jika kondisi akhirnya sesuai dengan spesifikasi program.

158 Misalnya, kita lihat potongan program berikut, di mana semua variabelnya memiliki tipe double: det = B*B - 4*A*C; x = (-B + Math.sqrt(det)) / (2*A); Persamaan kuadrat (darti matematika di SMU) menyatakan bahwa nilai x adalah solusi persamaan A*x2 + B*x + C = 0 jika det bernilai 0 atau lebih. Jika kita menganggap atau menjamin bahwa B*B - 4*A*C >= 0 dan A!= 0, maka x yaitu solusi persamaan kuadrat merupakan kondisi akhir. Kita sebut B*B - 4*A*C >= 0 sebagai kondisi awal potongan program tersebut. Kondisi A!= 0 adalah kondisi awal lainnya. Kondisi awal adalah kondisi yang harus bernilai benar pada suatu waktu di tengah eksekusi program untuk menjamin bahwa program akan dapat terus dieksekusi tanpa kesalahan. Kondisi awal adalah sesuatu yang kita ingin selalu benar. Kondisi awal harus kita cek agar program kita benar. Mari kita lihat potongan program yang lebih panjang berikut ini. Program ini menggunakan kelas KonsolInput yang dibahas pada bagian sebelumnya. do { System.out.println("Masukkan A, B, dan C. B*B-4*A*C harus >= 0."); System.out.print("A = "); A = KonsolInput.ambilDouble(); System.out.print("B = "); B = KonsolInput.ambilDouble(); System.out.print("C = "); C = KonsolInput.ambilDouble(); if (A == 0 B*B - 4*A*C < 0) System.out.println("Input Anda tidak benar, masukkan lagi."); while (A == 0 B*B - 4*A*C < 0); det = B*B - 4*A*C; x = (-B + Math.sqrt(det)) / (2*A); Setelah perulangan berakhir, kita yakin bahwa B*B-4*A*C >= 0 dan juga A!= 0. Kondisi awal untuk dua baris terakhir sudah dipenuhi, sehingga kondisi akhir bahwa x merupakan solusi persamaan A*x2 + B*x + C = 0 juga benar. Potongan progam ini menghitung solusi suatu persamaan dengan benar dan bisa dibuktikan secara matematis (Sebetulnya karena ada masalah utama dalam merepresentasi angka terutama bilangan real pada komputer, hal ini tidak 100% benar. Algoritma ini benar, akan tetapi programnya bukan implementasi sempurna dari algoritma ini.) Berikut ini adalah contoh lain, di mana kondisi awal diuji dengan suatu perintah. Di bagian awal pernyataan if, di mana solusi dihitung kemudian dicetak ke layar, kita yakin

159 bahwa kondisi awal telah dipenuhi. Di bagian lain, kita tahu bahwa salah satu kondisi awal tidak bisa dipenuhi. Bagaimana pun kondisinya, program akan tetap benar. System.out.println("Masukkan nilai A, B, dan C."); System.out.print("A = "); A = KonsolInput.ambilDouble(); System.out.print("B = "); B = KonsolInput.ambilDouble(); System.out.print("C = "); C = KonsolInput.ambilDouble(); if (A!= 0 && B*B - 4*A*C >= 0) { det = B*B - 4*A*C; x = (-B + Math.sqrt(disc)) / (2*A); System.out.println("Solusi persamaan A*X*X + B*X + C = 0 is " + x); else if (A == 0) { System.out.println("Nilai A tidak boleh 0."); else { System.out.println("Karena B*B - 4*A*C kurang dari nol, maka"); System.out.println("persamaan A*X*X + B*X + C = 0 tidak memiliki solusi."); Ketika kita menulis suatu program, akan lebih baik jika kita mencari tahu kondisi awal suatu program dan memikirkan bagaimana program kita harus menanganinya. Sering kali, kondisi awal suatu program bisa memberi informasi tentang bagaimana cara menulis program. Misalnya, untuk setiap referensi pada array, misalnya A[i], memiliki suatu kondisi awal. Indeksnya harus berada di dalam rentang yang diperbolehkan pada array tersebut. Untuk A[i], kondisi awalnya adalah 0 <= i < A.length. Komputer akan menguji kondisi ini ketika ia mengevaluasi A[i], dan jika kondisi tidak dipenuhi, program akan dihentikan. Untuk mencegah hal ini, kita harus menguji bahwa indeks i berada di dalam nilai yang diperbolehkan (Sebetulnya ada lagi kondisi awal yang lain, yaitu A tidak boleh null, akan tetapi mari kita abaikan untuk sementara waktu.) Misalnya kode berikut digunakan untuk mencari nilai x di dalam array A : i = 0; while (A[i]!= x) { i++; Dalam program ini, kita melihat bahwa program tersebut memiliki kondisi awal, yaitu x harus ada di dalam array. JIka kondisi awal ini dipenuhi, maka perulangan akan berhenti ketika A[i] == x. Akan tetapi, jika x tidak berada di dalam array, maka nilai i akan terus dinaikkan hingga nilainya sama dengan A.length. Pada saat tersebut, referensi ke A[i] menjadi ilegal sehingga program akan dihentikan. Untuk mencegah hal ini, kita bisa

160 menambahkan pengujian untuk menjamin bahwa kondisi awal untuk merujuk pada A[i] bisa dipenuhi, yaitu : i = 0; while (i < A.length && A[i]!= x) { i++; Sekarang, perulangan pasti akan selesai. Setelah selesai, nilai i akan bernilai i == A.length atau A[i] == x. Pernyataan if bisa ditambahkan di akhir perulangan untuk menguji apa yang menyebabkan perulangan berhenti : i = 0; while (i < A.length && A[i]!= x) { i++; if (i == A.length) System.out.println("x berada di luar array"); else System.out.println("x berada pada posisi " + i); Pemrograman dengan Pengecualian Posted Jum, 03/13/ :06 by belajarprogram Versi ramah cetak Pengecualian bisa digunakan untuk membantu kita menulis program tangguh. Pengecualian adalah pendekatan yang terstruktur dan terorganisir untuk membuat program tangguh. Tanpa pengecualian, program akan dipenuhi dengan pernyataan if untuk menguji berbagai macam kondisi kesalahan. Dengan pengecualian, kita bisa menulis program yang algoritma yang lebih jelas, di mana kasus-kasus pengecualian akan ditangani di bagian lain, yaitu di dalam klausa catch. Membuat Kelas Pengecualian Baru Ketika suatu program menemukan kondisi yang tidak biasa dan tidak ada cara yang masuk akal untuk ditangani pada saat itu juga, program akan melempar pegecualian. Dalam beberapa kasus, mungkin akan lebih mudah apabila pengecualian yang dilemparkan merupakan objek dari salah satu kelas pengecualian bawaah Java, seperti IllegalArgumentException atau IOException. Akan tetapi, jika tidak ada kelas standar yang cukup mewakili jenis pengecualian tersebut, programmer bisa membuat kelas pengecualian baru. Kelas baru tersebut harus diturunkan dari kelas standar Throwable atau kelas turunannya. Secara umum, kelas baru merupakan turunan dari kelas RuntimeExceptionatau kelas turunannya jika programmer tidak mewajibkan penanganan kesalahan. Untuk membuat kelas pengecualian baru yang

161 mewajibkan penanganan kesalahan, programmer dapat membuat turunan dari kelas Exception atau salah satu kelas turunannya. Berikut ini adalah contoh suatu kelas yang merupakan turunan dari kelas Exception yang mewajibkan penanganan kesalahan apabila ia dilemparkan : public class KelasahanBaca extends Exception { public KelasahanBaca(String pesan) { // Konstruktor. Membuat objek dari KesalahanBaca yang berisi // pesan kesalahan super(pesan); Kelas tersebut hanya memiliki konstruktor sehingga kita bisa membuat objek dari kelas KesalahanBaca yang berisi pesan kesalahan. (Pernyataan "super(pesan)" memanggil konstruktor di kelas supernya, yaitu Exception. Lihat bagian sebelumnya). Tentunya kelas tersebut juga mewariskan metode getmessage() dan printstacktrace() dari kelas supernya. Jika e merujuk pada objek dengan tipe KesalahanBaca maka perintah e.getmessage() akan mengambil pesan kesalahan yang diberikan pada konstruktornya. Apabila objek dengan tipe KesalahanBaca dilempar, ini berarti jenis kesalahan tertentu telah terjadi. (Mungkin misalnya terjadi apabila pembacaan suatu String yang diproses program tidak sesuai dengan format yang diharapkan). Pernyataan throw bisa digunakan untuk melempar kesalahan dengan tipe KesalahanBaca. Konstruktor objek ini harus memiliki pesan kesalahan, misalnya : throw new ParseError("Ditemukan bilangan negatif ilegal."); atau throw new ParseError("Kata '" + word + "' bukan nama file yang benar."); Jika pernyataan throw tidak terdapat dalam pernyataan try yang menangkap kesalahan tersebut, maka subrutin yang melemparnya harus dideklarasikan di awal bahwa subrutin tersebut bisa melempar KesalahanBaca, yaitu dengan menambah klausa "throws KesalahanBaca". Misalnya : void ambilnamauser() throws KesalahanBaca {... Klausa ini tidak diperlukan apabila KesalahanBaca didefinisikan sebagai turunan dari kelas RuntimeException, karena pengecualian ini tidak wajib untuk ditangani. Suatu subrutin yang ingin menangani KesalahanBaca dapat menggunakan pernyataan try dengan klausa catch untuk menangkap KesalahanBaca. Misalnya

162 try { ambilnamauser(); olahnamauser(); catch (KesalahanBaca kb) {... // Tangani kesalahan Ingat bahwa karena KesalahanBaca adalah kelas turunan dari Exception, maka klausa catch dalam bentuk "catch (Exception e)" juga akan menangkap KesalahanBaca dan juga objek yang bertipe Exception. Kadang-kadang, ada gunanya untuk menyimpan data dalam objek pengecualian, misalnya : class KapalMeledak extends RuntimeException { Kapal kapal; // Kapal yang meledak int lokasi_x, lokasi_y; // Lokasi tempat kapal meledak KapalMeledak(String pesan, Kapal k, int x, int y) { // Konstruktor: Buat objek KapalMeledak yang menyimpan // pesan kesalahan dan informasi bahwa kapal k // meledak pada lokasi x,y pada layar super(pesan); kapal = k; lokasi_x = x; lokasi_y = y; Di sini, objek KapalMeledak berisi pesan kesalahan dan informasi tambahan tentang kapal yang meledak, yang bisa digunakan dalam perintah berikut: if ( kapaluser.istertembak() ) throw new KapalMeledak("Anda Tertembak!", kapaluser, xlok, ylok); Ingat bahwa kondisi objek KapalMeledak mungkin bukan suatu kesalahan. Mungkin hanya merupakan jalan lain dari alur suatu game. Pengecualian bisa juga digunakan sebagai percabangan besar seperti ini dengan cara yang lebih rapi. Kelas dan Subrutin Pengecualian Kemungkinan untuk melempar pengecualian akan berguna dalam penulisan subrutin dan kelas umum yang digunakan oleh lebih dari satu program. Dalam hal ini orang yang menulis subrutin atau kelas tersebut tidak memiliki cara yang umum untuk menangani kesalahan tersebut. Terutama karena ia tidak tahu bagaimana subrutin atau kelas tersebut akan digunakan. Dalam kondisi seperti itu, programmer pemula biasanya lebih memilih untuk mencetak pesan kesalahan dan melanjutkan program, akan tetapi cara ini tidak memuaskan karena mungkin akan ada masalah di kemudian hari. Mencetak pesan kesalahan dan menghentikan program juga bukan solusi karena program tidak berkesempatan untuk mengatasi kesalahan tersebut.

163 Program yang memanggil subrutin atau menggunakan kelas tersebut perlu tahu bahwa suatu kesalahan telah terjadi. Dalam bahasa yang tidak memiliki pengecualian, satusatunya alternatif adalah mengembalikan nilai khusus atau mengeset nilai variabel tertentu untuk memberi tahu bahwa suatu kesalahan telah terjadi. Misalnya, fungsi ambildouble() bisa saja mengembalikan nilai NaN jika input dari user salah. Akan tetapi, cara ini hanya efektif jika program utama mengecek nilai keluarannya. Pengecualian akan lebih rapi jika suatu subrutin memiliki cara untuk tahu apabila suatu kesalahan telah terjadi. Asersi Ingat bahwa kondisi awal adalah kondisi yang harus benar pada suatu titik di dalam program sehingga program akan berjalan benar dari titik tersebut dan seterusnya. Dalam hal ini, ada kemungkin bahwa suatu kondisi awal mungkin tidak bisa dipenuhi. Untuk itu, akan lebih baik jika kita letakkan pernyataan if untuk mengujinya. Pertanyaan berikutnya adalah apa yang harus kita lalukan jika kondisi awal tidak benar? Salah satunya adalah melempar pengecualian, yang kemudian akan menghentikan program kecuali jika pengecualian tersebut ditangkap dan ditangani di tempat lain. Bahasa pemrograman seperti C dan C++ memiliki fasilitas untuk menambah asersi (assertions) dalam program. Asersi dapat berbentuk assert(kondisi), di mana kondisi adalah ekspresi bernilai boolean. Kondisi adalah suatu kondisi awal yang harus benar pada satu titik di dalam program. Ketika komputer menemukan asersi dalam eksekusi suatu program, ia akan mengevaluasi kondisi tersebut. Jika kondisi tersebut salah, maka program akan berhenti. Jika benar, maka program akan terus berjalan. Asersi dalam bentuk ini tidak tersedia pada Java, akan tetapi sesuatu yang mirip seperti ini bisa dilakukan dengan pengecualian. Bentuk asersi assert(kondisi) dapat diganti dalam bahasa Java dalam bentuk : if (kondisi == false) throw new IllegalArgumentException("Asersi gagal."); Kita bisa mengganti pesan kesalahan dengan pesan yang lebih baik, dan mungkin akan lebih cantik apabila kelas pengecualiannya juga diganti dengan kelas yang lebih spesifik. Asersi sangat umum digunakan dalam pengujian dan debugging. Setelah kita merilis program kita, kita tidak ingin program kita crash. Akan tetapi banyak program yang dibuat pada dasarnya seperti try {.. // Jalankan program. catch (Exception e) { System.out.println("Pengecualian dalam program terjadi.");

164 System.out.println("Harap kirimkan pesan bug kepada programmernya."); System.out.println("Detail kesalahan:"): e.printstacktrace(); Jika suatu program memiliki banyak asersi, maka akan menyebabkan program lebih lambat. Salah satu keuntungan asersi pada C dan C++ adalah asersi bisa "dimatikan". Dalam arti jika program dikompilasi dengan cara lain, maka asersi akan dibuang dari dalam program utama. Versi rilis dari program dikompilasi dengan asersi yang dimatikan. Dengan cara ini versi rilis akan lebih efisien, karena komputer tidak perlu mengevaluasi semua asersi tersebut. Keuntungan lainnya adalah kita tidak perlu membuang asersi tersebut dari kode sumber programnya. Ada cara seperti ini yang mungkin juga bisa diterapkan pada Java, yang tergantung dari seberapa canggih kompiler kita. Misalnya kita tentukan suatu konstanta static final boolean DEBUG = true; dan kita menulis asersi seperti if (DEBUG == true && kondisi <span style="color: #00bb00;"></span>== false) throw new IllegalArgumentException("Asersi Gagal."); Karena DEBUG bernilai true, maka nilai "DEBUG == true && kondisi == false" sama dengan nilai kondisi, sehingga pernyataan if ini sama dengan pengujian suatu kondisi awal. Sekarang misalnya kita telah selesai melakukan debugging. Sebelum kita mengkompilasi versi rilis suatu program, kita ganti definisi DEBUG menjadi static final boolean DEBUG = false; Sekarang, nilai "DEBUG == true && kondisi == false" selalu bernilai false, dan kompiler canggih akan bisa mendeteksi ini pada saat kompilasi. Karena nilai if ini akan selalu bernilai false, kompiler canggih akan mengabaikan perintah ini dalam hasil kompilasinya, karena if ini tidak akan pernah dieksekusi. Hasilnya, kode ini tidak akan dimasukkan ke dalam versi rilis program. Dan kita hanya cukup mengganti satu baris saja pada kode sumbernya. Bab VIII - Pengenalan Struktur Data dan Algoritma Posted Kam, 03/19/ :44 by belajarprogram Versi ramah cetak

165 Komputer bisa menjadi canggih seperti sekarang karena struktur data. Struktur dala adalah koleksi dari suatu data yang saling berhubungan. Suatu objek adalah struktur data, tapi tipe struktur data seperti ini -- yang memiliki sedikit variabel instansi -- hanya awalnya saja. Dalam banyak hal, programmer akan membuat struktur data kompleksnya sendiri, yaitu dengan menghubungkan objek satu sama lain. Bab ini akan membahas tentang array dan beberapa struktur data dalam Java. Array Posted Kam, 03/19/ :57 by belajarprogram Versi ramah cetak Array adalah struktur data yang terdiri dari item berurutan, di mana semua itemnya bertipe sama. Dalam Java, item dalam array selalu dinomori dari nol hingga nilai maksimum tertentu, yang nilainya ditentukan pada saat array tersebut dibuat. Misalnya, suatu array berisi 100 bilangan bulat, yang dinomori dari nol hingga 99. Item dalam array bisa bertipe salah satu tipe Java primitif. Item-item ini bisa juga berupa referensi ke objek, sehingga, misalnya kita bisa membuat array yang berisi semua komponen dalam applet. Bagian ini akan membahas bagaimana array dibuat dan digunakan pada Java. Juga mencakup kelas standar java.util.arraylist. Suatu objek bertipe ArrayList sangat mirip dengan array dari Object, akan tetapi ia bisa bertambah ukuran secara dinamis. Membuat dan Menggunakan Array Posted Kam, 03/19/ :25 by belajarprogram Versi ramah cetak Jika sekumpulan data digabungkan dalam satu unit, hasilnya adalah suatu struktur data. Data struktur dapat berupa struktur yang sangat kompleks, akan tetapi dalam banyak aplikasi, data struktur yang cocok hanya terdiri dari kumpulan data berurutan. Struktur data sederhana seperti ini bisa berupa array atau record. Istilah "record" sebetulnya tidak digunakan pada Java. Suatu record pada intinya mirip dengan objek pada Java yang hanya memiliki variabel instansi tanpa metode instansi. Beberapa bahasa pemrograman lain yang tidak mendukung objek biasanya mendukung record. Dalam bahasa C yang bukan bahasa berorientasi objek, misalnya, memiliki tipe data record, dimana pada C disebut "struct". Data pada record -- dalam Java, adalah variabel instansi suatu objek -- disebut field suatu record. Masing-masing item disebut nama field. Dalam Java, nama field adalah nama variabel instansi. Perbedaan sifat dari suatu record adalah bahwa item pada record dipanggil berdasarkan namanya, dan field

166 yang berbeda dapat berupa tipe yang berbeda. Misalnya, kelas Orang didefisikan sebagai : class Orang { String nama; int nomorid; Date tanggallahir; int umur; maka objek dari kelas Orang bisa disebut juga sebagai record dengan 4 field. Nama fieldnya adalah nama, nomorid, tanggallahir dan umur. Lihat bahwa tipe datanya berbeda-beda yaitu String, int, dan Date. Karena record hanya merupakan bagian lebih kecil dari objek, kita tidak akan bahas lebih lanjut di sini. Seperti record, suatu array adalah kumpulan item. Akan tetapi, item pada record dipanggil dengan nama, sedangkan item pada array dinomori, dan masing-masing item dipanggil besarkan nomor posisi pada array tersebut. Semua item pada array harus bertipe sama. Definisi suatu array adalah : kumpulan item bernomor yang semuanya bertipe sama. Jumlah item dalam suatu array disebut panjang array. Nomor posisi dari array disebut indeks item tersebut dalam array. Tipe dari item tersebut disebut tipe dasar dari array. Tipe dasar suatu array bisa berupa tipe Java apa saja, baik berupa tipe primitif, nama kelas, atau nama interface. Jika tipe dasar suatu array adalah int, maka array tersebut disebut "array int". Suatu array bertipe String disebut "array String". Akan tetapi array bukan urutan int atau urutan String atau urutan nilai bertipe apapun. Lebih baik jika array adalah urutan variabel bertipe int atau String atau tipe lainnya. Seperti biasa, ada dua kemungkinan kegunaan variabel : sebagai nama suatu lokasi di memori, dan nama suatu nilai yang disimpan pada lokasi memori. Setiap posisi pada array bersifat seperti variabel. Setiap posisi dapat menyimpan nilai dengan tipe tertentu (yaitu tipe dasar array). Isinya bisa diganti kapanpun. Nilai tersebut disimpan di dalam array. Array merupakan kontainer bukan kumpulan nilai. Item pada array (maksudnya setiap anggota variabel dalam array tersebut) sering juga disebut elemen array. Dalam Java, elemen array selalu dinomori mulai dari nol. Yaitu, indeks dari elemen pertama suatu array adalah nol. Jika panjang array adalah N, maka indeks elemen terakhir adalah N-1. Sekali array dibuat, maka panjangnya tidak bisa diubah lagi. Dalam Java, array adalah objek. Ada beberapa konsekuensi yang lahir dari fakta ini. Array harus dibuat dengan operator new. Variabel tidak bisa menyimpan array; variabel hanya bisa merujuk pada array. Variabel lain yang bisa merujuk array juga bisa bernilai null yang berarti ia tidak merujuk pada lokasi memori apapun. Seperti objek lain, array

167 juga bagian dari suatu kelas, di mana seperti kelas lain adalah kelas turunan dari kelas Object. Elemen array pada dasarnya adalah variabel instansi dalam objek array, kecuali mereka dipanggil dalam indeksnya bukan namanya. Meskipun array berupa objek, ada beberapa perbedaan antara array dan objek lainnya, dan ada beberapa fitur khusus Java untuk membuat dan menggunakan array. Misalnya A adalah variabel yang merujuk pada suatu array. Maka indeks k di dalam A bisa dipanggil dengan A[k]. Item pertama adalah A[0], yang kedua adalah A[i], dan seterusnya. A[k] adalah suatu variabel dan bisa digunakan seperti variabel lainnya. Kita bisa memberinya nilai, bisa menggunakannya dalam ekspresi, dan bisa diberikan sebagai parameter pada subrutin. Semuanya akan didiskusikan di bawah nanti. Untuk sekarang ingat sintaks berikut variabel_array [ekspresi_integer] untuk merujuk pada suatu array. Meskipun setiap array merupakan suatu objek, kelas array tidak harus didefinisikan sebelumnya. Jika suatu tipe telah ada, maka kelas array dari tipe tersebut otomatis ada. Jika nama suatu tipe adalah TipeDasar, maka nama kelas arraynya adalah TipeDasar[]. Artinya, suatu objek yang diciptakan dari kelas TipeDasar[] adalah array dari item yang tiap itemnya bertipe TipeDasar. Tanda kurung "[]" dimaksudkan untuk mengingat sintaks untuk mengambil item di dalam suatu array. "TipeDasar[]" dibaca seperti "array TipeDasar". Mungkin perlu juga dijelaskan bahwa jika KelasA adalah kelas turunan dari KelasB maka KelasA[] otomatis menjadi kelas turunan KelasB[]. Tipe dasar suatu array dapat berupa tipe apapun yang ada atau sudah didefinisikan pada Java. Misalnya tipe primitif int akan diturunkan kelas array int[]. Setiap elemen di dalam array int[] adalah variabel yang memiliki tipe int dan bisa diisi dengan nilai dengan tipe int. Dari kelas yang bernama String diturunkan tipe array String[]. Setiap elemen di dalam array String[] adalah variabel dengan tipe String, yang bisa diisi dengan nilai bertipe String. Nilai ini bisa null atau referensi ke objek yang bertipe String (dan juga kelas turunan dari String) Mari kita lihat contoh lebih konkrotnya menggunakan array bilangan bulat sebagai contoh pertama kita. Karena int[] adalah sebuah kelas, maka kita bisa menggunakannya untuk mendeklarasikan variabel. Misalnya, int[] daftar; yang membuat variabel bernama daftar dengan tipe int[]. Variabel ini bisa menunjuk pada array int, akan tetapi nilai awalnya adalah null (jika merupakan variabel anggota suatu kelas) atau tak tentu (jika merupakan variabel lokal di dalam suatu metode).

168 Operator new digunakan untuk membuat objek array baru, ayng kemudian bisa diberikan kepada daftar. Sintaksnya sama seperti sintaks sebelumnya, yaitu : daftar = new int[5]; membuat array 5 buah integer. Lebih umum lagi, konstruktor "new TipeDasar[N]" digunakan untuk membuat array bertipe TipeDasar[]. Nilai N di dalam kurung menyatakan panjang array, atau jumlah elemen yang bisa ditampung. Panjang array adalah variabel instansi di dalam objek array, sehingga array tahu berapa panjangnya. Kita bisa mendapatkan panjang suatu array, misalnya daftar menggunakan daftar.length (akan tetapi kita tidak bisa mengubahnya) Hasil dari pernyataan "daftar = new int[5];" dapat diilustrasikan sebagai berikut Perlu dicatat bahwa array integer secara otomatis diisi dengan nol. Dalam Java, array yang baru dibuat akan selalu diisi dengan nilai tertentu: nol untuk angka, false untuk boolean, karakter dengan nilai Unicode 0 untuk char dan null untuk objek. Elemen di dalam array daftar dapat dirujuk dengan daftar[0], daftar[1], daftar[2], daftar[3], dan daftar[4] (ingat juga bahwa nilai indeks terbesar adalah panjangnya array dikurang satu). Akan tetapi, referensi array sebetulnya lebih umum lagi. Tanda kurung di dalam referensi array bisa berisi ekspresi apapun yang nilainya suatu integer. Misalnya jika idks adalah variabel bertipe int, maka daftar[idks] dan daftar[2*idks+3] secara sintaks benar. Contoh berikut akan mencetak semua isi integer di dalam array daftar ke layar : for (int i = 0; i < daftar.length; i++) { System.out.println( daftar[i] ); Perulangan pertama adalah ketika i = 0, dan daftar[i] merujuk pada daftar[0]. Jadi nilai yang disimpan pada variabel daftar[0] akan dicetak ke layar. Perulangan kedua

169 adalah i = 1, sehingga nilai daftar[i] dicetak. Perulangan berhenti setelah mencetak daftar[4] dan i menjadi sama dengan 5, sehingga kondisi lanjutan "i < daftar.length" tidak lagi benar. Ini adalah contoh umum dari menggunakan perulangan untuk mengolah suatu array. Penggunaan suatu variabel dalam suatu program menyatakan lokasi di memori. Pikirkan sesaat tentang apa yang akan komputer lakukan ketika ia menemukan referensi ke elemen suatu array daftar[k] ketika program berjalan. Komputer harus menentukan lokasi memori di mana ia dijadikan referensi. Untuk komputer, daftar[k] berarti : "Ambil pointer yang disimpan di dalam variabel daftar. Ikuti pointer ini untuk mencari objek array. Ambil nilai k. Pergi ke posisi ke-k dari array tersebut, dan di sanalah alamat memori yang Anda ingin." Ada dua hal yang bisa salah di sini. Misalnya nilai daftar adalah null. Dalam kasus ini, maka daftar tidak memiliki referensi sama sekali. Percobaan merujuk suatu elemen pada suatu array kosong adalah suatu kesalahan. Kasus ini akan menampilkan pesan kesalahan "pointer kosong". Kemungkinan kesalahan kedua adalah jika daftar merujuk pada suatu array, akan tetapi k berada di luar rentang indeks yang legal. Ini akan terjadi jika k < 0 atau jika k >= daftar.length. Kasus ini disebut kesalahan "indeks array keluar batas". Ketika kita menggunakan array dalam program, kita harus selalu ingat bahwa kedua kesalahan tersebut mungkin terjadi. Dari kedua kasus di atas, kesalahan indeks array keluar batas adalah kesalahan yang lebih sering terjadi. Untuk suatu variabel array, seperti variabel lainnya, kita bisa mendeklarasikan dan mengisinya dengan satu langkah sekaligus, misalnya : int[] daftar = new int[5]; Jika daftar merupakan variabel lokal dalam subrutin, maka perintah di atas akan persis sama dengan dua perintah : int[] daftar; daftar = new int[5]; (Jika daftar adalah variabel instansi, tentukan kita tidak bisa mengganti "int[] daftar = new int[5];" dengan "int[] daftar; daftar = new int[5];" karena ini hanya bisa dilakukan di dalam subrutin) Array yang baru dibuat akan diisi dengan nilai awal yang tergantung dari tipe dasar array tersebut seperti dijelaskan sebelumnya. Akan tetapi Java juga menyediakan cara untuk memberi isi array baru dengan daftar isinya. Dalam pernyataan yang untuk membuat array, ini bisa dilakukan dengan menggunakan penginisialiasi array (array initializer), misalny : int[] daftar = { 1, 4, 9, 16, 25, 36, 49 ;

170 akan membuat array baru yang berisi 7 nilai, yaitu 1, 4, 9, 16, 25, 36, dan 49, dan mengisi daftar dengan referensi ke array baru tersebut. Nilai daftar[0] berisi 1, nilai daftar[1] berisi 4, dan seterusnya. Panjang daftar adalah 7, karena kita memberikan 7 nilai awal kepada array ini. Suatu penginisialisasi array memiliki bentuk daftar angka yang dipisahkan dengan koma dan diapit dengan tanda kurung kurawal {. Panjang array tersebut tidak perlu diberikan, karena secara implisit sudah bisa ditentukan dari jumlah daftar angkanya. Elemen di dalam penginisialisasi array tidak harus selalu berbentuk konstanta. Juga bisa merupakan variabel atau ekspresi apa saja, asalkan nilainya bertipe sama dengan tipe dasar array tersebut. Misalnya, deklarasi berikut membuat array dari delapan jenis Color beberapa warna telah dibentuk dengan ekspresi "new Color(r,g,b);" Color[] palette = { Color.black, Color.red, Color.pink, new Color(0,180,0), // hijau gelap Color.green, Color.blue, new Color(180,180,255), // biru muda Color.white ; Inisialisasi array bentuk seperti ini hanya bisa digunakan dalam deklarasi suatu variabel baru, akan tetapi tidak bisa digunakan seperti operator pemberi nilai (=) di tengah-tengah suatu program. Akan tetapi ada cara lain yang bisa digunakan sebagai pernyataan pemberian nilai atau diberikan ke dalam subrutin. Yaitu menggunakan jenis lain dari operator new untuk membuat atau menginisialisasi objek array baru. (Cara ini agak kaku dengan sintaks aneh, seperti halnya sintaks kelas anonim yang telah didiskusikan sebelumnya). Misalnya untuk memberi nilai kepada suatu variabel daftar, kita bisa menggunakan : daftar = new int[] { 1, 8, 27, 64, 125, 216, 343 ; Sintaks umum dari bentuk operator new seperti ini adalah new TipeDasar [ ] { daftar_nilai_nilai Ini adalah suatu ekspresi yang isinya merupakan objek, dan bisa digunakan untuk banyak situasi di mana suatu objek dengan tipe TipeDasar dipentingkan. Misalnya buattombol merupakan metode yang mengambil array String sebagai parameter, maka kita bisa menuliskan buattombol( new String[] { "Stop", "Jalan", "Berikut", "Sebelum" ); Catatan terakhir : untuk alasan sejarah, maka deklarasi

171 int[] daftar; akan bernilai sama dengan int daftar[]; di mana sintaks tersebut digunakan dalam bahasa C dan C++. Akan tetapi sintaks alternatif ini tidak begitu masuk akan dalam Java, atau mungkin lebih baik dihindari. Lagian, maksudnya adalah mendeklarasikan variabel dengan tipe tertentu dan namanya adalah int[]. Akan lebih masuk akan untuk mengikuti siintaks "nama_tipe nama_variabel" seperti pada bentuk bertama. Pemrograman dengan Array Posted Sab, 03/21/ :29 by belajarprogram Versi ramah cetak Array merupakan jenis struktur data yang sangat dasar dan sangat penting. Teknik pengolahan array merupakan teknik pemrograman yang paling penting yang kita harus kuasai. Dua jenis teknik pengolahan array -- pencarian dan pengurutan -- akan dibahas kemudian. Bagian ini akan memperkenalkan beberapa ide dasar pengolahan array secara umum. Dalam banyak hal, pengolahan array berarti menggunakan operasi yang sama kepada setiap elemen di dalam array. Biasanya sering dilakukan dengan perulangan for. Perulangan untuk mengolah semua elemen dalam array A dapat ditulis dalam bentuk : // lakukan inisialiasi yang diperlukan sebelumnya for (int i = 0; i < A.length; i++) {... // proses A[i] Misalnya, A adalah array dengan tipe double[]. Misalnya kita ingin menjumlah semua nilai dalam array tersebut. Algoritma umum untuk melakukannya adalah : Mulai dengan 0; Tambah A[0]; (proses elemen pertama di dalam A) Tambah A[1]; (proses elemen kedua di dalam A)... Tambah A[ A.length - 1 ]; (proses elemen terakhir di dalam A) Dengan menggunakan pengetahuan yang kita telah pelajari tentang perulangan, kita bisa ubah algoritma di atas menjadi bentuk perulangan for seperti berikut: double jumlah; jumlah = 0; // Jumlah nilai di dalam A // Mulai dengan 0

172 for (int i = 0; i < A.length; i++) jumlah += A[i]; // tambah A[i] ke dalam jumlah untuk i = 0, 1,..., A.length - 1 Lihat bahwa kondisi kelanjutan "i < A.length" menyatakan bahwa nilai i terakhir yang akan diolah adalah A.length - 1 yaitu elemen terakhir dalam array. Ingat bahwa kita menggunakan "<" bukan "<=" karena dengan "<=" komputer akan memberikan kesalahan indeks di luar batas. Pada akhirnya, nanti Anda akan bisa membuat perulangan seperti di atas di luar kepala. Kita akan lihat beberapa contohnya. Di sini perulangan akan menghitung banyaknya elemen di dalam array A yang nilainya kurang dari nol : int hitung; // Untuk menghitung elemen hitung = 0; // Mulai dengan nol for (int i = 0; i < A.length; i++) { if (A[i] < 0.0) // Jika elemen ini kurang dari nol hitung++; // tambah hitung dengan 1 // Di sini nilai "hitung" adalah banyaknya elemen yang kurang dari 0. Kita bisa mengganti "A[i] < 0.0" jika kita ingin menghitung banyaknya elemen di dalam array yang memiliki sifat tertentu. Variasinya akan memiliki tema yang sama. Misalnya kita ingin menghitung banyaknya elemen di dalam array A yang sama dengan elemen sesudahnya. Elemen setelah A[i] adalah A[i+1], sehingga kita bisa mengganti klausa if dengan "if (A[i] == A[i+1])". Akan tetapi tunggu dulu : Tes ini tidak bisa digunakan apabila A[i] adalah elemen terakhir dalam array, karena tidak ada lagi array sesudahnya. Komputer akan menolak pernyataan ini. Sehingga kita harus berhenti satu elemen sebelum array terakhir, sehingga menjadi int hitung = 0; // lihat kondisi for berubah dibandingkan dengan contoh sebelumnya for (int i = 0; i < A.length - 1; i++) { if (A[i] == A[i+1]) hitung++; Masalah umum lainnya adalah mencari nilai terbesar di dalam array A. Strateginya adalah lihat semua isi array, catat nilai terbesar saat itu. Kita akan simpan nilai terbesar yang kita temui dalam variabel maks. Pada saat kita melihat elemen array satu per satu, kapanpun kita melihat nilai elemen tersebut lebih besar dari maks kita akan mengganti nilai maks dengan nilai yang lebih besar tersebut. Setelah semua elemen array diproses, maka maks merupakan nilai elemen terbesar di dalam array tersebut. Pertanyaannya adalah, apa nilai awal maks? Salah satu kemungkinannya adalah mulai dengan nilai maks sama dengan A[0], baru kemudian melihat isi elemen array lainnya mulai dengan A[1]. Misalnya, double maks = A[0]; // nilai maks berisi elemen array pertama for (int i = 1; i < A.length; i++) { // i mulai dari elemen kedua

173 if (A[i] > maks) max = A[i]; // Di sini maks berisi nilai elemen array yang paling besar (Ada masalah yang lebih penting di sini. Java membolehkan array memiliki panjang nol. Artinya bahkan A[0] pun tidak ada di dalam array, sehingga memanggil A[0] akan menghasilkan kesalahan indeks keluar batas. Akan tetapi array biasanya array dengan panjang nol biasanya sesuatu yang kita ingin hindarkan dalam kehidupan sehari-hari. Lagian apa artinya mencari nilai terbesar di dalam suatu array yang panjangnya nol?) Contoh terakhir dari operasi array, misalnya kita ingin mengkopi suatu array. Untuk mengkopi array A, tidak cukup untuk menggunakan perintah double[] B = A; karena perintah ini tidak membuat objek array baru. Yang dibuat di sini adalah variabel baru yang merujuk pada objek yang sama dengan A. (Sehingga perubahan yang terjadi pada A[i] akan juga menyebabkan B[i] berubah). Untuk membuat array baru yang merupakan kopi dari array A, kita harus membuat objek array baru, dan mengkopi isinya satu per satu dari array A ke array baru, sehingga // Buat objek array baru, yang panjangnya sama dengan panjang A double[] B = new double[a.length]; for (int i = 0; i < A.length; i++) B[i] = A[i]; // Kopi setiap elemen dari A ke B Mengkopi nilai dari satu array ke array yang lain adalah operasi umum sehingga Java memiliki subrutin untuk melakukannya, yaitu System.arraycopy(), yang merupakan subrutin anggota statik dari kelas standar System. Deklarasinya memiliki bentuk seperti : public static void arraycopy(object arraysumber, int indeksawalsumber, Object arraytujuan, int indeksawaltujuan, int jumlah) di mana arraysumber dan arraytujuan bisa berbentuk array dengan tipe apapun. Nilai akan dikopi dari arraysumber ke arraytujuan. jumlah adalah berapa banyak elemen yang akan dikopi. Nilai akan dikopi dari arraysumber mulai dari posisi indeksawalsumber dan akan disimpan pada arraytujuan mulai dari posisi indeksawaltujuan. Misalnya kita akan mengkopi array A, maka kita bisa menggunakan perintah double B = new double[a.length]; System.arraycopy( A, 0, B, 0, A.length ); Suatu tipe array, misalnya double[] adalah tipe Java biasa, sehingga kita bisa menggunakannya seperti tipe-tipe Java lainnya. Termasuk juga digunakan sebagai parameter formal di dalam suatu subrutin. Juga bisa digunakan sebagai tipe keluaran

174 suatu fungsi. Misalnya, kita bisa menulis fungsi yang membuat kopi array dengan tipe double sebagai berikut : double[] kopi( double[] sumber ) { // Membuat dan mengembalikan kopi array sumber // Jika sumber null, maka kembalikan null if ( sumber == null ) return null; double[] kpi; // Kopi array sumber kpi = new double[sumber.length]; System.arraycopy( sumber, 0, kpi, 0, sumber.length ); return kpi; Rutin main() memiliki parameter dengan tipe String[] yang merupakan array String. Ketika sistem memanggil rutin main(), string di dalam array ini adalah parameter dari baris perintah. Jika kita menggunakan konsol, user harus mengetikkan perintah untuk menjalankan program. User bisa menambahkan input tambahan dalam perintah ini setelah nama program yang akan dijalankan. Misalnya, jika kelas yang memiliki rutin main() bernama programku, maka user bisa menjalankan kelas tersebut dengan perintah "java programku" di konsol. Jika kita tulis dengan "java programku satu dua tiga", maka parameter dari baris perintahnya adalah "satu", "dua", dan "tiga". Sistem akan memasukkan parameter-parameter ini ke dalam array String[] dan memberikan array ini pada rutin main(). Berikut ini adalah contoh program sederhana yang hanya mencetak parameter dari baris perintah yang dimasukkan oleh user. public class CLDemo { public static void main(string[] args) { System.out.println("Anda memasukkan " + args.length + " parameter dari baris perintah"); if (args.length > 0) { System.out.println("Parameter tersebut adaah :"); for (int i = 0; i < args.length; i++) System.out.println(" " + args[i]); // akhir main() // akhir kelas CLDemo Perhatikan bahwa parameter args tidak mungkin null meskipun tidak ada parameter yang dimasukkan. Jika tidak ada parameter dari baris perintah yang dimasukkan, maka panjang array ini adalah nol. Hingga sekarang, contoh yang telah diberikan adalah bagaimana mengolah array dengan mengakses elemennya secara berurutan (sequential access). Artinya elemen-elemen array diproses satu per satu dalam urutan dari awal hingga akhir. Akan tetapi salah satu

175 keuntungan array adalah bahwa array bisa digunakan untuk mengakses elemennya secara acak, yaitu setiap elemen bisa diakses kapan saja secara langsung. Misalnya, kita ambil contoh suatu masalah yang disebut dengan masalah ulang tahun: Misalnya ada N orang di dalam suatu ruangan. Berapa kemungkinan dua orang di dalam ruangan tersebut memiliki ulang tahun yang sama (yang dilahirkan pada tanggal dan bulan yang sama, meskipun tahunnya berbeda)? Kebanyakan orang salah menerka jawabannya. Sekarang kita lihat dengan versi masalah yang berbeda: Misalnya kita memilih orang secara acak dan menanyakan ulang tahunnya. Berapa orang yang Anda harus tanya untuk mendapatkan hari ulang tahun yang sama dengan orang sebelumnya? Tentunya jawabannya akan tergantung pada faktor yang bersifat acak, akan tetapi kita bisa simulasikan dengan program komputer dan menjalankan beberapa kali hingga kita tahu berapa kira-kira orang harus dicek. Untuk mensimulasikan percobaan ini, kita harus mencatat semua ulang tahun yang kita sudah tanyakan. Ada 365 kemungkinan hari ulang tahun (Kita abaikan sementara tahun kabisat). Untuk setiap kemungkinan hari ulang tahun, kita perlu tahu, apakah hari ulang tahun tersebut telah digunakan? Jawabannya adalah nilai boolean true atau false. Untuk menyimpan data ini, kita bisa gunakan array dari 365 nilai boolean: boolean[] sudahditanya; sudahditanya = new boolean[365]; Tanggal-tanggal pada satu tahun dinomori dari 0 hingga 364. Nilai sudahditanya[i] akan bernilai true jika orang yang kita tanya berulang tahun pada hari tersebut. Pada awalnya semua nilai pada array sudahditanya[i] bernilai false. Ketika kita memilih satu orang dan menanyakan hari ulang tahunnya, misalnya i, kita akan mengecek terlebih dahulu apakah sudahditanya[i] bernilai true. Jika tidak maka orang ini adalah orang kedua dengan ulang tahun yang sama. Artinya kita sudah selesai. Jika sudahditanya[i] bernilai false, maka belum ada orang sebelum ini yang memiliki hari ulang tahun tersebut. Kita akan ganti sudahditanya[i] dengan true, kemudian kita akan tanyakan lagi kepada orang lain, dan begitu seterusnya hingga semua orang di dalam ruangan ditanyakan. static // // // // void masalahulangtahun() { Melakukan simulasi dengan memilih seseorang secara acak dan mengecek hari ulang tahunnya. Jika hari ulang tahunnya sama dengan orang yang pernah kita tanya sebelumnya, hentikan program dan laporkan berapa orang yang sudah dicek boolean[] sudahditanya; // Untuk mencatat ulang tahun yang sudah ditanyakan // Nilai true pada sudahditanya[i] berarti orang lain // sudah ada yang berulang tahun pada hari i int hitung; // Jumlah orang yang sudah pernah ditanya

176 sudahditanya = new boolean[365]; // Awalnya, semua nilai adalah false hitung = 0; while (true) { // Ambil ulang tahun secara acak dari 0 hingga 364 // Jika ulang tahun telah ditanya sebelumnya, keluar // Jika tidak catat dalam array int ultah; // Ulang tahun seseorang ultah = (int)(math.random()*365); hitung++; if ( sudahditanya[ultah] ) break; sudahditanya[ultah] = true; System.out.println("Ulang tahun yang sama ditemukan setelah menanyakan " + hitung + " orang."); // akhir masalahulangtahun() Subrutin ini menggunakan fakta bahwa array boolean yang baru dibuat memiliki seluruh elemen yang bernilai false. Jika kita ingin menggunakan array yang sama untuk simulasi kedua, kita harus mereset ulang semua elemen di dalamnya menjadi false kembali dengan perulangan for for (int i = 0; i < 365; i++) sudahditanya[i] = false; Array paralel adalah menggunakan beberapa array dengan indeks yang sama. Misalnya kita ingin membuat beberapa kolom secara paralel -- array x di kolom pertama, array y di kolom kedua, array warna di kolom ketiga, dan seterusnya. Data untuk baris ke-i bisa didapatkan dari masing-masing array ini. Tidak ada yang salah dengan cara ini, akan tetapi cara ini berlawanan dengan filosofi berorientasi objek yang mengumpulkan data yang berhubungan di dalam satu objek. Jika kita mengikuti aturan seperti ini, amaka kita tidak harus membayangkan hubungan data yang satu dan yang lainnya karena semua data akan dikelompokkan di dalam satu tempat. Misalnya saya menulis kelas seperti class DataString { // Data dari salah satu pesan int x,y; // Posisi pesan Color warna; // Warna pesan

177 Untuk menyimpan data dalam beberapa pesan, kita bisa menggunakan array bertipe DataString[], yang kemudian dideklarasikan sebagai variabel instansi dengan nama data sehingga DataString[] data; Isi dari data bernilai null hingga kita membuat array baru, misalnya dengan data = new DataString[JUMLAH_PESAN]; Setelah array ini dibuat, nilai setiap elemen array adalah null. Kita ingin menyimpan data di dalam objek yang bertipe DataString, akan tetapi tidak ada objek yang dibuat. Yang kita sudah buat hanyalah kontainernya saja. Elemen di dalamnya berupa objek yang belum pernah kita buat. Untuk itu elemen di dalamnya bisa kita buat dengan perulangan for seperti : for (int i = 0; i < JUMLAH_PESAN; i++) data[i] = new DataString(); Sekarang kita bisa mengambil data setiap pesan dengan data[i].x, data[i].y, dan data[i].warna. Terakhir berkaitan dengan pernyataan switch. Misalnya kita memiliki nilai bulan dari 0 hingga 11, yang melambangkan bulan dalam satu tahun dari Januari hingga Desember. Kita ingin mencetaknya di layar, dengan perintah switch (bulan) { case 0: bulanstring = break; case 1: bulanstring = break; case 2: bulanstring = break; case 3: bulanstring = break;... case 11: bulanstring = break; default: bulanstring = "Januari"; "Februari"; "Maret"; "April"; "Desember"; "Salah bulan";

178 Kita bisa mengganti keseluruhan perintah switch tersebut dengan menggunakan array, misalnya dengan array namabulan yang dideklarasikan sebagai berikut : static String[] namabulan = { "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember" ; Kemudian kita bisa ganti keseluruhan switch di atas dengan bulanstring = namabulan[bulan]; Sangat mudah bukan? Array Dinamis Posted Sab, 03/21/ :39 by belajarprogram Versi ramah cetak Panjang suatu array tidak bisa diubah setelah dibuat. Akan tetapi, sering kali jumlah data yang disimpan dalam array bisa berubah setiap saat. Misalnya dalam contoh berikut : Suatu array menyimpan baris teks dalam program pengolah kata. Atau suatu array yang menyimpan daftar komputer yang sedang mengakses halaman suatu website. Atau array yang berisi gambar yang ditambahkan user oleh program gambar. Di sini jelas, bahwa kita butuh sesuatu yang bisa menyimpan data di mana jumlahnya tidak tetap. Array Setengah Penuh Bayangkan suatu aplikasi di mana sejumlah item yang ingin kita simpan di dalam array akan berubah-ubah sepanjang program tersebut berjalan. Karena ukuran array tidak bisa diubah, maka variabel terpisah digunakan untuk menyimpan berapa banyak sisa tempat kosong yang masih bisa diisi di dalam array. Bayangkan misalnya, suatu program yang membaca bilangan bulat positif dari user, kemudian menyimpannya untuk diproses kemudian. Program akan berhenti membaca input apabila input yang diterima bernilai 0 atau kurang dari nol. Bilangan input n tersebut kita simpa di dalam array bilangan dengan tipe int[]. Katakan banyaknya bilangan yang bisa disimpan tidak lebih dari 100 buah. Maka ukuran array bisa dibuat 100. Akan tetapi program tersebut harus melacak berapa banyak bilangan yang sudah diambil dari user. Kita gunakan variabel terpisah bernama jmlbilangan. Setiap kali suatu bilangan disimpan di dalam array, nilai jmlbilangan akan bertambah satu. Sebagai contoh sederhana, masi kita buat program yang mengambil bilangan yang diinput dari user, kemudian mencetak bilangan-bilangan tersebut dalam urutan terbalik. (Ini adalah contoh pengolahan yang membutuhkan array, karena semua bilangan harus

179 disimpan pada suatu tempat. Banyak lagi contoh program misalnya, mencari jumlah atau rata-rata atau nilai maksimum beberapa bilangan, bisa dilakukan tanpa menyimpan bilangan tersebut satu per satu) public class BalikBilanganInput { public static void main(string[] args) { int[] bilangan; // Array untuk menyimpan nilai input dari user int jmlbilangan; // Banyaknya bilangan yang sudah disimpan dalam array int bil; // Bilangan yang diambil dari user bilangan = new int[100]; int // Buat array dengan 100 bilangan jmlbilangan = 0; // Belum ada bilangan yang disimpan System.out.println("Masukkan bilangan bulat positif (paling banyak 100 bilangan)" + ", masukkan nol untuk mengakhiri."); while (true) { System.out.print("? "); bil = KonsolIO.ambilInt(); if (bil <= 0) break; bilangan[jmlbilangan] = bil; jmlbilangan++; System.out.println("\nBilangan yang Anda masukkan dalam urutan terbalik adalah :\n"); for (int i = jmlbilangan - 1; i >= 0; i--) { System.out.println( bilangan[i] ); // akhir main(); // akhir kelas BalikBilanganInput Penting untuk diingat bahwa jmlbilangan memiliki dua peran. Yang pertama, adalah melacak banyaknya bilangan yang sudah dimasukkan di dalam array. Yang kedua adalah menentukan di mana indeks kosong berikutnya di dalam array. Misalnya, jika 4 bilangan sudah dimasukkan ke dalam array, maka bilangan-bilangan tersebut diisi pada array di posisi 0, 1, 2, dan 3. Maka posisi kosong berikutnya adalah posisi 4. Ketika kita akan mencetak angka di dalam array, maka poisisi penuh berikutnya adalah di lokasi jmlbilangan - 1, sehingga perulangan for mencetak bilangan dari jmlbilangan - 1 hingga 0.

180 Mari kita lihat contoh lain yang lebih realistis. Misalkan kita ingin menulis program game, di mana pemain bisa masuk ke dalam game dan keluar dari game setiap saat. Sebagai programmer berorientasi objek yang baik, mungkin kita memiliki kelas bernama Pemain sebagai lambang pemain di dalam game. Daftar pemain yang sedang ada di dalam game, bisa disimpan di dalam array ArrayPemain dengan tipe Pemain[]. Karena jumlah pemain bisa berubah-ubah maka kita bisa menggunakan variabel bantu, misalnya jumlahpemainaktif untuk mencatat banyaknya pemain yang sedang aktif berada di dalam game. Misalnya jumlah maksimum pemain di dalam game adalah 10 orang, maka kita bisa mendeklarasikan variabelnya sebagai : Pemain[] ArrayPemain = new Pemain[10]; // Hingga 10 pemain. int jumlahpemainaktif = 0; // Di awal game, tidak ada pemain yang aktif Setelah beberapa pemain masuk ke dalam game, variabel jumlahpemainaktif akan lebih dari 0, dan objek p n akan disimpan dalam array, misalnya ArrayPemain[0], ArrayPemain[1], ArrayPemain[2], dan seterusnya. Ingat bahwa pemain ArrayPemain[jumlahPemainAktif] tidak ada. Prosedur untuk menambah pemain baru, secara sederhana : // Tambah pemain di tempat kosong ArrayPemain[jumlahPemainAktif] = pemainbaru; // And increment playerct to count the new player. jumlahpemainaktif++; Untuk menghapus seorang pemain mungkin sedikit lebih sulit karena kita tidak ingin meninggalkan lubang di tengah-tengah array. Misalnya kita ingin menghapus pemain pada indeks k pada ArrayPemain. Jika kita tidak peduli urutan pemainnya, maka salah satu caranya adalah memindahkan posisi pemain terakhir ke posisi pemain yang meninggalkan game, misalnya : ArrayPemain[k] = ArrayPemain[jumlahPemainAktif - 1]; jumlahpemainaktif--; Pemain yang sebelumnya ada di posisi k, tidak lagi ada di dalam array. Pemain yang sebelumnya ada di posisi jumlahpemainaktif -1 sekarang ada di array sebanyak 2 kali. Akan tetapi sekarang ia berada di bagian yang valid, karena nilai jumlahpemainaktif kita kurangi dengan satu. Ingat bahwa setiap elemen di dalam array harus menyimpan satu nilai, akan tetapi satu-satunya nilai dari posisi 0 hingga jumlahpemainaktif - 1 akan tetap diproses seperti biasa. Misalnya kita ingin menghapus pemain di posisi k, akan tetapi kita ingin agar urutan pemain tetap sama. Untuk melakukannya, semua pemain di posisi k+1 ke atas harus dipindahkan satu posisi ke bawah. Pemain k+ mengganti pemain k yang keluar dari game. Pemain k+2 mengganti pemain yang pindah sebelumnya, dan berikutnya. Kodenya bisa dibuat seperti

181 for (int i = k+1; i < jumlahpemainaktif; i++) { ArrayPemain[i-1] = ArrayPemain[i]; jumlahpemainaktif--; Perlu ditekankan bahwa contoh Pemain di atas memiliki tipe dasar suatu kelas. Elemennya bisa bernilai null atau referensi ke suatu objek yang bertipe Pemain, Objek Pemain sendiri tidak disimpan di dalam array, hanya referensinya saja yang disimpan di sana. Karena aturan pemberian nilai pada Java, objek tersebut bisa saja berupa kelas turunan dari Pemain, sehingga mungkin juga array tersebut menyimpan beberapa jenis Pemain misalnya pemain komputer, pemain manusia, atau pemain lainnya, yang semuanya adalah kelas turunan dari Pemain. Contoh lainnya, misalnya kelas BentukGeometri menggambarkan suatu bentuk geometri yang bisa digambar pada layar, dan ia memiliki kelas-kelas turunan yang merupakan bentuk-bentuk khusus, seperti garis, kotak, kotak bertepi bulat, oval, atau oval berisi warna, dan sebagainya. (BentukGeometri sendiri bisa berbentuk kelas abstrak, seperti didiskusikan sebelumnya). Kemudian array bertipe BentukGeometri[] bisa menyimpan referensi objek yang bertipe kelas turunan dari BentukGeometri. Misalnya, perhatikan contoh pernyataan berikut BentukGeometri[] gambar = new BentukGeometri[100]; // Array untuk menyimpan 100 gambar. gambar[0] = new Kotak(); // Letakkan beberapa objek di dalam array. gambar[1] = new Garis(); // (Program betulan akan menggunakan beberapa gambar[2] = new OvalBerwarna(); // parameter di sini int jmlgambar = 3; // Lacak jumlah objek di dalam array bisa diilustrasikan sebagai berikut.

182 Array tersebut bisa digunakan dalam program gambar. Array bisa digunakan untuk menampung gambar-gambar yang akan ditampilkan. Jika BentukGeometri memiliki metode "void gambarulang(graphics g)" untuk menggambar pada grafik g, maka semua grafik dalam array bisa digambar dengan perulangan sederhana for (int i = 0; i < jmlgambar; i++) gambar[i].gambarulang(g); Pernyataan "gambar[i].gambarulang(g);" memanggil metode gambarulang() yang dimiliki oleh masing-masing gambar pada indeks i di array tersebut. Setiap objek tahu bagaimana menggambar dirinya sendiri, sehingga perintah dalam perulangan tersebut sebetulnya melakukan tugas yang berbeda-beda tergantung pada objeknya. Ini adalah contoh dari polimorfisme dan pengolahan array. Array Dinamis Dalam contoh-contoh di atas, ada batas tententu dalam jumlah elemennya, yaitu 100 int, 100 Pemain, dan 100 BentukGeometris. Karena ukuran array tidak bisa berubah, array tersebut hanya bisa menampung maksimum sebanyak elemen yang didefinisikan pada pembuatan array. Dalam banyak kasus, adanya batas maksimum tersebut tidak diinginkan. Kenapa harus bekerja dengan hanya 100 bilangan bulat saja, bukan 101? Alternatif yang umum adalah membuat array yang sangat besar sehingga bisa digunakan untuk dalam kehidupan sehari-hari. Akan tetapi cara ini tidak baik, karena akan sangat banyak memori komputer yang terbuang karena tidak digunakan. Memori itu mungkin lebih baik digunakan untuk yang lain. Apalagi jika komputer yang akan digunakan tidak memiliki memori yang cukup untuk menjalankan program tersebut. Tentu saja, cara yang lebih baik adalah apabila kita bisa mengubah ukuran array sesuka kita kapan saja. Ingat bahwa sebenarnya variabel array tidak menyimpan array yang sesungguhnya. Variabel ini hanya menyimpan referensi ke objek tersebut. Kita tidak bisa membuat array tersebut lebih besar, akan tetapi kita bisa membuat array baru yang lebih besar, kemudian mengubah isi variabel array tersebut ke array baru itu. Tentunya kita harus mengkopi semua isi di array yang lama ke array baru. Array lama akan diambil oleh pemulung memori, karena ia tidak lagi digunakan. Mari kita lihat kembali contoh game di atas, di mana ArrayPemain adalah array dengan tipe Pemain[] dan jumlahpemainaktif[/code] adalah jumlah pemain yang sudah digunakan array tersebut. Misalnya kita tidak ingin membuat limit banyaknya pemainnya yang bisa ikut main. Jika pemain baru masuk dan array tersebut sudah penuh, kita akan membuat array baru yang lebih besar. Variabel ArrayPemain akan merujuk pada array baru. Ingat bahwa setelah ini dilakukan, ArrayPemain[0] akan menunjuk pada lokasi memori yang berbeda, akan tetapi nilai

183 ArrayPemain[0] sama dengan sebelumnya. Berikut ini adalah kode untuk melakukan hal di atas: // Tambah pemain baru, meskipun array sudah penuh if (jumlahpemainaktif == ArrayPemain.length) { // Array sudah penuh. Buat array baru yang lebih besar, // kemudian kopi isi array lama ke array baru lalu ubah // ArrayPemain ke array baru. int ukuranbaru = 2 * ArrayPemain.length; // Ukuran array baru Pemain[] temp = new Pemain[ukuranBaru]; // Array baru System.arraycopy(ArrayPemain, 0, temp, 0, ArrayPemain.length); ArrayPemain = temp; // Ubah referensi ArrayPemain ke array baru. // Di sini kita sudah tahu bahwa pasti ada tempat di array baru. ArrayPemain[jumlahPemainAktif] = pemainbaru; // Tambah pemain baru... jumlahpemainaktif++; //... dan tambah satu jumlahpemainaktif nya Jika kita akan melakukan hal ini terus menerus, akan lebih indah jika kita membuat kelas untuk menangani hal ini. Objek mirip array yang bisa berubah ukuran untuk mengakomodasi jumlah data yang bisa ia tampung disebut array dinamis. Array dinamis memiliki jenis operasi yang sama dengan array : mengisi nilai pada posisi tertentu dan mengambil nilai di posisi tertentu. Akan tetapi tidak ada batas maksimum dari jumlah array (hanya tergantung pada jumlah memori komputer yang tersedia). Dalam kelas array dinamis, metode put dan get akan diimplementasikan sebagai metode instansi. Di sini misalnya, adalah kelas yang mengimplementasikan array dinamis int : public class ArrayDinamisInt { private int[] data; // Array untuk menyimpan data public DynamicArrayOfInt() { // Konstruktor. data = new int[1]; // Array akan bertambah besar jika diperlukan public int get(int posisi) { // Ambil nilai dari posisi tertentu di dalam array. // Karena semua posisi di dalam array adalah nol, maka // jika posisi tertentu di luar data array, nilai 0 akan dikembalikan if (posisi >= data.length) return 0; else return data[posisi]; public void put(int posisi, int nilai) { // Simpan nilai ke posisi yang ditentukan di dalam array // Data array tersebut akan bertambah besar jika diperlukan

184 masih if (posisi >= data.length) { // Posisi yang ditentukan berada di luar array data // Besarkan ukuran array 2x lipat. Atau jika ukurannya // terlalu kecil, buat ukurannya sebesar 2*posisi int ukuranbaru = 2 * data.length; if (posisi >= ukuranbaru) ukuranbaru = 2 * posisi; int[] databaru = new int[ukuranbaru]; System.arraycopy(data, 0, databaru, 0, data.length); data = databaru; // Perintah berikut hanya untuk demonstrasi System.out.println("Ukuran array dinamis diperbesar menjadi " + ukuranbaru); data[posisi] = nilai; // akhir kelas ArrayDinamisInt Data pada objek ArrayDinamisInt disimpan dalam array biasa, akan tetapi arraynya akan dibuang dan diganti dengan array baru yang lebih besar apabila diperlukan. Jika bilangan adalah variable bertipe ArrayDinamisInt, maka perintah bilangan.put(pos,nilai) akan menyimpan bilangan pada posisi pos di array dinamis tersebut. Fungsi bilangan.get(pos) mengambil nilai yang disimpan pada posisi pos. Pada contoh pertama, kita menggunakan array untuk menyimpan bilangan bulat positif yang dimasukkan oleh user. Kita bisa menulis ulang program tersebut dengan menggunakan ArrayDinamisInt. Referensi ke bilangan[i] diganti dengan bilangan.get[i]. Perintah "bilangan[jmlbilangan] = bil;" kita ganti dengan "bilangan.put(jmlbilangan,bil);". Berikut ini adalah programnya: public class BalikBilanganInput { public static void main(string[] args) { ArrayDinamisInt bilangan; // Array untuk menyimpan nilai input dari user int jmlbilangan; // Banyaknya bilangan yang sudah disimpan dalam array int bil; // Bilangan yang diambil dari user bilangan = new ArrayDinamisInt(); jmlbilangan = 0; // Belum ada bilangan yang disimpan System.out.println("Masukkan bilangan bulat positif, masukkan nol untuk mengakhiri.");

185 while (true) { System.out.print("? "); bil = KonsolIO.ambilInt(); if (bil <= 0) break; bilangan.put(jmlbilangan,bil); jmlbilangan++; System.out.println("\nBilangan yang Anda masukkan dalam urutan terbalik adalah :\n"); for (int i = jmlbilangan - 1; i >= 0; i--) { System.out.println( bilangan.get(i) ); // akhir main(); // akhir kelas BalikBilanganInput ArrayLists dan Vector Posted Sab, 03/21/ :41 by belajarprogram Versi ramah cetak ArrayList Kelas ArrayDinamisInt bisa digunakan jika kita membutuhkan array dengan batas maksimum yang tak terbatas. Akan tetapi jika kita ingin menyimpan BentukGeometri misalnya, kita harus membuat kelas baru. Kelas tersebut mungkin bernama ArrayDinamisBentukGeometri, dan akan tampak sama persis dengan ArrayDinamisInt dengan beberapa perubahan di mana "int" muncul akan diganti dengan "BentukGeometri". Juga demikian jika kita ingin membuat kelas ArrayDinamisDouble, ArrayDinamisPemain, dan sebagainya. Yang agak sedikit lucu adalah kelas tersebut sangat mirip isinya, hanya kelas-kelasnya saja yang berlainan. Akan sangat lebih baik apabila kita bisa membuat kelas umum yang berlaku untuk semua kelas. Hal ini disebut dengan pemrograman generik. Beberapa bahasa pemrograman seperti C++ memiliki fasilitas untuk melakukan pemrograman generik. Java tidak memiliki fasilitas seperti itu (maksudnya tidak sama persis). Tapi kita bisa membuat sesuatu yang mirip dengan itu pada Java dengan menggunakan struktur data yang memiliki tipe "Object". Pada Java, setiap kelas adalah kelas turunan dari kelas yang bernama Object. Artinya setiap objek dapat dirujuk oleh variabel bertiipe Object. Semua objek dapat dimasukkan dalam array bertipe Object[]. Jika suatu subrutin memiliki parameter formal bertipe Object, maka objek apapun bisa diberikan kepada subrutin tersebut.

186 Jika kita buat kelas ArrayDinamisObject, maka kita bisa menyimpan objek apapun. Ini sebenarnya bukan programming generik sebenarnya, dan tidak berlaku untuk tipe primitif seperti int dan double. Sebenarnya, kita tidak perlu membuat kelas ArrayDinamisObject sendiri, karena Java telah memiliki kelas standar yang dinamakan ArrayList yang sifatnya mirip dengan yang kita sebutkan sebelumnya. ArrayList disimpan dalam paket java.util, jadi jika kita ingin menggunakan ArrayList dalam sebuat program, kita harus memberikan "import java.util.arraylist;" atau "import java.util.*;" di awal program kita. kelas Kelas ArrayList berbeda dengan kelas ArrayDinamisInt dalam arti, objek ArrayList selalu memiliki ukuran tertentu, dan kita tidak boleh mengambil posisi di luar ukuran ArrayList. Dalam hal ini, ArrayList mirip seperti array biasa. Akan tetapi, ukuran ArrayList bisa bertambah kapan saja jika diperlukan. Kelas ArrayList memiliki banyak metode instansi. Kita akan jelaskan sebagian yang sangat berguna. Misalnya daftar adalah variabel dengan tipe ArrayList. daftar.size() -- Fungsi ini menghasilkan ukuran ArrayList saat ini. Posisi valid dalam daftar adalah yang bernomor 0 hingga daftar.size() - 1. Ingat bahwa ukurannya bisa nol. Panggilan konstruktor new ArrayList() akan membuat ArrayList dengan ukuran nol. daftar.add(obj) -- Menambah objek di akhir ArrayList, kemudian menambah ukurannya dengan 1. Parameter obj merujuk pada objek dengan tipe apapun, atau bisa bernilai null. daftar.get(n) -- Mengambil nilai yang disimpan pada posisi N pada ArrayList. N harus bertipe bilangan bulat antara 0 hingga daftar.size() - 1. Jika N berada di luar rentang ini, pesan kesalahan akan ditampilkan. Memanggil fungsi ini mirip dengan memanggil array seperti A[N] untuk suatu array A. Akan tetapi kita tidak bisa menggunakan daftar.get(n) pada ekspresi di sebelah kiri daftar.get(n) = 5 tidak boleh dilakukan) daftar.set(n, obj) -- Mengisi suatu objek obj di posisi N dari suatu ArrayList, dan mengganti apapun yang sudah disimpan sebelumnya pada posisi N. Bilangan bulat N harus berada pada rentang 0 hingga daftar.size() - 1. Perintah ini mirip dengan perintah A[N] = obj pada array A. daftar.remove(obj) -- Jika objek tersebut ada di dalam ArrayList, maka objek tersebut akan dibuang. Elemen lain setelah posisi objek tersebut di dalam ArrayList akan digeser satu posisi. Kemudian ukuran ArrayList akan berkurang 1. Jika obj terdapat dalam ArrayList lebih dari satu kali, hanya yang pertama saja yang dibuang. daftar.remove(n) -- Untuk bilangan bulat N, maka perintah ini akan menghapus posisi ke-n pada ArrayList. N harus berada pada rentang 0 hingga daftar.size() - 1. Elemen setelah ini akan digeser satu posisi. Kemudian ukuran ArrayList berkurang 1.

187 -- Fungsi untuk mencari suatu objek obj di dalam ArrayList. Jika objek ditemukan, maka posisinya di dalam ArrayList akan dikembalikan. Jika tidak, maka fungsi ini akan mengembalikan -1. daftar.indexof(obj) Misalnya,kita akan membuat pemain dalam game yang digambarkan dengan objek dengan tipe Pemain. Pemain yang berada dalam game disimpan dalam ArrayList bernama parapemain. Variabel ini dideklarasikan seperti : ArrayList parapemain; dan kita inisialisasikan dengan objek kosong dengan perintah parapemain = new ArrayList(); Jika pemainbaru adalah variabel yang bertipe Pemain, maka pemain baru tersebut bisa ditambahkan ke dalam ArrayList dan ke dalam game dengan perintah : parapemain.add(pemainbaru); dan jika pemain nomor i keluar dari game, maka kita hanya perlu memberikan perintah parapemain.remove(i); Atau jika pemain adalah objek bertipe Pemain yang akan kita keluarkan dari game, maka kita bisa menggunakan perintah parapemain.remove(pemain); Semuanya terlihat sangat mudah. Satu-satunya kesulitan yang akan kita temui adalah ketika kita ingin mengambil nilai yang disimpan pada posisi i di dalam ArrayList. Tipe keluaran fungsi ini adalah Object. Dalam hal ini objek yang diambil oleh fungsi ini sebenarnya bertipe Pemain. Supaya kita bisa menggunakan hasil keluarannya, maka kita perlu menggunakan casting tipe untuk mengubahnya menjadi tipe Player, dengan cara : Pemain pmn = (Pemain)paraPemain.get(i); Misalnya, jika kelas Pemain memiliki metode instansi yang dinamakan jalan() yang dipanggil ketika seorang pemain menjalankan dadu atau kartu, maka kita bisa menuliskan kode untuk memberi giliran kepada semua pemain untuk jalan, yaitu dengan for (int i = 0; i < parapemain.size(); i++) { Pemain pmn = (Pemain)paraPemain.get(i); pmn.jalan(); Dua baris di dalam perulangan for tersebut dapat digabungkan dengan satu perintah : ((Pemain)paraPemain.get(i)).jalan();

188 Perintah ini akan mengambil elemen pada ArrayList mengcasting tipenya, kemudian memanggil metode jalan() pada pemain yang baru diambil tersebut. Tanda kurung di sekitar "(Pemain)paraPemain.get(i)" diperlukan karena aturan dalam Java sehingga perintah dalam kurung akan dijalankan terlebih dahulu sebelum metode jalan() dipanggil. Vector Kelas ArrayList diperkenalkan pada Java versi 1.2, sebagai salah satu kumpulan kelas yang digunakan untuk bekerja dengan sekumpulan koleksi objek. Jika akan bahas lebih lanjut tentang "kelas koleksi" pada bagian berikutnya. Versi awal Java tidak memiliki ArrayList, akan tetapi memiliki kelas yang sangat mirip yaitu java.util.vector. Kita masih bisa melihat Vector digunakan pada program lama, dan dalam beberapa kelas standar Java, sehingga kita perlu tahu tentang kelas ini. Menggunakan Vector mirip dengan menggunakan ArrayList. Perbedaannya adalah nama metode yang berbeda untuk melakukan tugas yang sama, atau nama metode yang berbeda untuk melakukan tugas yang sama. Seperti ArrayList, suatu Vector mirip dengan array Object yang bisa berkembang jika diperlukan. Konstruktor new Vector() membuat vektor tanpa elemen. Misalnya vec adalah suatu Vector. Maka : vec.size() adalah fungsi untuk mengembalikan jumlah elemen di dalam vektor. vec.addelement(obj) akan menambahkan Object obj di akhir vektor. Sama dengan metode add() pada ArrayList. vec.removeelement(obj) menghapus obj dari dalam vektor, kalau ada. Hanya objek pertama yang ditemui akan dihapus. Sama dengan remove(obj) pada kelas ArrayList vec.removeelementat(n) menghapus elemen ke-n. N harus berada pada rentang 0 hingga vec.size() - 1. Sama dengan remove(n) pada ArrayList vec.setsize(n) akan mengubah ukuran vektor menjadi N. Jika di dalam vektor terdapat elemen yang jumlahnya lebih banyak dari N, maka elemen lainnya akan dihapus. Jika lebih sedikit, maka tempat kosong akan diisi dengan null. Kelas ArrayList tidak memiliki metode seperti ini. Kelas Vector memiiki banyak metode lagi, akan tetapi ini adalah metode yang sering digunakan. Array Multi Dimensi Posted Sab, 03/21/ :45 by belajarprogram Versi ramah cetak

189 Tipe apapun bisa digunakan sebagai tipe dasar suatu array. Kita bisa membuat array int, array String, array Object dan seterusnya. Terutama, karena array adalah tipe Java kelas satu, kita bisa membuat array yang bertipe array. Misalnya suatu array bertipe int[], juga otomatis memiliki array bertipe int[][], yaitu "array bertipe array int". Array tersebut disebut array 2 dimensi. Tentunya, dengan tipe int[][], kita juag bisa membuat arraynya dengan tipe int[][][], yang merupakan array 3 dimensi, dan seterusnya. Tidak ada batasan berapa dimensi array yang kita buat, akan tetapi bukan sesuatu yang biasa dilakukan untuk membuat array lebih dari 3 dimensi. Pembahasan kita akan lebih dikhususkan pada array 2 dimensi. Tipe TipeDasar[][] biasanya dibaca "array 2 dimensi bertipe TipeDasar" atau "array dari array TipeDasar". Deklarasi pernyataan "int[][] A;" adalah membuat variabel bernama A dengan tipe int[][]. Variabel ini berisi objek yang bertipe int[][]. Pernyataan pemberian nilai "A = new int[3][4];" akan membuat objek array 2 dimensi dan mengisi A ke objek yang baru dibuat tersebut. Seperti biasa, deklarasi dan pemberian nilai bisa digabung menjadi satu pernyataan, seperti "int[][] A = new int[3][4];". Objek yang baru dibuat adalah objek yang merupakan array dari array int. Bagian int[3][4] menyatakan bahwa ada 3 array int di dalam array A, dan di setiap array int tersebut terdapat 4 int. Cara seperti itu mungkin sedikit membingungkan, akan tetapi akan lebih mudah apabila kita bayangkan array tersebut seperti matriks. Istilah "int[3][4]" bisa disebut sebagai matriks dengan 3 baris dan 4 kolom, seperti pada ilustrasi berikut ini :

190 Untuk banyak hal, kita bisa mengabaikan kenyataan di atas, dan membayangkan bentuk matriks seperti di atas. Kadang-kadang kita juga harus ingat bahwa setiap baris sebenarnya juga merupakan suatu array. Array-array ini bisa dirujuk dengan A[0], A[1], dan A[2]. Setiap baris bertipe int[]. Pernyataan A[1] merujuk pada salah satu baris pada array A. Karena A[1] itu sendiri sebenarnya adalah array int, kita bisa menambah indeks lain untuk merujuk pada posisi pada baris tersebut. Misalnya A[1][3] adalah elemen nomor 3 pada baris 1. Seperti biasa, ingat bahwa posisi baris dan kolom dimulai dari 0. Jadi pada contoh di atas, A[1] [3] bernilai 5. Lebih umum lagi, A[i][j] adalah posisi pada baris i dan kolom j. Seluruh elemen pada A bisa dinamakan seperti berikut : A[0][0] A[1][0] A[2][0] A[0][1] A[1][1] A[2][1] A[0][2] A[1][2] A[2][2] A[0][3] A[1][3] A[2][3] adalah variabel bertipe int. Kita bisa mengisi nilainya atau menggunakannya seperti variabel bertipe int biasa. A[i][j]

191 Perlu juga diketahui bahwa A.length akan memberikan jumlah baris pada A. Untuk mendapatkan jumlah kolom pada A, kita harus mencari jumlah int dalam setiap baris, yaitu yang disimpan pada A[0]. Jumlah kolom ini bisa didapatkan dengan menggunakan A[0].length, atau A[1].length atau A[2].length. (Tidak ada aturan baku yang menyatakan bahwa pada setiap baris suatu array harus memiliki panjang yang sama, dan sebenarnya pada beberapa aplikasi, juga digunakan array dengan panjang yang berbedabeda pada setiap barisnya. Akan tetapi apabila kita membuat array dengan perintah seperti di atas, maka kita akan selalu mendapatkan array dengan panjang array yang sama.) Array 3 dimensi juga dibuat dan diolah dengan cara yang sama. Misalnya, array 3 dimensi bertipe int bisa dibuat dengan pernyataan "int[][][] B = new int [7][5] [11];". Kita juga bisa mengilustrasikannya sebagai kubus 3-dimensi. Masing-masing bloknya bertipe int yang bisa dipanggil dalam bentuk B[i][j][k]. Array dimensi lain yang lebih tinggi juga mengikuti pola yang sama, akan tetapi akan sangat sulit untuk membuat visualisasi struktur arraynya. Kita bisa mengisi array multi dimensi sekaligus pada saat dideklarasikan. Ingat sebelumnya bagaimana array 1 dimensi biasa dideklarasikan, dan bagaimana isinya diinisialisasikan, yaitu seperti daftar nilai-nilainya yang dipisahkan dengan koma, dan diletakkan di dalam tanda kurung kurawal { dan. Inisialisasi array bisa juga digunakan untuk array multi dimensi, yang terdiri dari beberapa inisialisasi array 1 dimensi, masing-masing untuk setiap barisnya. Misalnya, array A pada gambar di atas dapat dibuat dengan perintah : int[][] A = { { 1, 0, 12, -1, { 7, -3, 2, 5, { -5, -2, 2, 9 ; Jika tidak ada inisialisasi yang diberikan untuk suatu array, maka nilainya akan diisi dengan nilai awal tergantung pada tipenya : nol untuk bilangan, false untuk boolean dan null untuk objek. Seperti halnya array 1 dimensi, array 2 dimensi juga sering diolah dengan menggunakan perulangan for. UNtuk mengolah semua elemen pada array 2 dimensi, kita bisa menggunakan pernyataan for bertingkat. Jika array A dideklarasikan seperti int[][] A = new int[3][4]; maka kita bisa mengisi 0 untuk semua elemen pada A dengan menggunakan for (int baris = 0; baris < 3; baris++) { for (int kolom = 0; kolom < 4; kolom++) {

192 A[baris][kolom] = 0; Pertama kali perulangan for bagian luar akan memproses dengan baris = 0. Bagian dalamnya akan mengisi keempat kolom pada baris pertama, yaitu A[0][0] = 0, A[0][1] = 0, A[0][2] = 0, dan A[0][3] = 0. Kemudian perulangan for bagian luar akan mengisi baris kedua, dan seterusnya. Dan juga, kita bisa menjumlah semua elemen pada A dengan int jml = 0; for (int i = 0; i < 3; i++) for (int j = 0; j < 4; i++) jml = jml + A[i][j]; Untuk mengolah array 3 dimensi, tentunya kita harus menggunakan perulangan for bertingkat 3. Suatu array 2 dimensi bisa digunakan untuk menyimpan data yang secara alami memang tersusun sebagai baris dan kolom. Misalnya papan catur terdiri dari 8 baris dan 8 kolom. Jika suatu kelas dinamakan PapanCatur untuk merepresentasikan papan catur, maka kita bisa deklarasikan dengan perintah PapanCatur[][] papan = new PapanCatur[8][8]; Kadang-kadang array 2 dimensi juga digunakan untuk masalah yang tidak terlalu jelas matriksnya. Misalnya perusahaan yang memiliki 25 toko. Anggap masing-masing toko memiliki keuntungan yang didapat pada masing-masing toko tersebut setiap bulan pada tahun Jika toko-toko tersebut memiliki nomor 0 hingga 24, dan 12 bulan dari Januari 09 hingga Desember 09 dinomori 0 hingga 11, maka data keuntungan dapat disimpan dalam array untung yang dideklarasikan seperti : double[][] untung = new double[25][12]; untung[3][2] adalah keuntungan yang dibuat oleh toko nomor 3 di bulan Maret. Atau secara umum, untung[notoko][nobulan] adalah keuntungan toko notoko pada bulan nobulan. Dalam contoh ini array 1 dimensi untung[notoko] memiliki arti : Data keuntungan satu toko selama satu tahun. Anggap array untung telah diisi dengan data. Data ini bisa diolah lebih lanjut. Misalnya, total keuntungan seluruh perusahaan -- sepanjang tahun dari seluruh toko -- dapat dihitung dengan menjumlahkan semua elemen pada array : double totaluntung; totaluntung = 0; // Total keuntungan perusahaan tahun 2009

193 for (int toko = 0; toko < 25; toko++) { for (int bulan = 0; bulan < 12; bulan++) totaluntung += untung[toko][bulan]; Kadang-kadang kita juga perlu menghitung hanya satu baris atau satu kolom saja, bukan keseluruhan array. Misalnya, kita ingin menghitung keuntungan total perusahaan pada bulan Desember, yaitu bulan nomor 11, maka kita bisa gunakan perulangan : double untungdesember = 0.0; for (notoko = 0; notoko < 25; notoko++) untungdesember += untung[notoko][11]; Sekarang mari kita buat array 1 dimensi yang berisi total keuntungan seluruh toko setiap bulan : double[] untungbulanan; // Keuntungan setiap bulan untungbulanan = new double[12]; for (int bulan = 0; bulan < 12; bulan++) { // hitung total keuntungan semua toko bulan ini untungbulanan[bulan] = 0.0; for (int toko = 0; toko < 25; toko++) { untungbulanan[bulan] += profit[toko][bulan]; Sebagai contoh terakhir untuk mengolah array keuntungan, misalnya kita ingin tahu toko mana yang menghasilkan keuntungan terbesar sepanjang tahun. Untuk menghitungnya, kita harus menjumlahkan keuntungan setiap toko sepanjang tahun. Dalam istilah array, ini berarti kita ingin mengetahui jumlah setiap baris pada array. Kita perlu mencatat hasil perhitungannya untuk mencari mana toko dengan keuntungan terbesar. double untungmaks; // Keuntungan terbesar suatu toko int tokoterbaik; // Nomor toko yang memiliki keuntungan terbesar double total = 0.0; // Total keuntungan suatu toko // Pertama-tama hitung keuntungan dari toko nomo 0 for (int bulan = 0; bulan < 12; bulan++) total += untung[0][bulan]; tokoterbaik = 0; // Mulai dengan anggapan toko nomor 0 untungmaks = total; // adalah toko paling menguntungkan // // // // Sekarang kita lihat seluruh toko, dan setiap kali kita melihat toko dengan keuntungan lebih besar dari untungmaks, kita ganti untungmaks dan tokoterbaik dengan toko tersebut for (toko = 1; toko < 25; toko++) {

194 // Hitung keuntungan toko tersebut sepanjang tahun total = 0.0; for (bulan = 0; bulan < 12; bulan++) total += untung[toko][bulan]; // Bandingkan keuntungan toko ini dengan untungmaks if (total > untungmaks) { untungmaks = total; // keuntungan terbesar saat ini tokoterbaik = toko; // datang dari toko ini // akhir for // // // // Di sini, untungmaks adalah keuntungan terbesar dari 25 toko dan tokoterbaik adalah toko dengan keuntung tersebut (Mungkin juga ada toko yang menghasilkan keuntungan yang persis sama.) Pencarian, Pengurutan dan Rekursi Posted Min, 03/22/ :08 by belajarprogram Versi ramah cetak Dua jenis teknik pemrosesan array yang paling umum adalah pencarian dan pengurutan. Pencarian di sini berarti mencari item di dalam array yang memenuhi kriteria tertentu. Pengurutan berarti menata ulang semua item di dalam array dalam urutan tertentu (urutan naik atau turun tergantung konteksnya). Pencarian dan pengurutan sering didiskusikan, dengan cara yang teoretis, dengan menggunakan contoh array bilangan. Dalam situasi sebenarnya, tipe data yang lebih kompleks biasanya digunakan. Misalnya, array bisa jadi suatu mailing list, dan setiap elemen di dalam array adalah objek yang berisi nama dalam alamat . Kita mungkin akan mencari alamat seseorang apabila namanya diketahui. Ini adalah contoh pencarian, di mana kita ingin mencari objek di dalam array yang berisi suatu nama. Mungkin juga kita ingin mengurut array tersebut tergantung pada kriteria tertentu. Misalnya mengurutkan elemen pada array di mana nama diurutkan secara abjad. Contoh lainnya adalah mengurutkan elemen pada array berdasarkan kode pos. Contoh-contoh ini bisa dibuat lebih umum yaitu kita mempunyai array yang berisi objek, dan kita ingin melakukan pencarian atau pengurutan array berdasarkan nilai salah satu variabel instansi pada array tersebut. Kita bisa gunakan beberapa istilah yang bersumber pada "database", yang sesungguhnya adalah koleksi data yang besar dan terorganisir. Kita akan menyebut masing-masing objek di dalam array sebagai record. Variabel instansi di dalam objek disebut field dari record tersebut. Dalam contoh mailing list di atas, masing-masing record berisi nama dan alamat . Field dari record tersebut mungkin nama depan, nama akhir, alamat , dan seterusnya. Dalam konteks

195 pencarian dan pengurutan, salah satu field diambil sebagai field kunci. Mencarian berarti mencari suatu record di dalam array yang memiliki nilai tertentu pada field kuncinya. Pengurutan berarti melakukan penataan elemen di dalam array sehingga field kunci record akan terurut berdasarkan urutan naik atau turun. Dalam bagian ini, contoh-contoh yang disediakan akan mengikuti tradisi menggunakan array bilangan. Kita akan contoh beberapa record dan kunci untuk mengingatkan kita pada aplikasi yang lebih praktis. Lebih jauh, kita akan melihat tentang rekursi dan aplikasinya. Suatu rubrutin disebut rekursif jika ia memanggil dirinya sendiri baik secara langung atau tak langsung. Rekursi dapat digunakan untuk menyelesaikan masalah kompleks dengan menguranginya menjadi masalah yang lebih sederhana. Pencarian Posted Min, 03/22/ :38 by belajarprogram Versi ramah cetak Ada algoritma sederhana yang bisa digunakan untuk mencari suatu item pada array : Lihat setiap array, dan cek apakah isinya sama dengan item yang kita cari. Jika ketemu, maka pencarian selesai. Jika kita sudah melihat semua item dan tidak ada item yang sama, maka kita yakin bahwa item yang kita cari tidak ada dalam array. Subrutin untuk mengimplementasikan algoritma tersebut mudah kita tulis. Misalnya array yang kita cari bertipe int[]. Berikut ini adalah metode untuk mencari integer tertentu dalam array. Jika integer ditemukan, maka metode ini akan mengembalikan indeks dalam array di mana item tersebut ditemukan. Jika integer tersebut tidak ada dalam array, maka metode tersebut akan mengembalikan nilai -1, yang artinya integer tersebut tidak ditemukan. static int cari(int[] A, int N) { // Mencari integer N di dalam array A // Kondisi akhir : jika N tidak ada dalam array // maka kembalikan -1. Jika N ada dalam array // kembalikan i, yaitu indeks di mana A[i] == N for (int indeks = 0; indeks < A.length; indeks++) { if ( A[indeks] == N ) return indeks; // N ditemukan pada indeks ini. // Jika kita sampai di sini, berarti N belum ditemukan // Kembalikan -1. return -1;

196 Metode seperti ini dimana pencarian dilakukan dengan menguji setiap item disebut pencarian linier (linear search). Jika kita tidak mengetahui apa-apa tentang isi dan urutan item pada array, maka tidak ada lagi algoritma alternatif yang lebih baik dari ini. Akan tetapi jika kita tahu bahwa elemen di dalam array diurut dalam urutan menaik atau urutan menurun, maka kita bisa menggunakan algoritma lain yang lebih cepat. Tentu saja, waktu yang dibutuhkan untuk mengurutkan array tidak sebentar, akan tetapi jika array ini akan dicari berulang kali, maka waktu pengurutan array akan terbayarkan dengan cepat. Pencarian biner (binary search) adalah metode untuk mencari suatu item dalam array yang sudah diurutkan. Meskipun implementasinya tidak mudah, akan tetapi ide dasarnya sangat mudah : Jika kita mencari suatu item dalam suatu array yang terurut, maka kita bisa menghapus setengah dari keseluruhan elemen hanya dengan melihat satu nilai. Misalnya kita ingin mencari bilangan 42 dalam array yang sudah diurutkan yang terdiri dari 1000 bilangan bulat. Anggap bahwa array tersebut diurutkan dalam urutan menaik (dari kecil ke besar). Kemudian kita cek item ke-500 dalam array, dan ternyata isinya adalah 93. Karena 42 kurang dari 93, dan karena elemen di dalam array tersebut dalam urutan menaik, kita bisa simpulkan bahwa 42 tidak mungkin ada di item ke-501 ke atas. Maka elemen tersebut pasti ada di lokasi tertentu sebelum posisi ke-500. Cara berikutnya adalah melihat di lokasi 250. Jika misanya lokasi tersebut berisi 21, maka kita bisa menghilangkan lokasi 0 hingga 250 dan memfokuskan pencarian antara 251 dan 499. Yang berikutnya adalah kira-kira di lokasi ke-125 setelah itu, yang berikutnya adalah sekitar 62 lokasi setelah itu. Setelah kira-kira 10 langkah pengujian, hanya ada satu lokasi yang akan kita cek. Cara ini akan jauh lebih mudah dan lebih cepat daripada harus mencari semua elemen di dalam array. Jika ada satu juta elemen di dalam array, maka kita hanya perlu mencari 20 kali. (Secara matematika, jumlah langkah yang diperlukan adalah logaritmik dari jumlah item di dalam array). Untuk membuat subrutin pencarian biner pada Java yang mencari item N pada array A, kita hanya perlu mencatat rentang lokasi di mana kira-kira N bisa ditemukan. Pada setiap langkah, kita bisa mengurangi kemungkinan dan mengurangi rentang pencarian. Operasi dasarnya adalah mencari item di tengah-tengah rentang tersebut. Jika item ini lebih besar dari N, maka rentang bagian atasnya bisa dibuang. Jika kurang dari N, maka rentang bawahnya bisa dibuang. Jika nilai di tengah-tengah tersebut persisi sama denan N, maka pencarian selesai. Jika ukurang pencarian berkurang menjadi nol, maka nilai N tidak ada dalam array. Berikut ini adalah subrutin yang mengembalikan lokasi di mana N berada di dalam array terurut A. Jika N tidak ditemukan, maka nilai -1 akan dikembalikan. static // // // // int pencarianbiner(int[] A, int N) { Mencari bilangan N pada array A Kondisi awal : A harus diurut menaik (dari kecil ke besar) Kondisi akhir : Jika N ada dalam array, maka kembalikan nilai i, di mana A[i] == N. Jika tidak kembalikan -1

197 int lokasiterkecil = 0; int lokasiterbesar = A.length - 1; while (lokasiterbesar >= lokasiterkecil) { int tengah = (lokasiterkecil + lokasiterbesar) / 2; if (A[tengah] == N) { // N ditemukan di sini return tengah; else if (A[tengah] > N) { // buang lokasi >= tengah lokasiterbesar = tengah - 1; else { // buang lokasi <= tengah lokasiterkecil = tengah + 1; // Sampai titik ini, lokasiterbesar < lokasiterkecil // yang berarti nilai N tidak ada dalam array. // Kembalikan -1, yang artinya item tidak ditemukan return -1; List Asosiasi Posted Min, 03/22/ :08 by belajarprogram Versi ramah cetak Salah satu aplikasi pencarian yang banyak digunakan adalah yang menggunakan list asosiasi (association list). Contoh umum dari suatu list asosiasi adalah kamus. Kamus menghubungan kata dengan definisi. Dengan kata tertentu, kita bisa menggunakan kamus untuk mencari definisinya. Kita bisa membayangkan kamus sebagai daftar suatu pasangan (pair) dalam bentuk (k,d) di mana k adalah kata dan d adalah definisi. Secara umum, kita menganggap bahwa tidak ada dua pasangan dalam list yang memiliki kunci yang sama. Operasi dasar dari list asosiasi adalah sebagai berikut : Dengan kunci k, cari nilai n yang berhubungan dengan k, jika ada. List asosiasi digunakan secara luas dalam ilmu komputer. Misalnya, suatu kompiler harus melacak di mana lokasi suatu variabel pada memori. Kompiler dapat menggunakan list asosiasi di mana kuncinya adalah nama variabel dan nilainya adalah alamat variabel tersebut di memori. Contoh lainnya adalah mailing list, yang menghubungkan nama dan alamat dalam daftar tersebut. Contoh lain yang mungkin berhubungan adalah direktori telepon yang menghubungkan nama dan nomor telepon. Item di dalam list tersebut mungkin berupa objek dari kelas : class EntriTelepon {

198 String nama; String notelp; Data dalam direktori telepon adalah array yang bertipe EntriTelepon[] dan variabel integer untuk menyimpan berapa banyak item yang disimpan dalam direktori tersebut. (Contoh ini adalah contoh dari "array setengah penuh" yang dibahas pada bagian sebelumnya. Mungkin lebih baik jika kita menggunakan array dinamis atau ArrayList untuk menyimpan daftar telepon.) Direktori telepon mungkin berupa objek di dalam kelas class DirektoriTelepon { EntriTelepon[] info = new EntriTelepon[100]; // Tempat untuk 100 entri int jmlentri = 0; // Jumlah entri aktual di dalam array void tambahentri(string nama, String notelp) { // Tambah entri baru di akhir array info[jmlentri] = new EntriTelepon(); info[jmlentri].nama = nama; info[jmlentri].notelp = notelp; jmlentri++; String getnotelp(string nama) { // Ambil nomor telepon dari nama ini atau // kembalikan null jika tidak ada nama ini // di dalam array. for (int idks = 0; idks < jmlentri; idks++) { if (nama.equals( info[idks].nama )) // Nama ketemu! return info[idks].notelp; return null; // Nama tidak ketemu. Lihat bahwa metode getnotelphanya mengambil lokasi dalam array yang telah diisi dengan EntriTelepon. Dan juga tidak seperti rutin pencarian yang disebutkan sebelumnya, rutin ini tidak mengembalikan lokasi item dalam array. Akan tetapi ia mengembalikan nilai lain yang berhubungan dengan kata kuncinya, yaitu nama. Hal ini sering dilakukan untuk list asosiasi. Kelas ini bisa diperbaliki lebih lanjut. Satu hal, mungkin lebih baik jika kita melakukan pencarian dengan menggunakan pencarian biner dan bukan pencarian linier sederhana dalam metode getnotelp. Akan tetapi, kita hanya bisa lakukan ini apabila EntriTelepon diurut terlebih dahulu berdasarkan nama. Dan sebenarnya, tidak terlalu suit untuk membuat entri tersebut dalam urutan, yang akan kita lihat berikutnya.

199 Pengurutan Posted Min, 03/22/ :58 by belajarprogram Versi ramah cetak Pengurutan Penyisipan (Insertion Sort) Ada banyak algoritma yang tersedia untuk melakukan pengurutan. Salah satu yang paling mudah dimengerti adalah pengurutan penyisipan (insertion sort). Metode ini juga bisa digunakan untuk menjaga agar list selalu dalam urutan tertentu (naik atau turun) sewaktu kita menambah item baru ke dalam list. Mari kita lihat contoh pertama : Misalnya kita memiliki list yang sudah diurutkan, dan kita ingin menambahkan sebuat item ke dalamnya. Jika kita ingin memastikan bahwa suatu list tetap dalam kondisi terurut, maka item tersebut harus diletakkan di tempat yang tepat, yaitu semua item yang lebih kecil harus ditempatkan sebelum item tersebut, dan semua item yang lebih besar ditempatkan setelahnya. Artinya kita harus menggeser semua item yang lebih besar ke satu sisi untuk memberi ruangan pada item baru yang akan ditambahkan. static // // // // // // // // // // void sisip(int[] A, int jmlitem, int itembaru) { Kondisi awal : jmlitem adalah jumlah item pada A. Item ini harus berada dalam kondisi terurut naik di mana (A[0] <= A[1] <=... <= A[jmlItem-1]). Ukuran array harus lebih besar dari jmlitem. Kondisi akhir : jumlah item akan ditambah dengan satu, itembaru telah ditambah pada array, dan semua item masih dalam kondisi terurut. Catatan: untuk menyelesaikan proses penyisipan item dalam array, variabel yang mencatat jumlah item dalam array harus ditambah satu setelah memanggil subrutin ini. int lok = jmlitem - 1; // Mulai dari akhir array /* Pindahkan item yang lebih besar dari itembaru satu posisi; Stop jika item yang lebih kecil ditemukan atau sampai ke awal array (lok == 0) */ while (lok >= 0 && A[lok] > itembaru) { A[lok + 1] = A[lok]; // Pindahkan lokasi item dari posisi lok ke lok+1 lok = lok - 1; // Pindah ke lokasi sebelumnya A[lok + 1] = itembaru; // Letakkan itembaru di tempat kosong Metode di atas bisa dikembangkan menjadi metode pengurutan jika kita mengeluarkan semua item dari array yang belum diurutkan, kemudian memasukkannya kembali satu demi satu, sambil menjaga agar array tetap terurut selama kita menambah item ke array baru. Setiap penyisipan bisa dilakukan dengan rutin sisip() di atas. Dalam algoritma

200 sesungguhnya, kita tidak benar-benar mengambil semua item dari dalam array, kita hanya cukup mengingat bagian mana yang sudah diurutkan. static void urutpenyisipan(int[] A) { // Mengurutkan array A dalam urutan menaik (dari kecil ke besar) int itemterurut; // Jumlah item yang sudah diurut for (itemterurut = 1; itemterurut < A.length; itemterurut++) { // Anggap item A[0], A[1],... A[itemTerurut-1] // telah diurutkan. Sisipkan A[itemTerurut] // ke dalam bagian yang sudah diurutkan int temp = A[itemTerurut]; int lok = itemterurut - 1; // Item yang akan disisipkan // Mulai dari akhir list while (lok >= 0 && A[lok] > temp) { A[lok + 1] = A[lok]; // Pindahkan item dari lok ke lok+1 lok = lok - 1; // Pindah ke lokasi sebelumnya A[lok + 1] = temp; // Letakkan temp di tempat kosong Ilustrasi berikut adalah ilustrasi di tengah-tengah pengurutan, yang menunjukkan apa yang terjadi di tengah-tengah salah satu eksekusi perulangan for dari kode di atas, ketika itemterurut = 5.

201 Pengurutan Pilihan (Selection Sort) Metode pengurutan lainnya yang biasa digunakan adalah pengurutan pilihan (selection sort). Metode ini mencari item terbesar di dalam list, kemudian memindahkannya ke akhir array -- atau dengan kata lain di tempatnya, karena item terbesar akan berada di akhir array. Setelah item terbesar ditempatkan di tempat yang benar, kita gunakan cara yang sama, yaitu cari item terbesar berikutnya, kemudian letakkan di tempat kedua dari akhir, dan seterusnya. Metode ini dapat ditulis sebagai : static void urutpilihan(int[] A) { // Urut A dengan urutan menaik dengan Pengurutan Pilihan for (int tmptterakhir = A.length-1; tmptterakhir > 0; tmptterakhir--) { // Cari nilai terbesar di antara A[0], A[1],..., A[tmptTerakhir], // dan pindahkan ke tmptterakhir dengan cara menukarny // dengan nilai yang ada di tmptterakhir int lokmaks = 0; // Lokasi nilai terbesar saat ini

202 pernah for (int j = 1; j <= tmptterakhir; j++) { if (A[j] > A[lokMaks]) { // Karena A[j] lebih besar dari nilai maksimum yang // kita lihat, j adalah lokasi baru tempat di mana nilai // maksimum tersebut berada lokmaks = j; int temp = A[lokMaks]; // Tukar nilainya dengan A[tmptTerakhir]. A[lokMaks] = A[tmptTerakhir]; A[tmptTerakhir] = temp; // akhir perulangan Pengurutan penyisipan dan pengurutan pilihan cocok digunakan untuk mengurut array dengan ukuran kecil (hingga beberapa ratus elemen). Ada beberapa algoritma pengurutan lain yang jauh lebih cepat dari pengurutan penyisipan dan pengurutan pilihan untuk array yang sangat besar. Kita akan diskusikan kemudian. Mengacak Nilai Kita akan sudahi bagian ini dengan masalah yang sedikit berkaitan, lebih jarang muncul, akan tetapi menarik, yaitu bagaimana caranya meletakkan elemen array dengan urutan acak. Misalnya adalah untuk mengocok kartu. Algoritma baik untuk mengocok mirip dengan pengurutan pilihan, akan tetapi kita tidak memindahkan item terbesar ke array paling belakang. Item dipilih secara acak dan dipindahkan ke akhir array. Berikut ini adalah subrutin untuk mengocok array bertipe int. static void kocok(int[] A) { // Kondisi akhir : Item pada A diatur dalam urutan yang acak for (int tmptterakhir = A.length-1; tmptterakhir > 0; tmptterakhir--) { // Pilih lokasi acak di antara 0,1,...,tmptTerakhir. int lokacak = (int)(math.random()*(tmptterakhir+1)); // Tukar item pada lokacak dengan A[tmptTerakhir] int temp = A[lokAcak]; A[lokAcak] = A[tmptTerakhir]; A[tmptTerakhir] = temp; Rekursi Posted Rab, 03/25/ :35 by belajarprogram Versi ramah cetak

203 Definisi rekursi adalah definisi yang menggunakan konsep atau sebagian dari definisi tersebut menjadi definisi yang komplit. Misalnya : "keturunan" bisa berarti anak atau keturunan dari anak. "Kalimat" bisa berarti dua kalimat yang digabung dengan kata hubung "dan". "Direktori" adalah bagian pada hard disk yang berisi file dan direktori. Dalam matematika, "himpunan" adalah koleksi elemen, di mana elemen tersebut bisa berupa himpunan. "Pernyataan" pada Java misalnya pernyataan while yang didalamnya terdapat kata while, kondisi bernilai boolean dan pernyataan lainnya. Definisi rekursi bisa menjelaskan situasi yang sangat kompleks dalam beberapa kata. Definisi istilah "keturunan" tanpa menggunakan rekursi bisa jadi "anak, cucu, cicit, dan seterusnya". Akan tetapi mengatakan "dan seterusnya" bukan arti "keturunan" secara lengkap. Kita juga akan kesulitan jika kita mencoba mendefinisikan "direktori" sebagai "file yang berisi daftar file, dimana beberapa file bisa berisi daftar file, di mana beberapa file tersebut bisa berisi daftar file, dan seterusnya". Mencoba untuk menjelaskan pernyataan Java tanpa menggunakan rekursi dalam definisinya akan sulit dilakukan. Rekursi bisa digunakan dalam teknik pemrograman. Subrutin rekursif adalah subrutin yang memanggil dirinya sendiri, baik langsung maupun tak langsung. Subrutin tersebut memanggil dirinya sendiri secara tidak langsung yaitu jika ia memanggil subrutin lain yang akhirnya memanggil subrutin pertama (baik langsung maupun tak langsung). Suatu subrutin rekursi bisa menyelesaikan tugas kompleks dalam beberapa baris perintah. Kita akan lihat beberapa contohnya pada bagian ini. Mari kita mulai dengan contoh yang sudah kita lihat sebelumnya: algorithma pencarian biner pada bagian sebelumnya. Pencarian biner digunakan untuk mencari suatu nilai dalam list terurut (atau jika item nilai tersebut tidak ada di dalam list tersebut, akan memberitahu hasilnya misalnya dengan mengembalikan -1). Caranya adalah dengan mengecek elemen di tengah list tersebut. Jika elemen tersebut sama dengan nilai yang dicari, maka pencarian tersebut selesai. Jika nilai yang dicari lebih kecil daripada nilai elemen di tengah list tersebut, maka kita harus mencari di separuh awal dari list tersebut. Jika lebih besar, kita harus mencari di separuh akhir list tersebut. Kemudian, pada separuh list yang kita pilih tersebut, kita akan mengecek kembali elemen tengahnya. Kita akan melihat kembali apakah nilainya sama dengan nilai yang kita cari, lebih besar atau lebih kecil, yang dari sini kita tahu paruh mana yang akan kita cari berikutnya. Dan begitu seterusnya, hingga besar list yang akan dicari berkurang menjadi 0. Ini adalah definisi rekursif, dan kita bisa membuat subrutin rekursif untuk mengimplementasikannya.

204 Sebelumnya, ada dua pertimbahangan yang harus kita masukkan ke dalam perhitungan kita, yang merupakan fakta tentang subrutin rekursif. Pertama, algoritma pencarian biner dimulai dengan mengecek "elemen tengah suatu list". Apa yang terjadi jika list tersebut kosong? Jika tidak ada elemen di dalam list, maka kita tidak mungkin melihat elemen di tengahnya. Atau dengan kata lain, ini disebut "kondisi awal" untuk mengecek elemen di tengah list, yaitu memiliki list yang tidak kosong. Apa yang terjadi kita ternyata harus mencari nilai di list kosong? Jawabannya mudah : Kita bisa mengatakan bahwa nilai yang kita cari tidak ada di dalam list. List kosong adalah kasus dasar untuk algoritma pencari biner. Kasus dasar untuk algoritma rekursif adalah kasus yang akan ditangani secara langsung, bukan dilakukan secara rekursif. Algoritma pencarian biner memiliki kasus dasar lain, yaitu jika kita menemukan nilai yang kita cari di tengah suatu list, maka program tersebut selesai. Kita tidak perlu melakukan rekursi lebih lanjut. Pertimbangan kedua adalah parameter subrutin tersebut. Dalam subrutin non-rekursif dari pencarian biner yang dibahas sebelumnya, parameternya adalah suatu array. Akan tetapi dalam pendekatan rekursif, kita harus bisa menerapkan subrutin secara rekursif hanya sebagian dari list aslinya. Pada subrutin aslinya yang non-rekursif, kita melakukan pencarian di seluruh array, sedangkan subrutin rekursif harus bisa mencari di sebagian array. Parameter subrutin tersebut harus bisa memberi tahu di bagian mana array akan dicari. Berikut ini adalah algoritma pencarian biner rekursif yang mencari suatu nilai dalam bagian dari array integer: static int caribiner(int[] A, int idksrendah, int idkstinggi, int nilai) { // Cari "nilai" pada array "A" dari posisi "idksrendah" ke "idkstinggi", // Asumsinya adalah array diurut dalam urutan menaik // Jika nilai ditemukan kembalikan indeks pada array // dimana nilai tersebut berada. Jika tidak kembalikan -1 if (idksrendah > idkstinggi) { // Artinya list kosong karena seharusnya idksrendah lebih rendah // dari idkstinggi. "Nilai" tidak mungkin ada di list kosong. return -1; else { // Cek elemen di tengah list. Jika nilai sama dengan isi elemen // tengah, maka kembalikan posisi tersebut. // Jika tidak, cari secara rekursif di awal atau akhir // dari setengah list int idkstengah = (idksrendah + idkstinggi) / 2; if (nilai == A[idksTengah]) return idkstengah; else if (nilai < A[idksTengah]) return caribiner(a, idksrendah, idkstengah - 1, nilai); else // nilai > A[idksTengah]

205 return caribiner(a, idkstengah + 1, idkstinggi, nilai); // akhir caribiner() Dalam rutin di atas, parameter idksrendah dan idkstinggi menyatakan bagian array yang akan dicari. Untuk mencari keseluruhan array, kita hanya perlu memanggil caribiner(a, 0, A.length - 1, nilai). Dalam kedua kasus dasar -- yaitu tidak ada elemen di dalam rentang indeks yang diberikan dan ketika tidak ada nilai yang ditemukan di tengah-tengah rentang tersebut -- subrutin dapat memberikan jawabannya secara langsung, tanpa rekursi. Pada kasus lain, subrutin akan memanggil dirinya sendiri secara rekursif untuk menghitung dan mengembalikan hasilnya. Banyak orang yang merasa sulit untuk memahami bagaimana rekursi bekerja. Kuncinya ada 2 hal yang harus dipenuhi agar rekursi bisa bekerja dengan benar : Harus ada minimum satu kasus dasar, yang bisa ditangani tanpa menggunakan rekursi. Jika subrutin dilakukan secara rekursif, ia harus dipanggil dalam lingkup yang lebih kecil, makin kecil hingga mendekati kasus dasarnya. Satu kesalahan umum yang terjadi ketika menulis subrutin rekursif adalah jika kita melanggar salah satu dari kedua aturan di atas. Jika aturan ini dilanggar, hasilnya bisa jadi rekursi tak hingga, di mana subrutin tersebut akan memanggil dirinya terus menerus tanpa henti, karena tidak pernah mencapai kasus dasarnya. Rekrusi tak hingga mirip dengan perulangan yang tak pernah berhenti. Akan tetapi karena setiap panggilan rekursif menggunakan memori komputer, maka program yang tersangkut di dalam rekursi tak hingga, pada akhirnya akan kehabisan memori. Pencarian biner dapat diimplementasikan dengan perulangan while selain dengan menggunakan rekursi. Sekarang mari kita lihat suatu masalah yang lebih mudah diselesaikan dengan rekursi tapi sulit dilakukan dengan metode lain. Berikut ini adalah contoh yang biasa digunakan, yand dinamakan "Menara Hanoi". Persoalannya dapat dituliskan sebagai berikut : sebuah tumpukan piringan dengan ukuran berbeda ditumpuk dari urutan terbesar di bagian paling bawah hingga terkecil di bagian paling atas. Seluruh piringan harus dipindahkan dari satu tiang ke tiang lain, dengan dua aturan dalam setiap langkah hanya boleh memindahkan satu piringan, dan piringan yang lebih besar tidak boleh diletakkan di atas piringan yang lebih kecil. Ada tiang lain yang berfungsi sebagai tiang cadangan, dan bisa digunakan sebagai tempat sementara. Gambar berikut (atas) mengilustrasikan tumpukan 10 piringan. Gambar lainnya (bawah) adalah ilustrasi setelah beberapa langkah telah dijalankan.

206 Kita akan memindahkan 10 piringan dari tiang 0 ke tiang 1, dan tiang 2 bisa dijadikan cadangan. Bisakah kita mengurangi persoalan ini menjadi persoalan yang sama dengan skala yang lebih kecil? Mungkin kita harus sedikit mengeneralisir persoalannya sehingga kita bisa melihat lebih jelas. Jika ada N piringan pada tiang 0, kita tahu bahwa pada akhirnya kita haris memindahkan piringan paling bawah dari tiang 0 ke tiang 1. Akan tetapi sebelum itu, menurut aturan di atas, piringan 0 hingga N-1 harus dipindahkan terlebih dahulu ke tiang 2. Setelah kita pindahkan piringan ke-n ke tiang 1, maka kita harus memindahkan kembali N-1 piringan dari tiang 2 ke tiang 1 untuk menyelesaikan masalahnya. Lihat bahwa memindahkan N-1 piringan adalah persoalan yang sama seperti memindahkan N piringan, akan tetapi sekarang persoalannya menjadi lebih kecil. Ini bisa dilakukan dengan mudah dengan rekursi. Suatu persoalan harus digeneralisir terlebih dahulu, di sini kita lihat bahwa persoalan yang lebih kecil adalah memindahkan piringan dari tiang 0 ke tiang 2 dan kemudian dari tiang 2 ke tiang 1, bukan dari tiang 0 ke tiang 1. Untuk subrutin rekursiif yang akan kita buat, kita harus menyatakan tiang asal, tiang tujuan, dan tiang cadangannya. Kasus dasarnya adalah jika hanya ada satu piringan yang akan dipindahkan, yang mana jawabannya mudah : pindahkan satu piringan itu dalam satu langkah. Berikut ini adalah contoh subrutin untuk menyelesaikan masalah ini : void MenaraHanoi(int piringan, int asal, int tujuan, int cadangan) { // Memecahkan persoalan untuk memindahkan sejumlah "piringan" // dari tiang "asal" ke tiang "tujuan". Tiang "cadangan" bisa // digunakan sebagai tempat sementara if (piringan == 1) { // Hanya ada satu piringan, pindahkan langsung

207 System.out.println("Pindahkan piringan dari tiang " + asal + " ke tiang " + tujuan); else { // Pindahkan semua piringan minus 1 ke tiang cadangan, // kemudian pindahkan piringan paling bawah ke tiang tujuan, // kemudian pindahkan sisanya dari tiang cadangan ke // tiang tujuan. MenaraHanoi(piringan-1, asal, cadangan, tujuan); System.out.println("Pindahkan piringan dari tiang " + asal + " ke tiang " + tujuan); MenaraHanoi(piringan-1, cadangan, tujuan, asal); Subrutin ini mengekspresikan solusi persoalan secara alami. Rekursi bisa bekerja dengan benar karena setiap panggil rekursif selalu akan dipanggil dengan jumlah piringan yang semakin sedikit. Dan ketika sampai pada kasus dasarnya, yaitu hanya ada satu piringan, persoalannya bisa diselesaikan langsung dengan memindahkan satu piringan tersebut ke tiang tujuannya. Untuk memecahkan persoalan ini pada "level paling atas", yaitu memindahkan N piringan dari tiang 0 ke tiang 1, subrutin ini bisa dipanggil dengan perintah MenaraHanoi(N,0,1,2). Ceritanya, dahulu kala ada kisah yang merupakan nama dari persoalan ini. Menurut cerita ini, pada saat bumi pertama kali dicipkatan, sekumpulan biksu pada suatu menara di dekat Hanoi diberi tumpukan 64 piringan dan diberi tugas untuk memindahkan satu piringan setiap hari dengan aturan yang sama seperti di atas. Pada hari ketika tugas ini selesai, alam semesta akan kiamat. Tapi tenang saja, karena jumlah langkah yang diperlukan untuk menyelesaikan tugas ini untuk N piringan adalah 2N - 1, dan hari sama dengan lebih dari 50 trilyun tahun. Pengurutan Cepat Posted Min, 03/29/ :49 by belajarprogram Versi ramah cetak Aplikasi rekursi yang cukup populer adalah Pengurutan Cepat (Quicksort) yang digunakan untuk mengurutkan array. Di bagian sebelumnya kita telah melihat bagaimana mengurutkan array dengan menggunakan pengurutan pilihan dan pengurutan penyisipan yang relatif lebih mudah, akan tetapi akan berjalan lebih lambat untuk array yang besar. Algoritma pengurutan yang lebih cepat sudah tersedia. Salah satunya adalah pengurutan cepat (quick sort), yaitu algoritma rekursif yang ternyata paling cepat hampir pada segala kondisi. Algoritma pengurutan cepat dibuat berdasarkan ide yang sederhana namun cerdas : Dari beberapa item, pilih satu item. Item ini kita sebut pivot. Pindahkan semua item yang lebih

208 kecil dari pivot ke awal array, dan pindahkan item yang lebih besar ke akhir array. Kemudian letakkan pivot di tengah-tengah kedua grup tersebut. Atau dengan kata lain, posisi pivot adalah posisi terakhir dan tidak perlu dipindahkan lagi. LangkahUrutCepat bukan algoritma rekursif. Kecepatan pengurutan cepat tergantung dari kecepatan LangkahUrutCepat. Karena ini bukan diskusi utama kita, kita akan tuliskan algoritma LangkahUrutCepat tanpa diskusi lebih lanjut. static // // // int LangkahUrutCepat(int[] A, int rendah, int tinggi) { Jalankan LangkahUrutCepat pada array dengan indeks antara rendah dan tinggi pada array A. Nilai yang dikembalikan adalah posisi akhir pivot dalam array // Kita ambil sembarang pivot, yaitu pada indeks pertama int pivot = A[rendah]; // // // // // // // Nilai antara rendah dan tinggi adalah nilai yang belum pernah kita uji. Kurangi tinggi dan naikkan rendah hingga keduanya bernilai sama, pindahkan nilai yang lebih besar dari pivot sehingga nilai tersebut berada di atas tinggi dan pindahkan nilai yang lebih kecil dari pivot sehingga nilainya berada di bawah rendah. Ketika kita mulai, A[rendah] adalah tempat kosong, karena ini adalah posisi awal nilai pivot while (tinggi > rendah) { while (tinggi > rendah && A[tinggi] > pivot) { // Pindahkan tinggi hingga melewati nilai yang lebih rendah // dari pivot. Nilai ini tidak perlu dipindahkan hi--; if (tinggi == rendah) break; // Nilai pada A[tinggi] kurang dari pivot. Pindahkan ke tempat // kosong pada A[rendah], sehingga tempat di A[tinggi] // menjadi kosong

Mengenal Bahasa Pemrograman Java

Mengenal Bahasa Pemrograman Java Bab I - Pendahuluan Java untuk Pemula Bahasa pemrograman Java adalah bahasa pemrograman berorientasi objek yang mirip dengan bahasa C++ dan Smalltalk. Java bersifat netral, tidak bergantung pada suatu

Lebih terperinci

OPERATOR JAVA. g = x + y; System.out.println("Penjumlahan (x+y) : " + g); g = y - x; System.out.println("Pengurangan (y-x) : " + g);

OPERATOR JAVA. g = x + y; System.out.println(Penjumlahan (x+y) :  + g); g = y - x; System.out.println(Pengurangan (y-x) :  + g); OPERATOR JAVA Operator Aritmatika + Operator penjumlahan (juga sebagai penyambung string) - Operator pengurangan * Operator perkalian / Operator pembagian % Operator sisa pembagian Operator aritmatika

Lebih terperinci

Pemrograman. Pertemuan-3 Fery Updi,M.Kom

Pemrograman. Pertemuan-3 Fery Updi,M.Kom Pemrograman Pertemuan-3 Fery Updi,M.Kom 1 Pokok Bahasan Mengenal Tipe Data, Variabel Mengenal Operator 2 public class Main { Komentar /** Bentuk Dasar Kode Java * @param args */ public static void main(string[]

Lebih terperinci

SUMBER BELAJAR PENUNJANG PLPG

SUMBER BELAJAR PENUNJANG PLPG SUMBER BELAJAR PENUNJANG PLPG 2017 [TIK] BAB VIII PEMROGRAMAN BERORIENTASI OBJEK [Alfa Faridh Suni] KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN DIREKTORAT JENDERAL GURU DAN TENAGA KEPENDIDIKAN 2017 BAB VIII

Lebih terperinci

Badiyanto, S.Kom., M.Kom. PBO java

Badiyanto, S.Kom., M.Kom. PBO java Badiyanto, S.Kom., M.Kom PBO java Apa yang Disebut Java? Bahasa pemrograman berorientasi objek murni yang dibuat berdasarkan kemampuankemampuan terbaik bahasa pemrograman objek sebelumnya (C++, Ada, Simula).

Lebih terperinci

BAB 3 TYPE DATA, VARIABLE DAN OPERATOR

BAB 3 TYPE DATA, VARIABLE DAN OPERATOR BAB 3 TYPE DATA, VARIABLE DAN OPERATOR Bahasa pemrograman pada umumnya, mengenal adanya variabel yang digunakan untuk menyimpan nilai atau data. Sedangkan Java sendiri dikenal sebagai bahasa pemrograman

Lebih terperinci

JAVA FUNDAMENTAL ATURAN PERKULIAHAN SILABUS

JAVA FUNDAMENTAL ATURAN PERKULIAHAN SILABUS JAVA FUNDAMENTAL Nama : Julian Chandra W Telp : 085647155605 Email : maeztro_87@yahoo.co.id Referensi : 1. Benny Hermawan. 2004. Menguasai Java 2 & Object Oriented Programming. Andi. 2. Bambang Hariyanto.

Lebih terperinci

BAB II VARIABEL DAN TIPE DATA

BAB II VARIABEL DAN TIPE DATA BAB II VARIABEL DAN TIPE DATA Bahasa pemrograman pada umumnya, mengenal adanya variabel yang digunakan untuk menyimpan nilai atau data. Sedangkan Java sendiri dikenal sebagai bahasa pemrograman dengan

Lebih terperinci

2 TIPE DATA DAN VARIABEL

2 TIPE DATA DAN VARIABEL BAB 2 TIPE DATA DAN VARIABEL Kompetensi Dasar dan Indikator : Setelah mengikuti materi kuliah ini mahasiswa mampu menggunakan tipe data dan variable yang ada dalam Java, dengan indikator mahasiswa mampu:

Lebih terperinci

Nama : Julian Chandra W Telp :

Nama : Julian Chandra W Telp : JAVA FUNDAMENTAL Nama : Julian Chandra W Telp : 085647155605 Email : maeztro_87@yahoo.co.id julian.chand@gmail.com Referensi : 1. Benny Hermawan. 2004. Menguasai Java 2 & Object Oriented Programming. Andi.

Lebih terperinci

Pengenalan JAVA. Farhat, ST., MMSI., MSc

Pengenalan JAVA. Farhat, ST., MMSI., MSc Pengenalan JAVA Tim sun Microsystems (dipimpin oleh James Gosling) bahasa komputer kecil (chipchip embedded) Proyek bernama Green. Pascal (diciptakkan oleh Niklaus Wirth) Bahasa yang portable kode intermediate

Lebih terperinci

BAHASA PEMROGRAMAN JAVA

BAHASA PEMROGRAMAN JAVA MI1274 Algoritma & Pemrograman Lanjut Genap 2015-2016 BAHASA PEMROGRAMAN JAVA Disusun Oleh: Reza Budiawan Untuk: Tim Dosen Algoritma & Pemrograman Lanjut Hanya dipergunakan untuk kepentingan pengajaran

Lebih terperinci

PEMROGRAMAN JAVA : VARIABEL DAN TIPE DATA

PEMROGRAMAN JAVA : VARIABEL DAN TIPE DATA PEMROGRAMAN JAVA : VARIABEL DAN TIPE DATA Asep Herman Suyanto info@bambutechno.com http://www.bambutechno.com Bahasa pemrograman pada umumnya, mengenal adanya variabel yang digunakan untuk menyimpan nilai

Lebih terperinci

Dasar Pemrograman Java

Dasar Pemrograman Java Dasar Pemrograman Java Tessy Badriyah, SKom. MT. http://lecturer.eepis-its.edu/~tessy Tujuan Pembelajaran Penggunaan Komentar dalam program Memahami perbedaan identifier yang valid dan yang tidak valid

Lebih terperinci

Bahasa Pemrograman Java. Yudi Adha. ST. MMSI

Bahasa Pemrograman Java. Yudi Adha. ST. MMSI Bahasa Pemrograman Java Yudi Adha. ST. MMSI Tujuan Pada bagian ini, kita akan mendiskusikan mengenai bagian dasar pemrograman Java. Kita akan memulai dengan mencoba menjelaskan bagian dasar dari program

Lebih terperinci

Bahasa Pemrograman 2.

Bahasa Pemrograman 2. Bahasa Pemrograman 2 Pengenalan JAVA 1 anton@ukdw.ac.id Instalasi JDK Download JDK for free Instalasi biasa Set PATH dan JAVA_HOME set PATH=%PATH%; set JAVA_HOME=

Lebih terperinci

Pemrograman dengan Java

Pemrograman dengan Java Pemrograman dengan Java Java sebagai salah satu bahasa pemrograman baru menjanjikan banyak kemudahan bagi programer junior maupun senior. Tutorial ini akan membawa Anda mengenal lebih jauh bahasa ini melalui

Lebih terperinci

TIPE DATA PADA JAVA. Pertemuan (K-04/L-04)

TIPE DATA PADA JAVA. Pertemuan (K-04/L-04) TIPE DATA PADA JAVA Pertemuan (K-04/L-04) Alangkah baiknya kita mempelajari terlebih dahulu tentang apa itu tipe data dan mengenal ada berapa tipe data yang digunakan dalam Bahasa Pemrograman Java. Sudah

Lebih terperinci

Pemrograman Berorientasi Obyek. Dasar Pemrograman Java

Pemrograman Berorientasi Obyek. Dasar Pemrograman Java Pemrograman Berorientasi Obyek Dasar Pemrograman Java 1 Materi Pokok Membedakan antara valid dan invalid identifiers. Mengetahui Java technology keywords. Mengetahui 8 tipe data primitif. Mendefinisikan

Lebih terperinci

Elemen Dasar Dalam Bahasa Java

Elemen Dasar Dalam Bahasa Java Elemen Dasar Dalam Bahasa Java 1. Kata Kunci Kata kunci adalah kata-kata yang didefenisikan oleh compiler dan memiliki arti dan tujuan spesifik. Java tidak mengizinkan kata-kata tersebut dipakai sebagai

Lebih terperinci

MODUL 1 INSTALASI PAKET JAVA DAN PROGRAM SEDERHANA

MODUL 1 INSTALASI PAKET JAVA DAN PROGRAM SEDERHANA MODUL 1 INSTALASI PAKET JAVA DAN PROGRAM SEDERHANA A. Target Pembelajaran 1. Siswa mampu menginstal JDK 2. Siswa mampu menjalankan eclipse 3. Siswa mampu membuat program sederhana B. Materi 1. Pengenalan

Lebih terperinci

Turbo C adalah tool yang dipakai untuk membuat code program dalam bahasa C ataupun C++. Berikut adalah jendela utama Turbo C

Turbo C adalah tool yang dipakai untuk membuat code program dalam bahasa C ataupun C++. Berikut adalah jendela utama Turbo C 1. Pendahuluan Lingkungan Turbo C++ 4.5 Turbo C++ 4.5 adalah tool yang dipakai untuk membuat code program dalam bahasa C ataupun C++. Berikut adalah jendela utama Turbo C++ 4.5. 1 2 3 4 1 : Menu Utama

Lebih terperinci

Penggunaan Netbeans IDE, Hello World, variable dan Operator aritmetika.

Penggunaan Netbeans IDE, Hello World, variable dan Operator aritmetika. Topik Penggunaan Netbeans IDE, Hello World, variable dan Operator aritmetika. Tujuan Setelah menyelesaikan praktikum ini, mahasiswa diharapkan mampu: 1. Menggunakan Netbeans IDE untuk membuat program Java

Lebih terperinci

Modul PVB-POLINEMA V1.0

Modul PVB-POLINEMA V1.0 BAB V TIPE DATA, VARIABEL DAN KONSTANTA MATERI 1. Tipe Data 2. Variabel 3. Konstanta STANDAR KOMPETENSI 1. Mampu memahami konteks pemakaian variabel dan konstanta 2. Mampu membuat variabel dengan tipe

Lebih terperinci

Dasar Pemrograman Java

Dasar Pemrograman Java Fakultas : FTI Modul ke : Praktikum 1 Program Studi : Informatika Pertemuan : Pekan II Mata Kuliah : 52323306 PBO Halaman : 14 Pemrograman Berorientasi Obyek Modul I. Dasar Pemrograman Java 1.1 PETUNJUK

Lebih terperinci

Identifier, Keywords, Variabel, Tipe Data Primitif dan Operator PBO. Ramos Somya

Identifier, Keywords, Variabel, Tipe Data Primitif dan Operator PBO. Ramos Somya Identifier, Keywords, Variabel, Tipe Data Primitif dan Operator PBO Ramos Somya Identifier Merupakan nama yang digunakan untuk menamai class, variabel, method dan interface. Aturan: - Tidak ada batasan

Lebih terperinci

TPI4202 e-tp.ub.ac.id

TPI4202 e-tp.ub.ac.id TPI4202 e-tp.ub.ac.id Bahasa pemrograman berorientasi objek (objectoriented programming/oop) Tidak mungkin membuat program java tanpa kita mendefinisikan class, data dan method Bersifat netral, tidak tergantung

Lebih terperinci

Pertemuan 4 Array pada Java

Pertemuan 4 Array pada Java Pertemuan 4 Array pada Java Objektif : 1. Mahasiswa dapat memahami pengertian Array pada Java 2. Mahasiswa dapat mengetahui bentuk umum dari Array 3. Mahasiswa dapat mengetahui jenis-jenis Array pada Java

Lebih terperinci

Tabel 1. Instruksi untuk menampilkan teks No. Bahasa Pemrograman Instruksi 1. Pascal WRITE ( Bahasa pemrograman itu mudah );

Tabel 1. Instruksi untuk menampilkan teks No. Bahasa Pemrograman Instruksi 1. Pascal WRITE ( Bahasa pemrograman itu mudah ); PERTEMUAN I BAHASA PEMROGRAMAN JAVA DAN PENGENALAN NETBEANS 1. Program dan Bahasa Pemrograman Di dalam dunia komputer sering kali dijumpai istilah program dan bahasa pemrograman. Kedua istilah tersebut

Lebih terperinci

DASAR PEMROGRAMAN. PENGANTAR BAHASA C ( Sejarah, Struktur Pemrograman, Tipe Data, Operator ) Djoko Soerjanto, M.Kom

DASAR PEMROGRAMAN. PENGANTAR BAHASA C ( Sejarah, Struktur Pemrograman, Tipe Data, Operator ) Djoko Soerjanto, M.Kom DASAR PEMROGRAMAN PENGANTAR BAHASA C ( Sejarah, Struktur Pemrograman, Tipe Data, Operator ) Djoko Soerjanto, M.Kom https://www.facebook.com/groups/dasarpemrogramanc TUJUAN Mengenal sejarah, struktur, sintaks

Lebih terperinci

LANGKAH-LANGKAH MENULISKAN PROGRAM DALAM TURBO C++

LANGKAH-LANGKAH MENULISKAN PROGRAM DALAM TURBO C++ I.PENDAHULUAN 1. 1. ALGORITMA Algoritma adalah urutan aksi-aksi yang dinyatakan dengan jelas dan tidak rancu untuk memecahkan suatu masalah dalam rentang waktu tertentu. Setiap aksi harus dapat dikerjakan

Lebih terperinci

Pengenalan Java PEMROGRAMAN DASAR. Dr. Eng. Herman Tolle, ST., MT. Sistem Informasi PTIIK UB Semester Ganjil 2014/2015

Pengenalan Java PEMROGRAMAN DASAR. Dr. Eng. Herman Tolle, ST., MT. Sistem Informasi PTIIK UB Semester Ganjil 2014/2015 PEMROGRAMAN DASAR Sistem Informasi PTIIK UB Semester Ganjil 2014/2015 Pengenalan Java Dr. Eng. Herman Tolle, ST., MT Program Teknologi Informasi & Ilmu Komputer, Universitas Brawijaya Outline Pengenalan

Lebih terperinci

PEMROGRAMAN JAVA. Petunjuk Penulisan Program Token Aturan Penamaan Identifier Lingkungan /Scope dari variabel Tipe Data (i) Yoannita

PEMROGRAMAN JAVA. Petunjuk Penulisan Program Token Aturan Penamaan Identifier Lingkungan /Scope dari variabel Tipe Data (i) Yoannita PEMROGRAMAN JAVA Petunjuk Penulisan Program Token Aturan Penamaan Identifier Lingkungan /Scope dari variabel Tipe Data (i) Yoannita Education is not the filling of a pail, but the lighting of a fire. (William

Lebih terperinci

Achmad Solichin.

Achmad Solichin. Pemrograman Bahasa C dengan Turbo C Sh-001@plasa.com Lisensi Dokumen: Seluruh dokumen di IlmuKomputer.Com dapat digunakan, dimodifikasi dan disebarkan secara bebas untuk tujuan bukan komersial (nonprofit),

Lebih terperinci

Dasar-dasar Pemrograman JAVA

Dasar-dasar Pemrograman JAVA MK. Pemrograman Berorientasi Objek Dasar-dasar Pemrograman JAVA KARMILASARI Hardware dan Software yang Dibutuhkan untuk membuat Program dalam Bahasa JAVA 2 Komputer dengan spesifikasi minimal : Processor

Lebih terperinci

JAVA. Sekilas tentang java : FITUR JAVA :

JAVA. Sekilas tentang java : FITUR JAVA : JAVA Sekilas tentang java : Java diciptakan oleh suatu tim yang dipimpin oleh Patrick Naughton dan james gosling dalam suatu proyek dari sun Microsystem. Tujuan adalah untuk menghasilkan bahasa komputer

Lebih terperinci

OPERATOR-OPERATOR DALAM JAVA

OPERATOR-OPERATOR DALAM JAVA OPERATOR-OPERATOR DALAM JAVA Obyektif : 1. Memahami tentang operator-operator (aritmatic, logical, relational, assigment, bitwise) 2. Dapat membuat program sederhana dengan menggunakan operatoroperator

Lebih terperinci

1. SEJARAH JAVA 2. STRUKTUR KONTROL

1. SEJARAH JAVA 2. STRUKTUR KONTROL 1. SEJARAH JAVA Java dipelopori oleh James Gosling, Patrick Naughton, Chris Warth, Ed Frank, dan Mike Sheridan dari Sun Microsystems, Inc pada tahun 1991. Mereka membutuhkan kurang lebih 18 bulan untuk

Lebih terperinci

Bahasa C-M6 By Jamilah, Skom 1

Bahasa C-M6 By Jamilah, Skom 1 BAB 1 KONSEP DASAR BAHASA C 1.1 SEJARAH DAN STANDAR C Akar dari bahasa C adalah bahasa BCPL yang dikembangkan oleh Martin Richard pada tahun 1967. Bahasa ini memberkan ide kepada ken thompson yang kemudian

Lebih terperinci

Modul 1 Pengenalan Java. Oleh: Mike Yuliana PENS-ITS

Modul 1 Pengenalan Java. Oleh: Mike Yuliana PENS-ITS Modul 1 Pengenalan Java Oleh: Mike Yuliana PENS-ITS Materi Dasar Programming 2 1. Introduction of Java 2. Basic Java Programming 3. Operator and Assignment 4. Array 5. Class 6. Encapsulation 7. Inheritance

Lebih terperinci

TIPE DATA, VARIABLE, dan OPERATOR DELPHI

TIPE DATA, VARIABLE, dan OPERATOR DELPHI TIPE DATA, VARIABLE, dan OPERATOR DELPHI A. TIPE DATA Delphi merupakan bahasa pemrograman tingkat tinggi yang mendukung perancangan terstruktur dan berorientasi Object. Bahasa pemrograman ini berdasarkan

Lebih terperinci

PEMAHAMAN DASAR DASAR JAVA

PEMAHAMAN DASAR DASAR JAVA MODUL 1 PEMAHAMAN DASAR DASAR JAVA A. PENGANTAR JAVA Java Standard Development Kit (JDK/SDK) merupakan alat-alat utama bagi programmer untuk membuat dan menjalankan java. Development Kit dapat didownload

Lebih terperinci

PEMROGRAMAN BERORIENTASI OBJEK

PEMROGRAMAN BERORIENTASI OBJEK MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK NINF615 SEMESTER GASAL 2016/2017 PROGRAM STUDI S1 TEKNIK INFORMATIKA MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK DISUSUN OLEH: Tim Asisten Praktikum Jurusan

Lebih terperinci

ELEMEN DASAR C++ C++ mempunyai cara untuk menyatakan karakter-karakter yang tidak mempunyai kode tombol (seperti karakter tombol) misalnya \n.

ELEMEN DASAR C++ C++ mempunyai cara untuk menyatakan karakter-karakter yang tidak mempunyai kode tombol (seperti karakter tombol) misalnya \n. 1 ELEMEN DASAR C++ HIMPUNAN KARAKTER Himpunan karakter pada C++ terdiri huruf, digit maupun simbol-simbol lainnya (termasuk spasi dan karakter kontrol). Huruf, contoh : A s/d Z dan a s/d z Digit, contoh

Lebih terperinci

BAB 1 KONSEP DASAR JAVA

BAB 1 KONSEP DASAR JAVA BAB 1 KONSEP DASAR JAVA TUGAS PENDAHULUAN Buatlah algoritma dari program yang ada dalam kegiatan praktikum ini! 1. TUJUAN a. Mahasiswa mengetahui dasar dan elemen-elemen pembentuk bahasa Java b. Mahasiswa

Lebih terperinci

PERTEMUAN II Tipe Data, Variabel, Konstanta, Operator

PERTEMUAN II Tipe Data, Variabel, Konstanta, Operator PERTEMUAN II Tipe Data, Variabel, Konstanta, Operator 1. Tipe Data Dasar 2. Pengertian Variabel 3. Pengertian Konstanta 4. Operator Penugasan 5. Operator Operasi Bit 6. Operator Logika Pertemuan II ELEMEN

Lebih terperinci

MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK (JAVA) PERTEMUAN 1 PENGENALAN LINGKUNGAN PEMROGRAMAN JAVA

MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK (JAVA) PERTEMUAN 1 PENGENALAN LINGKUNGAN PEMROGRAMAN JAVA PERTEMUAN 1 PENGENALAN LINGKUNGAN PEMROGRAMAN JAVA A. Instalasi paket Java Development Kit (JDK) 1. Download paket JDK MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK (JAVA) Pertama masuk ke situs http://java.sun.com/javase/downloads/index.jsp,

Lebih terperinci

TKJ 2A TKJ 2B TMJ 2. Estu Sinduningrum, ST, MT

TKJ 2A TKJ 2B TMJ 2. Estu Sinduningrum, ST, MT TKJ 2A TKJ 2B TMJ 2 E-mail : estu.ningrum@yahoo.co.id INSTALASI JDK INSTALASI JAVA SDK 1. Bukalah folder tempat anda menyimpan file-file instalasi Java SDK. 2. Klik-dobel file instalasi Java SDK untuk

Lebih terperinci

MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK

MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK Deskripsi Singkat Praktikum pemrograman berorientasi objek adalah praktikum yang menggunakan bahasa Java sebagai bantuan dalam memahami konsep pemrograman

Lebih terperinci

TPI4202 e-tp.ub.ac.id

TPI4202 e-tp.ub.ac.id TPI4202 e-tp.ub.ac.id Program name.p atau name.pas (Pascal source code) Part I: Header Dokumentasi Nama program; Part II: Declarations Konstanta Variabel; Part III: Statements begin : end. Text Editor

Lebih terperinci

PHP mendukung komentar yang digunakan pada C, C++ dan Shell Unix. Sebagai contoh:

PHP mendukung komentar yang digunakan pada C, C++ dan Shell Unix. Sebagai contoh: Perintah Dasar Tag PHP Ketika PHP membaca suatu file, proses akan berlangsung hingga ditemukan tag khusus yang berfungsi sebagai tanda dimulainya interpretasi teks tersebut sebagai kode PHP. PHP akan menjalankan

Lebih terperinci

Bab 2. Dasar-Dasar Pemrograman C

Bab 2. Dasar-Dasar Pemrograman C Bab 2. Dasar-Dasar Pemrograman C Konsep Pemrograman Politeknik Elektronika Negeri Surabaya 2006 Overview Tipe Data Standar (Standart Data Type) Aturan Pendefinisian Identifier Variabel Mendeklarasikan

Lebih terperinci

BAB 3 Mengenali Lingkup Pemrograman Anda

BAB 3 Mengenali Lingkup Pemrograman Anda BAB 3 Mengenali Lingkup Pemrograman Anda 3.1 Tujuan Dalam bagian ini, kita akan membahas tentang bagaimana menulis, mengkompilasi dan menjalankan program Java. Terdapat dua cara dalam melakukannya, yang

Lebih terperinci

BAHASA PEMROGRAMAN JAVA PUTU INDAH CIPTAYANI JURUSAN SISTEM INFORMASI STMIK AMIKOM YOGYAKARTA

BAHASA PEMROGRAMAN JAVA PUTU INDAH CIPTAYANI JURUSAN SISTEM INFORMASI STMIK AMIKOM YOGYAKARTA 1 BAHASA PEMROGRAMAN JAVA PUTU INDAH CIPTAYANI JURUSAN SISTEM INFORMASI STMIK AMIKOM YOGYAKARTA IDENTIFIER Identifier adalah suatu tanda yang mewakili nama-nama variabel, method, class, dsb. Ingat : Bahasa

Lebih terperinci

Chapter 1 KONSEP DASAR C

Chapter 1 KONSEP DASAR C Chapter 1 KONSEP DASAR C Sejarah Dan Standar C Akar dari bahasa C adalah BCPL (dikembangkan oleh Martin Richard tahun 1967). Kemudian Tahun 1970, Ken Thompson mengembangkan bahasa tersebut yang di kenal

Lebih terperinci

MODUL 6 PERULANGAN. A. String. 1. Instansiasi dan Inisialisasi. M0601xxyyy.jar

MODUL 6 PERULANGAN. A. String. 1. Instansiasi dan Inisialisasi. M0601xxyyy.jar MODUL 6 PERULANGAN Topik-topik yang dibahas pada modul ini adalah mengenai kelas String, kelas Random, dan konsep perulangan. Pertanyaan-pertanyaan yang dijawab dalam bentuk teks harus Anda kumpulkan dengan

Lebih terperinci

BAHASA PEMROGRAMAN C

BAHASA PEMROGRAMAN C BAHASA PEMROGRAMAN C A. Pengenalan Bahasa C diciptakan oleh Dennis Ritchie tahun 1972 di Bell Laboratories. Kelebihan Bahasa C: - Bahasa C tersedia hampir di semua jenis computer. - Kode bahasa C sifatnya

Lebih terperinci

Pendahuluan Dasar Pemrograman Java

Pendahuluan Dasar Pemrograman Java Pendahuluan Dasar Pemrograman Java Tujuan Instruksional Khusus Memahami tentang lingkungan java Memahami tentang aplikasi program java sederhana Memahami tentang proses input dan output Sejarah Java Bahasa

Lebih terperinci

29 Februari Introduction Of Java

29 Februari Introduction Of Java 29 Februari 2012 Introduction Of Java Sejarah Java Dikembangkan oleh tim Pemimpin: James Gosling Company: Sun Microsystem Agustus 1991, bernama Oak Januari 1995, berganti nama Java Dapat dijalankan di

Lebih terperinci

PSEUDOCODE TIPE DATA, VARIABEL, DAN OPERATOR

PSEUDOCODE TIPE DATA, VARIABEL, DAN OPERATOR 1 PSEUDOCODE TIPE DATA, VARIABEL, DAN OPERATOR Siti Mukaromah, S.Kom TEKNIK PENYAJIAN ALGORITMA Teknik Tulisan Structure English Pseudocode Teknik Gambar Structure Chart HIPO Flowchart 2 PSEUDOCODE Kode

Lebih terperinci

AP2B Dini Triasanti STRUKTUR PEMROGRAMAN PYTHON

AP2B Dini Triasanti STRUKTUR PEMROGRAMAN PYTHON STRUKTUR PEMROGRAMAN PYTHON 1. Aturan Penulisan Program-program yang ditulis dalam Python secara khas jauh lebih pendek dibandingkan dengan program-program C atau C++, karena beberapa pertimbangan: tipe

Lebih terperinci

KONSEP DASAR PEMROGRAMAN BERORIENTASI OBYEK

KONSEP DASAR PEMROGRAMAN BERORIENTASI OBYEK KONSEP DASAR PEMROGRAMAN BERORIENTASI OBYEK Farah Zakiyah Rahmanti, M.T 2015 Overview Definisi Teknologi Java Konsep Pemrograman Procedural dan OOP Struktur Java, Identifier, Kata Kunci, Tipe Data, Operator,

Lebih terperinci

Dasar-Dasar Pemrograman Java

Dasar-Dasar Pemrograman Java 1 Dasar-Dasar Pemrograman Java Tipe data primitif 1. logika - boolean Tipe data boolean diwakili oleh dua pernyataan : true dan false 2. teksual char Tipe data character (char) diwakili oleh karakter single

Lebih terperinci

Pengenalan Java, Tipe Data, Variabel dan Operator. Putu Putra Astawa

Pengenalan Java, Tipe Data, Variabel dan Operator. Putu Putra Astawa Pengenalan Java, Tipe Data, Variabel dan Operator Topik Struktur program Java Analisa Program Java Komentar Program Penyataan dan Blok program Penggunaan Editor Netbeans Latihan1 Tipe Data Variabel Operator

Lebih terperinci

JAVA BASIC PROGRAMMING Joobshet

JAVA BASIC PROGRAMMING Joobshet JAVA BASIC PROGRAMMING Joobshet 1. KOMPETENSI Mahasiswa dapat memahami jenis jenis tipe data Mahasiswa dapat memahami jenis jenis variable Mahasiswa dapat memahami jenis jenis seleksi kondisi Mahasiswa

Lebih terperinci

MODUL 5 JAVA SCRIPT. Sub : PENGENALAN

MODUL 5 JAVA SCRIPT. Sub : PENGENALAN MODUL 5 JAVA SCRIPT Sub : PENGENALAN Laboratorium Komputer STIMIK PPKIA Pradnya Paramita Malang Pertemuan 5 5.1 Tujuan : 1. Mahasiswa dapat memahami dan mengenai perintah perintah javascript 2. Mahasiswa

Lebih terperinci

IKG2I4 / Software Project I

IKG2I4 / Software Project I IKG2I4 / Software Project I Mahmud Imrona, M.T. Izzatul Ummah, M.T. Kelompok Keahlian Algoritma dan Komputasi LECTURE NOTE WEEK 2 1 3/11/2015 WEEK 2 Class Driver Constructor Public vs private Get dan set

Lebih terperinci

Pengenalan Pascal/DevPascal

Pengenalan Pascal/DevPascal Materi 1 Pengenalan Pascal/DevPascal Turbo Pascal adalah Compiler bahasa pemrograman Pascal. Untuk memulai menjalankan Pascal: Cari Folder Pascal ada di C:\TP\BIN\TPX.EXE Jalankan File TPX tersebut Dev

Lebih terperinci

Java Basic. Variabel dan Tipe Data. Lokasi di dalam memori komputer yang digunakan untuk menyimpan suatu informasi (nilai)

Java Basic. Variabel dan Tipe Data. Lokasi di dalam memori komputer yang digunakan untuk menyimpan suatu informasi (nilai) Variabel dan Tipe Data Lokasi di dalam memori komputer yang digunakan untuk menyimpan suatu informasi (nilai) Nilai variabel dapat diubah di pernyataan manapun di dalam program Java Basic By Didit Setya

Lebih terperinci

Mengenal Java Dan Cara Membuat Project Java Bagi Pemula

Mengenal Java Dan Cara Membuat Project Java Bagi Pemula Mengenal Java Dan Cara Membuat Project Java Bagi Pemula Abdul Mukti Abdul.mukti45@ymail.com : http://mukti666.wordpress.com Abstrak Java dipelopori oleh James Gosling, Patrick Naughton, Chris Warth, Ed

Lebih terperinci

Percabangan & Perulangan

Percabangan & Perulangan Struktur Dasar Java Percabangan & Perulangan Object-oriented Programming (OOP) with JAVA 2011/2012 Macam-macam Percabangan if (...) if ( ) else ( ) if ( ) else if ( ) else ( ) switch ( ) Percabangan :

Lebih terperinci

LAB PEMROGRAMAN I (JAVA FUNDAMENTAL) PERTEMUAN 3 Dosen : Bella Hardiyana S. Kom

LAB PEMROGRAMAN I (JAVA FUNDAMENTAL) PERTEMUAN 3 Dosen : Bella Hardiyana S. Kom LAB PEMROGRAMAN I (JAVA FUNDAMENTAL) PERTEMUAN 3 Dosen : Bella Hardiyana S. Kom BAB III DASAR-DASAR PEMROGRAMAN Tipe Data Data adalah sekumpulan kejadian/fakta yang dipresentasikan dengan huruf, angka,

Lebih terperinci

BAB 4 PENGENALAN BAHASA C

BAB 4 PENGENALAN BAHASA C Bab 4 Pengenalan Bahasa C 35 BAB 4 PENGENALAN BAHASA C TUJUAN PRAKTIKUM 1. Mengetahui sejarah perkembangan bahasa C. 2. Mengerti struktur program bahasa C. 3. Mengerti konsep tipe data, variabel, & operator

Lebih terperinci

BAB 1 KONSEP DASAR BAHASA C

BAB 1 KONSEP DASAR BAHASA C BAB 1 KONSEP DASAR BAHASA C 1. Sejarah dan Standar C Akar dari bahasa C adalah bahasa BCPL yang dikembangkan oleh Martin Richard pada tahun 1967. Bahasa ini memberikan ide kepada Ken Thompson yang kemudian

Lebih terperinci

BAB IV IMPLEMENTASI DAN ANALISA

BAB IV IMPLEMENTASI DAN ANALISA BAB IV IMPLEMENTASI DAN ANALISA 4. Implementasi dan Analisa Pada bagian ini akan dijelaskan langah-langkah pembuatan aplikasi dengan menggunakan Bahasa pemrograman Java untuk Android, proses implementasi

Lebih terperinci

Reserved words Reserved words atau keywords merupakan kata-kata spesifik digunakan oleh compiler untuk keperluan pemrograman. Contoh reserved words

Reserved words Reserved words atau keywords merupakan kata-kata spesifik digunakan oleh compiler untuk keperluan pemrograman. Contoh reserved words Comments Comments digunakan untuk memberikan keterangan/penjelasan suatu baris program. Comments tidak akan dikompilasi oleh compiler. Lambang untuk comments : - double slash ( // ) untuk memberikan penjelasan

Lebih terperinci

T I P E D A T A P R I M I T I F V A R I A B E L D A N S T A T E M E N P E N U G A S A N E K S P R E S I D A N O P E R A T O R A R I T M A T I K A

T I P E D A T A P R I M I T I F V A R I A B E L D A N S T A T E M E N P E N U G A S A N E K S P R E S I D A N O P E R A T O R A R I T M A T I K A Pemrograman Dasar T I P E D A T A P R I M I T I F V A R I A B E L D A N S T A T E M E N P E N U G A S A N E K S P R E S I D A N O P E R A T O R A R I T M A T I K A Tipe Data Tipe Data merupakan skema yang

Lebih terperinci

NASKAH UTAMA ULANGAN AKHIR SEMESTER GANJIL TAHUN PELAJARAN 2013/2014

NASKAH UTAMA ULANGAN AKHIR SEMESTER GANJIL TAHUN PELAJARAN 2013/2014 YAYASAN PENDIDIKAN ISLAM AL MUHADJIRIN SMK AL MUHADJIRIN KELOMPOK TEKNOLOGI DAN INDUSTRI Jln : Pulau Jawa Raya Perumnas 3 Bekasi Kode Pos 17111 Telp./Fax. 021-8829052 Email : smk_almuhadjirin@yahoo.com

Lebih terperinci

BAB 3 Mengenali Lingkup Pemrograman Anda

BAB 3 Mengenali Lingkup Pemrograman Anda BAB 3 Mengenali Lingkup Pemrograman Anda 3.2 Tujuan Dalam sesi ini, kita akan membahas tentang bagaimana menulis, meng-compile dan menjalankan(run) program Java. Terdapat 2 cara dalam melakukannya, yang

Lebih terperinci

Dasar Pemograman Java

Dasar Pemograman Java Dasar Pemograman Java A Sejarah dan Perkembangan Java Java adalah salah satu pemograman berorientasi objek murni yang dibuat berdasarkan kemampuan terbaik bahasa pemograman objek sebelumnya. Java diciptakan

Lebih terperinci

Tipe Data Floating Point Tipe data yng digunakan untuk menampung bilangan desimal

Tipe Data Floating Point Tipe data yng digunakan untuk menampung bilangan desimal I. Bahan Kajian 1. Kelas(Class) Kelas adalah definisi umum (pola, template atau cetak biru) untuk himpunan objek sejenis. Kelas menetapkan spesifikasi perilaku (behavior) dan atribut dari objek-objek (*lebih

Lebih terperinci

BAB 3 STRUKTURE PROGRAM JAVA

BAB 3 STRUKTURE PROGRAM JAVA BAB 3 STRUKTURE PROGRAM JAVA 3.1 Tujuan Pada akhir pembahasan, diharapkan Mahasiswa dapat : Mengidentifikasi bagian dasar dari program Java Membedakan mana yang termasuk ke dalam Java literals, tipe data

Lebih terperinci

MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK TIS243

MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI OBJEK TIS243 MODUL PRAKTIKUM PEMROGRAMAN BERORIENTASI TIS243 OBJEK PROGRAM STUDI TEKNIK INFORMATIKAA STMIK TEKNOKRAT LAMPUNG SEMESTER GENAP TAHUN AJARAN 2014/2015 PRAKTIKUM 1 Materi 1. 2. 3. 4. Tujuan 1. 2. 3. Pengenalan

Lebih terperinci

TIPE DATA, VARIABEL DATA DAN OPERATOR

TIPE DATA, VARIABEL DATA DAN OPERATOR TIPE DATA, VARIABEL DATA DAN OPERATOR A. TIPE DATA PRIMITIF Bahasa pemrograman java mendefinisikan delapan tipe data primitif. Tipe-tipe data tersebut diantaranya adalah boolean (untuk bentuk logika),

Lebih terperinci

MODUL III STRUCTURED QUERY ANGUAGE (SQL)

MODUL III STRUCTURED QUERY ANGUAGE (SQL) MODUL III STRUCTURED QUERY ANGUAGE (SQL) Tujuan : 1. Memahami tentang sistem database 2. Memahami instalasi MySQL di lingkungan Windows 3. Memahami dasar-dasar MySQL. Tugas Pendahuluan 1. Apa yang anda

Lebih terperinci

Pertemuan 1. Pengenalan Java

Pertemuan 1. Pengenalan Java Pertemuan 1 Pengenalan Java Objektif: 1. Mahasiswa mengetahui latar belakang perkembangan bahasa Java. 2. Mahasiswa mengetahui fitur-fitur penting yang terdapat pada Java. 3. Mahasiswa mengerti konsep

Lebih terperinci

Struktur Dasar Bahasa C Tipe Data Dalam bahasa C terdapat lima tipe data dasar, yaitu :

Struktur Dasar Bahasa C Tipe Data Dalam bahasa C terdapat lima tipe data dasar, yaitu : 1 Struktur Dasar Bahasa C Tipe Data Dalam bahasa C terdapat lima tipe data dasar, yaitu : Contoh Program : { int x; float y; char z; double w; clrscr(); /* untuk membersihkan layar */ x = 10; /* variable

Lebih terperinci

TIPE DATA Pertemuan (K-03/L-03)

TIPE DATA Pertemuan (K-03/L-03) TIPE DATA Pertemuan (K-03/L-03) Coba Anda jawab, dimana Anda berteduh? Pasti jawabnya di rumah, lalu apakah rumah Anda punya nama? Jawabnya adalah ya, yaitu Rumah No.X (misal). Jadi apa itu data? Analogi

Lebih terperinci

Universitas Komputer Indonesia. Pemrograman dengan C++ Builder 2004 Taryana S.

Universitas Komputer Indonesia. Pemrograman dengan C++ Builder 2004 Taryana S. 3.1. Statement Aspek awal yang perlu anda ketahui dalam bahasa pemograman adalah Reserved Word dan statement. Reserved word harus kita kenal bahkan harus dihapalkan, layaknya menghapal kata-kata baru apabila

Lebih terperinci

LAPORAN PRAKTIKUM RESMI TIPE DATA, KONSTANTA DAN VARIABEL

LAPORAN PRAKTIKUM RESMI TIPE DATA, KONSTANTA DAN VARIABEL LAPORAN PRAKTIKUM RESMI TIPE DATA, KONSTANTA DAN VARIABEL Disusun oleh : Nama : Trins Astriani Br Sidauruk NIM : 201302011 Dosen pengampu : Yosef Murya Kusuma Ardhana.S.T., M.Kom JURUSAN KOMPTERISASI AKUNTANSI

Lebih terperinci

Tipe Data dan Operator

Tipe Data dan Operator Tipe Data dan Operator Dasar Algoritma dan Pemrogrman Eka Maulana, ST, MT, MEng. Klasifikasi Tipe Data 1 Tipe Data Tipe data adalah jenis data yang dapat diolah oleh komputer untuk memenuhi kebutuhan dalam

Lebih terperinci

Pengantar Pemrograman dengan Bahasa Java

Pengantar Pemrograman dengan Bahasa Java Pengantar Pemrograman dengan Bahasa Java IF2123 Aljabar Geometri Oleh: Rinaldi Munir Sekolah Teknik Elektro dan Informatika ITB 1 Sejarah Bahasa Java Bahasa java dibuat oleh James Gosling saat masih bergabung

Lebih terperinci

PENGERTIAN VARIABEL, KONSTANTA DAN TIPE DATA

PENGERTIAN VARIABEL, KONSTANTA DAN TIPE DATA PENGERTIAN VARIABEL, KONSTANTA DAN TIPE DATA Haida Dafitri, ST, M.Kom Ta. 2016 2017 T. Informatika STT Harapan Medan TUJUAN PEMBELAJARAN Setelah menyelesaikan bab ini, anda diharapkan : Mengenal dan Mengetahui

Lebih terperinci

KATA PENGANTAR. Penulis. Raizal Dzil Wafa M.

KATA PENGANTAR. Penulis. Raizal Dzil Wafa M. i KATA PENGANTAR Buku ini dibuat untuk memudahkan siapa saja yang ingin belajar MATLAB terutama bagi yang baru mengenal MATLAB. Buku ini sangat cocok untuk pemula terutama untuk pelajar yang sedang menempuh

Lebih terperinci

Review C/C++ & Intro to Java. Pemrograman Berorientasi Obyek IT209

Review C/C++ & Intro to Java. Pemrograman Berorientasi Obyek IT209 Review C/C++ & Intro to Java Pemrograman Berorientasi Obyek IT209 Pemrograman Terstruktur Pemrograman terstruktur adalah suatu proses untuk mengimplementasikan urutan langkah untuk menyelesaikan suatu

Lebih terperinci

VARIABEL & TIPE DATA PEMROGRAMAN C++

VARIABEL & TIPE DATA PEMROGRAMAN C++ VARIABEL & TIPE DATA PEMROGRAMAN C++ ruliriki@gmail.com VARIABEL Suatu nama yang menyatakan tempat dalam memori komputer Menyimpan nilai yang dapat diubah VARIABEL Pengenal (identifier) yang digunakan

Lebih terperinci

Sejarah C. Dirancang oleh Denis M. Ritchie tahun 1972 di Bell Labs.

Sejarah C. Dirancang oleh Denis M. Ritchie tahun 1972 di Bell Labs. Sejarah C Dirancang oleh Denis M. Ritchie tahun 1972 di Bell Labs. Pengembangan dari bahasa BCPL(Martin Richard, 1967) dan bahasa B (Ken Thompson, 1970) Dibantu Brian W. Kernighan, Ritchie menulis buku

Lebih terperinci

Variabel, Tipe Data, dan Operator. Oleh : Edi Sugiarto, S.Kom, M.Kom

Variabel, Tipe Data, dan Operator. Oleh : Edi Sugiarto, S.Kom, M.Kom Variabel, Tipe Data, dan Operator Oleh : Edi Sugiarto, S.Kom, M.Kom 1 Pendahuluan Program merupakan kumpulan instruksi yg akan dikerjakan oleh komputer. Program yg kita tulis merupakan urutan perintah

Lebih terperinci

Rekomendasi Min Perangkat Keras. Prosesor dual core 1.5 GHz RAM 2 GB Monitor 10 " VGA Onboard Keyboard PS2 Mouse PS2

Rekomendasi Min Perangkat Keras. Prosesor dual core 1.5 GHz RAM 2 GB Monitor 10  VGA Onboard Keyboard PS2 Mouse PS2 Netbeans IDE Netbeans merupakan IDE (Integreted Development Environment) yang powerfull untuk membangun sebuah aplikasi berbasis Java, PHP, C/C++, Ruby dan lainnya. Netbeans awalnya diciptakan hanya untuk

Lebih terperinci

INTRODUCTION JAVA NORHIKMAH,M.KOM

INTRODUCTION JAVA NORHIKMAH,M.KOM NORHIKMAH,M.KOM Modul_Praktikum Setting Path & Program Java Sederhana OOP OOP (Object Oriented Programming) adalah suatu metode pemrograman yang berorientasi kepada objek. Tujuan dari OOP diciptakan adalah

Lebih terperinci