Seri Penuntun Praktis
Dasar-Dasar Pemrograman Java 2
i
Kutipan Pasal 44, Ayat 1 dan 2, Undang-Undang Republik Indonesia tentang HAK CIPTA: Tentang Sanksi Pelanggaran Undang-Undang Nomor 6 Tahun 1982 tentang HAK CIPTA, sebagaimana telah diubah dengan Undang-Undang No. 7 Tahun 1987 jo. UndangUndang No. 12 Tahun 1997, bahwa:
ii
1.
Barangsiapa dengan sengaja dan tanpa hak mengumumkan atau memperbanyak suatu ciptaan atau memberi izin untuk itu, dipidana dengan pidana penjara paling lama 7 (tujuh) tahun dan/atau denda paling banyak Rp 100.000.000,- (seratus juta rupiah).
2.
Barangsiapa dengan sengaja menyiarkan, memamerkan, mengedarkan, atau menjual kepada umum suatu ciptaan atau barang hasil pelanggaran Hak Cipta sebagaimana dimaksud dalam ayat (1), dipidana dengan pidana penjara paling lama 5 (lima) tahun dan/atau denda paling banyak Rp 50.000.000,- (lima puluh juta rupiah).
Seri Penuntun Praktis
Dasar-Dasar Pemrograman Java 2
Ady Wicaksono
Penerbit PT Elex Media Komputindo Kelompok Gramedia, Jakarta
iii
Seri Penuntun Praktis Dasar-Dasar Pemrograman Java 2 Ady Wicaksono 12102461 ISBN – 979-20-3312-2 © 2002, PT Elex Media Komputindo, Jakarta Hak Cipta dilindungi undang-undang Diterbitkan pertama kali oleh Penerbit PT Elex Media Komputindo Kelompok Gramedia, Anggota IKAPI, Jakarta 2002
Dilarang keras menterjemahkan, memfotokopi, atau memperbanyak sebagian atau seluruh isi buku ini tanpa izin tertulis dari penerbit.
Dicetak oleh Percetakan PT Gramedia, Jakarta isi di luar tanggung jawab percetakan
iv
Daftar Isi
Bab 1 Mulai Memprogram Java Apa yang Harus Disiapkan? Langkah-Langkah yang Harus Dilakukan Aplikasi Java Hello World Membuat Kode Program Java dengan Editor Text Melakukan Kompilasi Program Java Menjalankan Program Java dengan Perintah Java Aplikasi Applet Hello World Membuat Kode Program Java Applet dengan Editor Text Melakukan Kompilasi Kode Program Java Membuat File HTML untuk Menampilkan Applet Java Menampilkan Applet Java dengan Browser
1 1 2 2
10 10
Bab 2 Mengenal Teknologi Java Apa Java Itu? Fitur-Fitur Java yang Menarik
13 13 19
Bab 3 Mengulas “helloWorld” Anda Aplikasi Java “helloWorld” Applet Java “helloWorld”
23 23 28
Bab 4 Variabel dalam Java Sekilas Tentang Variable dalam Java Konstanta dalam Java Penamaan Variabel dan Scope Variable dalam Java
31 31 33 33
2 3 7 8 9 9
v
Lebih Jauh Tentang Beberapa Tipe Variabel dalam Java Tipe Boolean Tipe Numerik
37 37 37
Bab 5 Operator dalam Java Operator Aritmatika Operator Relasional Operator Kondisional Operator Shift Operator Bitwise Bitwise AND Bitwise OR Bitwise XOR (Exclusive OR) Bitwise Complement Operator Assignment Operator Lain ? new, [ ], instanceof, operator (tipe data), operator “.” Urutan Precedence Operator
41 41 48 51 52 54 54 55 55 56 58 58 59
Bab 6 ControlFlow dalam Java Operasi Pengulangan While Do-While For Operasi Kondisional If-Else Switch-Case Tentang Break, Label, Return, Continue
63 63 63 67 68 71 71 76 82
Bab 7 Konsep Pemrograman Berorientasi Object Apa Object Itu? Apa Enkapsulasi Itu? Apa Messages Itu? Apa Class Itu?
87 87 92 93 94
vi
60 60
Apa Inheritance Itu? Apa Interface Itu? Pemrograman Berorientasi Object pada Java Class pada Java Deklarasi Class pada Java Deklarasi Class Body pada Java Deklarasi Konstruktor pada Kelas/Class Java Deklarasi Member Variable pada Kelas/Class Java Deklarasi Method pada Kelas/Class Java Method Declaration Method Body Object pada Java Java Class Interface Java Package Membuat dan menggunakan Java Package Manajemen File Source dan *.class
97 99
Bab 8
Bab 9 Array/Larik Membuat dan Menggunakan Larik/Array pada Java Array of Array
101 101 102 106 106 109 111 111 121 122 124 128 129 132 135 135 139
Bab 10 Inheritance Bagaimana Membuat Turunan Sebuah Kelas? Menggunakan keyword : super Multilevel Inheritance Method Overriding Kelas Abstrak (Abstract Class) Menggunakan Final untuk Mencegah Overriding dan Inheritance
143 143 150 155 158 159
Bab 11 Java Exception Apa Exception Itu? Try – Catch - Finally
165 165 171
161
vii
Bab 12 Kelas java.lang.System dan Runtime Mengakses Sumber Daya Sistem Mengakses Properti Sistem dengan System.getProperty System.exit() Runtime Manajemen Memori Eksekusi program lain
173 173 177 178 179 179 181
Bab 13 Kelas java.lang.String Membuat Objek String Fungsi-Fungsi Penting dalam String Menentukan panjang string Menentukan Karakter pada Posisi Tertentu dari String Membandingkan Dua String Menentukan Substring Menentukan Awalan atau Akhiran String Mengubah String Menjadi Huruf Kecil/Besar Semua Menghapus Whitespace pada Sebuah String Menggabungkan Dua String Mengganti Karakter dalam String Mengubah String ke Numerik
190 191 191 192 192
Bab 14 Wrapper Tipe Karakter Konstruktor Fungsi-Fungsi Static dalam Kelas Character
197 197 198
Bab 15 Kelas java.lang.Math Konstruktor Fungsi-Fungsi Penting Fungsi sinus, kosinus, tangen, asin(), acos(), atan(), atan2 Fungsi Eksponensial Fungsi-Fungsi Rounding
203 203 204
viii
183 183 184 184 185 185 187 188
204 205 205
Bab 16 Paket java.util.* StringTokenizer Konstruktor dan Fungsi-Fungsinya Date Random
211 211 212 213 215
Bab 17 File JAR (Java Archieve File) Menggunakan File JAR Membuat File JAR Melihat Isi File JAR Mengesktrak File JAR File MANIFEST Main-Class
219 220 222 223 224 225 225
Bab 18 Input/Output Byte Stream Character Stream Data Sink Stream Processing Stream Stream Standard Membaca dari keyboard Menulis ke Layar Operasi File Membaca Sebuah file Menulis ke Sebuah file
227 228 229 230 231 232 232 236 237 242 244
Bab 19 Java Thread Membuat Thread Mengimplementasikan interface Runnable Menurunkan kelas Thread
247 247 248 251
Bab 20 Penutup
253
ix
x
Kata Pengantar
Mengapa buku yang berbicara tentang Java? Java merupakan bahasa pemrograman yang sangat populer di luar negeri. Di Indonesia sendiri, pengguna Java memang tidak sebanyak pengguna Visual Basic atau Borland Delphi. Namun, tidak dapat dipungkiri, komunitas Java saat ini meningkat di Indonesia. Sebagai bukti nyata, banyak kurikulum di universitas-universitas negeri dan swasta mulai mengikutkan bahasa Java sebagai bagian dari pengajaran pemrograman bahasa berorientasi objek. Sebagai contoh nyata, mata kuliah pemrograman objek di jurusan Informatika ITB menggunakan C++ dan Java sebagai bahasa pemrograman yang digunakan. Pada sisi yang lain, banyak vendor-vendor seperti Oracle (http://www.oracle.com), Nokia (http://www.nokia.com), Yahoo Portal (http://www.tibco.com) menggunakan Java untuk pengembangan aplikasinya. Java memang sangat populer pada level enterprise application dan mobile application. Sasaran utama dari buku ini adalah pemula dalam bahasa Java, terutama mahasiswa dan programmer yang ingin menggeluti bahasa Java. Buku ini dirancang untuk tahan lama, artinya tidak bergantung pada versi dari Java misalnya, karena yang dibahas adalah dasar-dasarnya, yang dari statistik yang diperoleh penulis, tampak bahwa dari Java 1.1 yang telah dirilis sejak beberapa tahun lalu, sampai Java 2 yang merupakan produk terbaru Sun Microsystem baru-baru ini, dasar-dasarnya adalah sama saja, yang berbeda hanyalah xi
fitur-fiturnya, yaitu keluaran terbaru memiliki fitur-fitur yang jauh lebih lengkap. Melalui buku ini diharapkan pembaca dapat memiliki dasar-dasar yang kuat tentang bagaimana memprogram bahasa Java, sehingga ketika menemui hal-hal baru tentang Java, akan sangat mudah sekali untuk beradaptasi dan mengerti.
xii
Bab 1
Mulai Memprogram Java
Cara belajar suatu bahasa pemrograman yang baik adalah dengan membuat program dalam bahasa tersebut. Hal ini berlaku pula bagi Anda yang akan belajar memprogram dalam bahasa Java. Pada bagian ini akan dibahas sebuah program kecil dalam bahasa Java berupa Java Applet dan Java Application yang akan menjadi program pertama Anda untuk kemudian melangkah lebih jauh. Mengapa di bagian pertama Anda harus memprogram, ya… hal ini untuk memberikan gambaran tentang aplikasi Java yang akan dibahas lebih lanjut di bab-bab berikutnya
Apa yang Harus Disiapkan? Untuk kompilasi kode program Java menjadi Java ByteCode dan menjalankan Java ByteCode tersebut Anda harus menyediakan Java Development Kit (JDK) yang dapat Anda download di situs http://java.sun.com/. Pada saat buku ini dibuat telah tersedia JDK versi 1.3 yang merupakan pengembangan dari versi JDK versi sebelumnya. Buku ini mengasumsikan Anda menginstal Java pada direktori C:\Program Files\jdk1.x di Windows atau pada direktori /usr/local/jdk1.x di Linux/UNIX, (keterangan 1.x disini menunjukkan versi dari JDK yang 1
ada jadi bisa bernilai 1.1, 1.2, atau 1.3). Selain itu, buku ini mengasumsikan Anda menginstal JDK versi 1.3 untuk Windows atau JDK versi 1.2 untuk UNIX/Linux. Untuk membuat kode program, yang Anda butuhkan hanyalah sebuah editor text seperti notepad (Windows) atau vi (UNIX). Namun, saat ini ada pula tool untuk memprogram aplikasi Java secara visual, misalnya Borland JBuilder, PowerJ, dan Visual J.
Langkah-Langkah yang Harus Dilakukan Pada awal memprogram Java ini kita akan membuat sebuah program “Hello World” baik berupa Java Application maupun Java Applet.
Aplikasi Java Hello World Berbeda dengan Java Applet yang dieksekusi oleh aplikasi browser seperti Internet Explorer dan Netscape Navigator yang akan dijelaskan kemudian, Java Application dieksekusi oleh program-program biasa yang dibuat dengan bahasa C, Perl, C++, atau yang lain, secara standalone. Untuk membuat aplikasi HelloWorld kita yang pertama, Anda harus mengikuti langkah-langkah berikut untuk memprogram.
Membuat Kode Program Java dengan Editor Text Anda dapat menggunakan editor seperti notepad atau vi seperti yang telah dijelaskan sebelumnya. Kode program java harus disimpan dalam file dengan ekstensi .java, misalnya hello.java, oracle.java, dan sebagainya. Kali ini, kita akan membuat program dengan nama helloWorld.java dengan kode sumber sebagai berikut: 2
// Nama file : helloWorld.java // Deskripsi : Program yang menampilkan string "Say Hello to Java" class helloWorld { public static void main (String[] args){ System.out.println("Say Hello to Java"); } }
Melakukan Kompilasi Program Java Untuk melakukan kompilasi kode program Java, Anda menggunakan perintah javac yang telah ada di dalam Java Development Kit (JDK) yang Anda download. Sintaksnya sederhana sekali, yakni:
javac
Jika Anda menggunakan sistem operasi Windows, dan Anda telah menginstal JDK di C:\Program Files\jdk1.3, Anda harus memastikan bahwa variabel %PATH% Anda telah mengandung direktori C:\Program Files\jdk1.3\bin. Anda dapat memeriksa informasi path yang ada sebagai berikut:
C:\>echo %PATH% C:\Perl\bin;C:\WINNT\system32;C:\WINNT C:\>set PATH=%PATH%;c:\jdk1.3\bin
3
Gambar 1-1. Pemeriksaan variabel %PATH% pada Windows, tampak direktori C:\Program Files\JDK1.3\BIN telah ada. Jika %PATH% Anda belum mengandung direktori C:\Program Files\jdk1.3\bin, Anda dapat menambahkannya dengan perintah:
SET PATH=%PATH%;C:\Progra~1\JDK1.3\bin
Untuk lingkungan UNIX/Linux, jika Anda telah menginstal JDK di /usr/local/jdk1.2.2/, Anda harus memastikan bahwa $PATH Anda telah mengandung direktori /usr/local/jdk1.2/bin. Anda dapat memeriksa informasi path yang ada sebagai berikut: [ady@localhost]$ echo $PATH /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/jdk1.2/bin
4
Gambar 1-2. Pemeriksaan variabel $PATH pada UNIX, tampak direktori /usr/local/jdk1.2.2/bin telah ada.
Jika $PATH Anda belum mengandung direktori /usr/local/jdk1.2.2/bin, Anda dapat menambahkannya dengan perintah:
export PATH=$PATH:/usr/local/jdk1.2.2/bin
Setelah konfigurasi %PATH% atau $PATH Anda telah benar, Anda bisa melakukan kompilasi program Java Anda dengan mengeksekusi perintah javac sebagai berikut:
javac helloWorld.java
Untuk lebih jelas bagaimana mengkompilasi program Java Anda, Anda dapat melihat Gambar 1-3 dan Gambar 1-4. 5
Perhatian: Program Java memiliki sifat case-sensitive, artinya antara huruf besar dan huruf kecil dibedakan, jadi Anda harus berhati-hati dalam membuat sebuah program Java. Hasil dari kompilasi kode sumber program Java adalah file berekstensi .class yang merupakan bytecode Java yang siap dijalankan di semua platform baik Sun Solaris, Windows 9.x/NT, Linux, atau sistem operasi lainnya yang mendukung Java Platform. Hasil dari kompilasi kode sumber program Java adalah file berekstensi .class yang merupakan bytecode Java yang siap dijalankan disemua platform baik Sun Solaris, Windows 9.x/NT, Linux, atau sistem operasi lainnya yang mendukung Java Platform.
Gambar 1-3. Kompilasi Java (pada Windows) yang menghasilkan file .class
6
Gambar 1-4. Kompilasi Java (pada Linux) yang menghasilkan file .class
Menjalankan Program Java dengan Perintah Java File *.class yang dihasilkan dari kompilasi kode program Java Anda kemudian dijalankan dengan perintah java, dengan sintaks sebagai berikut:
java
Untuk program di atas, Anda menjalankan perintah:
java helloWorld
7
Tampak hasilnya adalah dicetaknya “Say Hello to Java” pada layar seperti tampak pada Gambar 1-5. Bagaimana menurut Anda, apakah Java sudah mulai membuat Anda tertarik?
Gambar 1-5. Hasil Eksekusi program Java (helloWorld) pada Linux
Aplikasi Applet Hello World Java Applet merupakan salah satu gebrakan yang diberikan oleh Java. Dengan Applet, aplikasi-aplikasi Internet akan lebih dinamis di sisi client browser-browser. Java Applet akan dieksekusi oleh browser-browser seperti Internet Explorer dan Netscape Navigator. Sebenarnya, penggunaan applet tidak hanya pada browser saja, jika Anda pernah tahu aplikasi tambahan pada handphone seperti mobile banking, aplikasi seperti ini bisa berupa applet Java pula, namun pada buku ini yang dimaksud applet adalah aplikasi Java pada browser. 8
Untuk membuat aplikasi HelloWorld Applet kita yang pertama, Anda harus mengikuti langkah-langkah berikut untuk memprogram:
Membuat Kode Program Java Applet dengan Editor Text Untuk pembuatan Java Applet pertama kita, kita akan membuat program dengan nama helloWorld.java dengan kode sumber sebagai berikut:
// Nama file : helloWorld.java (Applet Java) // Deskripsi : Applet yang menampilkan string "Say Hello to Java" // pada browser import java.applet.* ; import java.awt.* ; public class helloWorld extends Applet { public void paint(Graphics g){ g.drawString(“Say Hello To Java”,50,25); } }
Melakukan Kompilasi Kode Program Java Seperti halnya dengan Java Application, untuk mengkompilasi kode program Java Anda tinggal mengeksekusi perintah:
javac helloWorld.java
9
Membuat File HTML untuk Menampilkan Applet Java Oleh karena Java Applet digunakan pada sebuah halaman web, maka perlu dibuat file HTML. File HTML harus mengandung tag <APPLET…> …. yang akan digunakan untuk menampilkan Applet Java. Untuk program Applet Java kita, pertama Anda membuat file HTML sebagai berikut:
My Applet Java Page
File di atas disimpan dengan nama helloWorld.html dan diletakkan satu direktori dengan file helloWorld.class dan helloWorld.java.
Menampilkan Applet Java dengan Browser Setelah langkah-langkah di atas selesai, Anda tinggal melakukan loading file HTML yang dibuat pada langkah 3 dengan browser Internet Explorer atau Netscape Navigator. Selain dengan browser-browser tersebut, JDK juga menyediakan appletviewer yang digunakan untuk menampilkan Applet Java.
10
Perhatikan Gambar 1-6, untuk melihat contoh loading Applet Java helloWorld. Bagaimana sekarang? Anda telah berhasil melewati fase pertama memprogram dalam bahasa Java. Anda tidak akan rugi mempelajari Java, karena saat ini Java benar-benar menjadi salah satu bahasa pemrograman unggulan untuk bermacam-macam solusi. Oracle 8i/9i merupakan salah satu contoh kecil yang menggunakan Java sebagai bahasa utama dalam pembuatannya. Contoh lain adalah dalam aplikasi mobile, hampir semua vendor-vendor mobile device seperti Nokia, Schlumberger menggunakan Java untuk aplikasi yang mereka buat. Kita tidak akan membahas lebih jauh program Java di atas pada bab ini, karena memang bab ini hanya dijadikan sebagai batu loncatan bagi Anda yang ingin belajar Java. Pembahasan yang lebih mendetail akan dilakukan pada bab-bab berikutnya.
Gambar 1-6. Tampilan applet helloWorld di Netscape Navigator, perhatikan status bar pada Netscape tersebut 11
12
Bab 2
Mengenal Teknologi Java
Bab 1 telah Anda lalui dengan sukses dan menarik, bukan? Kali ini kita akan mencoba mengenal tentang Java sebuah bahasa berorientasi object yang dikembangkan oleh Sun Microsystems.
Apa Java Itu? Berbicara mengenai Java berarti ada dua bagian yang dibicarakan, yakni Java sebagai bahasa pemrograman dan Java sebagai platform. Sebagai bahasa pemro-graman, Java dikenal sebagai bahasa pemrograman tingkat tinggi dengan fitur-fitur utama antara lain: § Simple Java dirancang untuk mudah dipelajari, terutama bagi programmer-programmer yang telah mengenal C/C++ akan mudah sekali untuk berpindah ke Java § Object Oriented Paradigma pemrograman berorientasi object merupakan paradigma pemrograman masa depan. Java pun merupakan bahasa pemrograman berorientasi object § Robust and Secure Java dirancang sebagai bahasa pemrograman yang handal dan aman. Aplikasi-aplikasi yang dibangun 13
dengan bahasa Java sangat handal dengan manajemen memori yang bagus. Aplikasi Java juga dikenal sangat secure, yaitu kasus-kasus seperti buffer overflow yang umumnya menjadi lubang keamanan aplikasi-aplikasi berbasis C/C++ tidak terjadi di Java, karena pengaturan security-nya yang bagus § Architecture Neutral and Portable Dengan semboyan write once run everywhere, Java dirancang untuk dapat dijalankan di semua platform, tanpa peduli apakah arsitektur perangkat lunak berupa Intel, AMD, Sun Sparc, PowerPC; aplikasi Java mampu berjalan di semuanya tanpa perlu dikompilasi ulang. Bagaimana Java bisa bersifat neutral architecture? Java Compiler yang digunakan untuk mengkom-pilasi kode program Java dirancang untuk menghasilkan kode yang netral terhadap semua arsitektur perangkat keras yang disebut sebagai Java bytecode. Aplikasi-aplikasi hasil kompilasi Java pada dasarnya berupa Java bytecode dan bukannya native code sebagaimana file-file *.exe pada Windows/DOS. JVM (Java Virtual Machine) menjadi bagian dari teknologi Java yang menyediakan media untuk dijalankannya aplikasi Java (Java bytecode). § High Performance Java dirancang untuk menghasilkan aplikasi-aplikasi dengan performansi yang terbaik. Contoh nyata aplikasi besar saat ini yang mungkin bisa kita lihat adalah aplikasi database Oracle 8i/9i yang core-nya dibangun menggunakan bahasa pemrograman Java. Seperti yang telah dijelaskan sebelumnya, aplikasi Java (*.class) merupakan Java bytecode yang berjalan di atas JVM (Java Virtual Machine). Java bytecode bisa Anda anggap sebagai kode-kode mesin dari JVM, yang kemudian JVM-lah yang akan menginterpretasikan kode-kode tersebut ke kode native atau kode mesin dari arsitektur yang 14
bersangkutan. Hal sangat menarik karena urusan arsitektur mesin bukan jadi masalah bagi programmer tapi menjadi urusan kompiler pada bahasa pemrograman Java. Setelah Anda memprogram dengan Java, Anda tidak perlu pusingpusing lagi gara-gara aplikasi Anda hanya bisa berjalan di Intel Linux misalnya, padahal Anda ingin semua platform mendukung, karena JVM menyediakan neutral platform untuk Anda.
Gambar 2-1. Proses kompilasi dan dijalankannya aplikasi Java Sebagai sebuah platform, Java terdiri atas dua bagian utama, yakni: § Java Virtual Machine (JVM) § Java Application Programming Interface (Java API) Pada dasarnya, ada berbagai macam platform tempat aplikasi-aplikasi perangkat lunak (software) dieksekusi seperti Microsoft Windows, Unix, Linux, Netware, Macintosh, dan OS/2. Namun, aplikasi-aplikasi yang berjalan pada suatu platform (misalnya Windows) tidak akan bisa dijalankan di platform yang lain (misalnya Linux) tanpa usaha kompilasi ulang, bahkan pengubahan kode 15
program. Java platform merupakan perangkat lunak yang menjadi mesin virtual bagi aplikasi Java untuk dieksekusi. Jadi, aplikasi Java tidak perlu dikompilasi ulang jika telah dikompilasi di suatu platform dan akan dijalankan di platform yang berbeda dengan platform saat dikompilasi, karena aplikasi Java dijalankan di atas Java Virtual Machine (JVM). Saat ini Java Platform telah ada secara default pada berbagai sistem operasi, antara lain: § Windows 9.x/NT/2000 § Sun Solaris § MacOS § Novell Netware 4.0 § HPUx § Hitachi OS § AIX § Irix § Unixware (SCO)
16
Gambar 2-2. Perbandingan fitur beberapa bahasa pemrograman populer (sumber : http://java.sun.com/ docs/white/langenv/Perform.doc2.html)
17
Gambar 2-3. Model Java Platform sebagai perantara dieksekusinya aplikasi Java(Java bytecode) ke kode mesin yang bersangkutan Berbicara kecepatan, memang aplikasi Java kalah cepat dibandingkan dengan aplikasi yang native code karena Java berjalan di atas JVM sedangkan aplikasi native, misalnya file *.exe, langsung berjalan di atas perangkat keras yang bersangkutan. Namun, saat hal ini bisa ditekan dan tak jadi masalah lagi dengan algoritma yang bagus dan dukungan hardware, misal memori (RAM), yang baik.
18
Fitur-Fitur Java yang Menarik Java API menyediakan fitur-fitur yang menarik bagi Anda yang ingin menggunakan Java untuk mengem-bangkan aplikasi Anda. Ada berbagai fitur yang ditawarkan oleh Java API antara lain sebagai berikut: § Applet Java Applet merupakan program Java yang berjalan di atas browser. Dengan menggunakan java Applet, maka halaman HTML Anda akan lebih dinamis dan menarik, sangat cocok untuk pengembangan aplikasi-aplikasi berbasis web. § Java Networking Java Networking merupakan sekumpulan API (Application Programming Interface) yang menyediakan fungsi-fungsi untuk aplikasi-aplikasi jaringan. Java Networking menyediakan akses untuk TCP,UDP, IP Address dan URL. Java Networking tidak menyediakan akses untuk ICMP dikarenakan alasan sekuriti dan pada kondisi umum hanya administrator (root) yang bisa memanfaatkan protokol ICMP. § Java Database Connectivity (JDBC) JDBC menyediakan sekumpulan API yang dapat digunakan untuk mengakses database seperti Oracle, MySQL, PostgreSQL, Microsoft SQL Server. § Java Security Java Security menyediakan sekumpulan API untuk mengatur security dari aplikasi Java baik secara highlevel ataupun low-level, seperti public/private key management dan certificates. § Java Swing Java Swing menyediakan sekumpulan API untuk membangun aplikasi-aplikasi GUI (Graphical User Interface) dan model GUI yang diinginkan bisa bermacam-macam, bisa model Java, model Motif/CDE 19
§
§
§
§
§
§
§
20
atau model yang dependent terhadap platform yang digunakan. Java RMI Java RMI menyediakan sekumpulan API untuk membangun aplikasi-aplikasi Java yang mirip dengan model RPC (Remote Procedure Call) jadi object-object Java bisa di-call secara remote pada jaringan komputer. Java 2D/3D Java 2D/3D menyediakan sekumpulan API untuk membangun grafik-grafik 2D/3D yang menarik dan juga akses ke printer. Java Server Pages Berkembang dari Java Servlet yang digunakan untuk menggantikan aplikasi-aplikasi CGI, JSP (Java Server Pages) yang mirip ASP dan PHP merupakan alternatif terbaik untuk solusi aplikasi Internet Anda. JNI (Java Native Interface) JNI menyediakan sekumpulan API yang digunakan untuk mengakses fungsi-fungsi pada library (*.dll atau *.so) yang dibuat dengan bahasa pemrograman yang lain seperti C,C++, dan Basic. Java Sound Java Sound menyediakan sekumpulan API untuk manipulasi sound. Java IDL + CORBA Java IDL (Interface Definition Language) menyediakan dukungan Java untuk implementasi CORBA (Common Object Request Broker) yang merupakan model distributed-object untuk solusi aplikasi besar di dunia networking. Java Card Java Card utamanya digunakan untuk aplikasi-aplikasi pada smart card, yang sederhana wujudnya seperti SIM Card pada handphone Anda.
§
JTAPI (Java Telephony API) Java Telephony API menyediakan sekumpulan API untuk memanfaatkan devices-devices telephony, sehingga akan cocok untuk aplikasi-aplikasi CTI (Computer Telephony Integration) yang Anda butuhkan seperti ACD (Automatic Call Distribution), PC-PBX dan lainnnya. Sebenarnya, ada banyak sekali API-API yang disediakan oleh Java yang bisa Anda manfaatkan sesuai kebutuhan Anda, Anda dapat melihatnya di situs utama Java, yakni http://java.sun.com/
21
22
Bab 3
Mengulas “helloWorld” Anda
Pada Bab 1 Anda telah belajar memprogram Java dengan membuat aplikasi “helloWorld” dan Java Applet “helloWorld”. Pada bab ini, kita akan mengulasnya kembali, sehingga Anda jauh lebih mengerti tentang anatomi/susunan program Java.
Aplikasi Java “helloWorld” Coba perhatikan kembali kode program Java “helloWorld” yang telah Anda buat pada Bab 1.
// Nama file : helloWorld.java // Deskripsi : Program yang menampilkan string "Say Hello to Java" class helloWorld { public static void main (String[] args){ System.out.println("Say Hello to Java"); } }
23
Pada baris pertama, Anda menemukan:
// Nama file : helloWorld.java // Deskripsi : Program yang menampilkan string "Say Hello to Java"
Perintah ini merupakan komentar program dari aplikasi Java di atas. Perhatikan bahwa Java menggunakan tiga model komentar, yakni: // Komentar ini sama dengan komentar yang digunakan pada program berbahasa C++, yaitu semua teks sebaris setelah tanda di atas akan dianggap sebagai komentar dan diabaikan oleh Java Compiler. Misalnya:
// Ini adalah komentar // Ini juga……… // Hanya berlaku untuk semua text disatu baris saja lho
/*……*/ Komentar ini sama dengan komentar yang digunakan pada program berbahasa C, yaitu semua teks yang berada di antara dua tanda di atas akan dianggap sebagai komentar dan diabaikan oleh Java Compiler. Misalnya:
/* Ini adalah komentar */ /* Ini ada multiline comment (komentar yang terdiri atas beberapa baris, Java menarik bukan ? */
24
/**……*/ Komentar ini digunakan khusus oleh Java untuk menghasilkan dokumentasi program Java, yang menggunakan tool Java khusus, yakni javadoc. Misalnya:
/** <TITLE> Ini adalah contoh */
Kemudian, pada baris berikutnya Anda menemukan:
class helloWorld { …………… }
Perintah ini merupakan definisi nama kelas Java. Sebuah kelas merupakan blueprint atau template yang menggambarkan data (berupa variabel) dan method (berupa fungsi-fungsi dan prosedur) dari object yang bersangkutan. Lalu apa bedanya kelas dan object? Perbedaan mendasar adalah kelas merupakan blueprint dari object, jadi object merupakan hasil instansiasi dari kelas. Contoh sederhana yang lebih menggambarkan perbedaan kelas dan object jika digambarkan dalam contoh program C adalah sebagai berikut:
25
/* Definisi struktur dalam C mirip kelas dalam Java, dimana tidak dialokasikan memori untuk definisi ini */ struct t_mahasiswa { char *nim; char *nama; char *alamat; } /* Definisi variabel dalam C bertipe struktur t_mahasiswa mirip definisi object dalam Java dimana dari sebuah kelas bisa diciptakan banyak object yang pada dasarnya bertipe sama (karena dari 1 kelas yang sama) Pada saat pendefinisian object (instansiasi dari kelas) di Java, maka dilakukan alokasi memori untuk object yang bersangkutan */ struct t_mahasiswa mahasiswa1; struct t_mahasiswa mahasiswa2;
Jika Anda belum jelas, jangan khawatir karena kita akan mengulasnya lebih jauh pada bab yang membahas konsep Object Oriented Programming. Java secara sederhana menggunakan sintaks sebagai berikut untuk mendefinisikan nama sebuah kelas:
class { ……………………… }
26
Misalnya:
class helloWorld { ……………………… } class book { ……………………… }
Pada aplikasi Java “helloWorld” yang telah kita buat, tampak bahwa dalam kelas helloWorld kita hanya ada satu method/prosedur, yakni main(),
public static void main(String[ ] args) { …………… }
Perintah tersebut merupakan method utama dalam kelas helloWorld yang kita definisikan. Setiap aplikasi Java harus mengandung definisi main method di atas, seperti halnya program dalam bahasa C yang harus mengandung fungsi main(), karena eksekusi program akan dimulai pada method ini. Jika aplikasi Java Anda tidak mengandung main method, akan terjadi kesalahan saat dijalankan dengan pesan kesalahannya sebagai berikut:
Exception in thread "main" java.lang.NoSuchMethodError: main
27
Mengenai definisi method-method akan dibahas lebih lanjut pada bab selanjutnya. Pada baris berikutnya, Anda menemukan:
System.out.println(“Say Hello to Java”);
Perintah ini digunakan untuk mencetak string “Say Hello to Java” ke standard output (dalam hal ini layar monitor Anda). Tampak sekali bahwa Java benar-benar berorientasi object, bahkan untuk mencetak ke layar pun digunakan object System. Pada aplikasi “helloWorld” yang kita buat kita menggunakan salah satu kelas yang telah disediakan, yakni System yang merupakan bagian dari Java API, yang menyediakan akses ke sistem yang ada. Perhatikan model penggunaan object dan kelas di atas, out dalam System.out di atas merupakan variabel dalam kelas System yang tidak diinstansiasi, jadi untuk mengakses variabel atau method dalam suatu object atau kelas pada Java digunakan tanda titik (“.”). Mungkin Anda masih bingung dalam hal ini, namun, kita akan membahasnya lebih lanjut pada bab yeng mengupas tentang paradigma pemrograman berorientasi object. Selain itu, pada bab yang lain Anda akan belajar cara melakukan proses I/O tidak hanya pada layar, namun juga ke file dan socket (untuk aplikasi networking).
Applet Java “helloWorld” Coba perhatikan kembali kode program Applet Java “helloWorld” yang telah Anda buat pada Bab 1.
28
// Nama file : helloWorld.java (Applet Java) // Deskripsi : Applet yang menampilkan string "Say Hello to Java" // pada browser import java.applet.* ; import java.awt.* ; public class helloWorld extends Applet { public void paint(Graphics g){ g.drawString(“Say Hello To Java”,50,25); } }
Pada baris setelah komentar, Anda menemukan:
import java.applet.* ; import java.awt.* ;
Perintah ini digunakan untuk mengimpor paket-paket kelas Java API yang diperlukan untuk membuat Applet. Ada dua kelas penting yang digunakan oleh Applet Java “helloWorld” kita, yakni kelas java.applet.Applet dan java.awt.Graphics. Perhatikan bahwa pada aplikasi “helloWorld” sebelumnya, untuk menggunakan kelas System kita tidak perlu mengimpor paket yang menyediakan kelas System. Hal ini dikarenakan kelas System yang ada dalam paket java.lang secara default akan diimpor oleh Java, sehingga kita tidak perlu mengimpornya secara eksplisit. Pada baris berikutnya, Anda akan menemukan:
29
public class helloWorld extends Applet { …………………………………………….. }
Perintah ini mendefinisikan kelas “helloWorld” yang menjadi subkelas Applet. Apakah subkelas itu? Kita akan membahasnya lebih lanjut pada bab yang membahas tentang paradigma pemrograman berorientasi object. Applet Java harus merupakan subkelas dari kelas Applet atau JApplet yang disediakan oleh Java API. Cara mendeklarasikan subkelas adalah dengan menggunakan kata kunci extends diikuti dengan nama kelas yang menjadi superkelasnya. Mengenai applet akan dibahas lebih lanjut pada bab-bab yang berikutnya. Pada baris berikutnya, Anda akan menemukan:
public void paint(Graphics g){ g.drawString(“Say Hello To Java”,50,25); }
Perintah ini merupakan implementasi dari method yang disediakan oleh kelas Applet. Pada dasarnya, semua applet haruslah mengimplementasikan satu atau lebih di antara init(), start() dan paint(). Pada contoh di atas, yang diimplementasikan adalah method paint() saja. Setelah melewati Bab 3 ini, diharapkan Anda semakin mengerti tentang Java, bagaimana anatominya, kekuatannya dan yang paling penting bagaimana Java bisa menjadi solusi bagi permasalahan Anda.
30
Bab 4
Variabel dalam Java
Seperti halnya pada bahasa pemrograman pada umumnya, Java juga memungkinkan untuk mendeklarasikan variabel. Bab ini akan menjelaskan tentang variabel dalam Java.
Sekilas Tentang Variable dalam Java Variabel merupakan container yang digunakan untuk menyimpan suatu nilai pada sebuah program dengan tipe tertentu. Pada dasarnya ada dua macam tipe variabel data dalam bahasa Java, yakni tipe primitif dan tipe reference. Adapun tipe primitif meliputi: § Tipe boolean § Tipe numerik, yang meliputi: o byte o short o int o long o char o float o double Sedangkan tipe data variabel berupa reference terdiri atas tipe variabel data:
31
§
tipe class § tipe array § tipe interface Ada pula tipe variabel data yang khusus yang disebut null types, namun variabel dalam Java tidak akan pernah memiliki tipe null ini. Perhatikan contoh program Java berikut:
/* * Nama file : example.java * Deskripsi : contoh program Java yang *
memanfaatkan penggunaan variabel
* Kompilasi : javac example.java * Eksekusi program : java example */ class example { public static void main(String[] args){ int dataint = 19; char mychar = ‘8’; System.out.println(“Data Integer = “ + dataint); System.out.println(“Data char = “ + mychar); } }
Program di atas menunjukkan penggunaan dua tipe variabel dalam Java, yakni int dan char. Jadi, pada Java, untuk mendeklarasikan sebuah variabel digunakan sintaks sebagai berikut:
32
Contohnya:
int dataInt; char charData; float x;
Java memungkinkan kita langsung menginisialisasi nilai sebuah variabel saat dideklarasikan dengan cara seperti ini:
int dataInt = 10; char charData = ‘\u103’; float x = 12.67;
Konstanta dalam Java Variabel dalam Java bisa dijadikan konstanta, sehingga nilainya tidak akan dapat diubah-ubah dengan mendeklarasikannya sebagai variabel final seperti ini:
final int dataInt = 10; final char charData = ‘\u103’; final float x = 12.67; final byte y = 2;
Penamaan Variabel dan Scope Variable dalam Java 33
Penamaan sebuah variabel dalam Java harus memenuhi aturan sebagai berikut: § Harus terdiri atas sederetan karakter unicode yang diawali oleh karakter huruf atau garis bawah. Unicode merupakan sistem pengkodean karakter yang dapat dibaca oleh berbagai bahasa manusia. Ada maksimum 65.536 karakter yang dapat digunakan. Jika pada ASCII, kita hanya terbatas pada karakter latin, dengan unicode kita mampu mengbaca karakter dengan jenis alfabet seperti Jepang, Yunani, Cyrillic, dan Hebrew. Namun, saat ini karakter unicode yang sudah terdefinisi baru sekitar 34.168 karakter. § Tidak boleh berupa keyword (kata yang dicadangkan), null, atau literal true/false. § Harus unik dalam suatu scope Contoh pendeklarasian nama variabel yang salah: int 8k; /* salah, karena nama diawali dengan angka */ char null; /* salah, karena nama variabel = null */ String public; /* salah, karena nama = public yang */ /* merupakan keyword dalam Java */
/* * Nama file : var.java * Deskripsi : contoh program Java yang memberikan penamaan variabel yang tidak unik dalam 1 scope * Kompilasi : javac var.java * Eksekusi : java var */ class var { public static void main(String[] args){ int dataint = 19; char mychar = ‘8’;
34
System.out.println(“Data Integer = “ + dataint); System.out.println(“Data char = “ + mychar); /* Deklarasi variabel bertipe String */ String dataint; /* Salah, karena sudah ada variabel dengan nama dataint, dalam scope yang sama */ } }
Contoh pendeklarasian nama variabel yang benar: int k8; /* benar, karena nama tidak diawali dengan angka */ char Nnull; /* benar, karena nama bukan true,false,null, atau keyword */ String Spublic; /* benar, karena nama variabel keyword */
/* * Nama file : var.java * Deskripsi : contoh program Java yang memberikan penamaan variabel yang unik dalam 1 scope * Kompilasi : javac var.java * Eksekusi program : java var */ class var { /* Deklarasi variabel bertipe String */ String dataint; /* Benar, karena tidak ada variabel dengan nama dataint, dalam scope yang sama, perhatikan variabel dataint dalam method public static void main(String[] args) */
35
public static void main(String[] args){ int dataint = 19; char mychar = ‘8’; System.out.println(“Data Integer = “ + dataint); System.out.println(“Data char = “ + mychar); } }
Gambar 4-1. Scope Variabel dalam Java Scope variabel dalam Java dapat digambarkan seperti pada Gambar 4-1. Scope sebuah variabel harus diperhatikan dengan baik pada Java, karena program Anda boleh jadi menjadi error, hanya karena urusan scope variabel yang tidak benar.
36
Lebih Jauh Tentang Beberapa Tipe Variabel dalam Java Tipe Boolean Dalam Java, setiap variabel yang bertipe boolean hanya akan memiliki nilai true atau false. Contoh:
/* * Nama file : myBool.java * Deskripsi : contoh program Java yang memanfaatkan penggunaan variabel boolean * Kompilasi : javac myBool.java * Eksekusi program : java myBool */ class myBool { public static void main(String[] args){ boolean nilai1 = true; boolean nilai2 = false; System.out.println(“Boolean 1 = “ + nilai1); System.out.println(“Boolean 2 = “ + nilai2); } }
Tipe Numerik Adapun tipe numerik dalam Java ada tujuh macam seperti yang telah dijelaskan sebelumnya, yakni:
37
Nama Tipe
Ukuran
Range nilai
byte
8 bit
-128 ……127
Short
16 bit
-32768 … 32767
int
32 bit
-2147483648… 2147483647
long
64 bit
-9223372036854775808 … 9223372036854775808
char
16 bit
float
32 bit IEEE 754
double
64 bit IEEE 754
0..65535 ( ‘\u0000’ … ‘\uffff’ )
Selain adanya variabel-variabel di atas, juga ada kelas-kelas yang disediakan oleh Java API untuk tipe variabel di atas yakni Boolean, Byte, Short, Integer, Long, Character, Float, Double. Kelas-kelas ini secara default diimpor oleh Java saat kompilasi, namun secara eksplisit dapat Anda import dari package java.lang. Contoh penggunaan kelas Boolean, Byte, Short, Integer, Long, Char, Float sebagai variabel dalam Java:
/* * Nama file : myExample.java * Deskripsi : Penggunaan kelas-kelas Float,Byte dst dalam Java * Kompilasi : javac myExample.java * Eksekusi program : java myExample */ /* Import Package dibawah ini dapat dihilangkan karena secara default telah diimport oleh Java Compiler
38
*/ import java.lang.Boolean; import java.lang.Byte; import java.lang.Short; import java.lang.Integer; import java.lang.Long; import java.lang.Float; import java.lang.Double; import java.lang.Character; class myExample { public static void main(String[] args){ Boolean myBool1 = new Boolean(true); Boolean myBool2 = new Boolean(“false”); System.out.println(“My Boolean1 = “ + myBool1.booleanValue()); System.out.println(“My Boolean2 = “ + myBool2.toString()); Byte myByte1 = new Byte(“0”); System.out.println(“Byte Value = “ + myByte1.toString()); System.out.println(“Byte Max = “ + myByte1.MAX_VALUE); System.out.println(“Byte Min = “ + myByte1.MIN_VALUE); Short myShort1 = new Short(“8”); System.out.println(“Short Value = “ + myShort1.toString()); System.out.println(“Short Max = “ + myShort1.MAX_VALUE); System.out.println(“Short Min = “ + myShort1.MIN_VALUE); Integer myInteger1 = new Integer(76); Integer myInteger2 = new Integer(45); System.out.println(“Integer1 Value = “ + myInteger1.toString()); System.out.println(“Integer2 Value = “ + myInteger2.toString()); System.out.println(“Integer Max = “ + myInteger1.MAX_VALUE); System.out.println(“Integer Min = “ + myInteger1.MIN_VALUE); System.out.println(“Integer1 + Integer2 = “ + (myInteger1.intValue() + myInteger2.intValue()));
39
Long myLong1 = new Long(1024); Long myLong2 = new Long(102513); System.out.println(“Long1 Value = “ + myLong1.toString()); System.out.println(“Long2 Value = “ + myLong2.toString()); System.out.println(“Long Max = “ + myLong1.MAX_VALUE); System.out.println(“Long Min = “ + myLong1.MIN_VALUE); System.out.println(“Long1 + Long2 = “ + (myLong1.longValue() + myLong2.intValue())); Character myChar1 = new Character(‘X’); Character myChar2 = new Character(‘\u1674’); System.out.println(“Char1 Value = “ + myChar1.charValue()); System.out.println(“Char2 Value = “ + myChar2.charValue()); Float myFloat = new Float(1024.45); System.out.println(“myFloat Value = “ + myFloat.toString()); System.out.println(“Float Max = “ + myFloat.MAX_VALUE); System.out.println(“Float Min = “ + myFloat.MIN_VALUE); Double myDouble = new Double(12e3); System.out.println(“myDoubleValue = “ + myDouble.toString()); System.out.println(“Double Max = “ + myDouble.MAX_VALUE); System.out.println(“Double Min = “ + myDouble.MIN_VALUE); } }
Itulah penjelasan singkat tentang variabel dalam bahasa pemrograman Java. Penulis mengingatkan semakin sering Anda memprogram, Anda akan semakin terlatih, jadi cobalah selalu contoh-contoh yang ada pada buku ini.
40
Bab 5
Operator dalam Java
Operator dalam Java dibedakan menjadi beberapa jenis, yakni: § Operator aritmetika § Operator Relasional § Operator kondisional § Operator shift dan lojik § Operator assignment § Operator lainnya
Operator Aritmatika Sama halnya dengan semua bahasa pemrograman, Java menyediakan operator-operator aritmatika untuk manipulasi variabel data numerik. Tabel penggunaan dan jenis operator artimatika dalam Java bisa dilihat di bawah ini: Tabel 5-1. Operator Aritmetika dalam Java Operator
Penggunaan
Deskripsi
+
Op1 + Op2
Menambahkan Op1 dengan Op2
-
Op1 – Op2
Mengurangkan Op1 dengan Op2
*
Op1 * Op2
Mengalikan Op1 dengan Op2
/
Op1 / Op2
Membagi Op1 dengan Op2
%
Op1 % Op2
Menghasilkan sisa hasil bagi antara Op1 dengan Op2
41
Contoh penggunaan operator aritmetika dapat Anda lihat sebagai berikut:
/* * Nama file : opArit.java * Deskripsi : contoh program Java yang memanfaatkan operator aritmatika * Kompilasi : javac opArit.java * Eksekusi program : java opArit */ import java.io.*; class opArit { public static void main(String[] args){ int pilihan = -1; try { while(true){ System.out.println("Menu aritmetika bilangan integer"); System.out.println("================================"); System.out.println("1. Penambahan"); System.out.println("2. Pengurangan"); System.out.println("3. Perkalian"); System.out.println("4. Pembagian (/)"); System.out.println("5. Modulo (%)"); System.out.println("0. Keluar"); System.out.print("Pilihan menu [1-5] : "); BufferedReader answer = new
BufferedReader(new
InputStreamReader(System.in));
pilihan = (new Integer(answer.readLine())).intValue(); if(pilihan == 0){ System.out.println("Terima kasih. Bye");
42
break; }else if(pilihan > 5 || pilihan < 0){ System.out.println("Masukan pilihan salah !"); }else{ System.out.print("Masukkan operator 1 : "); int op1 = (new Integer( (new BufferedReader( new InputStreamReader(System.in))).readLine())).intValue(); System.out.print("Masukkan operator 2 : "); int op2 = (new Integer( (new BufferedReader( new InputStreamReader(System.in))).readLine())).intValue(); // Penggunaan operator aritmatika dalam Java // -----------------------------------------------------------if(pilihan == 1){ System.out.println("Hasil Penjumlahan"); System.out.println(op1 + " + " + op2 + " = " + (op1 + op2)); }else if(pilihan == 2){ System.out.println("Hasil Pengurangan"); System.out.println(op1 + " - " + op2 + " = " + (op1 - op2)); }else if(pilihan == 3){ System.out.println("Hasil Perkalian"); System.out.println(op1 + " * " + op2 + " = " + (op1 * op2)); }else if(pilihan == 4){ System.out.println("Hasil Pembagian"); System.out.println(op1 + " / " + op2 + " = " + (op1 / op2)); }else if(pilihan == 5){ System.out.println("Hasil Modulo"); System.out.println(op1 + " % " + op2 + " = " + (op1 % op2)); } System.out.println("\n\n"); } } }catch(IOException e){
43
System.out.println("Error I/O"); System.exit(0); } // end of try-catch } // end of public static void main() } // end of class opArit
Contoh hasil eksekusi dari program di atas adalah seperti ini:
Menu aritmetika bilangan integer ================================ 1. Penambahan 2. Pengurangan 3. Perkalian 4. Pembagian (/) 5. Modulo (%) 0. Keluar Pilihan menu [1-5] : 1 Masukkan operator 1 : 12 Masukkan operator 2 : 123 Hasil Penjumlahan 12 + 123 = 135 Menu aritmetika bilangan integer ================================ 1. Penambahan 2. Pengurangan 3. Perkalian 4. Pembagian (/) 5. Modulo (%) 0. Keluar Pilihan menu [1-5] : 2 Masukkan operator 1 : 312 Masukkan operator 2 : 312312 Hasil Pengurangan
44
312 – 312312 = -312000 Menu aritmetika bilangan integer ================================ 1. Penambahan 2. Pengurangan 3. Perkalian 4. Pembagian (/) 5. Modulo (%) 0. Keluar Pilihan menu [1-5] : 3 Masukkan operator 1 : 1238 Masukkan operator 2 : 123 Hasil Perkalian 1238 * 123 = 152274 Menu aritmetika bilangan integer ================================ 1. Penambahan 2. Pengurangan 3. Perkalian 4. Pembagian (/) 5. Modulo (%) 0. Keluar Pilihan menu [1-5] : 4 Masukkan operator 1 : 12 Masukkan operator 2 : 5 Hasil Pembagian 12 / 5 = 2
Selain operator di atas, operator berikut juga termasuk dalam operator aritmetika:
45
Tabel 5-2. Operator Aritmetika dalam Java Operator
Penggunaan
Deskripsi
++
Op++
Op dinaikkan nilainya 1 setelah dilakukan operasi pada Op
++
++Op
Op dinaikkan nilainya 1 sebelum dilakukan operasi pada Op
--
Op--
Op diturunkan nilainya 1 setelah dilakukan operasi pada Op
--
--Op
Op diturunkan nilainya 1 setelah dilakukan operasi pada Op
-
-Op
Mengubah nilai Op menjadi negasinya, jika Op positif maka menjadi negatif, jika Op negatif menjadi positif
Contoh sederhana dari penggunaan operator di atas adalah:
/* * Nama file : opArit2.java * Deskripsi : contoh program Java yang memanfaatkan operator ++,-* Kompilasi : javac opArit2.java * Eksekusi program : java opArit2 */ class opArit2{ public static void main(String args[]){ int op1 = 100; int op2 = 200; int tmp = op1; System.out.println("Perhatikan baik-baik"); System.out.println("Op1 = " + op1); System.out.println("Op2 = " + op2); System.out.println("Op1 dinaikkan 1 setelah operasi dilakukan");
46
System.out.println("(Op1++) + Op2 = " + ((op1++) + op2)); System.out.println("Nilai Op1 sekarang = " + op1); op1 = tmp; System.out.println("Op1 dinaikkan 1 sebelum operasi dilakukan"); System.out.println("(++Op1) + Op2 = " + ((++op1) + op2)); System.out.println("Nilai Op1 sekarang = " + op1); } }
Contoh hasil eksekusi dari program di atas adalah seperti ini:
F:\Books\Java\program>java opArit2 Perhatikan baik-baik Op1 = 100 Op2 = 200 Op1 dinaikkan 1 setelah operasi dilakukan (Op1++) + Op2 = 300 Nilai Op1 sekarang = 101 Op1 dinaikkan 1 sebelum operasi dilakukan (++Op1) + Op2 = 301 Nilai Op1 sekarang = 101
Perhatikan hasil eksekusi program di atas! Pada kasus pertama, Op1 dinaikkan 1 setelah operasi dilakukan, maka yang terjadi adalah operasi Op1+Op2 dihitung terlebih dahulu, baru kemudian nilai Op1 dinaikkan. Pada kasus kedua, Op1 dinaikkan 1 terlebih dahulu sebelum operasi dilakukan, maka yang terjadi adalah operand Op1 dinaikkan 1 terlebih dahulu sehingga menjadi 101, baru kemudian dilakukan operasi Op1+Op2. Anda bisa lihat perbedaannya?
47
Operator Relasional Operator relasional dalam Java dapat digunakan untuk membandingkan antara dua variabel data, lebih lengkapnya dapat dilihat dalam tabel berikut ini: Tabel 5-3. Operator Relasional dalam Java Operator
Penggunaan
Deskripsi
>
Op1 > Op2
Menghasilkan true jika Op1 lebih besar dari Op2
<
Op1 < Op2
Menghasilkan true jika Op1 lebih kecil dari Op2
>=
Op1 >= Op2
Menghasilkan true jika Op1 lebih besar atau sama dengan Op2
<=
Op1 <= Op2
Menghasilkan true jika Op1 lebih kecil atau sama dengan Op2
==
Op1 == Op2
Menghasilkan dengan Op2
!=
Op1 != Op2
Menghasilkan true jika Op1 tidak sama dengan Op2
true
jika
Op1
sama
Contoh penggunaan operator relasional dapat Anda lihat di program berikut ini:
/* * Nama file : relasional.java * Deskripsi : contoh program Java yang memanfaatkan operator relasional <,>,<=,>=,!=,== * Kompilasi : javac relasional.java * Eksekusi program : java relasional <parameter> */
48
public class relasional { public static void main(String[] args) { if(args.length != 3){ System.out.print("Penggunaan: java relasional "); System.out.println(" \"\" "); System.out.print("Keterangan: oprel (operator relasional)"); System.out.println(": <, >, <=, >=, !=, =="); System.out.println("Contoh: java relasional 10 \"<=\" 100"); System.exit(0); } try { Integer op1 = new Integer(args[0]); Integer op2 = new Integer(args[2]); // Contoh penggunaan operator relasional dalam Java // -----------------------------------------------if(args[1].equalsIgnoreCase("<")){ System.out.print(args[0] + " < " + args[2]); System.out.println(" = " + (op1.intValue() < op2.intValue())); }else if(args[1].equalsIgnoreCase(">")){ System.out.print(args[0] + " > " + args[2]); System.out.println(" = " + (op1.intValue() > op2.intValue())); }else if(args[1].equalsIgnoreCase(">=")){ System.out.print(args[0] + " >= " + args[2]); System.out.println(" = " + (op1.intValue() >= op2.intValue())); }else if(args[1].equalsIgnoreCase("<=")){
49
System.out.print(args[0] + " <= " + args[2]); System.out.println(" = " + (op1.intValue() <= op2.intValue())); }else if(args[1].equalsIgnoreCase("==")){ System.out.print(args[0] + " == " + args[2]); System.out.println(" = " + (op1.intValue() == op2.intValue())); }else if(args[1].equalsIgnoreCase("!=")){ System.out.print(args[0] + " != " + args[2]); System.out.println(" = " + (op1.intValue() != op2.intValue()));
}else{
System.out.println("Operator \"" + args[1] + "\" tidak dikenal"); } }catch (NumberFormatException e){ System.out.println("Kesalahan format operator angka"); System.out.println(e.toString()); System.exit(0); } } }
Contoh hasil eksekusi dari program di atas adalah seperti ini:
F:\Books\Java\program>java relasional 10 "==" 13 10 == 13 = false F:\Books\Java\program>java relasional 13 ">-" 123 Operator ">-" tidak dikenal F:\Books\Java\program>java relasional 13 ">=" 123 13 >= 123 = false
50
F:\Books\Java\program>java relasional 13 "!=" 123 13 != 123 = true F:\Books\Java\program>java relasional 13 "!=" 13 13 != 13 = false F:\Books\Java\program>java relasional Penggunaan: java relasional "" Keterangan: oprel (operator relasional) : <, >, <=, >=, !=, == Contoh: java relasional 10 "<=" 100 F:\Books\Java\program>java relasional tes tes tes2 Kesalahan format operator angka java.lang.NumberFormatException: tes
Operator Kondisional Operator kondisional dalam Java ada enam macam sebagaimana digambarkan dalam tabel berikut ini: Tabel 5-4. Operator Kondisional dalam Java Operator
Penggunaan
Deskripsi
&&
Op1 && Op2
Menghasilkan true jika Op1 dan Op2, keduanya bernilai boolean true
||
Op1 || Op2
Menghasilkan true jika Op1 atau Op2, salah satunya bernilai boolean true
!
! Op1
Menghasilkan boolean false
&
Op1 & Op2
Bitwise AND, menghasilkan true jika Op1 dan Op2 bernilai true
|
Op1 | Op2
Bitwise OR, menghasilkan true jika Op1 atau Op2 salah satunya bernilai true
^
Op1 ^ Op2
Menghasilkan true jika salah satu diantara Op1 atau Op2 bernilai true, namun tidak keduanya
true
jika
Op1
bernilai
51
Operator Shift Operator shift dalam Java digunakan untuk manipulasi bit. Operator shift digunakan untuk menggeser bit-bit sesuai yang diinginkan. Ada tiga operator shift dalam Java, yakni: Tabel 5-5. Operator Shift dalam Java Operator
Penggunaan
Deskripsi
>>
Op1 >> Op2
Menggeser bit Op1 ke kanan sejauh Op2
<<
Op1 << Op2
Menggeser bit Op1 ke kiri sejauh Op2
>>>
Op1 >>> Op2
Menggeser bit Op1 ke kanan sejauh Op2
Contoh programnya adalah:
/* * Nama file : demoBit.java * Deskripsi : contoh program Java yang memanfaatkan operator shift (penggeseran bit) * Kompilasi : javac demoBit.java * Eksekusi program : java demoBit */
class demoBit { public static void main(String[] args){ System.out.println("Demo penggunaan operator shift (penggeseran)"); if(args.length != 2){ System.out.print("penggunaan: java demoBit "); System.out.println(" "); System.exit(0);
52
} Integer op1 = new Integer(args[0]); Integer op2 = new Integer(args[1]); System.out.print(op1.intValue() + " >> " + op2.intValue()); System.out.println(" = " + (op1.intValue() >> op2.intValue()));
System.out.print(op1.intValue() + " << " + op2.intValue()); System.out.println(" = " + (op1.intValue() << op2.intValue())); System.out.print(op1.intValue() + " >>> " + op2.intValue()); System.out.println(" = " + (op1.intValue() >>> op2.intValue())); } }
Contoh hasil eksekusi dari program Java di atas adalah: F:\Books\Java\program>java demoBit 0 0 Demo penggunaan operator shift (penggeseran) 0 >> 0 = 0 0 << 0 = 0 0 >>> 0 = 0 F:\Books\Java\program>java demoBit 2 2 Demo penggunaan operator shift (penggeseran) 2 >> 2 = 0 2 << 2 = 8 2 >>> 2 = 0 F:\Books\Java\program>java demoBit 4 1 Demo penggunaan operator shift (penggeseran) 4 >> 1 = 2 4 << 1 = 8 4 >>> 1 = 2
53
Perhatikan contoh yang kedua di atas. Bit dari desimal 2 adalah “10”, jadi ketika biner “10” digeser ke kanan sejauh 2 posisi, hasilnya akan menjadi “00”. Ketika digeser ke kiri sejauh 2 posisi, bit “10” akan menjadi “1000” atau dalam desimalnya adalah “8”. Sama halnya pada contoh ketiga, nilai biner dari 4 adalah “100”, jika biner tersebut digeser ke kanan 1 posisi makan hasilnya adalah “010” atau bernilai “2” dalam desimal, dan jika digeser ke kiri 1 posisi, hasilnya adalah “1000” atau bernilai “8” dalam desimal.
Operator Bitwise Operator bitwise dalam Java juga digunakan untuk manipulasi bit. Tabel 5-6. Operator Bitwise dalam Java Operator
Penggunaan
Deskripsi
&
Op1 & Op2
Bitwise AND
|
Op1 | Op2
Bitwise OR
^
Op1 ^ Op2
Bitwise XOR
~
~Op
Bitwise Complement
Tabel berikut mendefinisikan kemungkinan hasil pada penggunaan operator bitwise:
Bitwise AND Bitwise AND akan menghasilkan bit “1” jika kedua operator bernilai bit “1”
54
Tabel 5-7. Operasi Bitwise AND dalam Java Op1
Op2
Op1 & Op2
0
0
0
0
1
0
1
0
0
1
1
1
Bitwise OR Bitwise OR akan menghasilkan bit “1” jika salah satu operator bernilai bit “1” Tabel 5-8. Operasi Bitwise OR dalam Java Op1
Op2
Op1 | Op2
0
0
0
0
1
1
1
0
1
1
1
1
Bitwise XOR (Exclusive OR) Bitwise XOR akan menghasilkan bit “1” jika kedua operator memiliki nilai bit yang berbeda. Tabel 5-9. Operasi Bitwise XOR dalam Java Op1
Op2
Op1 | Op2
0
0
0
0
1
1
1
0
1
1
1
0
55
Bitwise Complement Bitwise Complement akan menghasilkan berlawanan dengan bit yang dioperasikan.
bit
yang
Tabel 5-10. Operasi Bitwise Complement dalam Java Op
~Op
0
1
1
0
Contoh penggunaan operator bitwise dapat dilihat pada program Java berikut ini:
/* * Nama file : bitWise.java * Deskripsi : contoh program Java yang memanfaatkan operator bitwise * Kompilasi : javac bitWise.java * Eksekusi program : java bitWise */
class bitWise { public static void main(String[] args){ System.out.println("Demo penggunaan operator bitwise"); if(args.length != 3){ System.out.println("penggunaan: java bitWise "); System.exit(0); } int op1
56
= (new Integer(args[0])).intValue();
int op2
= (new Integer(args[1])).intValue();
String opr = args[2];
if(opr.equalsIgnoreCase("&")){ System.out.println(op1 + " & " + op2 + " = " + (op1 & op2)); }else if(opr.equalsIgnoreCase("|")){ System.out.println(op1 + " | " + op2 + " = " + (op1 | op2)); }else if(opr.equalsIgnoreCase("^")){ System.out.println(op1 + " ^ " + op2 + " = " + (op1 ^ op2)); }else{ System.out.println("Unimplemented"); } } }
Contoh hasil eksekusi dari program Java di atas adalah:
F:\Books\Java\program>java bitWise 1 1 "&" Demo penggunaan operator bitwise 1&1=1 F:\Books\Java\program>java bitWise 1 0 "&" Demo penggunaan operator bitwise 1&0=0 F:\Books\Java\program>java bitWise 0 0 "&" Demo penggunaan operator bitwise 0&0=0
57
F:\Books\Java\program>java bitWise 1 1 "|" Demo penggunaan operator bitwise 1|1=1 F:\Books\Java\program>java bitWise 1 1 "^" Demo penggunaan operator bitwise 1^1=0
Operator Assignment Operator assignment dalam Java digunakan untuk memberikan sebuah nilai ke sebuah variabel. Operator assignment hanya berupa ‘=’, namun selain itu dalam Java dikenal beberapa shortcut assignment operator yang penting, yang digambarkan dalam tabel berikut: Tabel 5-11. Operator Assignment dalam Java Operator
Penggunaan
Ekivalen dengan
+=
Op1 += Op2
Op1 = Op1 + Op2
-=
Op1 -= Op2
Op1 = Op1 - Op2
*=
Op1 *= Op2
Op1 = Op1 * Op2
/=
Op1 /= Op2
Op1 = Op1 / Op2
%=
Op1 %= Op2
Op1 = Op1 % Op2
&=
Op1 &= Op2
Op1 = Op1 & Op2
|=
Op1 |= Op2
Op1 = Op1 | Op2
^=
Op1 ^= Op2
Op1 = Op1 ^ Op2
<<=
Op1 <<= Op2
Op1 = Op1 << Op2
>>=
Op1 >>= Op2
Op1 = Op1 >> Op2
>>>=
Op1 >>>= Op2
Op1 = Op1 >>> Op2
Operator Lain Operator-operator yang tidak termasuk dalam golongan operator-operator yang disebutkan di atas adalah : 58
? Operator ini merupakan operator pendek untuk pernyataan if(…)else, contohnya adalah sebagai berikut:
/* * Nama file : misc1.java * Deskripsi : contoh program Java yang memanfaatkan operator bitwise * Kompilasi : javac misc1.java * Eksekusi program : java misc1 */ class misc1 { public static void main(String[] args){ int op1 = 100; int op2 = 200; boolean result; /* * Ekspresi berikut merupakan pengganti dari * if(op1 < op2) { *
result = true;
* }else{ *
result = false;
*} */ result = (op1 < op2) ? true : false; System.out.println("Result : "+ result); } }
Operator ini akan dibahas lebih jauh pada bagian yang lain di buku ini. 59
new, [ ], instanceof, operator (tipe data), operator “.” Operator-operator yang baru saja disebutkan akan dibahas pada bagian lain di buku ini.
Urutan Precedence Operator Operasi-operasi yang menggunakan operator dapat melibatkan lebih dari 1 operator dan 1 operand. Contohnya adalah:
X + y + Z; X * Y + Z; X / Y + Z++;
Hal-hal di atas sering membingungkan kita untuk menentukan bagian mana yang akan dioperasikan terlebih dahulu, karenanya lebih baik agar kita menggunakan ( ) untuk mengalokasikan urutan blok operasi yang akan dijalankan. Contohnya:
X + Y / 100; // Membingungkan
Akan lebih baik jika ditulis seperti ini:
(X+Y) / 100; /* yang berarti operasi X+Y akan dilakukan dahulu baru kemudian dibagi dengan 100 */
60
Adapun urutan precedence operator dalam Java, secara lengkap digambarkan dalam tabel berikut: Tabel 5-12. Urutan Precedence Operator dalam Java postfix operators
[ ] . (params) expr++ expr--
unary operators
++expr --expr +expr -expr ~ !
Creation or cast
new (type)expr
multiplicative
*/%
Additive
+-
Shift
<< >> >>>
relational
< > <= >= instanceof
Equality
== !=
bitwise AND
&
bitwise exclusive OR
^
bitwise inclusive OR
|
logical AND
&&
logical OR
||
conditional
?:
assignment
= += -= *= /= %= &= ^= |= <<= >>= >>>=
Pada bab ini, Anda telah dikenalkan dengan operatoroperator dalam bahasa Java. Pada bab berikutnya, Anda akan belajar tentang control-flow yang antara lain digunakan untuk operasi berikut dalam bahasa Java. § pengulangan § operasi kondisional (if-else) § penanganan exception
61
62
Bab 6
ControlFlow dalam Java
Pada bab ini akan dibahas tentang control flow dalam Java yang meliputi hal-hal berikut ini: § Operasi pengulangan (looping): while, do-while, for § Operasi kondisional: if-else, switch-case § Operasi penanganan exception: try-catch-finally, thrown § break, return, label:, continue Control flow merupakan bagian penting dalam program dalam bahasa apapun, karenanya diharapkan Anda benarbenar memahami materi pada bab ini. Khusus untuk operasi penanganan exception tidak akan dibahas dalam bab ini, dan akan dibahas pada bab berikutnya.
Operasi Pengulangan While Statement while digunakan untuk mengeksekusi sebuah blok secara berulang selama memenuhi kondisi tertentu. Sintaks penggunaannya adalah sebagai berikut:
63
while (ekspresi){ ……statement…… }
Jadi, selama ekspresi menghasilkan nilai true, statement yang ada akan dieksekusi secara terus-menerus. Contoh sederhana penggunaan while() adalah sebagai berikut:
/* * Nama file : whileDemo.java * Deskripsi : contoh program Java yang memanfaatkan while(), yakni untuk menelusuri sebuah string dan mencetak karakter-karakternya * Kompilasi : javac whileDemo.java * Eksekusi program : java whileDemo */ import java.io.*; class whileDemo{ public static void main(String args[]){ String str1 = “Welcome”; int idx = 0; while (idx < str1.length()){ System.out.println(“Karakter ke : “ + idx + “ = “ + str1.charAt(idx)); idx++; } } }
64
Adapun, hasil eksekusi dari program Java di atas adalah sebagai berikut:
F:\Books\Java\program>java whileDemo Karakter ke : 0 = W Karakter ke : 1 = e Karakter ke : 2 = l Karakter ke : 3 = c Karakter ke : 4 = o Karakter ke : 5 = m Karakter ke : 6 = e
Contoh di atas dapat dimodifikasi agar lebih menarik, yakni dengan mengambil informasi string dari argumen saat program dijalankan
/* * Nama file : whileDemo2.java * Deskripsi : contoh program Java yang memanfaatkan while(), seperti sebelumnya namun dengan mengambil informasi string dari argumen saat program dieksekusi * Kompilasi : javac whileDemo2.java * Eksekusi program : java whileDemo2 <string> */ import java.io.*; class whileDemo2{ public static void main(String args[]){
65
if(args.length != 1){ System.out.println(“usage: java whileDemo2 <string>”); System.exit(0); } String str1 = args[0]; int idx = 0; while (idx < str1.length()){ System.out.println(“Karakter ke : “ + idx + “ = “ + str1.charAt(idx)); idx++; } } }
Contoh eksekusi dari program Java di atas adalah sebagai berikut:
F:\Books\Java\program>java whileDemo2 usage: java whileDemo2 <string> F:\Books\Java\program>java whileDemo2 "Mengapa ?" Karakter ke : 0 = M Karakter ke : 1 = e Karakter ke : 2 = n Karakter ke : 3 = g Karakter ke : 4 = a Karakter ke : 5 = p Karakter ke : 6 = a Karakter ke : 7 = Karakter ke : 8 = ?
66
Do-While Sama halnya dengan while, statement do-while digunakan untuk mengeksekusi sebuah blok secara berulang sampai tidak memenuhi kondisi tertentu. Pada penggunaan while, ekspresi diperiksa pada saat awal, jadi ada kemungkinan blok statement dalam while tidak pernah dieksekusi. Pada penggunaan do-while, ekspresi tidak diperiksa pada saat awal eksekusi, jadi minimal blok statement do-while akan dieksekusi sekali. Sintaks penggunaannya adalah sebagai berikut:
do { ……statement…… }while (ekspresi){
Contoh penggunaan do-while, sebagai modifikasi contoh di atas adalah sebagai berikut:
/* * Nama file : dowhileDemo.java * Deskripsi : contoh program Java yang memanfaatkan do-while(),yakni untuk menelusuri sebuah string dan mencetak karakter-karakternya * Kompilasi : javac dowhileDemo.java * Eksekusi program : java dowhileDemo <string> */ import java.io.*; class dowhileDemo{
67
public static void main(String args[]){ if(args.length != 1){ System.out.println(“usage: java dowhileDemo <string>”); System.exit(0); } String str1 = args[0]; int idx = 0; do{ System.out.println(“Karakter ke : “ + idx + “ = “ + str1.charAt(idx)); idx++; }while (idx < str1.length()); } }
Contoh eksekusi dari program Java di atas adalah sebagai berikut:
F:\Books\Java\program>java dowhileDemo "Bulan" Karakter ke : 0 = B Karakter ke : 1 = u Karakter ke : 2 = l Karakter ke : 3 = a Karakter ke : 4 = n
For Statement for digunakan untuk mengeksekusi sebuah blok secara berulang dalam sebuah range tertentu. Sintaks penggunaannya adalah sebagai berikut:
68
for (inisialisasi; terminasi; increment) { ……statement…… }
Inisialisasi dalam for merupakan ekspresi yang dieksekusi pada awal eksekusi for. Terminasi digunakan untuk menentukan kapan pengulangan akan dihentikan. Increment merupakan ekspresi yang akan dieksekusi setiap selesai melakukan satu looping (pengulangan). Perlu diperhatikan bahwa ketiga bagian di dalam for() bersifat opsional, jadi boleh tidak ada. Namun, jika ketiga bagian di atas kosong, akan menyebabkan terjadinya pengulangan tanpa henti (loop forever).
// Skema - Loop Forever dengan For for (;;) { ……statement…… }
Contoh berikut ini akan menjelaskan penggunaan for() dalam program Java:
bagaimana
/* * Nama file : forDemo.java * Deskripsi : contoh program Java yang memanfaatkan for(), untuk mencetak angka dari 0 sampai 9 * Kompilasi : javac forDemo.java * Eksekusi program : java forDemo
69
*/ import java.io.*; class forDemo{ public static void main(String args[]){ for(int idx = 0; idx < 10; idx++){ System.out.print(idx + “ “); } System.out.println(“”); } }
Contoh berikut merupakan modifikasi contoh di atas untuk menunjukkan bahwa bagian-bagian dalam for() bersifat opsional:
/* * Nama file : forDemo.java * Deskripsi : contoh program Java yang memanfaatkan for(), untuk mencetak angka dari 0 sampai 9 * Kompilasi : javac forDemo.java * Eksekusi program : java forDemo */ import java.io.*; class forDemo{ public static void main(String args[]){ int idx = 0;
70
for(; idx < 10; ){ System.out.print(idx + “ “); idx++; } System.out.println(“”); } }
Hasil eksekusi dari kedua program Java di atas adalah sebagai berikut :
F:\Books\Java\program>java forDemo 0123456789
Operasi Kondisional If-Else Statement if-else digunakan untuk mengeksekusi sebuah blok jika memenuhi sebuah kondisi tertentu. Sintaks penggunaannya sebagai berikut:
if (kondisi) { ……statement…… }
Jika kondisi bernilai true, statement yang ada akan dieksekusi. Contoh program sederhananya adalah sebagai berikut:
71
/* * Nama file : ifDemo1.java * Deskripsi : contoh program Java yang memanfaatkan if() * Kompilasi : javac ifDemo1.java * Eksekusi program : java ifDemo1 */ class ifDemo1{ public static void main(String args[]){ int idx = 0; if(idx > 10){ // Statement berikut tidak akan pernah dieksekusi System.out.println(“IDX lebih besar dari 10”); } } }
Ada kalanya kita menginginkan dua pencabangan, yakni jika suatu kondisi terpenuhi, lakukan aksi A, jika tidak, lakukan aksi B. Dua pencabangan ini dimungkinkan pula dengan menggunakan if-else() sebagai berikut:
if (kondisi) { ……statement 1 …… }else{ ……statement 2 …… }
72
Jika kondisi bernilai true, statement 1 akan dijalankan. Sebaliknya, jika kondisi bernilai false, statement 2-lah yang akan dijalankan. Dengan melakukan modifikasi pada contoh sebelumnya, dapat dihasilkan contoh program Java dengan menggunakan if-else() sebagai berikut:
/* * Nama file : ifDemo2.java * Deskripsi : contoh program Java yang memanfaatkan if-else() * Kompilasi : javac ifDemo2.java * Eksekusi program : java ifDemo2 */ class ifDemo2{ public static void main(String args[]){ int idx = 0; if(idx > 10){ // Statement berikut tidak akan pernah dieksekusi System.out.println(“IDX lebih besar dari 10”); }else{ System.out.println(“IDX tidak lebih besar dari 10”); } } }
Pada lain waktu mungkin kita menginginkan lebih dari dua pencabangan, maka hal ini dimungkinkan pula dengan menggunakan if-else() sebagai berikut:
73
if (kondisi-1) { ……statement 1 …… }else if (kondisi-2){ ……statement 2 …… }else if (kondisi-3){ ……statement 3 …… …………………………………………………………………… }else if (kondisi-n){ ……statement n …… }
Atau:
if (kondisi-1) { ……statement 1 …… }else if (kondisi-2){ ……statement 2 …… }else if (kondisi-3){ ……statement 3 …… …………………………………………………………………… }else if (kondisi-n){ ……statement n …… }else{ // Kondisi selain kondisi-1,2,…,n ……statement …… }
Contoh program berikut akan memanfaatkan if-else() dalam banyak pencabangan untuk menentukan indeks nilai dari mahasiswa:
74
/* * Nama file : indexMhs.java * Deskripsi : contoh program Java yang memanfaatkan if-else() dalam banyak kondisi, dan menampilkan index nilai dari mahasiswa * Kompilasi : javac indexMhs.java * Eksekusi program : java indexMhs */ class indexMhs{ public static void main(String args[]){ if(args.length != 1){ System.out.println(“usage: java indexMhs ”); System.exit(0); } int nilai = (new Integer(args[0])).intValue(); if(nilai < 0 || nilai > 100){ System.out.println(“Nilai System.exit(0);
harus
diantara
0-100”);
} if(nilai >= 90){ System.out.println(“Nilai : “ + nilai + “ – indeks : A”); }else if(nilai >= 75){ System.out.println(“Nilai : “ + nilai + “ – indeks : B”); }else if(nilai >= 55){ System.out.println(“Nilai : “ + nilai + “ – indeks : C”); }else if(nilai >= 45){ System.out.println(“Nilai : “ + nilai + “ – indeks : D”); }else{ System.out.println(“Nilai : “ + nilai + “ – indeks : E”); }
75
} }
Adapun, hasil eksekusi dari program Java di atas adalah sebagai berikut:
F:\Books\Java\program>java indexMhs 67 Nilai : 67 - indeks : C F:\Books\Java\program>java indexMhs 55 Nilai : 55 - indeks : C F:\Books\Java\program>java indexMhs 49 Nilai : 49 - indeks : D F:\Books\Java\program>java indexMhs 12 Nilai : 12 - indeks : E F:\Books\Java\program>java indexMhs -123 Nilai harus diantara 0-100
Switch-Case Statement switch digunakan untuk mengeksekusi sebuah blok jika memenuhi sebuah kondisi tertentu. Sintaks penggunaannya sebagai berikut:
switch(ekspresi) { case (kondisi-1): ……statement-1…… break; case (kondisi-2): ……statement-2……
76
break; …………………………………… case (kondisi-n): ……statement-n…… break; default: ……statement-default…… break; }
Kondisi default bersifat opsional, artinya boleh ada atau tidak ada, yang berfungsi seperti else, pada kasus if-else() dengan banyak pencabangan, yakni ketika ditemui kondisi yang tidak memenuhi semua testing kondisi sebelumnya. Agar lebih jelas, perhatikan contoh program Java berikut ini:
/* * Nama file : namaBulan.java * Deskripsi : contoh program Java yang menampilkan nama bulan berdasar index yang diberikan * Kompilasi : javac namaBulan.java * Eksekusi program : java namaBulan <nomor-bulan> */ class namaBulan{ public static void main(String args[]){ if(args.length != 1){ System.out.println("usage: java namaBulan <nomor-bulan>"); System.exit(0); }
77
int nilai = (new Integer(args[0])).intValue(); switch(nilai){ case 1: System.out.println("Bulan Januari"); break; case 2: System.out.println("Bulan Februari"); break; case 3: System.out.println("Bulan Maret"); break; case 4: System.out.println("Bulan April"); break; case 5: System.out.println("Bulan Mei"); break; case 6: System.out.println("Bulan Juni"); break; case 7: System.out.println("Bulan Juli"); break; case 8: System.out.println("Bulan Agustus"); break; case 9: System.out.println("Bulan September"); break; case 10: System.out.println("Bulan Oktober"); break; case 11: System.out.println("Bulan November"); break;
78
case 12: System.out.println("Bulan Desember"); break; // Bagian ini opsional, // untuk menangani kasus dimana nilai tidak memenuhi // case-case di atas default : System.out.println("Nomor bulan tidak sah"); break; } } }
Hasil eksekusi dari program Java di atas adalah sebagai berikut:
F:\Books\Java\program>java namaBulan usage: java namaBulan <nomor-bulan> F:\Books\Java\program>java namaBulan 1 Bulan Januari F:\Books\Java\program>java namaBulan 2 Bulan Februari F:\Books\Java\program>java namaBulan 0 Nomor bulan tidak sah F:\Books\Java\program>java namaBulan -19 Nomor bulan tidak sah
79
Pernyataan break pada switch() di atas digunakan untuk terminasi (menghentikan) eksekusi pernyataan-pernyataan pada switch(), namun bersifat opsional. Jika pada suatu case tidak diberikan pernyataan break, proses testing akan diteruskan ke case berikutnya. Agar lebih jelas, perhatikan contoh program Java berikut ini:
/* * Nama file : bulan.java * Deskripsi : contoh program Java yang menampilkan informasi apakah termasuk bulan yang namanya diawali dengan huruf “J” (misal Januari, Juli, Juni) atau tidak * Kompilasi : javac bulan.java * Eksekusi program : java bulan <nomor-bulan> */ class bulan{ public static void main(String args[]){ if(args.length != 1){ System.out.println("usage: java bulan <nomor-bulan>"); System.exit(0); } int nilai = (new Integer(args[0])).intValue(); switch(nilai){ case 1: case 6: case 7: System.out.println("Nama bulan diawali huruf 'J'"); break; case 2:
80
case 3: case 4: case 5: case 8: case 9: case 10: case 11: case 12: System.out.println("Nama bulan tidak diawali huruf 'J'"); break; default : System.out.println("Nomor bulan tidak sah"); break; } } }
Hasil eksekusi dari program Java di atas adalah sebagai berikut:
F:\Books\Java\program>java bulan 1 Nama bulan diawali huruf 'J' F:\Books\Java\program>java bulan 2 Nama bulan tidak diawali huruf 'J' F:\Books\Java\program>java bulan 7 Nama bulan diawali huruf 'J'
81
Tentang Break, Label, Return, Continue Statement break ada dua macam, yakni : § break with label § break without label Penggunaan break tanpa label umumnya dalam switch(), seperti yang telah dijelaskan sebelumnya, dan dalam pengulangan seperti for(), do-while(), dan while(). Fungsi break adalah untuk menghentikan eksekusi sebuah blok program, misalnya untuk memaksa keluar dari sebuah looping. Label pada program Java hanya merupakan penanda yang berupa:
Namalabel :
Penggunaan break dengan label adalah pada pengulangan yang berkalang, yakni pengulangan dalam pengulangan, yang mungkin berada dalam pengulangan yang lain, dan seterusnya, akan menyebabkan setelah eksekusi sebuah blok statement terhenti, aliran eksekusi akan berlanjut ke posisi pengulangan tempat label berada. Agar lebih jelasnya, silakan perhatikan contoh-contoh berikut:
/* * Nama file : breakDemo.java * Deskripsi : contoh program Java yang mencari sebuah nilai dalam list-array * Kompilasi : javac breakDemo.java * Eksekusi program :
82
java breakDemo */
class breakDemo{ public static void main(String args[]){ // Membuat Array-List int[] daftar_nilai = {1,123,4556,778,12,312,45,567}; // Nilai yang akan dicari dalam Array-List di atas int nilai_yang_dicari = 778; boolean ketemu = false; for(int i = 0; i < daftar_nilai.length; i++){ // Jika ketemu, maka keluar dari looping, dan mencetak informasi if(daftar_nilai[i] == nilai_yang_dicari){ ketemu = true; break; } } if(ketemu){ System.out.println("Nilai yang dicari ditemukan dalam array"); }else{ System.out.println("Nilai yang dicari tidak ditemukan"); } } }
Pada contoh selanjutnya akan digunakan break dengan label, dan akan ditunjukkan bahwa setelah break, maka eksekusi program akan menuju ke label yang didefinisikan.
83
/* * Nama file : breakDemo.java * Deskripsi : contoh program Java yang mencari sebuah nilai dalam list-array * Kompilasi : javac breakDemo.java * Eksekusi program : java breakDemo */
class breakDemo{ public static void main(String args[]){ // Membuat Array-List int[] daftar_nilai = {1,123,4556,778,12,312,45,567}; // Nilai yang akan dicari dalam Array-List di atas int nilai_yang_dicari = 778; boolean ketemu = false; akhir : // Ini label "akhir" for(int i = 0; i < daftar_nilai.length; ){ System.out.println("Looping luar"); for(;;i++){ // Jika ketemu, maka keluar dari looping, dan mencetak informasi System.out.println("Looping dalam"); if(daftar_nilai[i] == nilai_yang_dicari){ ketemu = true; break akhir; } } } if(ketemu){ System.out.println("Nilai yang dicari ditemukan dalam array"); }else{
84
System.out.println("Nilai yang dicari tidak ditemukan"); } } }
Berbeda dengan break, continue digunakan untuk melewatkan eksekusi pada pengulangan yang ada, dan melanjutkan ke pengulangan berikutnya. Agar lebih jelasnya perhatikan contoh berikut ini:
/* * Nama file : continueDemo.java * Deskripsi : contoh program Java yang menampilkan isi sebuah string, namun jika ditemui karakter “a” tidak akan dicetak * Kompilasi : javac continueDemo.java * Eksekusi program : java continueDemo <string> */ class continueDemo{ public static void main(String args[]){ if(args.length != 1){ System.out.println("usage: java continueDemo <string>"); System.exit(0); } String str = args[0]; for(int i = 0; i < str.length(); i++){ // Jika ditemui karakter 'a' maka lanjutkan pengulangan if(str.charAt(i) == 'a'){ continue;
85
} System.out.print(str.charAt(i)); } System.out.println(""); } }
Hasil eksekusi dari program Java di atas adalah sebagai berikut:
F:\Books\Java\program>java continueDemo "Ady Wicaksono" Ady Wicksono F:\Books\Java\program>java continueDemo "Ady Wicaksono anak baik" Ady Wicksono nk bik F:\Books\Java\program>java continueDemo "Ady Wicaksono anak baik sekali" Ady Wicksono nk bik sekli
Pada continue, juga dapat digunakan label dengan aturan yang sama dengan break. Pernyataan return digunakan untuk keluar dari sebuah fungsi, dan dapat diberikan parameter nilai untuk menunjukkan return value dari sebuah fungsi. Jika Anda sudah pernah mengenal C/C++, return di Java pun sama halnya dengan return pada C/C++.
86
Bab 7
Konsep Pemrograman Berorientasi Object
Untuk dapat menguasai pemrograman Java, Anda harus mengerti dengan baik konsep pemrograman berorientasi object, karena Java merupakan bahasa pemrograman berorientasi object. Dalam bab ini akan dibahas konsepkonsep penting dalam pemrograman berorientasi object, sehingga Anda diharapkan mampu mempelajari bahasa Java dengan baik.
Apa Object Itu? Pada dasarnya semua benda yang ada di dunia nyata dapat dianggap sebagai sebuah object. Rumah, mobil, sepeda motor, gelas, komputer, dan meja merupakan contohcontoh object yang ada di dunia nyata. Jika kita perhatikan lebih lanjut pada dasarnya ada dua karakteristik yang utama pada sebuah object, yakni: § Setiap object memiliki atribut sebagai status yang kemudian akan kita sebut sebagai state § Setiap object memiliki tingkah laku yang kemudian akan kita sebut sebagai behaviour Contoh sederhana adalah:
87
Object sepeda § Sepeda memilki atribut (state): pedal, roda, jeruji, warna, jumlah roda § Sepeda memilki tingkah laku (behaviour): kecepatannya menaik, kecepatannya menurun, perpindahan gigi sepeda Sama halnya dengan penggambaran dalam dunia nyata, pengembangan perangkat lunak berorientasi object akan menggunakan model object juga. Object dalam perangkat lunak akan menyimpan state-nya dalam variabel dan menyimpan informasi tingkah laku (behaviour) dalam method-method atau fungsi-fungsi/prosedur. Jika Anda pernah bermain-main dengan bahasa C Anda tentu mengenal definisi struct seperti ini:
#include <string.h> struct t_mhs { char *nama; char *nim; char *ttl; char *agama; }; /* dari parameter */ void getNama(struct t_mhs , char *nim, char *nama); void getNim(struct t_mhs, char *nama, char *nim); int main(int argc, char **argv){ struct t_mhs m; strcpy(m.nama,”Ady”); return 0; } void getNama(struct t_mhs t, char *nim, char *nama){
88
….. implementasi …. }
Coba Anda bandingkan dengan kode Java sebagai berikut:
// Kode dalam Java class mhs { private String nama; private String nim; private String ttl; private String agama; // Konstruktor public mhs(String nama, String nim, String ttl, String agama){ this.nama = nama; this.nim
= nim;
this.ttl = ttl; this.agama = agama; } public String getName(){ return this.nama; } public String getNim(){ return this.nim; } // Pemakaian public static void main(String args[]){ mhs m = new mhs(“Ady”,”13597055”,”19”,”Islam”); System.out.println(“Nama = “ + m.getName()); } }
89
Jika kode Java di atas Anda kompilasi menjadi *.class dan Anda eksekusi, hasilnya akan seperti ini:
F:\Books\Java\program>javac mhs.java F:\Books\Java\program>java mhs Nama=Ady
Kode dalam bahasa C, sengaja tidak saya tuliskan seluruhnya karena bukan unsur pemrogramannya yang saat ini akan saya bandingkan namun bagaimana dengan model struct yang merupakan ADT (Abstract Data Type) pada C kita akan dapat mengenal object dengan lebih baik. Perhatikan pada kode C di atas, model struct digunakan untuk membungkus beberapa variabel menjadi satu bungkus cantik yang diberi nama t_mhs. Kemudian coba perhatikan pada kode Java di atas, tak hanya informasi atribut (state) yang berupa variabel, yakni variabel nama, nim, ttl, agama yang dibungkus, namun juga fungsi-fungsi yang digunakan untuk manipulasi object (getName(), getNim()) yang merupakan behaviour dari object tersebut juga dibungkus dalam satu bungkus yang tentu saja lebih cantik. Jadi, jika untuk memanipulasi struct pada C Anda menggunakan fungsi lain di luar, pada object, bungkusan yang digunakan telah menyediakan fungsi-fungsi untuk memanipulasinya. Perbandingan lain yang cukup baik untuk mengenal object dari hal ini adalah: § Pada bahasa pemrograman prosedural biasa seperti C, Pascal yang menyediakan tipe bentukan seperti struct pada C atau record pada Pascal, hanya dapat memuat variabel-variabel bertipe data tertentu.
90
Gambar 7-1. Pemodelan object §
Pada bahasa pemrograman object seperti Java, C++ bukan hanya variabel-variabel yang bisa dibungkus namun juga fungsi-fungsi yang memanipulasinya juga bisa dibungkus dalam satu bundelan. Umumnya, sebuah object digambarkan seperti pada Gambar 7-1. Untuk menggambarkan sebuah object mahasiswa misalnya, yang memiliki atribut-atribut: § Nama = “Arman” § NIM = “13597099” § Alamat = “Bandung” dan memiliki behaviour menginformasikan nama, menginformasikan nim, mengganti alamat sekarang, Anda dapat menggambarkan secara sederhana seperti pada Gambar 7-2. Untuk mengganti alamat, misalnya ada method changeAlamat(), sedangkan untuk menginformasikan nama dan nim digunakan method getNama() dan getNIM().
91
Gambar 7-2. Pemodelan object mahasiswa dengan variabel dan method-nya.
Apa Enkapsulasi Itu? Dalam sebuah object yang mengandung variabel-variabel dan method-method, dapat ditentukan hak akses pada sebuah variabel atau method dari object. Pembungkusan variabel dan method dalam sebuah object dalam bagian yang terlindungi inilah yang disebut dengan enkapsulasi. Jika Anda perhatikan Gambar 7-2 yang merupakan model object mahasiswa, tampak bahwa bagian pada lingkaran di dalam tidak boleh diakses langsung dari luar (didefinisikan private – lihat program mhs.java di atas), bagian tersebut misalnya nama, bisa diakses dengan memanfaatkan bagianbagian pada lingkaran luar yang bersifat public (boleh diakses langsung dari luar object), yakni getNama().
92
Manfaat dari proses enkapsulasi ini adalah: § Modularitas Kode sumber dari sebuah object dapat dikelola secara independen dari kode sumber object yang lain. Jadi, misalnya Anda memiliki object jam dinding, Anda bisa memberikan kepada orang lain, tanpa harus bergantung siapa orang tersebut, dan jam dinding tersebut tetap akan bisa digunakan oleh orang tersebut. § Information Hiding Seperti telah dijelaskan sebelumnya, kita dapat menentukan hak akses sebuah variabel/method dari object. Dengan demikian, kita bisa menyem-bunyikan informasi yang tidak perlu diketahui object lain. Misalnya, dalam sebuah object jam dinding, seseorang tidak perlu tahu bagaimana sebuah jam dinding memutar jarum jam untuk mengetahui jam berapa sekarang, dia hanya perlu sebuah method untuk mendapatkan informasi itu.
Apa Messages Itu? Messages merupakan mekanisme yang digunakan oleh sebuah object Java untuk berkomunikasi dengan object Java yang lain. Salah satu keuntungan adanya messages ini adalah dimungkinkannya terjadi aplikasi yang terdistribusi dimana object-object Javanya dapat berinteraksi melalui jaringan. Contoh implementasinya adalah dalam CORBA (Common Object Request Broker) dan Java-RMI.
93
Gambar 7-3. Komunikasi antar object Java dilakukan dengan message
Apa Class Itu? Class berbeda dengan object. Sebagai analogi, ada contoh sebagai berikut di dunia ini tidak ada seorang manusia pun yang sama persis, namun pada sisi yang lain seluruh manusia di dunia ini, tanpa memperdulikan usia, jenis kelamin, atau sifat-sifat lain, manusia digolongkan dalam kelompok “homo sapiens”. Class merupakan prototipe yang mendefinisikan variabelvariabel dan method-method secara umum. Object pada sisi yang lain merupakan instansiasi dari suatu kelas. Coba Anda perhatikan Gambar 7-4. Pada Gambar 7-4, digambarkan ada tiga object (object A, B, dan C) yang merupakan instansiasi dari class X. Contoh dalam kehidupan sehari-hari adalah sepeda. Sebuah sepeda pasti memiliki roda, pedal, stang (kemudi), di sisi lain sebuah sepeda memiliki fungsi-fungsi seperti memutar kemudi, mengubah gigi, dan mengayuh pedal. Dari kondisi umum 94
sepeda itulah dapat dibuat sebuah class sepeda, yang kemudian boleh muncul object-object yang ber-class sepeda dengan kondisi yang berbeda-beda, misalnya object sepeda A dengan kondisi kemudi ke arah depan, gigi sepeda pada posisi 5 dan object sepeda B yang lain dengan kondisi kemudi ke arah kiri, gigi sepeda pada posisi 2.
Gambar 7-4. Instansiasi object A,B, dan C yang ber-class X
Contoh program Java berikut ini akan menunjukkan beda antara class dan object, sebagai implementasi kasus object sepeda di atas:
/* * Nama file : sepeda.java * Deskripsi : contoh program Java yang menunjukkan kelas dan object * Kompilasi : javac sepeda.java
95
* Eksekusi program : java sepeda */ // Disini kita mendefinisikan sebuah class sepeda // class sepeda { // Setiap sepeda memiliki atribut berikut private int kecepatan_sepeda = 0; private int posisi_gigi = 0; private String merk_sepeda; private String pemilik_sepeda;
// Setiap sepeda memiliki fungsi-fungsi berikut // Konstruktor 1 public sepeda(String m, String p){ this.merk_sepeda
= m;
this.pemilik_sepeda = p; } // Fungsi untuk ubah kecepatan sepeda public void ubah_kecepatan(int kcp){ this.kecepatan_sepeda = kcp; } // Main Function public static void main(String args[]){ // Disinilah kita mendefinisikan object-object yang // ber-class sepeda // Sepeda1 : sepeda merk Federal milik Pak Arman sepeda bike1 = new sepeda("Federal","Pak Arman"); // Sepeda2 : sepeda merk Timoti milik Pak Hasyim sepeda bike2 = new sepeda("Timoti","Pak Hasyim"); // Kondisi Sepeda1 System.out.println("Object \"sepeda-1\" : ");
96
System.out.println("Merk
: " + bike1.merk_sepeda);
System.out.println("Pemilik : " + bike1.pemilik_sepeda); // Kondisi Sepeda2 System.out.println("Object \"sepeda-2\" : "); System.out.println("Merk
: " + bike2.merk_sepeda);
System.out.println("Pemilik : " + bike2.pemilik_sepeda); } }
Adapun hasil eksekusi dari program java di atas adalah sebagai berikut:
F:\Books\Java\program>java sepeda Object "sepeda-1" : Merk
: Federal
Pemilik : Pak Arman Object "sepeda-2" : Merk
: Timoti
Pemilik : Pak Hasyim
Anda harus bisa membedakan antara object dan class dalam Java. Dari contoh dan materi di atas, penulis berharap Anda akan mampu mengerti perbedaan object dan class.
Apa Inheritance Itu? Class dapat didefinisikan dengan referensi pada class yang lain yang telah terdefinisi. Inheritance merupakan pewarisan atribut dan method pada sebuah class yang diperoleh dari class yang telah terdefinisi tersebut.
97
Pada kasus class sepeda, dimungkinkan kita mendefinisikan class sepeda yang lain yang menggunakan referensi class sepeda, seperti class sepeda gunung, sepeda balap, sepeda motor. Class sepeda yang baru tersebut (sepeda gunung, sepeda balap, sepeda motor) akan mewarisi berbagai atribut dan behaviour dari class sepeda. Pewarisan itu misalnya, sepeda memiliki atribut roda, maka sepeda balap, sepeda gunung, dan sepeda motor pun akan memiliki atribut roda. Class sepeda balap, sepeda gunung, dan sepeda motor dalam hal ini disebut sebagai subclass dari class sepeda. Class sepeda, pada sisi lain, akan menjadi superclass dari sepeda balap, sepeda gunung, dan sepeda motor. Perhatikan Gambar 7-5. Setiap subclass akan mewarisi state (variabel-variabel) dan behaviour (method-method) dari superclass-nya. Subclass kemudian dapat menambahkan state dan behaviour baru yang spesifik dan dapat pula memodifikasi (override) state dan behaviour yang diturunkan oleh superclass-nya.
Gambar 7-5. Inheritance pada class sepeda
98
Keuntungan dari inheritance adalah: § Subclass menyediakan state/behaviour yang spesifik yang membedakannya dengan superclass, hal ini akan memungkinkan programmer Java untuk menggunakan ulang source code dari superclass yang telah ada. § Programmer Java dapat mendefinisikan superclass khusus yang bersifat generik, yang disebut abstract class, untuk mendefinisikan class dengan tingkahlaku dan state secara umum.
Apa Interface Itu? Sebagai tambahan, pada Java dikenal konsep interface, yang merupakan device yang digunakan untuk komunikasi antarobject berbeda yang tidak memiliki hubungan apa pun. Interface bisa dikatakan sebagai protokol komunikasi antarobject tersebut. Anda akan mempelajari implementasinya dalam program Java pada bab-bab berikutnya.
99
100
Bab 8
Pemrograman Berorientasi Object pada Java
Setelah belajar tentang konsep-konsep pemrograman object pada bab sebelumnya, pada bab ini akan dibahas bagaimana memprogram Java dengan paradigma object.
Class pada Java Secara garis besar susunan deklarasi class pada Java dapat dilihat pada contoh class Sepeda pada Gambar 8-1. Jadi, secara garis besar, ada dua bagian utama pada sebuah class Java, yakni class declaration dan class body. Deklarasi kelas (class declaration) mendefinisikan nama class body kelas dan atributnya, sedangkan mendeklarasikan variabel dan method.
101
Gambar 8-1. Contoh class
Deklarasi Class pada Java Seperti telah Anda perhatikan pada contoh deklarasi kelas Sepeda di atas, deklarasi sebuah class pada Java mengikuti sintaks berikut ini (sintaks berikut sudah terurut berdasarkan kemungkinkan pendeklarasian):
public abstract final
102
class extends implement { }
Secara sederhana, minimal untuk mendeklarasikan sebuah kelas di Java, Anda hanya perlu mendefinisikan sebagai berikut
class
Deklarasi tersebut otomatis akan bersifat: § Nonpublic § Nonabstract § Nonfinal § Nonextends § Tidak mengimplementasikan suatu interface apapun Contoh deklarasi sebuah kelas Java adalah sebagai berikut:
class Sepeda { ………………… }
public class SepedaMotor { …………………
}
103
public class SepedaMotor extends Sepeda { …………………
}
public abstract class SepedaMotor extends Sepeda { ………………… }
public abstract class SepedaMotor extends Sepeda implement Runnable { ………………… }
Adapun atribut-atribut lain saat deklarasi sebuah kelas di Java adalah sebagai berikut: § public Jika sebuah kelas dideklarasikan public, kelas tersebut akan dapat digunakan oleh kelas yang lain tanpa memperdulikan apakah kelas lain yang menggunakannya itu berasal dari package yang sama atau berbeda. Mengenai package akan dibahas pada bagian yang lain. § abstract Jika sebuah kelas dideklarasikan abstract, kelas tersebut tidak akan dapat diinstansiasi menjadi sebuah object Java. Jadi, misalnya kelas sepeda dideklarasikan sebagai kelas abstract, tidak dapat dilakukan instansiasi seperti ini:
104
Sepeda m = new Sepeda(); // Akan terjadi kesalahan, karena Sepeda // dideklarasikan sebagai kelas abstract
§
§
§
final Jika sebuah kelas dideklarasikan final, kelas tersebut tidak akan dapat diturunkan lagi menjadi kelas turunan yang lain. Ingat-ingatlah kembali masalah inheritance pada bab yang terdahulu. class Atribut ini digunakan untuk mendeklarasikan nama kelas. extends Atribut ini digunakan untuk mendeklarasikan kelas turunan dari kelas yang lain (ingat-ingatlah kembali masalah inheritance pada bab yang terdahulu). Jadi, misalnya dilakukan deklarasi kelas seperti ini:
public class SepedaMotor extends Sepeda { …………………. }
§
Dengan demikian, kelas SepedaMotor di atas akan mewarisi sifat-sifat dari induknya yakni kelas Sepeda. Jika kelas Sepeda memiliki method ganti_gigi() yang dapat diwariskan ke kelas SepedaMotor, kelas SepedaMotor tanpa perlu mendeklarasikan method tersebut, akan memilikinya secara otomatis. implements Atribut ini digunakan untuk mendeklarasikan sebuah 105
kelas yang akan mengimplementasikan satu atau lebih interfaces Java. Jika interface Java yang akan diimplementasikan lebih dari satu, pendeklarasiannya dipisahkan dengan koma (“,”). Contohnya adalah sebagai berikut:
public class SepedaMotor extends Sepeda implements Runnable, HighSpeed { …………………. }
Deklarasi Class Body pada Java Class body merupakan bagian dari kelas yang mendeklarasikan kode-kode program Java yang bisa dibedakan menjadi tiga bagian utama dari sebuah kelas, yakni: § Konstruktor: untuk digunakan ketika terjadi inisialisasi object § Variable: sebagai state dari kelas dan object § Method (fungsi-fungsi/prosedur): sebagai behaviour dari kelas dan object Konstruktor pada Java akan dijelaskan pada subbagian yang lain pada bab ini. Namun, perlu diketahui bahwa keberadaan konstruktor tidak dianggap sebagai method oleh Java, sekalipun pendeklarasiannya (lihat contoh deklarasi kelas Sepeda di atas) mirip dengan pendeklarasian sebuah method.
Deklarasi Konstruktor pada Kelas/Class Java Konstruktor digunakan melakukan instansiasi sebuah object yang menggunakan kelas yang bersangkutan. Melakukan instansiasi adalah mengalokasikan sejumlah memori dari 106
komputer sesuatu kebutuhan struktur data yang digunakan. Keberadaan konstruktor dalam sebuah kelas Java bersifat opsional, karena kelas abstract misalnya tidak membutuhkan konstruktor karena tidak bisa diinstan-siasi menjadi sebuah object. Bahkan jika tidak dideklarasikan sebagai kelas abstract. Nama dari konstruktor haruslah sama dengan nama kelasnya. Coba Anda perhatikan contoh deklarasi kelas Sepeda pada halaman awal bab ini, tampak ada dua konstruktor dari kelas Sepeda tersebut, yakni:
public Sepeda(){ this.gigi = 0; this.merk = “Federal”; } public Sepeda(int g, String m){ this.gigi = g; this.merk = m; }
Jadi, konstruktor dari sebuah kelas boleh lebih dari satu. Fitur ini dikenal dengan sebutan constructor overloading, yakni dimungkinkannya lebih dari satu konstruktor dalam sebuah kelas Java, bedanya hanya pada parameterparameter konstruktornya saja. Melalui dua konstruktor tersebut, dengan enak kita dapat memilih cara manakah yang lebih cocok untuk dipakai instansiasi object Sepeda.
// Cara 1 instansiasi object Sepeda Sepeda sepeda1 = new Sepeda(); // Cara 2 instansiasi object Sepeda Sepeda sepeda2 = new Sepeda(2,”BMX”);
107
Ada sebuah kata kunci, yakni super() yang bisa digunakan untuk instansiasi object dari konstruktor yang ada pada superclass. Contohnya adalah sebagai berikut:
class SepedaMotor extends Sepeda{ public SepedaMotor(){ super(0,”Honda”); ………………….. } }
Deklarasi konstruktor dapat memiliki beberapa atribut sebagai berikut: § private Jika konstruktor dideklarasikan sebagai private, kelas yang bersangkutan tidak akan dapat diinstansiasi menjadi object oleh kelas yang lain. Contoh:
class SepedaMotor extends Sepeda{ private SepedaMotor(){ ………………… } }
§
108
protected Jika konstruktor dideklarasikan sebagai protected, kelas yang bersangkutan hanya dapat diinstansiasi menjadi object oleh kelas yang lain yang merupakan kelas turunan (subclass-nya). Contoh:
class SepedaMotor extends Sepeda{ protected SepedaMotor(){ ………………… } }
§
§
public Jika konstruktor dideklarasikan sebagai public, kelas yang bersangkutan akan dapat diinstansiasi menjadi sebuah object oleh sembarang kelas yang lain. Tanpa spesifikasi Jika konstruktor dideklarasikan tanpa spesifikasi apakah public, private, atau protected, kelas tersebut hanya akan dapat diinstansiasi menjadi object oleh kelas dalam package yang sama.
Deklarasi Member Variable pada Kelas/Class Java Elemen kedua yang merupakan elemen penting dari sebuah object adalah variable, yang pendeklarasiannya dilakukan pada class body. Member variable, yang berarti variabel yang merupakan anggota dari sebuah object, dapat memiliki atribut yang bersifat opsional. Pada bab yang lalu dijelaskan bagaimana mendeklarasi-kan sebuah variable di dalam bahasa Java, seperti ini:
int x; //variabel x bertipe integer float y; // variabel y bertipe float String s; //variabel s, yang merupakan bertipe kelas String
109
Atribut yang dapat ditambahkan pada deklarasi variabel adalah sebagai berikut, (sintaks berikut telah diurutkan sesuai sintaks deklarasi variabel pada Java):
public, private, protected, package static final volatile type
Contoh deklarasi variabel berdasar urutan atribut dari atas ke bawah seperti disebutkan di atas adalah sebagai berikut:
public static final int variabel1 = 0; private static final int variabel2 = 1450; protected static int variabel3 = 100; package int variabel4 = 19; protected final int variabel5 = 125;
§
§
§
110
public, private, protected, package Atribut pertama pada sebuah member variable ini menentukan level pengaksesan sebuah variabel, yang sama dengan level pengaksesan pada deklarasi method static Atribut pada sebuah member variable ini menyata-kan bahwa variabel akan bernilai tetap seperti pada waktu deklarasi kelas/class. final Atribut pada sebuah member variable ini menyatakan bahwa nilai variabel tidak dapat diubah (konstanta).
§
volatile Atribut pada sebuah member variable ini menya-takan bahwa kompiler Java tidak perlu melakukan optimasi pada variabel yang bersangkutan.
Deklarasi Method pada Kelas/Class Java Elemen ketiga yang merupakan elemen penting dari sebuah object adalah method atau fungsi-fungsi/prosedur, yang pendeklarasiannya dilakukan pada class body. Member method, yang berarti fungsi-fungsi yang merupakan anggota dari sebuah object, dapat memiliki atribut yang bersifat opsional. Method terdiri atas dua bagian, yakni: § Method declaration § Method body Contohnya adalah sebagai berikut:
Method Declaration Seperti halnya dalam mendeklarasikan sebuah kelas dalam Java, deklarasi method dapat mengandung berbagai macam atribut yang menentukan leval akses, return type, nama method dan argumennya. Atribut yang dapat ditambahkan pada deklarasi method adalah sebagai berikut, (sintaks berikut telah diurutkan sesuai sintaks deklarasi method pada Java):
111
public, private, protected, package static abstract final native synchronized (parameter) throws exception
Penggambaran deklarasi method dalam Java:
§
112
public, private, protected, package Atribut pertama pada sebuah member method ini menentukan level pengaksesan sebuah method. Apakah bisa diakses oleh objek lain, objek anak, objek dalam satu paket, atau tidak bisa diakses oleh objek lain sama sekali. o public Atribut ini menunjukkan bahwa fungsi/method bisa diakses oleh objek lain. o private Atribut ini menunjukkan bahwa fungsi/method tidak bisa diakses oleh objek lain. o protected Atribut ini menunjukkan bawah fungsi/method hanya bisa diakses oleh objek itu sendiri atau objek lain yang merupakan subclass-nya.
package Atribut ini menunjukkan bawah fungsi/method hanya bisa diakses oleh objek itu sendiri atau objek lain yang berada dalam 1 paket kelas Java yang sama. static Maksud dari atribut ini sama halnya dengan atribut pada member variable. abstract Atribut ini menunjukkan bahwa fungsi yang bersangkutan bersifat abstrak, tidak memiliki implementasi. Jika fungsi mengandung atribut ini, fungsi tersebut harus dideklarasikan pada kelas abstrak. final Pada pemrograman object, Anda melihat bahwa sebuah kelas bisa memiliki kelas anakan (subclass), yaitu dalam subkelas tersebut bisa jadi Anda membuat sebuah fungsi/method yang nama dan parameternya sama dengan fungsi/method yang ada di kelas induknya (mekanisme overriding method). Dengan mendefinisikan sebuah method sebagai final, maka fungsi ini tidak akan dapat di-override oleh subkelasnya. Contohnya adalah sebagai berikut: o
§
§
§
/* * Nama file : orang.java * Deskripsi : contoh program Java yang melakukan overriding * Kompilasi : javac orang.java * Eksekusi program : java orang_utan */ class orang {
113
public int mulut; public orang(){ mulut = 0; } protected void buka_mulut(){ mulut = 1; } protected void tutup_mulut(){ mulut = 0; } protected boolean isBukaMulut(){ return (mulut == 1); } } // Kelas orang_utan merupakan turunan dari kelas orang class orang_utan extends orang { public orang_utan(){ super(); } protected void tutup_mulut(){ mulut = 1; } public static void main(String args[]){ orang_utan m = new orang_utan(); m.buka_mulut(); if(m.isBukaMulut()){ System.out.println("Orang Utannya Buka Mulut"); }else{ System.out.println("Orang Utannya Tutup Mulut"); } m.tutup_mulut(); if(m.isBukaMulut()){ System.out.println("Orang Utannya Buka Mulut"); }else{
114
System.out.println("Orang Utannya Tutup Mulut"); } } }
Jika Anda kompilasi dan jalankan program Java di atas, keluarannya adalah sebagai berikut:
D:\Books\Java\program>javac orang.java D:\Books\Java\program>java orang_utan Orang Utannya Buka Mulut Orang Utannya Buka Mulut
Perhatikan bahwa dalam file orang.java di atas ada dua kelas, yakni kelas orang dan kelas orang_utan, dan Anda melihat bahwa fungsi:
protected void tutup_mulut(){ mulut = 1; }
Kelas orang_utan akan menimpa (override) atau menggantikan fungsi yang sama di kelas orang yang menjadi bapaknya. Seharusnya, jika fungsi di atas tidak di-override, ketika fungsi tutup_mulut() dipanggil, otomatis fungsi isBukaMulut() akan menghasilkan nilai false, sehingga yang dicetak ke layar adalah “Orang Utannya Tutup Mulut”. Nah, sekarang coba Anda ganti fungsi tersebut menjadi final method di kelas orang, sehingga program di atas akan menjadi seperti ini: 115
/* * Nama file : orang.java * Deskripsi : contoh program Java yang melakukan overriding * Kompilasi : javac orang.java * Eksekusi program : Tidak akan bisa dieksekusi, terjadi kesalahan kompilasi */ class orang { public int mulut; public orang(){ mulut = 0; } protected void buka_mulut(){ mulut = 1; } protected final void tutup_mulut(){ mulut = 0; } protected boolean isBukaMulut(){ return (mulut == 1); } } // Kelas orang_utan merupakan turunan dari kelas orang class orang_utan extends orang { public orang_utan(){ super(); } protected void tutup_mulut(){ mulut = 1; }
116
public static void main(String args[]){ orang_utan m = new orang_utan(); m.buka_mulut(); if(m.isBukaMulut()){ System.out.println("Orang Utannya Buka Mulut"); }else{ System.out.println("Orang Utannya Tutup Mulut"); } m.tutup_mulut(); if(m.isBukaMulut()){ System.out.println("Orang Utannya Buka Mulut"); }else{ System.out.println("Orang Utannya Tutup Mulut"); } } }
Ketika Anda mencoba mengkompilasinya akan terjadi kesalahan dari kompiler Java, dan menghasilkan pesan sebagai berikut:
D:\Books\Java\program>javac orang.java orang.java:36: tutup_mulut() in orang_utan tutup_mulut() in orang; overridden method is final
cannot
override
protected void tutup_mulut(){ ^ 1 error
§
native Atribut ini menunjukkan bahwa fungsi/method yang bersangkutan akan diimplementasikan dalam bahasa lain seperti C/C++. Penggunaannya adalah seperti ini misalnya ada sebuah library (*.dll) yang dibuat dalam 117
§
§
bahasa C, maka fungsi yang terdapat dalam library tersebut akan dapat langsung digunakan dalam program Java tanpa perlu melakukan modifikasi. synchronized Atribut ini biasanya digunakan untuk fungsi yang digunakan pada aplikasi yang melibatkan pengaksesan sumber daya secara konkuren atau bersamaan. Dengan atribut ini, fungsi akan dijamin aman dalam mengakses informasi dari sebuah thread. Apa itu thread? Tidak akan dijelaskan dalam buku ini dan jangan khawatir jika Anda masih dalam tahap pemula, Anda tidak perlu mengkhawatirkan tentang atribut ini, karena umumnya Anda akan jarang menggunakannya. Bagian ini harus Anda ganti dengan tipe keluaran dari fungsi. Jika Anda pernah belajar matematika tentu Anda ingat fungsi seperti ini:
Y = F(X)
Jelaslah bahwa setiap fungsi menghasilkan suatu nilai dengan tipe data tertentu. Nah, dalam pemrograman ada perkecualian, fungsi bisa tidak menghasilkan suatu nilai apapun, dengan cara mengisi bagian return type ini dengan void. Oleh karena setiap nilai memiliki tipe data, maka tipe data yang tepat harus diisikan pada bagian ini. Contohnya:
// Tidak menghasilkan nilai apapun public static void main(String args[]){ ....................... // Method Implementation }
118
// Fungsi yang menghasilkan nilai bertipe boolean public static boolean isOK(){ ....................... // Method Implementation } // Fungsi yang menghasilkan nilai bertipe objek String public static String getName(){ ....................... // Method Implementation }
§
<Parameter> Bagian ini harus Anda isi dengan parameter-parameter fungsi yang diperlukan yang masing-masing parameternya dipisahkan oleh tanda koma. Perlu Anda ketahui bahwa parameter pada fungsi-fungsi di Java akan di-pass by value, artinya fungsi tidak boleh mengubah nilai dari parameter-paremeter tersebut. Agar lebih jelasnya, perhatikan contoh program berikut:
/* * Nama file : tukar_nilai.java * Deskripsi : contoh program Java yang melakukan pass by value pada method * Kompilasi : javac tukar_nilai.java * Eksekusi program : java tukar_nilai */ class tukar_nilai { // Deklarasi member variable private int c; // Konstruktor public tukar_nilai(){
119
} // Deklarasi Method public void swap(int a, int b){ c = a; a = b; b = c; }
// Fungsi main() public static void main(String args[]){ tukar_nilai myObj = new tukar_nilai(); int x = 10; int y = 20; System.out.println("Sebelum ditukar x = " + x + " y = " + y); myObj.swap(x,y); System.out.println("Setelah ditukar x = " + x + " y = " + y); } }
Program di atas jika dikompilasi dan dijalankan akan menghasilkan keluaran seperti ini:
D:\Books\Java\program>javac tukar_nilai.java D:\Books\Java\program>java tukar_nilai Sebelum ditukar x = 10 y = 20 Setelah ditukar x = 10 y = 20
Apa yang terjadi? Kita ingin menukar nilai x dan y, sehingga x menjadi 20 dan y menjadi 10, namun gagal. Hal ini dikarenakan fungsi swap() pada objek tukar_nilai di atas mencoba mengubah nilai parameter 120
x menjadi 20 dan nilai parameter y menjadi 10, namun tidak dimungkinkan oleh Java. Dengan pembatasan seperti ini, program Java cenderung lebih aman. Namun demikian, Anda bisa tetap memaksakan untuk bisa mengganti nilai parameter asalkan tipe dari parameter itu adalah reference, misalnya berupa objek atau array. Mengenai array akan dibahas kemudian pada bab lain di buku ini. throw <exception> Atribut ini menunjukkan bahwa fungsi akan melemparkan exception, yang kemudian bisa ditangani oleh suatu fungsi tertentu.
§
Method Body Bagian ini merupakan implementasi dari sebuah fungsi/method. Dalam hal ini dikenal dua kata kunci penting, yakni this yang mengacu ke objek yang sedang diproses (objek yang bersangkutan) dan super yang mengacu pada objek induk dari objek yang sedang diproses. Sebagai contoh, perhatikan program Java berikut ini:
/* * Nama file : method_body.java * Deskripsi : contoh penggunaan this dan super * Kompilasi : javac method_body.java * Eksekusi program : java method_body */ class parent_of_method_body{ protected int variabel_pada_induk = 25; public parent_of_method_body(){ } public void cetakdeh(){
121
System.out.println("Nilai variabel = " + variabel_pada_induk); } }
class method_body extends parent_of_method_body { public int variabelku; public method_body(){ this.variabelku = 10; } public void cetakjuga(){ System.out.println("Nilai variabelku = " + this.variabelku); super.cetakdeh(); } public static void main(String args[]){ method_body m = new method_body(); m.cetakjuga(); } }
Perhatikan pada fungsi cetakjuga(), tampak terjadi pemanggilan fungsi cetakdeh() yang ada pada induk kelas dari kelas method_body.
Object pada Java Umumnya program Java terdiri atas object-object yang berinteraksi dengan messages sehingga dapat mengimplementasikan banyak hal sesuai yang kita inginkan. Object Java secara otomatis akan dibersihkan dari memori oleh garbage-collector Java setelah object yang dibuat tidak digunakan. Pada pembuatan object, Anda harus tahu object yang akan Anda buat akan memakai class apa. Sebagaimana yang 122
Anda ketahui class merupakan prototipe/blueprint untuk digunakan oleh sebuah object. Secara sederhana untuk mendeklarasikan sebuah variabel untuk mengacu ke sebuah object digunakan sintaks sebagai berikut:
nama
Contohnya:
Sepeda mybike; // Deklarasi variabel tanpa membuat object Point mypoint;
Untuk membuat object pada Java digunakan operator new. Dengan menggunakan contoh deklarasi variabel di atas, maka untuk membuat object sepeda digunakan line seperti ini:
mybike = new Sepeda(“Federal”,”Pak Andy”);
Perhatikan contoh kelas Sepeda berikut ini:
// Definisi class sepeda // class sepeda { // Setiap sepeda memiliki atribut berikut private int kecepatan_sepeda = 0; private int posisi_gigi = 0; private String merk_sepeda;
123
private String pemilik_sepeda; // Konstruktor 1 public sepeda(String p, String m){ this.merk_sepeda
= m;
this.pemilik_sepeda = p; } public sepeda(){ this.merk_sepeda
= “Federal”;
this.pemilik_sepeda = “Nobody”; } }
Dengan memperhatikan kode deklarasi class Java di atas dapat digunakan dua cara untuk membuat object, yakni:
mybike = new Sepeda(“Federal”,”Pak Andy”);
dan
mybike = new Sepeda();
Jadi pada intinya, pembuatan object tak lain mengacu kepada konstruktor pada class Java yang telah dijelaskan pada halaman lain di bab ini.
Java Class Interface Java class interface merupakan kumpulan deklarasi fungsi tanpa implementasi yang mendefinisikan aturan pemang-
124
gilan fungsi oleh kelas lain di sembarang hirarki. Kelas yang mengimplementasikan interface harus mengikuti aturan-aturan tersebut. Contoh dari Java interface adalah sebagai berikut:
Jadi, ada dua bagian dalam Java interface, yakni deklarasi interface dan interface body. Anda melihat sendiri bahwa di dalam interface di atas, ada satu fungsi yakni “public void wakeUp()” yang sekedar deklarasi, tanpa implementasi apapun. Nah, kelas yang akan menggunakan interface itulah yang harus mendefinisikan implementasi fungsi-fungsi yang ada. Contohnya seperti ini:
interface Sleeper{ public void wakeUp(); } class tesInterface implements Sleeper { // Fungsi pada interface Sleeper public void wakeUp(){ System.out.println("OK deh"); } public static void main(String args[]){ Sleeper p = new tesInterface(); p.wakeUp(); } }
125
Secara garis besar, untuk membuat Java Interface adalah sebagai berikut:
Mengapa dibutuhkan interface? Dalam bahasa pemrograman lain seperti C++, dikenal istilah multipleinheritance, artinya sebuah objek bisa diturunkan dari dua atau lebih objek berbeda. Misalnya, objek X memiliki super kelas A dan B. Pada Java, hal ini tidak dimungkinkan, karena objek hanya bisa extends dari 1 objek saja, dan disinilah interface Java menjadi solusinya. Namun demikian, interface Java memiliki beberapa perbedaan dengan multiple-inheritance, sebagai berikut: § Kelas yang mengimplementasikan interface, hanya mewarisi konstanta dari kelas interface, tidak seperti kelas turunan yang semua anggota baik variabel maupun fungsi akan diwariskan ke anaknya § Kelas yang mengimplementasikan intrerface tidak mewarisi fungsi yang bukan interface, yakni kelas yang memiliki implementasi pada kelas interface. Pada kelas turunan, akan diwarisi semua fungsi yang ada baik yang abstrak maupun yang ada implementasinya pada super kelasnya. § Hirarki kelas independen, yaitu kelas interface dengan kelas yang mengimplementasikannya bisa saling tidak berelasi. Contoh lain penggunaan interface dalam Java adalah sebagai berikut:
126
/* * Nama file : interfaceDemo.java * Deskripsi : contoh program Java yang menggunakan interface * Kompilasi : javac interfaceDemo.java * Eksekusi program : java interfaceDemo */ import java.util.Random; interface sharedVariables { int NO
= 0;
int YES = 1; int LATER = 2; int SOON = 3; int NEVER = 4; } class P implements sharedVariables { Random r = new Random(); int ask(){ int prob = (int) (100*r.nextDouble()); if(prob < 30){ return NO; }else if(prob < 60){ return YES; }else if(prob < 75){ return LATER; }else if(prob < 98){ return SOON; }else{ return NEVER; } } }
127
class interfaceDemo implements sharedVariables { static void answer(int res){ switch(res){ case NO: System.out.println("No"); break; case YES: System.out.println("Yes"); break; case LATER: System.out.println("Later"); break; case SOON: System.out.println("Soon"); break; case NEVER: System.out.println("Never"); break; } } public static void main(String args[]){ P x = new P(); answer(x.ask()); answer(x.ask()); } }
Java Package Java package digunakan untuk membungkus kelas-kelas Java ke dalam grup-grup tertentu yang telah didefinisikan, sehingga terjadinya konflik penamaan, hak akses bisa dicegah. Selain itu, dengan menggunakan pemaketan seperti ini, akan semakin mudah dalam mencari dan menggunakan kelas-kelas Java.
128
Membuat dan menggunakan Java Package Untuk membuat Java Package Anda cukup mendeklarasikan kata kunci package yang diikuti oleh nama paket pada saat pembuatan kelas Java. Sebagai contoh adalah sebagai berikut: package hemat; class pakEkoA { .................... // Implementasi kelas pakEkoA } class pakEkoB { .................... // Implementasi kelas pakEkoB } class pakEkoC { .................... // Implementasi kelas pakEkoC }
Untuk menggunakan paket-paket Java yang telah Anda buat, Anda cukup melakukan import paket tersebut seperti ini:
// Import semua kelas dan interface pada paket hemat import hemat.*; // Import kelas orang_utan dari paket orang import orang.orang_utan;
Contoh nyata penggunaan paket Java ini adalah sebagai berikut:
// Nama Paket package myPkg; public class paketOrang {
129
// Member Variable private String nama; // Konstruktor public paketOrang(String n){ nama = new String(n); } // Method public void cetak_nama(){ System.out.println(nama); } }
Simpan file di atas dengan nama “paketOrang.java”, kemudian kompilasi dengan menggunakan javac. Buatlah direktori bernama “myPkg” sesuai dengan nama paket Java yang baru saja Anda buat dan kopikan file “paketOrang.class” yang baru saja dihasilkan dari kompilasi program ke direktori “myPkg” , sebagai berikut: DOS/Windows:
D:\Books\Java\program>javac paketOrang.java D:\Books\Java\program>mkdir myPkg D:\Books\Java\program>copy paketOrang.class myPkg D:\Books\Java\program>dir MyPkg Volume in drive D is MUNTILAN Volume Serial Number is 2E55-1C0C Directory of D:\Books\Java\program\MyPkg 01/30/2002 08:35a
130
.
01/30/2002 08:35a
01/30/2002 08:34a 1 File(s)
.. 495 paketOrang.class
495 bytes
2 Dir(s) 1,435,267,072 bytes free
Linux: [ady@localhost]# javac paketOrang.java [ady@localhost]# mkdir myPkg [ady@localhost]# cp paketOrang.class myPkg
Kemudian buatlah aplikasi kecil, yang mengimpor kelas pada paket tersebut seperti ini:
import myPkg.paketOrang; class tesOrang { public static void main(String args[]){ paketOrang x = new paketOrang("Ady"); x.cetak_nama(); } }
Kompilasilah dengan option –classpath seperti ini:
D:\Books\Java\program>javac -classpath . tesOrang.java
Option –classpath menunjukkan bahwa kompiler akan mencari kelas yang diimpor oleh tesOrang.java di direktori yang bersangkutan selain di direktori standarnya. 131
Manajemen File Source dan *.class Pada subbab sebelumnya, tampak bahwa kita harus membuat direktori “myPkg” dahulu untuk meletakkan filefile kelas Java yang merupakan bagian dari paket “myPkg” tersebut. Java memang mengharuskan kita menyimpan kelas-kelas dalam sebuah paket yang sama di sebuah direktori yang sama. Nama direktori yang bersangkutan pun harus sama dengan nama paket Java. Jadi, misalnya Anda menemukan statement seperti ini:
import java.io.*; import myPkg.*;
Baris pertama artinya dilakukan pengimporan seluruh kelas dari paket java.io, yang secara fisik disimpan pada direktori java/io di suatu tempat. Setiap titik dalam nama paket yang diimpor menunjukkan hirarki direktori yang lebih bawah lagi. Jadi, jika Anda ingin membuat paket dengan nama myPkg.com.mama, Anda harus membuat direktori “myPkg”, kemudian membuat direktori “com” di bawah direktori “myPkg”, dan terakhir membuat direktori “mama” di bawah direktori “com”, seperti ini:
D:\Books\Java\program>mkdir myPkg D:\Books\Java\program>mkdir myPkg\com D:\Books\Java\program>mkdir myPkg\com\mama D:\Books\Java\program>dir myPkg\com\mama Volume in drive D is MUNTILAN Volume Serial Number is 2E55-1C0C
132
Directory of D:\Books\Java\program\myPkg\com\mama 01/30/2002 09:03a
.
01/30/2002 09:03a
..
0 File(s)
0 bytes
2 Dir(s) 1,435,250,688 bytes free
Lokasi direktori inilah yang digunakan untuk menyimpan semua file kelas Java yang merupakan bagian dari paket “myPkg.com.mama”. Pertanyaan selanjutnya adalah, bagaimana kompiler Java bisa mengetahui lokasi sebuah kelas dari paket yang diimpor? Ada dua cara umum, yakni: § Mendefinisikan variabel CLASSPATH § Dengan menggunakan option –classpath saat kompilasi atau eksekusi, pilihan ini lebih dianjurkan oleh penulis Contohnya telah Anda lihat saat Anda mencoba membuat paket Java di atas. Pada bab berikutnya, Anda akan menemukan pembahasan lebih jauh tentang pemrograman objek pada Java.
133
134
Bab 9
Array/Larik
Larik atau array merupakan struktur data yang penting dalam bahasa pemrograman. Sebuah larik terdiri atas himpunan beberapa nilai data dengan tipe data yang sama, dimana jumlah anggota dari himpunan dalam larik itu ditentukan saat deklarasi larik atau array. Tiap anggota himpunan dalam larik tersebut akan diacu sebagai elemen dengan menunjuk nomor indeks lokasi dia berada. Idx[0]
Idx[1]
Idx[2]
Idx[3]
Idx[4]
Idx[5]
.......
Penggambaran di atas menunjukkan sebuah larik, yaitu elemen pertama akan diacu sebagai elemen ke-0, elemen kedua diacu sebagai elemen ke-1, begitu seterusnya. Jika Anda pernah memprogram dengan bahasa lain seperti PHP, ASP, Pascal, C/C++, Perl larik pada Java sama saja dengan larik dengan bahasa-bahasa pemrograman tersebut, hanya saja mungkin pengacuan elemennya berbeda, ada bahasa pemrograman yang mengacu elemen pertama sebagai elemen ke-1 dan bukan ke-0.
Membuat dan Menggunakan Larik/Array pada Java Untuk mendefinisikan tipe variabel yang bertipe array digunakan cara seperti ini:
135
Type[ ] namaVariabel
Type menunjukkan bahwa array ini terdiri atas nilai-nilai bertipe data Type. Contohnya:
// Membuat array data bertipe data integer int[ ]
myArrayOfInteger;
// Membuat array data bertipe data float float[ ] myArrayOfFloat; // Membuat array data bertipe data String String[ ] myArrayOfString;
Setelah mendeklarasikan array dengan cara di atas, langkah selanjutnya adalah menginisialisasi array tersebut. Ada dua cara yang umum digunakan, yakni: § Dengan operator new Formatnya adalah sebagai berikut: new [ukuran]
Contohnya adalah: // Menginisialisasi myArrayOfInteger berjumlah 10 elemen myArrayOfInteger = new int[10]; // Menginisialisasi myArrayOfFloat berjumlah 25 elemen myArrayOfFloat = new float[25];
136
§
Dengan menggunakan cara ini, array yang ada belum mempunyai nilai awal dan Anda harus memberikannya terlebih dahulu sebelum Anda menggunakannya. Dengan langsung memberikan nilai-nilai awal Nilai awal dari array ditempatkan diantara ‘{‘ dan ‘}’ yang elemen-elemennya dipisahkan tanda koma, seperti ini:
// Menginisialisasi myArrayOfInteger berjumlah 10 elemen myArrayOfInteger = {1,2,3,4,5,6,7,8,9}; // Menginisialisasi myArrayOfFloat berjumlah 3 elemen myArrayOfFloat = {1.2, 6.7, 1.34};
Deklarasi dan inisialisasi dapat dilakukan secara langsung dalam satu baris seperti ini, sehingga akan lebih memudahkan Anda:
int dataInt = new int[10]; float dataFloat = new float[12]; int dataInt2 = {1,2,3,4,5,56};
Sebuah tipe data array dapat diketahui panjangnya dengan cara mengakses:
.length
Contohnya:
137
int dataInt = new int[10]; // Panjang array diacu dengan jalan int panjangDataInt = dataInt.length;
Sedangkan untuk mengacu ke salah satu elemen pada array, digunakan cara seperti ini:
[nomor-Elemen]
Contoh lengkapnya adalah sebagai berikut:
/* * Nama file : larik.java * Deskripsi : contoh program Java menggunakan array * Kompilasi : javac larik.java * Eksekusi program : java larik */ class larik { // Fungsi Utama -> main(), dimana aplikasi mulai dieksekusi public static void main(String args[]){ // Membuat larik/array int[]
larik_integer = new int[11];
char[] larik_char
= {'a','b','c'};
// Mencetak isi masing-masing array for (int i = 0; i < larik_integer.length; i++){ larik_integer[i] = i + 1; System.out.println("Elemen ke " +(i+1)+"=" + larik_integer[i]); }
138
for (int i = 0; i < larik_char.length; i++){ System.out.println("Elemen ke " +(i+1)+ " = " + larik_char[i]); } } }
Contoh program Java di atas, jika dikompilasi dan dieksekusi akan menghasilkan keluaran seperti ini:
D:\Books\Java\program>javac larik.java D:\Books\Java\program>java larik Elemen ke 1 = 1 Elemen ke 2 = 2 Elemen ke 3 = 3 Elemen ke 4 = 4 Elemen ke 5 = 5 Elemen ke 6 = 6 Elemen ke 7 = 7 Elemen ke 8 = 8 Elemen ke 9 = 9 Elemen ke 10 = 10 Elemen ke 11 = 11 Elemen ke 1 = a Elemen ke 2 = b Elemen ke 3 = c
Array of Array Mungkin suatu ketika Anda menginginkan sebuah tipe data, array of array, yakni array yang masing-masing elemennya berupa array, seperti ini:
139
1
2
3
4
5
6
7
8
9
10
1 2 3 4 5
Hal ini dimungkinkan pula pada bahasa Java, yaitu deklarasi variabel bertipe array dilakukan seperti ini:
[ ][ ]
Contohnya adalah sebagai berikut:
/* * Nama file : array2dimensi.java * Deskripsi : contoh program Java menggunakan array * Kompilasi : javac array2dimensi.java * Eksekusi program : java array2dimensi */ public class array2dimensi { public static void main(String[] args) { String[][] cartoons = { { "Flintstones", "Fred", "Wilma", "Pebbles", "Dino" }, { "Rubbles", "Barney", "Betty", "Bam Bam" }, { "Jetsons", "George", "Jane", "Elroy", "Judy", "Rosie", "Astro" },
140
{ "Scooby Doo Gang", "Scooby Doo", "Shaggy", "Velma", "Fred", "Daphne" } }; for (int i = 0; i < cartoons.length; i++) { System.out.print(cartoons[i][0] + ": "); for (int j = 1; j < cartoons[i].length; j++) { System.out.print(cartoons[i][j] + " "); } System.out.println(); } } }
Penggunaan array sangat penting dalam banyak hal, penulis mengharapkan agar Anda bisa mengerti mengenai array dalam Java dengan mudah di bab ini. Setelah melalui bab ini, Anda sudah akan memiliki dasardasar yang cukup untuk bekerja dengan bahasa pemrograman Java. Tidak semua dasar-dasar pemrograman Java 2 yang bisa dibahas di sini. Namun, dasar-dasar yang penting bisa dikatakan telah dibahas sampai bab ini. Bab berikutnya akan membahas beberapa kelas-kelas dasar yang sering dipakai dalam bahasa Java 2.
141
142
Bab 10
Inheritance
Pada bab sebelumnya Anda telah mengenal apa itu inheritance, pada bab ini penulis akan membahas lebih jauh implementasi dari konsep ini dalam bahasa Java.
Bagaimana Membuat Turunan Sebuah Kelas? Seperti yang telah disinggung pada bab sebelumnya, untuk membuat kelas yang dapat mewarisi sebuah kelas lain, kita hanya perlu mendeklarasikan kelas tersebut dengan menggunakan extends. Agar lebih jelasnya, perhatikan contoh berikut.
/* * Nama file : penurunanSederhana.java * Deskripsi : contoh program Java yang memanfaatkan inheritance * Kompilasi : javac penurunanSederhana.java * Eksekusi program : java penurunanSederhana */ class A { int i; int j;
143
void show_ij(){ System.out.println("i dan j = " + i + " " +j); } } class B extends A{ int k; void show_k(){ System.out.println("k = " +k); } void sum_all(){ System.out.println("i+j+k = " + (i+j+k)); } }
class penurunanSederhana { public static void main(String args[]){ A objekBapak = new A(); B objekAnak = new B(); objekBapak.i = 13; objekBapak.j = 17; System.out.println("Objek A -> objek superclass dari B : "); objekBapak.show_ij(); objekAnak.i = 9; objekAnak.j = 10; objekAnak.k = 11; System.out.println("Objek A -> objek superclass dari B : "); objekAnak.show_ij(); objekAnak.show_k(); objekAnak.sum_all(); } }
144
Hasil keluaran program di atas adalah sebagai berikut:
D:\Books\Java\program>javac penurunanSederhana.java D:\Books\Java\program>java penurunanSederhana Objek A -> objek superclass dari B : i dan j = 13 17 Objek A -> objek superclass dari B : i dan j = 9 10 k = 11 i+j+k = 30
Program di atas menunjukkan adanya kelas B sebagai subkelas (subclass) atau turunan dari kelas A, sehingga kelas A merupakan superclass dari kelas B. Pada saat dilakukan penurunan semua anggota dari kelas A akan diturunkan ke kelas B. Seperti Anda lihat pada program, sebenarnya tidak ada fungsi show_ij() variabel i,j pada kelas B, dan kelas B mendapatkan fungsi dan variabel ini dari superclass-nya. Perlu diketahui bahwa berbeda dengan C++, setiap kelas hanya bisa mewarisi sebuah kelas yang lain saja, dengan kata lain tidak mendukung multipleinheritance. Sekedar mengulang apa yang telah dijelaskan pada bab sebelumnya, secara sederhana untuk mendeklarasikan sebuah kelas yang menjadi subclass dari kelas yang lain adalah sebagai berikut:
class extends { // body of class }
145
Hal lain yang perlu diketahui adalah, seluruh anggota kelas yang dideklarasikan sebagai private, tidak akan diturunkan ke subclass-nya. Agar lebih jelas, cobalah modifikasi program di atas menjadi seperti ini, kemudian Anda kompilasi programnya dan perhatikan pesan kesalahan saat kompilasinya:
/* * Nama file : penurunanSederhana.java * Deskripsi : contoh program Java yang memanfaatkan inheritance * Kompilasi : javac penurunanSederhana.java * Eksekusi program : java penurunanSederhana */ class A { int i; private int j; private void show_ij(){ System.out.println("i dan j = " + i + " " +j); } } class B extends A{ int k; void show_k(){ System.out.println("k = " +k); } void sum_all(){ System.out.println("i+j+k = " + (i+j+k)); } }
146
class penurunanSederhana { public static void main(String args[]){ A objekBapak = new A(); B objekAnak = new B(); objekBapak.i = 13; objekBapak.j = 17; System.out.println("Objek A -> objek superclass dari B : "); objekBapak.show_ij(); objekAnak.i = 9; objekAnak.j = 10; objekAnak.k = 11; System.out.println("Objek A -> objek superclass dari B : "); objekAnak.show_ij(); objekAnak.show_k(); objekAnak.sum_all(); } }
Saat dikompilasi, Anda akan menemukan pesan kesalahan seperti ini:
D:\Books\Java\program>javac penurunanSederhana.java penurunanSederhana.java:26: j has private access in A System.out.println("i+j+k = " + (i+j+k)); ^ penurunanSederhana.java:37: j has private access in A objekBapak.j = 17; ^ penurunanSederhana.java:40: show_ij() has private access in A objekBapak.show_ij(); ^
147
penurunanSederhana.java:43: j has private access in A objekAnak.j = 10; ^ penurunanSederhana.java:46: show_ij() has private access in A objekAnak.show_ij(); ^ 5 errors
Perhatikan contoh lain penggunakan inheritance pada Java berikut:
/* * Nama file : contohkotak.java * Deskripsi : contoh program Java yang memanfaatkan inheritance * Kompilasi : javac contohkotak.java * Eksekusi program : java contohkotak */ class kotak { // Setiap kotak memiliki panjang,lebar,tinggi double panjang; double lebar; double tinggi; // Konstruktor kotak(){ panjang = 0; lebar = 0; tinggi = 0; } kotak(double p, double l, double t){ panjang = p; lebar = l;
148
tinggi = t; } // Konstruktor lain, misal kotaknya adalah kubus kotak(double sisi){ panjang = lebar = tinggi = sisi; } // Fungsi untuk menghitung volume double volume(){ return (panjang * lebar * tinggi); } } // Kelas kotakW ini merupakan subkelas dari kelas kotak // dimana kelas ini juga mengikutkan properti "berat" // dari sebuah kotak class kotakW extends kotak { // Berat kotak (asumsi dalam kilogram) ? double berat; // Konstruktor, ingat ! harus bernama sama dengan nama kelas kotakW(double p, double l, double t, double m){ panjang = p; lebar = l; tinggi = t; berat = m; } } // Kelas yang mengimplementasikan fungsi main() class contohkotak { public static void main(String args[]){ kotakW X = new kotakW(10,12,12,1); double vol; vol = X.volume(); System.out.println("Kotak X volumenya = " + vol);
149
System.out.println("Kotak X beratnya = " + X.berat); } }
Program di atas jika dijalankan akan menghasilkan keluaran seperti ini:
D:\Books\Java\program>javac contohkotak.java D:\Books\Java\program>java contohkotak Kotak X volumenya = 1440.0 Kotak X beratnya = 1.0
Tampak, bahwa kelas kotakW, memiliki fungsi volume(), yang diwarisi dari kelas kotak yang merupakan superclassnya.
Menggunakan keyword : super Pada bab sebelumnya, penulis pernah menyinggung penggunaan keyword super dalam pemrograman Java. Super digunakan untuk memanggil konstruktor yang ada pada superclass. Penggunaan super harus dilakukan saat awal di dalam sebuah konstruktor sebuah kelas. Formatnya sebagai berikut:
class extends { // konstruktor public { super(<parameter-list>) } }
150
Pada contoh program Java yang mengimplementasikan kelas kotak sebelumnya, Anda melihat bahwa dimungkinkan bagi kelas kotakW, yang merupakan subkelas kelas kotak, untuk menggunakan konstruktor yang ada pada superclass-nya. Bagaimana jika variabel-variabel panjang, lebar, tinggi pada kelas kotak didefinisikan sebagai private? Tentunya, konstruktor pada kotakW akan menjadi tidak valid karena berusaha mengakses variabel private secara langsung. Pada kasus inilah, konstruktor pada superclass menjadi dibutuhkan. Coba Anda modifikasi program tersebut menjadi seperti ini:
/* * Nama file : contohkotak.java * Deskripsi : contoh program Java yang memanfaatkan inheritance * Kompilasi : javac contohkotak.java * Eksekusi program : java contohkotak */ class kotak { // Setiap kotak memiliki panjang,lebar,tinggi private double panjang; private double lebar; private double tinggi; // Konstruktor kotak(){ panjang = 0; lebar = 0; tinggi = 0; } kotak(double p, double l, double t){ panjang = p; lebar = l; tinggi = t;
151
} // Konstruktor lain, misal kotaknya adalah kubus kotak(double sisi){ panjang = lebar = tinggi = sisi; } // Fungsi untuk menghitung volume double volume(){ return (panjang * lebar * tinggi); } } // Kelas kotakW ini merupakan subkelas dari kelas kotak // dimana kelas ini juga mengikutkan properti "berat" // dari sebuah kotak class kotakW extends kotak { // Berat kotak (asumsi dalam kilogram) ? double berat; // Konstruktor, ingat ! harus bernama sama dengan nama kelas kotakW(double p, double l, double t, double m){ super(p,l,t); berat = m; } } // Kelas yang mengimplementasikan fungsi main() class contohkotak { public static void main(String args[]){ kotakW X = new kotakW(10,12,12,1); double vol; vol = X.volume(); System.out.println("Kotak X volumenya = " + vol); System.out.println("Kotak X beratnya = " + X.berat); } }
152
Selain digunakan untuk memanggil konstruktor pada superclass, super bisa juga digunakan untuk mengakses variabel atau fungsi yang ada pada superclass, dengan format pemanggilan seperti ini:
super.<member-method/variable>
Kadang kala hal ini kita perlukan karena mungkin kita memiliki kelas yang terdiri atas variabel atau fungsi yang sama dengan fungsi dari superclass-nya. Perhatikan contoh berikut agar lebih jelas:
/* * Nama file : mySuper.java * Deskripsi : contoh program Java yang memanfaatkan super * Kompilasi : javac mySuper.java * Eksekusi program : java mySuper */ class bapak { int i; // Konstruktor bapak(){ } } class anak extends bapak { int i; // variabel ini akan override // variabel i pada superclass, yakni pada kelas // bapak
153
anak(){ super.i = 10; // Mengisi variabel i pada superclass-nya i
= 15;
} public void show(){ System.out.println("Variabel i pada bapak = " + super.i); System.out.println("Variabel i pada anak = " + i); } } // Kelas Utama class mySuper { public static void main(String args[]){ anak x = new anak(); x.show(); } }
Program di atas akan menghasilkan keluaran seperti ini:
D:\Books\Java\program>java mySuper Variabel i pada bapak = 10 Variabel i pada anak = 15
Perhatikan bahwa keberadaan variabel i pada kelas “anak” jelas akan menimpa (override) keberadaan variabel i pada superkelasnya, yakni kelas “bapak”, namun dengan super, kita bisa mengacu kembali variabel tersebut yang berada pada super kelas “bapak”.
154
Multilevel Inheritance Mungkin ada pertanyaan di benak Anda, apakah pewarisan ini dapat berlaku pada beberapa level turunan? Jawabannya adalah ya. Jadi, sebuah superclass bisa memiliki beberapa subclass, dan setiap subclass tersebut bisa memiliki subclass yang lain. Sebagai contoh, misalkan ada kelas A yang merupakan subclass dari kelas B, sedangkan kelas B merupakan subclass dari kelas C, maka kelas A ini akan mewarisi sifat-sifat dari keseluruhan kelas di atasnya, yakni dari kelas B dan kelas C. Sebagai ilustrasi, penulis akan melanjutkan contoh penggunaan kelas “kotak” pada subbab sebelumnya, yang akan dibuat kelas baru bernama “kotakHadiah” yang merupakan turunan dari kelas “kotakW”. Kelas “kotakW” ini sendiri merupakan subclass dari kelas “kotak”. Kelas “kotakHadiah” ini memiliki properti baru, yakni: § Harga: menunjukkan harga dari kotak hadiah § Isi : menunjukkan isi dari kotak hadiah ini
/* * Nama file : contohkotakHadiah.java * Deskripsi : contoh program Java yang memanfaatkan inheritance * Kompilasi : javac contohkotakHadiah.java * Eksekusi program : java contohkotakHadiah */ class kotak { // Setiap kotak memiliki panjang,lebar,tinggi private double panjang; private double lebar; private double tinggi; // Konstruktor
155
kotak(){ panjang = 0; lebar = 0; tinggi = 0; } kotak(double p, double l, double t){ panjang = p; lebar = l; tinggi = t; } // Konstruktor lain, misal kotaknya adalah kubus kotak(double sisi){ panjang = lebar = tinggi = sisi; } // Fungsi untuk menghitung volume double volume(){ return (panjang * lebar * tinggi); } } // Kelas kotakW ini merupakan subkelas dari kelas kotak // dimana kelas ini juga mengikutkan properti "berat" // dari sebuah kotak class kotakW extends kotak { // Berat kotak (asumsi dalam kilogram) ? double berat; // Konstruktor, ingat ! harus bernama sama dengan nama kelas kotakW(double p, double l, double t, double m){ super(p,l,t); berat = m; } } // kotakHadiah adalah turunan dari kotakW class kotakHadiah extends kotakW {
156
double harga; String isi; // Konstruktor kotakHadiah(double p, double l, double t, double m, double h, String x){ super(p,l,t,m); // Super selalu merujuk ke superclass terdekat harga = h; isi = x; } } // Kelas yang mengimplementasikan fungsi main() class contohkotakHadiah { public static void main(String args[]){ kotakHadiah X = new kotakHadiah(10,12,12,1,1203.8,"Boneka Harry Potter"); double vol; vol = X.volume(); System.out.println("Kotak hadiah X volumenya = " + vol); System.out.println("Kotak hadiah X beratnya = " + X.berat); System.out.println("Kotak hadiah X isinya
= " + X.isi);
} }
Hasil keluaran program Java di atas adalah :
D:\Books\Java\program>java contohkotakHadiah Kotak hadiah X volumenya = 1440.0 Kotak hadiah X beratnya = 1.0 Kotak hadiah X isinya
= Boneka Harry Potter
Perhatikan bahwa penggunaan kata super, akan senantiasa mengacu ke superclass dari kelas pemanggil, jadi super yang dilakukan oleh kelas “kotakHadiah” akan memanggil 157
konstruktor pada kelas “kotakW” dan bukan memanggil ke kelas “kotak”.
Method Overriding Dalam beberapa kasus, seringkali Anda menemukan bahwa ada fungsi atau variabel dari sebuah kelas yang sama persis dengan variabel atau fungsi dari superclass-nya. Ketika hal ini terjadi, fungsi atau variabel pada kelas tersebut akan menimpa atau override fungsi dan variabel dari superclassnya. Sebagai contoh, perhatikan program Java berikut:
class X { int i,j; // Konstruktor kelas X X(int a, int b){ i = a; j = b; } // Method pada kelas X // Menampilkan isi variabel i dan j void show(){ System.out.println("i dan j = " + i + " & " + j); } } class Y extends X { int k; // Konstruktor kelas Y Y(int a, int b, int c){ super(a,b); k = c; }
158
// Method pada kelas Y // Menampilkan isi variabel k void show(){ System.out.println("k = " + k); } } class tesOverride { public static void main(String args[]){ Y m = new Y(1,2,3); m.show(); } }
Pada program di atas, tampak bahwa kelas Y merupakan subkelas dari kelas X, yaitu kelas Y memiliki fungsi show() yang sama persis, baik nama maupun keberadaan parameter fungsinya dengan fungsi show() pada kelas X. Jadi, ketika dipanggil, fungsi show() yang dijalankan adalah fungsi show() pada kelas Y. Untuk memaksakan agar memanggil fungsi show() yang ada di kelas X, dari kelas Y bisa digunakan super.show().
Kelas Abstrak (Abstract Class) Kelas abstrak digunakan untuk mendefinisikan sebuah kelas yang hanya mendeklarasikan format generik tanpa mengimplementasikan secara detail fungsi-fungsi dari kelas abstrak yang ada. Agar lebih jelas, perhatikan contoh berikut:
/* * Nama file : abstractDemo.java * Deskripsi : contoh program Java yang menggunakan kelas abstrak * Kompilasi :
159
javac abstractDemo.java * Eksekusi program : java abstractDemo */ // Kelas Abstrak abstract class AAA { // Fungsi abstrak "callme()" tanpa implementasi abstract void callme(); // Fungsi dengan implementasi tetap dibolehkan // dalam kelas abstrak public void callmetoo(){ System.out.println("Ini fungsi test"); } }
class BBB extends AAA { // Implementasi dari fungsi callme() pada kelas abstract AAA void callme(){ System.out.println("Implementasi fungsi callme di kelas BBB"); } } class abstractDemo { public static void main(String args[]){ BBB varBBB = new BBB(); varBBB.callme(); varBBB.callmetoo(); } }
Kapan kita memerlukan kelas abstrak? Anda akan membutuhkannya ketika Anda merasa memerlukan sebuah superclass yang mendeklarasikan struktur umum dari sebuah objek atau template umum dari sebuah objek, yaitu 160
fungsi-fungsi yang ada pengimplementasiannya diserahkan pada objek-objek turunannya. Kelas abstrak tidak dapat diinstansiasi menjadi objek, sehingga jika pada program Anda di atas, Anda mencoba untuk melakukan instansiasi seperti ini, akan terjadi kesalahan:
AAA x = new AAA();
Kelas abstrak dapat mengandung fungsi-fungsi yang langsung diimplementasikan, seperti pada contoh di atas, yaitu fungsi callmetoo() yang didefinisikan pada kelas abstrak “AAA” termasuk implementasinya.
Menggunakan Final untuk Mencegah Overriding dan Inheritance Adakalanya, kita menginginkan kelas yang kita buat memiliki fungsi-fungsi yang tidak bisa di-override oleh kelas turunannya. Pada situasi yang lain, kita juga tidak ingin kelas kita bisa diturunkan ke kelas lain. Salah satu solusi untuk hal ini adalah dengan memberikan atribut final. Perhatikan contoh berikut ini:
class A { final void myFungsi(){ System.out.println("Ini final method"); } } class B extends A { void myFungsi(){ System.out.println("Gagal override");
161
} }
Pada contoh di atas, fungsi myFungsi() pada kelas A dicoba untuk ditimpa oleh kelas B. Namun tidak berhasil karena myFungsi() memiliki atribut final. Pada saat Anda mencoba kompilasi program di atas, akan muncul pesan kesalahan seperti ini:
tes.java:8: myFungsi() in B cannot override myFungsi() in A; overridden method is final void myFungsi(){ ^ 1 error
Sama halnya ketika Anda mendefinisikan atribut final pada deklarasi kelas. Jika ada program yang berusaha mendeklarasikan subkelas dari kelas final tersebut, akan terjadi kesalahan kompilasi. Contohnya adalah:
final class A { void myFungsi(){ System.out.println("Ini final method"); } } class B extends A { void myFungsi(){ System.out.println("Gagal override"); } }
162
Oleh karena A merupakan kelas final, maka ketika kelas B mencoba menjadi turunan dari kelas A, akan terjadi kesalahan kompilasi seperti ini:
tes.java:7: cannot inherit from final A class B extends A { ^ 1 error
Konsep penurunan sifat atau pewarisan sangat penting dalam paradigma pemrograman objek. Oleh karena itu, diharapkan pembaca memahami konsep ini baik dari teori maupun implementasinya.
163
164
Bab 11
Java Exception
Apa yang terjadi ketika ada kesalahan pada program, misalnya sebuah program yang akan digunakan untuk membaca file “X”, namun program tersebut gagal membuka file “X” yang diinginkan. Selayaknya Anda akan melakukan pengecekan hal-hal seperti ini dengan if-else, yang jumlahnya akan terus membengkak seiring dengan besarnya pengecekan yang perlu dilakukan. Java menyediakan mekanisme yang lebih baik dalam penanganan error (error handling) yang akan dibahas di bab ini.
Apa Exception Itu? Secara definitif, penulis menemukan bahwa yang dimaksud dengan exception adalah event yang terjadi ketika program menemui kesalahan saat instruksi program dijalankan. Banyak hal yang dapat menimbulkan event ini, misalnya crash, harddisk rusak dengan tiba-tiba sehingga programprogram tidak bisa mengakses file-file tertentu yang berada pada bad sector. Ada pun secara normal, pemrogram dapat pula menghasilkan event ini, misalnya dengan melakukan pembagian sebuah bilangan dengan nol, pengisian elemen array di luar jumlah elemen array yang dialokasikan dan sebagainya. Dalam bahasa Java, ketika terjadi kesalahan, otomatis akan dilemparkan sebuah objek yang disebut exception, yang kemudian dapat diproses lebih lanjut oleh fungsi-fungsi yang siap menangani kesalahan tersebut. Proses pelemparan 165
exception tersebut sering dikenal dengan istilah throwing exception, sedangkan proses penerimaan exception yang bersangkutan dikenal dengan istilah catch exception. Sebagai contoh kasus, misalkan Anda memiliki program yang akan melakukan pembacaan sebuah file dengan algoritma seperti ini:
Fungsi bacaFile BukaFile BacaBarisFileSampaiHabis TutupFile
Perhatikan, agar program ini lebih bersih Anda harus melakukan pengecekan kesalahan, misalnya untuk memeriksa bahwa program bisa membuka file dengan baik, menjadi seperti ini:
Fungsi bacaFile BukaFile Jika Gagal BukaFile Lakukan Sesuatu Jika Berhasil BukaFile BacaBarisFileSampaiHabis TutupFile
Jika program Anda harus memeriksa banyak kemungkinan kesalahan, Anda akan membutuhkan lebih banyak if-else yang mengurangi efektivitas program. Sebagai contoh dalam program bahasa C berikut:
166
#include <stdio.h> int main(int argc, char **argv){ FILE *fp; int error_code = 0; /* Buka File */ if((fp = fopen(“/etc/passwd”)) == NULL){ /* Terjadi Kesalahan */ error_code = -3; }else{ /* Alokasi Memori untuk penyimpanan */ char *buff = (char *)malloc(512); /* Alokasi Gagal */ if(buff == NULL){ error_code = -1; }else{ /* Alokasi sukses, baca file per baris */ while(fgets(buff,512,fp)){ printf(“%s”,buff); } } /* Tutup File, Gagal ? jika ya, simpan kode error */ if(!fclose(fp)){ error_code = -2; } } }
Lihat banyak sekali if-else pada program C di atas, di sinilah menariknya penanganan Exception dalam Java. Operator yang digunakan untuk penanganan Exception ini adalah try-catch seperti ini:
167
try { ……………………… }catch(Exception xxxx){ ……………………… }catch(Exception xxxx){ ……………………… }catch(Exception xxxx){ ……………………… }finally{ ……………………… }
Kembali ke program C di atas, daripada Anda menggunakan if-else yang mungkin akan membuat Anda bingung jika terlalu banyak, Anda bisa menggunakan model seperti ini:
#include <stdio.h> int main(int argc, char **argv){ FILE *fp; int error_code = 0; try{ /* Buka File */ fp = fopen(“/etc/passwd”); /* Alokasi Memori untuk penyimpanan */ char *buff = (char *)malloc(512); /* Alokasi sukses, baca file per baris */ while(fgets(buff,512,fp)){ printf(“%s”,buff); } fclose(fp); }catch(KesalahanBukaFile){
168
// Lakukan Sesuatu }catch(KesalahanAlokasiMemori){ // Lakukan Sesuatu }catch(KesalahanTutupFile){ // Lakukan Sesuatu } }
Lebih sederhana, bukan? Contoh lain tentang Java Exception adalah sebagai berikut:
import java.io.*; class prosesFile { private FileReader in; // Konstruktor public prosesFile(String filename){ in = new FileReader(filename); } public static void main(String args[]){ prosesFile mama = new prosesFile(“/etc/passwd”); } }
Program di atas jika dikompilasi akan terjadi kesalahan seperti ini: D:\Books\Java\program>javac prosesFile.java prosesFile.java:6: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown in = new FileReader(filename); ^ 1 error
169
Mengapa error pada saat kompilasi? Sederhana, FileReader() yang merupakan salah satu objek pada paket java.io, memiliki aturan bahwa ketika dia menerima parameter nama file untuk dibaca, jika file yang bersangkutan tidak ada, akan dilemparkan sebuah exception yang bernama java.io.FileNotFoundException. Exception ini harus dikelola oleh sebuah fungsi yang menjadi exception-handler-nya. Coba modifikasi program tersebut menjadi seperti ini:
import java.io.*; class prosesFile { private FileReader in; // Konstruktor public prosesFile(String filename){ try { in = new FileReader(filename); }catch(java.io.FileNotFoundException e){ System.err.println("File tidak ditemukan"); System.exit(0); } } public static void main(String args[]){ prosesFile mama = new prosesFile("/etc/passwd"); } }
Pada modifikasi di atas, tampak bahwa ada blok program yang siap menangani kesalahan jika file tidak ditemukan, yakni dengan mencetak pesan kesalahan bahwa file tidak ditemukan dan keluar dari program.
170
Try – Catch - Finally Seperti yang telah dilihat pada contoh sebelumnya, dalam Java untuk penanganan exception, digunakan blok try, catch, dan terakhir finally. Blok try, digunakan untuk menempatkan kode-kode program Java yang mengandung kode program yang mungkin melemparkan exception. Blok catch, digunakan untuk menempatkan kode-kode program Java yang digunakan untuk menangani sebuah exception tertentu. Blok finally, digunakan untuk clean-up.
171
172
Bab 12
Kelas java.lang.System dan Runtime
Kelas java.lang.System merupakan kelas yang sangat penting dalam Java. Pada bab-bab sebelumnya, Anda sebenarnya telah menggunakan kelas ini, yakni untuk mencetak ke layar dengan pemanggilan System.out.println. Pada bab ini akan dibahas tentang kelas ini lebih dalam.
Mengakses Sumber Daya Sistem Kelas System disediakan oleh Java, agar pemrogram Java bisa mengakses sumber daya sistem, seperti properti sistem, standar input/output, dan informasi waktu sistem dengan lebih mudah. Tanpa kelas ini, Anda tentulah harus membuat kode program Java yang lebih low level dan sangat bergantung pada platform sistem yang digunakan, sehingga Anda akan kesulitan sendiri. Berbeda dengan kelas-kelas yang lain pada umumnya, untuk menggunakan kelas ini Anda tidak perlu melakukan instansiasi variabel bertipe objek System dengan operator new. Jika Anda tengok lebih jauh, tampak bahwa kelas ini bersifat final dan seluruh konstruktornya bersifat private. Sehingga untuk menggunakan kelas ini, Anda langsung 173
mengacu ke fungsi atau member variable dari kelas ini, seperti berikut ini:
System.in System.out System.getProperty(“what”)
Salah satu member variable dari kelas ini yang sudah sering Anda pakai adalah System.out, yaitu member variable ini memiliki fungsi untuk mencetak data ke layar, yakni System.out.println. Fungsi ini bisa mengandung parameter dengan tipe data apapun yang ada dalam Java. Berikut ini akan diberikan contoh untuk menunjukkan penggunaan System.out.println untuk mencetak data ke layar:
/* * Nama file : tesCetak.java * Deskripsi : contoh program Java yang mencetak data ke layar * Kompilasi : javac tesCetak.java * Eksekusi program : java tesCetak */ public class tesCetak { public static void main(String[] args) { Thread objectData = new Thread(); String stringData = "Java Mania"; char[] charArrayData = { 'a', 'b', 'c' }; int integerData = 4; long longData = Long.MIN_VALUE; float floatData = Float.MAX_VALUE; double doubleData = Math.PI; boolean booleanData = true;
174
System.out.println(objectData); System.out.println(stringData); System.out.println(charArrayData); System.out.println(integerData); System.out.println(longData); System.out.println(floatData); System.out.println(doubleData); System.out.println(booleanData); } }
Selain System.out.println juga terdapat System.out.print yang digunakan untuk mencetak ke layar, namun tidak langsung diakhiri dengan karakter Enter. System.err merupakan variabel yang menjadi standar error, variabel ini digunakan untuk mencetak informasi data, terutama pesan kesalahan ke layar. Fungsi umum yang digunakan sama System.out, persis dengan fungsi pada yakni System.err.println() dan System.err.print(). System.in merupakan variabel yang menjadi standard input, penggunaan input stream cenderung lebih sukar daripada untuk mencetak data ke standar output. Namun, penggunaan umum adalah sebagai berikut:
import java.io.*; BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
Tampak pada penggunaan di atas, Anda bisa menggunakan variabel input yang memiliki fungsi readLine() untuk membaca sebaris masukan. Perlu diperhatikan bahwa, ketika melakukan pembacaan dari standar input ini, Anda 175
harus mengimpor paket java.io.* dan method yang implementasinya menggunakan pembacaan ini harus throws IOException. Perhatikan contoh di bawah ini agar Anda jelas:
/* * Nama file : masukan.java * Deskripsi : contoh program Java yang melakukan masukan dari standar input * Kompilasi : javac masukan.java * Eksekusi program : java masukan */ // Line ini harus ada import java.io.*; class masukan { public static void main(String[ ] args) throws IOException{ System.out.print("Masukkan sesuatu : "); // Proses Masukan User // ==================================================== BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String masukan = input.readLine(); // ==================================================== System.out.println("Masukan Anda = " + masukan); } }
176
Tampak ada tiga hal penting yang dicetak tebal, yakni: § import java.io.* Bagian ini digunakan untuk mengimpor paket java.io.* yang diperlukan oleh proses pembacaan masukan. § throws IOException Bagian ini menunjukkan bahwa jika ada kesalahan I/O akan dilempar exception. Namun, saat ini Anda tidak perlu berpusing-pusing masalah exception, yang penting Anda tulis bagian ini apa adanya. § String masukan = input.readLine() Bagian ini merupakan bagian ketika Anda membaca masukan dari standar input, kemudian menyim-pannya dalam variabel masukan yang bertipe String.
Mengakses Properti Sistem dengan System.getProperty Java menyimpan properti sistem yang sedang bekerja dalam pasangan key/value. Sederhananya lihat tabel berikut ini: Key “file.separator” “java.class.path” “java.class.version” “java.home” “java.vendor” “os.name” “os.arch” “os.version” “path.separator” “user.dir” “user.home”
Value Informasi tentang separator File Informasi path dari kelas Java Informasi veri dari kelas Java Lokasi Instalasi Java Informasi tentang vendor Java Informasi nama sistem operasi Informasi arsitektur sistem operasi Informasi versi sistem operasi Informasi pemisah path, misal “:” Informasi direktori kerja saat ini
Untuk mengakses nilai-nilai tersebut, maka dapat digunakan fungsi getProperty(String what), seperti pada contoh berikut ini:
177
/* * Nama file : properti.java * Deskripsi : contoh program Java yang menampilkan sistem * Kompilasi : javac properti.java * Eksekusi program : java properti */ class properti { public static void main(String[] args){ System.out.println("OS Name : " + System.getProperty("os.name")); System.out.println("OS Version : " + System.getProperty("os.version")); System.out.println("OS Arch : " + System.getProperty("os.arch")); System.out.println("Java Vendor : " + System.getProperty("java.vendor")); System.out.println("Java Version : " + System.getProperty("java.version")); } }
Program di atas jika dieksekusi akan menghasilkan keluaran sebagai berikut:
D:\Books\Java\program>java properti OS Name : Windows NT OS Version : 5.0 OS Arch : x86 Java Vendor : Sun Microsystems Inc. Java Version : 1.3
System.exit() Fungsi ini digunakan untuk keluar dengan paksa dari program. Identik dengan end pada Visual Basic dan exit() pada C/C++. 178
Runtime Sama halnya dengan kelas System, kelas ini tidak bisa diinstansiasi menjadi objek dengan konstruktor new. Kelas ini membungkus informasi tentang lingkungan runtime saat program Java dieksekusi, misalnya informasi memori, dan juga beberapa fungsi yang berkaitan dengan eksekusi program. Untuk menggunakannya, cukup dengan membuat reference ke objek Runtime yang bersangkutan saat program dijalankan denngan Runtime.getRuntime(). Setelah Anda mendapatkannya, maka Anda bisa menggunakannya untuk mengakses fungsi dalam kelas Runtime.
Runtime r = Runtime.getRuntime()
Umumnya, kelas Runtime digunakan dalam dua hal utama, yakni manajemen memori dan eksekusi proses lain.
Manajemen Memori Sekalipun Java menyediakan garbage collection yang membuat Anda tidak perlu lagi melakukan manajemen memori seperti manual selayaknya di C/C++, seringkali dibutuhkan informasi jumlah memori yang digunakan dan memori yang tersisa. Untuk mendapatkan informasi ini digunakan fungsi freeMemory() dan totalMemory(). Java garbage collection berjalan secara periodik untuk mencari objek-objek yang sudah terpakai untuk dibuang dari memori. Namun, kadangkala kita ingin menjalankannya saat ini, untuk itu bisa digunakan fungsi gc() untuk memaksa Java agar menjalankan garbage collection. Contoh penggunaan programnya adalah sebagai berikut:
179
/* * Nama File: memoryDemo.java * Deskripsi: Bagaimana mengambil informasi memori * Kompilasi: javac memoryDemo.java * Eksekusi : java memoryDemo */
class memoryDemo { public static void main(String[] args){ Runtime r = Runtime.getRuntime(); System.out.println("Total Memory is : " + r.totalMemory()); System.out.println("Initial Free Memory is : " + r.freeMemory()); // Run Garbage Collection r.gc(); System.out.println("After gargabe collection, free memory : " + r.freeMemory()); Integer arrayInt[] = new Integer[1000]; for(int i = 0; i < 1000; i++){ arrayInt[i] = new Integer(i); // Alokasi objek } System.out.println("After Allocate, free Mem: " + r.freeMemory()); } }
Adapun contoh keluaran dari program di atas adalah sebagai berikut:
180
D:\Books\Java\program>java memoryDemo Total Memory is : 1048568 Initial Free Memory is : 751368 After gargabe collection, free memory : 843616 After Allocate, free Mem: 823216
Hasil di atas tentu saja sangat bervariasi, sesuai dengan keadaan fisik memori pada komputer Anda.
Eksekusi program lain Mungkin bagi Anda yang pernah memprogram C/C++, PHP, atau Perl pernah menggunakan fungsi system() untuk mengeksekusi sebuah program lain. Dalam Java, untuk mengeksekusi program lain digunakan fungsi exec() yang ada pada objek Runtime. Fungsi ini menghasilkan sebuah objek dengan kelas Process yang kemudian bisa Anda gunakan untuk mengontol bagaimana program Java Anda bisa berinteraksi dengan program luar yang dijalankan ini. Contoh berikut akan menjelaskan bagaimana kita menjalankan program WordPad pada lingkungan Windows.
/* * Nama File: execDemo.java * Deskripsi: Bagaimana mengeksekusi program luar * Kompilasi: javac execDemo.java * Eksekusi : java execDemo */
class execDemo { public static void main(String[] args){
181
Runtime r = Runtime.getRuntime(); Process p = null; try{ p = r.exec("write"); p.waitFor(); }catch(Exception e){ System.err.println("Error executing wordpad"); } System.out.println("Wordpad return value = " + p.exitValue()); } }
182
Bab 13
Kelas java.lang.String
Java String merupakan salah satu kelas dasar yang disediakan oleh Java untuk manipulasi karakter data. Dalam banyak program Anda akan banyak memakai kelas ini, sehingga akan dijelaskan pula oleh penulis dalam buku ini.
Membuat Objek String Kelas String digunakan untuk mendefinisikan string yang konstant (tidak bisa berubah). Sebagaimana telah dijelaskan sebelumnya, Anda bisa menggunakan operator new untuk membuat sebuah objek sebagai instansiasi dari sebuah kelas, atau dengan memberikan inisialisasi awal pada variabel yang bersangkutan, seperti ini:
String s1 = new String(); String s3 = new String(“String Juga”); String s2 = “Init”;
Konstruktor kelas String ada banyak, namun yang umum digunakan adalah tiga cara di atas. Anda bisa mengacu ke dokumentasi JDK (Java Development Kit) untuk lebih mendalami beberapa konstruktor String dalam Java.
183
Fungsi-Fungsi Penting dalam String Ada banyak sekali method yang disediakan oleh kompiler Java untuk berbagai operasi penting dalam bahasa Java yang sebagian akan dibahas di bawah ini.
Menentukan panjang string Fungsi yang digunakan adalah length() yang menghasilkan nilai dengan tipe integer. Adapun contoh penggunaanya adalah sebagai berikut:
/* * Nama file : panjang_string.java * Deskripsi : contoh program Java yang menampilkan panjang string * Kompilasi : javac panjang_string.java * Eksekusi program : java panjang_string */ class panjang_string { // Fungsi utama, seperti halnya main() di c/c++ public static void main(String args[]){ String s1 = "String Pertama"; // Contoh konstruktor string String s2 = new String("String Kedua"); int
pjg;
pjg
= s1.length();
System.out.println("Panjang String s1 = \"" + s1 + "\" = " + pjg ); pjg
= s2.length();
System.out.println("Panjang String s2 = \"" + s2 + "\" = " + pjg ); } }
184
Menentukan Karakter pada Posisi Tertentu dari String Fungsi yang digunakan adalah chartAt(int index) yang menghasilkan karakter dengan memberikan parameter nomor indeks. Adapun contoh penggunaanya adalah sebagai berikut:
/* * Nama file : char_at.java * Deskripsi : contoh program Java yang memakai charAt * Kompilasi : javac char_at.java * Eksekusi program : java char_at */ class char_at { public static void main(String args[]){ char[] data = {'k','a','k','e','k','j','a','b','a','t'}; // Contoh lain konstruktor String String s1 = new String(data); for(int i = 0; i < s1.length(); i++){ System.out.println("Karakter ke-"+ (i+1) + " = " + s1.charAt(i)); } } }
Membandingkan Dua String Membandingkan adalah menentukan apakah dua string sama atau tidak, dengan memperhatikan pembandingan dengan memperhatikan perbedaan huruf besar kecil atau tidak. Fungsi yang digunakan adalah:
185
§
equals(String s) Dengan fungsi ini, maka objek string yang bersangkutan akan dibandingkan dengan objek String s, pada parameter fungsi ini, dengan membe-dakan pula antara huruf kecil dan huruf besar. § equalsIgnoreCase(String s) Dengan fungsi ini, maka objek string yang bersangkutan akan dibandingkan dengna objek String s, pada parameter fungsi ini, tanpa mempedulikan perbedaan antara huruf kecil dan huruf besar. Kedua fungsi di atas menghasilkan nilai boolean, true atau false. Agar lebih jelasnya, perhatikan contoh berikut ini:
/* * Nama file : stringSama.java * Deskripsi : contoh program Java yang menentukan apakah 2 string sama atau tidak ? * Kompilasi : javac stringSama.java * Eksekusi program : java stringSama */ class stringSama { public static void main(String args[]){ String s1 = "Kakek"; if(! s1.equals("kakek")){ System.out.println(s1 + " != kakek dengan equals()"); } // Membandingkan tanpa peduli perbedaan huruf besar/kecil if(s1.equalsIgnoreCase("kakek")){ System.out.println(s1 + " = kakek dengan equalsIgnoreCase()"); } } }
186
Jika program di atas coba Anda kompilasi dan jalankan, contoh keluarannya adalah sebagai berikut:
D:\Books\Java\program>java stringSama Kakek != kakek dengan equals() Kakek = kakek dengan equalsIgnoreCase()
Menentukan Substring Fungsi yang digunakan ada dua macam, yaitu: § substring(int index) Sebuah string akan dihasilkan oleh fungsi ini, yaitu karakter pertama dari String yang dihasilkan adalah karakter ke-index dari objek String yang menggunakan fungsi ini. Misalnya:
“fire”.substring(2) akan menghasilkan “re” “harbor”.substring(1) akan menghasilkan “arbor”
§
Jangan lupa, bahwa indeks pertama dari String dalam Java adalah 0, seperti halnya C/C++. substring(int indexAwal, int indexAkhir) Sebuah string akan dihasilkan oleh fungsi ini, yaitu karakter pertama dari String yang dihasilkan adalah karakter ke-indexAwal dari objek String yang menggunakan fungsi ini dan karakter terakhir dari string yang dihasilkan adalah karakter ke-indexAkhir dikurangi 1 dari String yang menggunakan fungsi ini. Misalnya:
187
“fire”.substring(2,3) akan menghasilkan “r” “harbor”.substring(1,4) akan menghasilkan “arb”
Agar lebih jelas lagi, perhatikan kode program Java berikut:
/* * Nama file : substring.java * Deskripsi : contoh program Java yang menggunakan substring * Kompilasi : javac substring.java * Eksekusi program : java substring */ class substring { public static void main(String args[]){ String s1 = "Kakek"; System.out.println("Kakek -> Substring(2) = "+s1.substring(2)); System.out.println("Kakek -> Substring(2,3) = "+s1.substring(2,3)); //Contoh lain pemakain method2 dalam objek String System.out.println("Jelangkung(5) = "+ "Jelangkung".substring(5)); System.out.println("Jelangkung(2,5) = "+ "Jelangkung".substring(2,5)); } }
Menentukan Awalan atau Akhiran String Operasi ini menentukan apakah sebuah String berawalan atau berakhiran dengan string tertentu. Ada dua fungsi utama, yakni: § startsWith(String s) Dengan fungsi ini, maka objek string yang bersangkutan akan diperiksa, apakah diawali oleh objek String s, pada parameter fungsi ini. 188
§
endsWith(String s) Dengan fungsi ini, maka objek string yang bersangkutan akan diperiksa, apakah diakhiri oleh objek String s, pada parameter fungsi ini. Kedua fungsi di atas menghasilkan sebuah nilai boolean, true atau false. Agar lebih memamahi, perhatikan contoh program Java berikut ini:
/* * Nama file : endStart.java * Deskripsi : contoh program Java yang menggunakan startsWith dan endsWith * Kompilasi : javac endStart.java * Eksekusi program : java endStart */ class endStart { public static void main(String args[]){ String s1 = "Kakek"; System.out.println("Kakek diawali \"Ka\" ? = " + s1.startsWith("Ka")); System.out.println("Kakek diawali \"ka\" ? = " + s1.startsWith("ka")); System.out.println("Kakek diakhiri \"ek\" ? = " + s1.endsWith("ek")); System.out.println("Kakek diakhiri \"eK\" ? = " + s1.endsWith("eK")); } }
Jika Anda mencoba mengeksekusi program Java di atas, hasilnya adalah sebagai berikut:
189
D:\Books\Java\program>java endStart Kakek diawali "Ka" ? = true Kakek diawali "ka" ? = false Kakek diakhiri "ek" ? = true Kakek diakhiri "eK" ? = false
Mengubah String Menjadi Huruf Kecil/Besar Semua Kadangkala kita ingin mengubah sebuah string menjadi huruf kecil semua atau huruf besar semua. Java menyediakan dua fungsi utama yang berkaitan dengan objek String, yakni toLowerCase() dan toUpperCase() yang masing-masing menghasilkan nilai bertipe String juga. Contoh programnya adalah sebagai berikut:
/* * Nama file : kecilBesar.java * Deskripsi : contoh program Java yang menghasilkan string sebagai huruf besar/kecil semua * Kompilasi : javac kecilBesar.java * Eksekusi program : java kecilBesar */ class kecilBesar { public static void main(String args[]){ String s1 = "Pearl Harbor"; System.out.println(s1 s1.toUpperCase());
+
"
menjadi
besar
semua
->
"
System.out.println(s1 + " menjadi kecil semua -> " + s1.toLowerCase()); } }
190
+
Jika Anda mencoba mengkompilasi dan mengeksekusi program Java di atas, hasilnya adalah sebagai berikut:
D:\Books\Java\program>java kecilBesar Pearl Harbor menjadi besar semua -> PEARL HARBOR Pearl Harbor menjadi kecil semua -> pearl harbor
Menghapus Whitespace pada Sebuah String Jika sebuah string mengandung karakter spasi, tabulasi atau linefeed pada awal dan akhirnya, maka kita bisa menghapusnya dengan menggunakan fungsi trim(). Misalnya:
“ mamamia ”.trim() akan menghasilkan “mamamia” “ mengapa ?”.trim() akan menghasilkan “mengapa ?”
Menggabungkan Dua String Anda dapat menggabungkan dua string dengan fungsi concat(). Misalnya:
String s1 = “Ady ”; String s2 = s1.concat(“Wicaksono”);
Dari contoh di atas, string “s2” akan berisi “Ady Wicaksono”.
191
Mengganti Karakter dalam String Jika Anda ingin mengganti semua keberadaan karakter tertentu dengan karakter lain, Anda bisa menggunakan fungsi replace(). Misalnya:
String s1 = “Ady Wicaksono”.replace(‘o’,’p’);
Dari contoh di atas, string “s1” akan berisi “Ady Wicakspnp”.
Mengubah String ke Numerik Sering kali Anda menemukan kondisi, yang Anda harus mengubah sebuah string dengan nilai numerik yang bersangkutan. Misalnya, Anda memiliki string “10”, dan Anda ingin menjadikannya integer 10, atau long 10. Anda bisa menggunakan beberapa fungsi berikut, yang bukan bagian dari objek String. § Integer.parseInt(String s) Fungsi ini menghasilkan nilai integer yang berkaitan dengan String “s” pada parameter fungsi. § Short.parseShort(String s) Fungsi ini menghasilkan nilai bertipe short, yang berkaitan dengan String “s” pada parameter fungsi. § Byte.parseByte(String s) Fungsi ini menghasilkan nilai bertipe byte, yang berkaitan dengan String “s” pada parameter fungsi. § Long.parseLong(String s) Fungsi ini menghasilkan nilai bertipe long, yang berkaitan dengan String “s” pada parameter fungsi.
192
§
Float.parseFloat(String s) Fungsi ini menghasilkan nilai bertipe float, yang berkaitan dengan String “s” pada parameter fungsi. § Double.parseDouble(String s) Fungsi ini menghasilkan nilai bertipe double, yang berkaitan dengan String “s” pada parameter fungsi. § Byte.parseByte(String s) Fungsi ini menghasilkan nilai bertipe byte, yang berkaitan dengan String “s” pada parameter fungsi. Contoh penggunaannya adalah sebagai berikut:
/* * Nama File: ubahStringkeNumerik.java * Deskripsi: Contoh penggunaan fungsi untuk mengubah string ke nilai numerik yang bersangkutan * Kompilasi: javac ubahStringkeNumerik.java * Eksekusi : java ubahStringkeNumerik */ import java.io.*; class ubahStringkeNumerik { public static void main(String[] args){ int
myInt
= 0;
short myShort = 0; long myLong = 0; byte myByte = 0; float myFloat = 0; double myDouble = 0; BufferedReader answer;
193
try { System.out.print("Masukkan sebuah Nilai Integer : "); answer = new BufferedReader(new InputStreamReader(System.in)); myInt = Integer.parseInt(answer.readLine()); System.out.println("Nilai Integernya : " + myInt); System.out.print("Masukkan sebuah Nilai Short : "); answer
= new BufferedReader(new InputStreamReader(System.in)); myShort = Short.parseShort(answer.readLine()); System.out.println("Nilai Shortnya : " + myShort); System.out.print("Masukkan sebuah Nilai Byte : ");
answer = new BufferedReader(new InputStreamReader(System.in)); myByte = Byte.parseByte(answer.readLine()); System.out.println("Nilai Bytenya : " + myByte); System.out.print("Masukkan sebuah Nilai Long : "); answer = new BufferedReader(new InputStreamReader(System.in)); myLong = Long.parseLong(answer.readLine()); System.out.println("Nilai Longnya : " + myLong); System.out.print("Masukkan sebuah Nilai Float : "); answer = new BufferedReader(new InputStreamReader(System.in)); myFloat = Float.parseFloat(answer.readLine()); System.out.println("Nilai Floatnya : " + myFloat); System.out.print("Masukkan sebuah Nilai Double : "); answer = new BufferedReader(new InputStreamReader(System.in)); myDouble= Double.parseDouble(answer.readLine()); System.out.println("Nilai Double : " + myDouble); }catch(IOException e){ System.out.println("Error I/O");
194
System.exit(0); } } } } }
Adapun contoh keluaran dari program tersebut adalah:
D:\Books\Java\program>java ubahStringkeNumerik Masukkan sebuah Nilai Integer : 123 Nilai Integernya : 123 Masukkan sebuah Nilai Short : 2221 Nilai Shortnya : 2221 Masukkan sebuah Nilai Byte : 12 Nilai Bytenya : 12 Masukkan sebuah Nilai Long : 3213213213 Nilai Longnya : 3213213213 Masukkan sebuah Nilai Float : 9e4 Nilai Floatnya : 90000.0 Masukkan sebuah Nilai Double : 8.4e4 Nilai Double : 84000.0
195
196
Bab 14
Wrapper Tipe Karakter
Selain menyediakan tipe char untuk menipulasi karakter, Java juga menyediakan objek Character yang merupakan bagian dari paket java.lang.* untuk menipulasi karakter dengan pendekatan objek. Bab ini akan membahas tentang beberapa penggunaan objek ini.
Konstruktor Untuk membuat objek berkelas Character, umumnya digunakan konstruktor berikut:
Character(char ch)
Contohnya:
Character t = new Character(‘t’); Character y = new Character(‘y’);
197
Fungsi-Fungsi Static dalam Kelas Character Dalam kelas Character, terdapat berbagai fungsi penting yang sifatnya statik sehingga Anda tidak perlu membuat/ menginstansiasi objek baru berkelas Character untuk menggunakannya, yakni: § isDigit(char ch) Fungsi ini menghasilkan nilai boolean yang menunjukkan apakah sebuah karakter merupakan sebuah nilai digit. § isLetter(char ch) Fungsi ini menghasilkan nilai boolean yang menunjukkan apakah sebuah karakter merupakan sebuah alphabet. § isLetterOrDigit(char ch) Fungsi ini menghasilkan nilai boolean yang menunjukkan apakah sebuah karakter merupakan sebuah nilai digit atau alfabet. § isLowerCase(char ch) Fungsi ini menghasilkan nilai boolean yang menunjukkan apakah sebuah karakter merupakan sebuah karakter dengan huruf kecil. § isUpperCase(char ch) Fungsi ini menghasilkan nilai boolean yang menunjukkan apakah sebuah karakter merupakan sebuah karakter dengan huruf besar. § isWhitespace(char ch) Fungsi ini menghasilkan nilai boolean yang menunjukkan apakah sebuah karakter merupakan sebuah karakter whitespace (tabulasi, spasi, newline).
198
§
toLowerCase(char ch) Fungsi ini menghasilkan nilai bertipe char, yang merupakan huruf kecil yang berkaitan dengan karakter ch pada parameter fungsi § toUpperCase(char ch) Fungsi ini menghasilkan nilai bertipe char, yang merupakan huruf besar yang berkaitan dengan karakter ch pada parameter fungsi Fungsi-fungsi di atas akan sangat berguna bagi Anda, dan memudahkan Anda dalam banyak hal. Contohnya, jika Anda ingin memeriksa sebuah karakter, apakah dia sebuah alfabet atau bukan, Anda tidak perlu lagi repot membuat pemeriksaan dengan if-else atau switch yang memakan banyak baris program. Adapun contoh penggunaan fungsifungsi di atas adalah sebagai berikut:
/* * Nama File: charDemo.java * Deskripsi: Contoh penggunaan objek Character * Kompilasi: javac charDemo.java * Eksekusi : java charDemo */ import java.io.*; class charDemo { public static void main(String[] args){ BufferedReader answer; char what; try {
199
System.out.print("Masukkan sebuah karakter : "); answer = new
BufferedReader(new
InputStreamReader(System.in));
what = (answer.readLine()).charAt(0); if(Character.isDigit(what)){ System.out.println("Karakter Digit"); } if(Character.isLetter(what)){ System.out.println("Karakter Letter"); } if(Character.isWhitespace(what)){ System.out.println("Karakter WhiteSpace"); } if(Character.isLowerCase(what)){ System.out.println("Karakter Huruf Kecil"); System.out.println("Ke huruf besar = " + Character.toUpperCase(what)); } if(Character.isUpperCase(what)){ System.out.println("Karakter Huruf Besar"); System.out.println("Ke huruf kecil = " + Character.toLowerCase(what)); } }catch(IOException e){ System.out.println("Error I/O"); System.exit(0); } } }
Contoh program di atas membaca masukan dari pengguna, dan melakukan beberapa operasi karakter, seperti memeriksa apakah karakter yang dimasukkan termasuk digit, letter, huruf kecil atau huruf besar dan mencetak versi 200
huruf besar atau huruf kecil dari karakter yang ada. Keluaran dari program di atas adalah sebagai berikut:
D:\Books\Java\program>java charDemo Masukkan sebuah karakter : k Karakter Letter Karakter Huruf Kecil Ke huruf besar = K D:\Books\Java\program>java charDemo Masukkan sebuah karakter : L Karakter Letter Karakter Huruf Besar Ke huruf kecil = l D:\Books\Java\program>java charDemo Masukkan sebuah karakter : 1 Karakter Digit
201
202
Bab 15
Kelas java.lang.Math
Untuk kebutuhan perhitungan matematika, misalnya untuk menghitung sinus, kosinus, tangen, nilai kuadrat, dapat digunakan fungsi-fungsi pada kelas java.lang.Math. Dalam kelas ini disediakan dua konstanta penting, yakni: § PI Nilainya bertipe double, kurang lebih senilai dengan 3,14 § E Nilainya bertipe double, kurang lebih senilai dengan 2,72
Konstruktor Sama halnya dengan kelas System, Anda tidak bisa menginstansiasi kelas ini menjadi sebuah objek. Namun, Anda bisa menggunakan fungsi-fungsinya dengan langsung mengacu ke objek Math, seperti ini:
Math.
atau Math.
Jadi, misalnya untuk mengakses konstanta PI dan E dalam kelas ini, digunakan:
203
Math.PI dan Math.E
Fungsi-Fungsi Penting Berikut adalah daftar fungsi-fungsi matematis penting dalam kelas java.lang.Math yang bisa Anda pergunakan:
Fungsi sinus, kosinus, tangen, asin(), acos(), atan(), atan2 §
§
§
§
§
§
§
204
sin(double arg) Fungsi ini menghasilkan nilai sinus dari argumen “arg”, yang bertipe double cos(double arg) Fungsi ini menghasilkan nilai kosinus dari argumen “arg”, yang bertipe double tan(double arg) Fungsi ini menghasilkan nilai tangen dari argumen “arg”, yang bertipe double asin(double arg) Fungsi ini menghasilkan nilai sudut, yang memiliki nilai sinus argumen “arg”, yang bertipe double. acos(double arg) Fungsi ini menghasilkan nilai sudut, yang memiliki nilai kosinus argumen “arg”, yang bertipe double. atan(double arg) Fungsi ini menghasilkan nilai sudut, yang memiliki nilai tangen argumen “arg”, yang bertipe double. atan2(double x, double y) Fungsi ini menghasilkan nilai sudut, yang memiliki nilai tangen x/y, yang bertipe double.
Fungsi Eksponensial Selain fungsi-fungsi perhitungan sudut, sinus, kosinus, dan tangen di atas, kelas java.lang.Math juga memiliki fungsifungsi untuk perhitungan eksponensial berikut: § exp(double arg) Fungsi ini menghasilkan nilai bertipe double yang merupakan nilai eksponen dari argumen arg. § log(double arg) Fungsi ini menghasilkan nilai bertipe double yang merupakan nilai natural logarithm dari argumen arg. § pow(double x, double y) Fungsi ini menghasilkan nilai bertipe double yang merupakan nilai pemangkatan x dengan y. Misalnya Math.pow(2.0, 3.0) akan mengembalikan nilai 8.0, karena 2 pangkat 3 = 8. § sqrt(double arg) Fungsi ini menghasilkan nilai bertipe double yang merupakan akar kuadrat dari argumen arg.
Fungsi-Fungsi Rounding Fungsi-fungsi yang dikelompokkan dalam fungsi-fungsi rounding adalah sebagai berikut: § abs(int arg) Fungsi ini menghasilkan nilai bertipe integer yang merupakan nilai absolut dari argumen arg. § abs(long arg) Fungsi ini menghasilkan nilai bertipe long yang merupakan nilai absolut dari argumen arg. § abs(float arg) Fungsi ini menghasilkan nilai bertipe float yang merupakan nilai absolut dari argumen arg.
205
§
§
§
§
§
§
§
§
206
abs(double arg) Fungsi ini menghasilkan nilai bertipe double yang merupakan nilai absolut dari argumen arg. max(int x, int y) Fungsi ini menghasilkan nilai bertipe integer yang merupakan nilai maksimum antara argumen x dan argumen y. max(long x, long y) Fungsi ini menghasilkan nilai bertipe long yang merupakan nilai maksimum antara argumen x dan argumen y. max(float x, float y) Fungsi ini menghasilkan nilai bertipe float yang merupakan nilai maksimum antara argumen x dan argumen y. max(double x, double y) Fungsi ini menghasilkan nilai bertipe double yang merupakan nilai maksimum antara argumen x dan argumen y. min(int x, int y) Fungsi ini menghasilkan nilai bertipe integer yang merupakan nilai minimum antara argumen x dan argumen y. min(long x, long y) Fungsi ini menghasilkan nilai bertipe long yang merupakan nilai minimum antara argumen x dan argumen y. min(float x, float y) Fungsi ini menghasilkan nilai bertipe float yang merupakan nilai minimum antara argumen x dan argumen y.
§
min(double x, double y) Fungsi ini menghasilkan nilai bertipe double yang merupakan nilai minimum antara argumen x dan argumen y. § rint(double arg) Fungsi ini menghasilkan nilai bertipe integer yang merupakan nilai integer terdekat dengan argumen arg. § round(float arg) Fungsi ini menghasilkan nilai bertipe integer yang merupakan nilai pembulatan ke atas dari argumen arg. § round(double arg) Fungsi ini menghasilkan nilai bertipe long yang merupakan nilai pembulatan ke atas dari argumen arg. Contoh penggunaan dari kelas ini adalah sebagai berikut:
/* * Nama File: mathDemo.java * Deskripsi: Bagaimana menggunakan kelas java.lang.Math * Kompilasi: javac mathDemo.java * Eksekusi : java mathDemo */
class mathDemo { public static void main(String[] args){ System.out.println("PI = " + Math.PI); System.out.println("E = " + Math.E); System.out.println("Sinus 45 derajat = " + Math.sin(45.0)); System.out.println("Kosinus 45 derajat = " + Math.cos(45.0)); System.out.println("Tangen 45 derajat = " + Math.tan(45.0));
207
System.out.println("ASin() 1 = " + Math.asin(1.0)); System.out.println("AKos() 1 = " + Math.acos(1.0)); System.out.println("ATan() 1 = " + Math.atan(1.0)); System.out.println("log 10
= " + Math.log(10.0));
System.out.println("3 pangkat 4 = " + Math.pow(3.0,4.0)); System.out.println("akar kuadrat dari 4 = " + Math.sqrt(4.0)); System.out.println("absolut -10 = " + Math.abs(-10)); System.out.println("max(4,5)
= " + Math.max(4,5));
System.out.println("min(4,5)
= " + Math.min(4,5));
System.out.println("round(1.567674)
= " + Math.round(1.567674));
} }
Jika Anda coba menkompilasi dan menjalankan program Java di atas, Anda akan mendapatkan keluaran seperti ini:
D:\Books\Java\program>java mathDemo PI = 3.141592653589793 E = 2.718281828459045 Sinus 45 derajat = 0.8509035245341184 Kosinus 45 derajat = 0.5253219888177297 Tangen 45 derajat = 1.6197751905438615 ASin() 1 = 1.5707963267948966 AKos() 1 = 0.0 ATan() 1 = 0.7853981633974483 log 10
= 2.302585092994046
3 pangkat 4 = 81.0 akar kuadrat dari 4 = 2.0 absolut -10 = 10 max(4,5)
=5
min(4,5)
=4
round(1.567674)
=2
Fungsi-fungsi matematika sangat penting dalam banyak hal, 208
sekalipun kurang lengkap untuk perhitungan yang jauh lebih rumit, Java cukup menyediakan fungsi-fungsi dasarnya.
209
210
Bab 16
Paket java.util.*
Paket java.util tersusun atas kelas-kelas penting yang terbagi atas dua bagian utama, yakni collection framework classes dan noncollection framework classes. Termasuk dalam collection framework classes antara lain adalah AbstractCollection, AbstractList, AbstractSet, ArrayList, Set, Hashtable. Kelas-kelas ini sangat penting untuk implementasi berbagai struktur data yang dapat Anda pelajari dalam dunia informasi seperti list, stack, linked-list. Penulis tidak akan membahas semua kelas dalam paket ini, namun beberapa paket penting saja yang tergolong dalam noncollection framework classes, karena kelas-kelas pada noncollection framework cukup membutuhkan berbagai pengetahuan mendasar tentang struktur data dalam dunia komputer. Berbeda dengan kelas-kelas pada paket java.lang, Anda harus mengimpor secara eksplisit terlebih dahulu untuk menggunakan kelas-kelas dalam java.util. Dalam paket ini juga terdapat, kelas-kelas untuk manipulasi file .zip, .gz, dan .jar.
StringTokenizer Saat melakukan pemrosesan teks, kadangkala kita membutuhkan mekanisme parsing sebuah teks dengan format atau pola tertentu. Parsing dalam hal ini adalah pemrosesan teks, yaitu sebuah teks dapat dipisahkan menjadi beberapa bagian dengan pemisah yang didefinisikan oleh pemrogram. Jadi, misalnya ada sebuah teks “Mengapa, kita 211
pergi” dapat dipisahkan menjadi dua kata “Mengapa” dan “ kita pergi” dengan mendefinisikan pemisahnya adalah koma “,”.
Konstruktor dan Fungsi-Fungsinya Ada dua buah konstruktor yang umum digunakan, yakni: § StringTokenizer(String str) § StringTokenizer(String str, String delimiters) Pada konstruktor yang pertama, digunakan karakter pemisah (delimiter) standar, yakni “\t\r\n\f” atau karakter tabulasi, newline, line-feed, dan form-feed. Setelah kiat menginisialisasi objek bertipe kelas ini, otomatis kita bisa menggunakan fungsi nextToken() untuk mengacu ke string tersisa yang belum di-parsing. Fungsi hasMoreTokens() bisa digunakan untuk memeriksa apakah masih ada sisa string yang belum di-parsing. Contoh penggunaan berikut adalah untuk mem-parsing sebuah string dengan pemisah “=” dan “;”.
/* * Nama File: parsingToken.java * Deskripsi: Bagaimana memparsing string * Kompilasi: javac parsingToken.java * Eksekusi : java parsingToken */ import java.util.*; class parsingToken { public static void main(String[] args){ String str
= "Judul = Dasar-dasar pemrograman Java;" + "Pengarang = Ady Wicaksono;" +
212
"Penerbit = PT Elexmedia Komputindo"; String pemisah = "=;"; StringTokenizer st = new StringTokenizer(str,pemisah); while(st.hasMoreTokens()){ String x = st.nextToken(); String y = st.nextToken(); System.out.println(x + " -> " + y); } } }
Program di atas akan menghasilkan keluaran berikut saat dijalankan:
D:\Books\Java\program>java parsingToken Judul -> Dasar-dasar pemrograman Java Pengarang -> Ady Wicaksono Penerbit -> PT Elexmedia Komputindo
Date Kelas Date menyimpan informasi waktu saat ini. Ada dua konstruktor yang umum digunakan, yakni: § Date() § Date(long milisec) Konstruktor pertama akan menghasilkan informasi waktu sekarang, sedangkan konstruktor yang kedua akan mengasilkan informasi waktu dihitung jumlah milidetik (miliseconds) – pada parameter konstruktor, yang telah terlewati sejak 1 Januari 1970 jam 00:00.
213
Fungsi-fungsi dalam kelas ini ada beberapa, antara lain: § toString() Fungsi ini menghasilkan string, yang merupakan representasi waktu sekarang § getTime() Fungsi ini menghasilkan nilai bertipe long, yang menunjukkan jumlah milidetik yang telah berjalan sejak 1 Januari 1970 jam 00.00 sampai sekarang Contoh penggunaan kelas ini adalah sebagai berikut:
/* * Nama File: infoWaktu.java * Deskripsi: Menampilkan informasi waktu sekarang * Kompilasi: javac infoWaktu.java * Eksekusi : java infoWaktu */ import java.util.Date; class infoWaktu { public static void main(String[] args){ Date
d
= new Date();
String sekarang = d.toString(); long
jumMDetik = d.getTime();
System.out.println("Sekarang : " + sekarang); System.out.println("Jumlah MiliDetik sejak 1 Januari 1970 : " + jumMDetik); } }
Jika program di atas dijalankan, akan menghasilkan informasi waktu seperti ini: 214
D:\Books\Java\program>java infoWaktu Sekarang : Sat Feb 02 21:11:12 GMT+07:00 2002 Jumlah MiliDetik sejak 1 Januari 1970 : 1012659072791
Random Kelas Random digunakan untuk menghasilkan nilai sembarang secara acak/random. Ada dua konstruktor yang umum digunakan, yakni: § Random() § Random(long seed) Pada konstruktor pertama, akan dikembalikan nilai random dengan seed waktu sekarang, sedangkan pada konstruktor kedua bisa didefinisikan nilai seed sendiri. Dalam kelas ini terdapat fungsi-fungsi penting, yakni: § nextBoolean() Fungsi ini menghasilkan sebuah nilai boolean secara acak § nextDouble () Fungsi ini menghasilkan sebuah nilai double secara acak § nextFloat() Fungsi ini menghasilkan sebuah nilai float secara acak § nextInt() Fungsi ini menghasilkan sebuah nilai integer secara acak § nextLong() Fungsi ini menghasilkan sebuah nilai long secara acak § nextGaussian() Fungsi ini menghasilkan sebuah nilai double secara acak
215
Agar lebih jelasnya, perhatikan contoh program Java berikut yang mendemonstrasikan bagaimana Java menghasilkan nilai-nilai random dengan menggunakan fungsi nextGaussian()
/* * Nama File: randomDemo.java * Deskripsi: Menampilkan nilai random dengan Java * Kompilasi: javac randomDemo.java * Eksekusi : java randomDemo */ import java.util.Random; class randomDemo { public static void main(String[] args){ Random r = new Random(); double val = 0.0; double sum = 0.0; int
bell[] = new int[10];
for(int i = 0; i < 100; i++){ val
= r.nextGaussian();
sum
+= val;
double t = -2; for(int x = 0; x < 10; x++, t += 0.5){ if(val < t){ bell[x]++; break; } } } System.out.println("Rata2 nilai : " + (sum/100));
216
for(int i = 0; i < 10; i++){ for(int x = bell[i]; x >0; x --){ System.out.print("*"); } System.out.println(""); } } }
Program di atas, akan menghasilkan keluaran seperti ini:
D:\Books\Java\program>java randomDemo Rata2 nilai : 0.1857481886572554 ** * ****** ********** ***************** ****************************** ******************* ******* ***** ** Rata2 nilai : -0.02379112012006849 ** *** ********** ******************** ******************* ****************** ************ ********** *****
217
218
Bab 17
File JAR (Java Archieve File)
Anda akan banyak berurusan dengan file *.jar selain filefile berekstensi *.class dan *.java. Pada Java, file *.jar digunakan untuk membungkus beberapa file menjadi sebuah file archieve. Umumnya digunakan untuk membungkus file-file kelas Java dengan informasi dan filefile lain yang dibutuhkan oleh kelas tersebut. Ada beberapa keuntungan dengan membungkus file-file dengan JAR, antara lain: § Security File JAR dapat ditandatangani secara digital, sehingga akan lebih meningkatkan keamanan file. § Decrease download time File-file kelas Applet yang ditempatkan dalam website akan semakin cepat di-download oleh browser, karena dengan file JAR file-file tersebut akan dikompresi menjadi lebih kecil. Selain itu, dengan membungkus file-file kelas Applet, tidak perlu melakukan beberapa kali koneksi HTTP (koneksi web) karena semuanya sudah masuk dalam bungkusan file JAR tersebut § Compression File-file yang dibungkus dalam JAR akan diperkecil ukurannya sehingga akan menghemat kebutuhan ruang disk Anda.
219
§
Package Versioning File JAR dapat mengandung informasi versi, vendor, dan berbagai file informasi lain dari file-file utama yang dibungkusnya Portability File JAR bersifat portable, karena semua file JAR akan dapat diproses oleh JRE (Java RunTime) yang bersifat multiplatform.
§
Menggunakan File JAR File JAR dibungkus dengan menggunakan format ZIP, sehingga Anda bisa membuka file JAR dengan tool-tool dekompresor seperti WinZIP. Sekalipun demikian, format JAR menambahkan berbagai fitur seperti yang disebutkan di atas. Untuk menggunakannya, baik untuk membuat, mengekstrak, melihat isi file JAR, dan berbagai manipulasi file JAR digunakan tools JAR (Java Archieve) Tools yang merupakan bagian dari JDK (Java Development Kit). Penulis kembali mengingatkan bahwa JDK ini dapat didownload secara online dari situs http://java.sun.com atau http://www.blackdown.org/ Kali ini untuk bekerja dengan file JAR, terlebih dahulu buatlah sebuah program Java dengan nama “myJar.java” dan berisi kode program berikut:
class myJar_A { int i,j; // Konstruktor myJar_A(int a, int b){ i = a; j = b; }
220
// Menampilkan isi variabel i dan j void show(){ System.out.println("i dan j = " + i + " & " + j); } } class myJar_B extends myJar_A { int k; // Konstruktor myJar_B(int a, int b, int c){ super(a,b); k = c; } // Menampilkan isi variabel k void show(){ System.out.println("k = " + k); } } class myJar { public static void main(String args[]){ myJar_B m = new myJar_B(1,2,3); m.show(); } }
Kemudian, kompilasi program di atas, sehingga akan dihasilkan tiga file *.class, masing-masing “myJar.class”, “myJar_B.class”, dan “myJar_A.class”
D:\Books\Java\program>dir myJar* Volume in drive D is MUNTILAN Volume Serial Number is 2E55-1C0C
221
Directory of D:\Books\Java\program 02/02/2002 11:14p
630 myJar.java
02/02/2002 11:15p
693 myJar_A.class
02/02/2002 11:15p
642 myJar_B.class
02/02/2002 11:15p 4 File(s)
327 myJar.class 2,292 bytes
0 Dir(s) 1,432,481,792 bytes free
Nantinya, dalam manipulasi file JAR, penulis akan menggunakan ketiga file *.class tersebut.
Membuat File JAR Untuk membuat file JAR, digunakan perintah “jar” dengan option seperti ini:
jar cf
Sebagai contoh, dengan menggunakan ketiga file kelas di atas, akan dibuat file JAR dengan nama percobaan.jar, cara membuatnya adalah seperti ini:
jar cf percobaan.jar myJar.class myJar_A.class myJar_B.class
Dan hasilnya adalah sebuah file JAR bernama “percobaan.jar”, yang terdiri atas ketiga file di atas ditambah dengan sebuah file MANIFEST.
222
D:\>jar cf percobaan.jar myJar.class myJar_A.class myJar_B.class D:\>dir percobaan.jar Volume in drive D is MUNTILAN Volume Serial Number is 2E55-1C0C Directory of D: 02/02/2002 11:23p 1 File(s)
1,778 percobaan.jar 1,778 bytes
0 Dir(s) 1,431,343,104 bytes free
Anda dapat pula menambahkan option “v” untuk melihat lebih detail pembuatan file JAR-nya. Misalnya:
D:\> jar cvf percobaan.jar myJar.class myJar_A.class myJar_B.class added manifest adding: myJar.class(in = 327) (out= 253)(deflated 22%) adding: myJar_A.class(in = 693) (out= 434)(deflated 37%) adding: myJar_B.class(in = 642) (out= 399)(deflated 37%)
Melihat Isi File JAR Untuk melihat isi dari file JAR, digunakan perintah “jar” dengan option seperti ini:
jar tf
Option “tf” dapat ditambahi “v” sehingga hasilnya akan lebih detail. Sebagai contoh, dengan menggunakan file percobaan.jar di atas, akan dilihat isinya, apakah benar 223
berisi file “myJar.class”, “myJar_A.class”, “myJar_B.class” atau tidak, dengan cara:
dan
D:\> jar tvf percobaan.jar 0 Sat Feb 02 23:28:46 GMT+07:00 2002 META-INF/ 68 Sat Feb 02 23:28:46 GMT+07:00 2002 META-INF/MANIFEST.MF 327 Sat Feb 02 23:15:02 GMT+07:00 2002 myJar.class 693 Sat Feb 02 23:15:02 GMT+07:00 2002 myJar_A.class 642 Sat Feb 02 23:15:02 GMT+07:00 2002 myJar_B.class
Mengesktrak File JAR Untuk mengekstrak file JAR, digunakan perintah “jar” dengan option seperti ini:
jar xf
Option “xf” dapat ditambahi “v” sehingga hasilnya akan lebih detail. Sebagai contoh, dengan menggunakan file percobaan.jar di atas, akan diekstrak isinya dengan cara:
D:\> jar xfv percobaan.jar created: META-INF/ extracted: META-INF/MANIFEST.MF extracted: myJar.class extracted: myJar_A.class extracted: myJar_B.class
224
File MANIFEST Pada saat mengekstrak file percobaan.jar di atas, Anda menemukan sebuah direktori bernama META-INF yang berisi file MANIFEST.MF. Sebenarnya file apakah itu? File ini merupakan metafile yang menyediakan fungsionalitas lebih pada JAR, seperti untuk penyimpanan tanda tangan digital, package versioning, dan sebagainya. Secara default, saat dibuat file JAR, akan dibuat file ini dalam direktori META-INF, yang berisi dua baris seperti ini:
Manifest-Version: 1.0 Created-By: 1.3.0 (Sun Microsystems Inc.)
File ini sangat penting, karena seperti yang telah disebutkan, file inilah yang menjadi kunci fungsionalitas lebih pada file JAR. Ada beberapa entri header yang penting untuk ditempatkan pada file MANIFEST ini, antara lain:
Main-Class Java mengizinkan kita mengeksekusi sebuah file JAR yang di dalamnya ada file-file kelas Java, dan salah satu kelasnya mengandung fungsi public static void main() dengan cara:
java -jar
Adakalanya Anda ingin membungkus banyak file *.class dalam satu file JAR, dan file JAR ini bisa langsung dijalankan oleh Java. Entri Main-Class menunjukkan kelas apakah yang memiliki fungsi public static void main(). 225
Misalnya, dengan menggunakan file percobaan.jar di atas, jelaslah bahwa fungsi public static void main() terdapat pada kelas “myJar.class”. Namun, ketika kita ingin mengeksekusi file percobaan.jar, terjadi kesalahan seperti ini:
D:\> java -jar percobaan.jar Failed to load Main-Class manifest attribute from percobaan.jar
Karenanya, kita harus mengubah file MANIFEST ini agar bisa mengandung entri Main-Class. Bagaimana cara mengupdatenya? Caranya dengan memberikan perintah:
jar ufv
adalah file teks biasa yang berisi entri-entri MANIFEST tambahan yang diinginkan.
226
Bab 18
Input/Output
Input/Output dalam Java umumnya diurusi oleh kelas-kelas dalam paket java.io. Selain kelas-kelas, paket ini juga mengandung interface yang semuanya menangani masalah aliran/stream data keluar (output) dan data masuk (input). Data tersebut dapat tersimpan dalam file, memori, disk, jaringan, atau program lain dengan bentuk data suara, data gambar, data karakter. Untuk mengambil data tersebut, sebuah program Java akan membuka stream pada sumber data tersebut dan membacanya secara serial.
Gambar 18-1. Skema pembacaan stream data Proses mengirimkan stream data pun seperti itu, program Java akan membuka stream data ke tujuan yang diinginkan dan menulis secara serial.
227
Gambar 18-2. Skema penulisan stream data Kelas stream pada paket java.io dapat dibagi atas dua bagian utama berdasarkan jenis data yang diproses, yakni character stream dan byte stream. Berdasarkan kegunaannya, kelas stream dapat dibagi atas dua, yakni data sink stream dan processing stream. Ingat, bahwa untuk menggunakan kelas-kelas dalam paket ini, Anda harus melakukan import java.io.* terlebih dahulu.
Byte Stream Kelompok kelas dan interface dalam byte stream digunakan untuk menangani proses baca/tulis byte data, misalnya untuk membaca dan menulis data binari. Secara hirarki, ada dua kelas abstrak yang menjadi super kelas, bagi semua kelas-kelas dalam byte stream, yakni InputStream dan OutputStream. Masing-masing dari kelas ini memiliki subkelas yang menangani secara lebih spesifik proses I/O pada disk, file, memori, jaringan, dan sebagainya. Bagan dari kelompok kelas ini adalah sebagai berikut:
228
Gambar 18-3. InputStream dan subkelasnya
Gambar 18-4. OutputStream dan subkelasnya
Character Stream Kelompok kelas dan interface dalam character stream digunakan untuk menangani proses baca/tulis himpunan karakter Unicode. Kelompok kelas ini merupakan pengembangan dari byte stream, sehingga kadang-kadang lebih efisien penggunaannya dibanding kelas-kelas pada byte stream. Sama halnya dengan kelompok kelas bytestream, kelas ini memiliki dua superkelas, yang masing-masing kelasnya merupakan kelas abstrak, yaitu Reader dan Writer. Bagannya dapat Anda lihat pada Gambar 18-5 dan Gambar 18-6.
229
Gambar 18-5. Reader dan subkelasnya
Gambar 18-6. Writer dan subkelasnya
Data Sink Stream Kelompok kelas dan interface dalam data sink stream digunakan untuk menangani proses baca/tulis dari suatu stream khusus, misalnya file, pipe, atau string. Tabel berikut akan memetakan jenis stream dari masing-masing tipe kelas (berdasar jenis data yang diproses), yang termasuk dalam data sink stream.
230
Tabel 18-1. Tabel pemetaan kelas bertipe data sink Tipe Data Sink Character Stream Memori CharArrayReader CharArrayWriter StringReader StringWriter Pipe PipeReader PipeWriter File FileReader FileWriter
Byte Stream ByteArrayInputStream ByteArrayOutputStream StringBufferInputStream PipedInputStream PipedOutputStream FileInputStream FileOutputStream
Processing Stream Kelompok kelas dan interface dalam processing stream digunakan untuk melakukan aksi tertentu pada sebuah stream, misalnya buffering, encoding, printing. Tabel berikut akan memetakan jenis stream dari masing-masing tipe kelas (berdasar jenis data yang diproses), yang termasuk dalam processing stream. Tabel 18-1. Tabel pemetaan kelas bertipe process Proses Buffering Filtering Konversi byte-karakter Konkatenansi Object Serialization Konversi data Counting Peeking Printing
Character Stream BufferedReader BufferedWriter FilterReader FilterWriter InputStreamReader InputStreamWriter
LineNumberReader PushbackReader PrintWriter
Byte Stream BufferedInputStream BufferedOutputStream FilterInputStream FilterOutputStream
SequenceInputStream ObjectInputStream ObjectOutputStream DataInputStream DataOutputStream LineNumberInputStream PushbackInputStream PrintStream
231
Stream Standard Sebagaimana Anda ketahui, bahwa dalam paket java.lang terdapat kelas System yang mendefinisikan in, out, err yang masing-masing berkaitan dengan standard input, standard output, dan standard error. Sebenarnya System.in merupakan objek dengan tipe kelas InputStream sedangkan System.out dan System.err merupakan objek dengan tipe kelas PrintStream. Tampak bahwa keduanya merupakan golongan kelas byte stream.
Membaca dari keyboard Dalam Java, masukan dari keyboard diakses menggunakan System.in. Agar Anda lebih mudah memprosesnya, objek yang ada dalam System.in sebaiknya dibungkus dengan objek BufferedReader, dengan cara seperti ini:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Dengan menggunakan objek di atas, Anda telah mendapatkan sebuah objek yang menangani aliran karakter (character stream), dan Anda bisa melakukan proses baca yang lebih mudah. Misalnya, Anda ingin membaca data per karakter dari keyboard, maka Anda cukup menggunakan fungsi read() yang ada pada objek BufferedReader. Fungsi read() yang akan kita gunakan akan menghasilkan nilai integer –1, jika mencapai end-of-stream. Agar lebih mengerti, pada contoh program Java berikut, akan dibaca masukan karakter dari konsole, sampai karakter yang dimasukkan ‘q’.
232
/* * Nama File: bacaKarakter.java * Deskripsi: Membaca karakter dari keyboard * Kompilasi: javac bacaKarakter.java * Eksekusi : java bacaKarakter */ import java.io.*; class bacaKarakter { public static void main(String args[]){ char c; try{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Masukkan karakter, dan akhiri dengan 'q'"); do{ c = (char) br.read(); System.out.println("Terbaca Karakter -> " + c); }while(c != 'q'); }catch(IOException e){ System.out.println("Kesalahan I/O"); System.exit(0); } } }
Adapun, contoh hasilnya adalah sebagai berikut:
D:\Books\Java\program>java bacaKarakter Masukkan karakter, dan akhiri dengan 'q'
233
abc Terbaca Karakter -> a Terbaca Karakter -> b Terbaca Karakter -> c Terbaca Karakter -> Terbaca Karakter -> q Terbaca Karakter -> q
Mungkin hasilnya terkesan aneh bagi Anda. Namun, sebenarnya yang terjadi adalah Java akan menempatkan data yang masuk dalam sebuah buffer, sampai Anda menekan Enter. Pada dua baris terakhir dari masukan “abc” tampak kosong padahal sebenarnya isinya adalah karakter CarriageReturn dan Linefeed. Pada kasus yang lain, adakalanya Anda ingin membaca sebuah baris string dari keyboard, maka Anda bisa menggunakan fungsi readLine() pada objek BufferedReader yang menghasilkan sebuah objek String. Coba perhatikan contoh sederhana berikut:
/* * Nama File: bacaString.java * Deskripsi: Membaca String dari keyboard * Kompilasi: javac bacaString.java * Eksekusi : java bacaString */ import java.io.*; class bacaString { public static void main(String args[]){
234
try{ String str; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Masukkan string, dan akhiri dengan \"akhir\""); do{ str = br.readLine(); System.out.println("Terbaca String -> \"" + str + "\""); }while(!str.equalsIgnoreCase("akhir")); }catch(IOException e){ System.out.println("Kesalahan I/O"); System.exit(0); } } }
Contoh keluaran dari program di atas adalah:
D:\Books\Java\program>java bacaString Masukkan string, dan akhiri dengan "akhir" mengapa Terbaca String -> "mengapa" kakek Terbaca String -> "kakek" nenek Terbaca String -> "nenek" Akhir Terbaca String -> "Akhir"
Pada contoh-contoh di atas, Anda menemukan bahwa kita menempatkan blok-blok kode dalam try{}catch{}. Hal ini dikarenakan operasi I/O paling tidak akan melemparkan sebuah exception, yakni IOException yang harus kita tangani atau kita buang ke sistem. Cara yang kedua ini 235
menggunakan kata kunci throws, dan penggunaannya seperti ini: /* * Nama File: bacaString.java * Deskripsi: Membaca String dari keyboard * Kompilasi: javac bacaString.java * Eksekusi : java bacaString */ import java.io.*; class bacaString { public static void main(String args[]) throws IOException{ String str; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Masukkan string, dan akhiri dengan \"akhir\""); do{ str = br.readLine(); System.out.println("Terbaca String -> \"" + str + "\""); }while(!str.equalsIgnoreCase("akhir")); } }
Menulis ke Layar Berbeda dengan proses baca dari keyboard, proses tulis ke layar jauh lebih mudah, Anda tidak perlu pusing-pusing menggunakan objek PrintStream, namun cukup menggunakan System.out.print() dan System.out.println(). Penulis tidak akan membahas lebih mendetail tentang menulis ke layar dengan PrintStream.
236
Operasi File Operasi manipulasi file dan direktori dalam sebuah program sangat penting. Ada beberapa kelas penting dalam paket java.io yang sangat erat kaitannya dengan operasi file, dan akan dijabarkan di bawah ini: Sekalipun dalam paket java.io, kebanyakan kelas berurusan dengan aliran data (stream), kelas File ini tidak demikian adanya. Namun, kelas ini berurusan dengan properti dari sebuah file itu sendiri, misalnya untuk mengambil informasi permission file, tanggal pembuatan file, menghapus file. Direktori yang ada pun, akan diurus oleh kelas ini. Ada sebuah konstruktor yang umum digunakan, yakni File(String nama). Jadi, dengan konstruktor tersebut, otomatis objek File yang ada akan dikaitkan dengan sebuah direktori/file dalam komputer. Dalam kelas ini terdapat fungsi-fungsi penting, yakni: § canRead() Fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah file bisa dibaca atau tidak § canWrite() Fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah file bisa ditulis atau tidak § createNewFile() Membuat file kosong baru dan fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah proses pembuatan file berhasil dilakukan atau tidak § delete() Menghapus file dan fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah proses penghapusan berhasil atau tidak
237
§
exists() Fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah file ada atau tidak § isFile() Fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah objek yang diakses adalah sebuah file atau tidak § isDirectory() Fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah objek yang diakses adalah sebuah direktori atau tidak § lastModified() Fungsi ini menghasilkan sebuah nilai long yang menunjukkan informasi waktu kapan terakhir file dimodifikasi § length () Fungsi ini menghasilkan sebuah nilai long yang menunjukkan informasi ukuran file § mkdir() Membuat direktori dan fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah berhasil membuat direktori atau tidak § mkdirs() Membuat direktori sekaligus parent directory-nya jika tidak ada dan fungsi ini menghasilkan sebuah nilai boolean yang menunjukkan apakah berhasil membuat direktori atau tidak § renameTo(File newfilename) Mengubah nama file ke nama file baru Contoh penggunaan dari objek File dengan fungsifungsinya adalah sebagai berikut:
238
/* * Nama File: operasiFile.java * Deskripsi: Menampilkan informasi File * Kompilasi: javac operasiFile.java * Eksekusi : java operasiFile */ import java.util.Date; import java.io.*;
class operasiFile { public static void main(String[] args) throws IOException{ File f = new File(args[0]); System.out.println("Operating on " + f.getName()); if(f.exists()){ System.out.println("File is exists"); }else{ System.out.println("File not exists, creating a new one"); if(f.createNewFile()){ System.out.println("Done....!"); }else{ System.out.println("Not Done...!"); System.exit(0); } } System.out.println("File Can Read ? " + f.canRead()); System.out.println("File Can Write ? " + f.canWrite()); System.out.println("File is file ? " + f.isFile()); System.out.println("File is directory ? " + f.isDirectory()); Date d = new Date(f.lastModified()); System.out.println("Last modified " + d.toString()); System.out.println("File size : " + f.length());
239
} }
Contoh penggunaan program di atas, adalah sebagai berikut:
D:\Books\Java\program> java operasiFile "c:\tes.java" Operating on tes.java File not exists, creating a new one Done....! File Can Read ? true File Can Write ? true File is file ? true File is directory ? false Last modified Sun Feb 03 15:17:58 GMT+07:00 2002 File size : 0
Contoh lain penggunaan kelas file adalah untuk mengubah nama (rename) sebuah file sebagai berikut:
/* * Nama File: renFile.java * Deskripsi: Mengganti nama file * Kompilasi: javac renFile.java * Eksekusi : java renFile */ import java.io.*; public class renFile {
240
public static void main(String[] args){ if(args.length != 2){ System.out.println("usage: java renFile "); System.exit(1); } File ftst = new File(args[0]); if(ftst.renameTo(new File(args[1]))){ System.out.println("Rename " + args[0] + " to " + args[1]); }else{ System.out.println("Rename failed"); } } }
Contoh berikutnya adalah bagaimana membuat sebuah direktori dengan fungsi mkdirs().
/* * Nama File: mkDir.java * Deskripsi: Membuat direktori * Kompilasi: javac mkDir.java * Eksekusi : java mkDir */ import java.io.*; public class mkDir{ public static void main(String[] args){ if(args.length != 1){ System.out.println("usage: java mkDir "); System.exit(1); }
241
File ftst = new File(args[0]); if(ftst.mkdir()){ System.out.println("Created directory " + args[0]); } } }
Membaca Sebuah file Untuk membaca sebuah file, Anda bisa menggunakan kelas-kelas dari golongan byte stream maupun character stream. Namun, umumnya dan sangat dianjurkan untuk menggunakan character stream. Kelas yang digunakan untuk membaca file adalah FileReader yang dibungkus dalam BufferedReader. Agar lebih jelas, Anda bisa memperhatikan contoh program Java berikut:
/* * Nama File: readFile.java * Deskripsi: Membaca sebuah file * Kompilasi: javac readFile.java * Eksekusi : java readFile */ import java.io.*; public class readFile { public static void main(String[] args){ if(args.length != 1){ System.out.println("usage: java readFile "); System.exit(1); }
242
try { FileReader f = new FileReader(args[0]); BufferedReader r = new BufferedReader(f); String s = null; while((s = r.readLine()) != null){ System.out.println(s); } r.close(); f.close(); }catch(FileNotFoundException e){ System.out.println("File " + args[0] + " not found"); System.exit(1); }catch(IOException e){ System.out.println("I/O Error"); System.exit(1); } } }
Program di atas, menerima parameter berupa nama file yang akan dibaca, jadi misalnya Anda ingin membaca file “C:\WINNT\ODBC.ini”, Anda cukup menjalankannya seperti ini:
D:\Books\Java\program> java readFile "C:\WINNT\ODBC.ini" [ODBC 32 bit Data Sources] MS Access Database=Microsoft Access Driver (*.mdb) (32 bit) dBASE Files=Microsoft dBase Driver (*.dbf) (32 bit) Excel Files=Microsoft Excel Driver (*.xls) (32 bit) Visual FoxPro Database=Microsoft Visual FoxPro Driver (32 bit) Visual FoxPro Tables=Microsoft Visual FoxPro Driver (32 bit) dBase Files - Word=Microsoft dBase VFP Driver (*.dbf) (32 bit)
243
FoxPro Files - Word=Microsoft FoxPro VFP Driver (*.dbf) (32 bit) [MS Access Database] Driver32=C:\WINNT\System32\odbcjt32.dll [dBASE Files] Driver32=C:\WINNT\System32\odbcjt32.dll [Excel Files] Driver32=C:\WINNT\System32\odbcjt32.dll [Visual FoxPro Database] Driver32=C:\WINNT\System32\vfpodbc.dll
Menulis ke Sebuah file Untuk menulis daya ke sebuah file, Anda bisa menggunakan kelas-kelas dari golongan byte stream maupun character stream. Namun, umumnya dan sangat dianjurkan untuk menggunakan character stream. Kelas yang digunakan untuk membaca file adalah FileWriter yang dibungkus dalam BufferedWriter. Fungsi yang digunakan adalah fungsi write(). Agar lebih jelas, Anda bisa memperhatikan contoh program Java berikut:
/* * Nama File: writeFile.java * Deskripsi: Menulis ke sebuah file * Kompilasi: javac writeFile.java * Eksekusi : java writeFile */ import java.io.*; class writeFile { public static void main(String[] args){
244
try { FileWriter
f = new FileWriter("tes.txt");
BufferedWriter r = new BufferedWriter(f); String
s = "Mengapa begini ? ";
r.write(s); r.close(); f.close(); }catch(IOException e){ System.out.println("I/O Error"); System.exit(1); } } }
245
246
Bab 19
Java Thread
Berbeda dengan beberapa bahasa pemrograman lain pada umumnya, Java menyediakan implementasi thread pada level bahasa secara langsung. Hal ini tentu saja akan memudahkan Anda ketika mengimplementasikan sebuah aplikasi yang membutuhkan thread karena Anda tidak perlu lagi memikirkan bagaimana implementasi thread di Windows, Linux, Solaris atau sistem operasi lain. Thread merupakan sekuens instruktri mesin yang dapat berjalan sendiri tanpa bergantung pada program yang menjalankannya atau pada thread lain. Sebagai sebuah sekuens/urutan instruksi, maka setiap thread memiliki awal, sekuens, dan akhir, serta pada waktu runtime ada instruksi yang dieksekusi. Thread umumnya digunakan untuk pemrograman multitasking, networking, yang melibatkan pengaksesan ke sumber daya secara konkuren.
Membuat Thread Untuk membuat thread, ada dua cara yang digunakan, yakni: § Mengimplementasikan interface Runnable § Membuat kelas turunan dari kelas Thread Kedua cara tersebut akan dibahas lebih lanjut pada subbab berikut.
247
Mengimplementasikan interface Runnable Cara ini merupakan cara yang paling sederhana untuk membuat thread. Runnable merupakan unit abstrak, yaitu kelas yang mengimplementasikan interface ini hanya cukup mengimplementasikan fungsi run(), yang dideklarasikan seperti ini:
public void run();
Dalam implementasi fungsi run()¸ kita akan mendefinisikan instruksi-instruksi yang membangun sebuah thread. Setelah mengimplementasikan Runnable, kita harus membuat objek Thread dalam kelas yang mengimplementasikan Runnable itu. Salah satu konstruktor Thread, yang umum digunakan adalah:
Thread(String namaThread);
Setelah thread dibuat, kita bisa menjalankan thread tersebut dengan memanggil fungsi start() pada objek Thread. Agar lebih jelas perhatikan contoh berikut ini:
/* * Nama File: myThread.java * Deskripsi: Contoh Thread * Kompilasi: javac myThread.java * Eksekusi : java myThread */
248
class theThread implements Runnable { Thread t; // Konstruktor theThread(){ t = new Thread(this,"Demo Thread"); System.out.println("Child Thread: " + t); t.start(); // Start the thread } // Implementasi Run public void run(){ try{ for(int i = 5; i > 0; i--){ System.out.println("Child Thread : " + i); Thread.sleep(500); } }catch(InterruptedException e){ System.out.println("Child interrupted"); } System.out.println("Exiting child thread"); } } class myThread{ public static void main(String[] args){ new theThread(); // Membuat Thread baru try{ for(int i = 5; i > 0; i--){ System.out.println("Main Thread : " + i); Thread.sleep(1000); } }catch(InterruptedException e){ System.out.println("Main interrupted"); } System.out.println("Exiting main thread"); } }
249
Jika Anda eksekusi program Java di atas, keluarannya akan seperti ini:
D:\Books\Java\program>java myThread Child Thread: Thread[Demo Thread,5,main] Main Thread : 5 Child Thread : 5 Child Thread : 4 Main Thread : 4 Child Thread : 3 Child Thread : 2 Main Thread : 3 Child Thread : 1 Exiting child thread Main Thread : 2 Main Thread : 1 Exiting main thread
Dari contoh di atas, tampak bahwa daur hidup sebuah thread adalah sebagai berikut: 1. Membentuk thread (start) Thread baru akan mulai berjalan saat dipanggil fungsi start(). 2. Memulai menjalankan thread (running) Fungsi start() mengalokasikan kebutuhan sistem untuk menjalankan thread, menjadwalkannya, dan memanggil fungsi run(). Jadi, setelah dilakukan fungsi start(), otomatis thread akan berada pada daur running. Oleh karena sifat dari thread, banyak thread berjalan pada satu waktu secara bersamaan, maka pada mesin komputer dengan satu CPU, Java Runtime harus mengatur penjadwalan yang memungkinkan sumber daya prosesor bisa digunakan oleh seluruh thread yang ada. Hal inilah mengapa thread bisa meningkatkan efisiensi CPU dan performansi sebuah aplikasi. 250
3.
Membuat thread bersifat nonrunnable (blocked) Thread berhenti berjalan ketika terjadi hal-hal berikut ini: § Bloking I/O § Memanggil fungsi sleep() § Memanggil fungsi wait() Thread berhenti berjalan (stop)
4.
Menurunkan kelas Thread Cara kedua yang lazim digunakan untuk membuat sebuah thread, adalah membuat kelas yang merupakan kelas turunan Thread. Perhatikan contoh berikut:
/* * Nama File: myThread2.java * Deskripsi: Contoh Thread 2 * Kompilasi: javac myThread2.java * Eksekusi : java myThread2 */ class simpleThread extends Thread { // Konstruktor simpleThread(String str){ super(str); // Memanggil konstruktor // pada superclass } public void run(){ for(int i = 0; i < 6; i++){ System.out.println(i + " " + getName()); try{ sleep((long)Math.random() * 1000);
251
}catch(InterruptedException e){ // Nothing to do } } } } class myThread2 { public static void main(String[] args){ new simpleThread("Thread 1 ").start(); new simpleThread("Thread 2 ").start(); } }
Pembahasan thread hanya dibatasi sampai di sini karena seperti disebutkan sebelumnya, umumnya Anda tidak akan menggunakan thread ini dalam pemrograman-pemrograman dasar. Namun, pada fitur-fitur lain seperti networking, concurrent programming Anda akan memanfaatkan thread ini.
252
Bab 20
Penutup
Syukur, Alhamdulillah. Anda telah memasuki bab terakhir dari buku ini yang tak lain adalah bab penutup seri pertama buku pemrograman Java dari penulis. Penulis, dengan sedikit pengalamannya mencoba mengkompilasi sedikit dari yang ada di situs utama Java http://java.sun.com untuk disampaikan ulang kepada Anda pecinta komputer di Indonesia, khususnya yang ingin berkenalan dengan teknologi Java. Penulis mengharapkan, buku yang memang disajikan untuk pemula ini bisa menjadi pijakan kuat untuk melangkah lebih lanjut menjadi programmer Java yang handal. Jelas terlihat, Anda harus memiliki pemahaman pemrograman objek yang baik agar bisa memprogram Java dengan mudah dan benar. Jika Anda telah menguasai konsep pemrograman objek yang ada, jangan khawatir puluhan implementasi Java API (Application Programming Interface), seperti JavaCard untuk aplikasi SmartCard, JSP (Java Server Pages) yang sekelas dengan ASP dan PHP untuk pemrograman web, dan Java CORBA akan sangat mudah dipelajari lebih lanjut dan Anda akan menjadi programmer Java yang handal. Buku ini mencoba menampilkan cukup banyak contoh yang bisa Anda coba, karena penulis melihat bahwa salah satu model pembelajaran pemrograman yang bagus adalah dengan model learn by example atau belajar dari contoh-contoh program yang ada.
253
Sebagai akhir kata dari buku ini, semoga buku ini bisa membawa manfaat bagi Anda, meningkatkan ilmu Anda sebagai pembaca, dan menjadi pahala bagi penulis. Pada kesempatan yang akan datang, Insya Allah penulis akan membuat buku yang berisi tentang pembahasan lanjutan dari buku ini, yang berisi hal-hal seperti pemrograman jaringan dengan Java, operasi file dan I/O lainnya, thread, akses database, pembuatan GUI (Graphical User Interface) dengan Java Swing, silakan ditunggu saja .
J
254