BAB I STRUKTUR PROGRAM JAVA I. Kompetensi : Pengenalan struktur program JAVA sebagai suatu model pemrograman yang berorientasi objek secara penuh. Pada percobaan ini diharapkan mahasiswa telah dapat melakukan editing code program JAVA sederhana yang hanya memuat satu class, melakukan kompilasi program dan mengeksekusi program JAVA. Diharapkan pula dalam percobaan ini dikuasai pemahaman Tipe data sederhana, operator, statemen kondisi dan komunikasi dengan layar serta masukan dari keyboard dengan class Console. II. Teori Singkat : Program JAVA dirancang sebagai suatu pemrograman berorientasi objek (OOP=Object Orientation Programming) secara penuh. Dalam pemrograman PASCAL yang untuk TURBO PASCAL versi 5 ke atas telah mendukung OOP atau C++ yang telah penuh mendukung OOP namun dalam kedua bahasa yang terakhir tersebut masih dimungkinkan untuk membuat program dengan pendekatan program terstruktur, yang dalam lingkup pemrograman JAVA hal ini tidak dapat lagi dilakukan. Struktur program JAVA dibuat dengan mendefinisikan suatu class dengan syntax : [public] class <NamaKelas> { // definisi atribut dari kelas tersebut // definisi method yang memanipulasi atribut } Keterangan : [public] = menunjukkan bahwa class tersebut dapat diases oleh class yang lain. Apabila kata public tidak dicantumkan menunjukkan bahwa class tersebut hanya dapat diases oleh class tertentu. NamaKelas = adalah nama dari programer sesuai dengan persoalan. Selanjutnya didalam suatu class dapat didefinisikan atribut-atribut class tersebut dan juga method-method yang memanipulasi atribut class tersebut. Suatu class dapat dieksekusi apabila didalam class tersebut didefinisikan suatu method yang disebut main(), yaitu : public static void main(String[] args) 2.1. Mengedit Source code program JAVA : Suatu kode program dalam JAVA yang berupa definisi suatu class dapat diketik dan diedit menggunakan editor teks, baik yang berbasis DOS ataupun WINDOWS. Sebagai contoh pada gambar 1.1. ditunjukkan mengedit code dengan NOTEPAD dari WINDOWS untuk suatu kode program JAVA yaitu class FirstSample yang hanya mengandung satu method dan sama sekali tidak mendefinisikan atribut sebagai berikut : public class FirstSample BAB I: Loop dan Array 2 { public static void main(String[] args) {System.out.println(“Hello INFORMATIKA !!!”); } } Gambar 1.1. Mengetik code JAVA dengan NOTEPAD Keterbatasan pengetikan dengan NOTEPAD adalah hanya dapat diketikan satu dokumen dalam suatu waktu. Untuk pengetikan beberapa kode sekaligus dapat dipilih editor teks seperti MS-WORD atau editor teks berbasis DOS yaitu program EDIT. Gambar 1.2 berikut menunjukkan proses pengeditan dengan program EDIT dari DOS. Salah satu kelebihan program EDIT dapat dibuka beberapa file sekaligus. Gambar 1.2. Mengedit code dengan program EDIT dari DOS 2.2. Meng-compile dan mengeksekusi program JAVA : Setelah suatu code program diketikkan, maka kode program tersebut disimpan dengan nama file HARUS SAMA DENGAN NAMA class utama dengan ekstension .java . Untuk nama class FirstSample maka nama filenya adalah FirstSample.java. Untuk meng-compile code tersebut digunakan compiler JAVA yang tersimpan dalam JDK (Java Development Kit) dalam subdirectory bin. Compiler tersebut merupakan file berukuran cukup kecil 4.608 byte yaitu javac.exe. Untuk isi subdirectory bin dapat dilihat dalam Gambar 1.3. BAB I: Loop dan Array 3 Gambar 1.3. Isi directory bin Meng-compile code program JAVA adalah meng-compile class yang telah disimpan dalam Namafile.java. Contoh untuk class FirstSample.java dicompile dengan baris perintah : >javac FirstSample.java Hasil compilasi ini adalah file: FirstSample.class Perlu diingat bahwa JAVA adalah suatu progam yang termasuk CASE SENSITIF seperti C++ sehingga apabila dalam meng-compile diketik : >javac firstSample.java atau >javac Firstsample.java maka akan terjadi error dalam nama file, karena yang benar adalah file dengan F besar dan sample dengan S besar. Hati-hati dalam meng-compile! File hasil compilasi berupa file berekstension *.class yang biasa dikenal sebagai JAVA BYTE CODE, yang merupakan suatu kode byte yang bebas platform. Perlu diingat bahwa apabila dalam file *.java ada beberapa definisi class maka hasil compilasi akan menghasilkan beberapa file yang berekstensi *.class pula. Selanjutnya untuk eksekusi kode byte ini digunakan suatu interpereter yang tergantung pada paltform tertentu. Untuk sistem yang digunakan dalam pembahsan ini (SO WINDOWS) interpreter adalah file :java.exe. Untuk menjalankan java byte code digunakan baris perintah : >java FirstSample BAB I: Loop dan Array 4 hasil adalah : Hello INFORMATIKA !!! Untuk urutan compilasi dan eksekusi program dari jendela MS-DOS prompt dapat dilihat pada Gambar 1.4. Gambar 1.4. Compilasi dan eksekusi code JAVA 2.3. Tipe Data dan Operator dalam JAVA JAVA mengenal tipe data yang mirip dengan C++. Untuk data numerik dimiliki beberapa tipe, yaitu : Integer : int short long 4 byte 2 byte 8 byte byte 1 byte Floating point float 4 byte double 8 byte kisaran nilai :-2.147.486.648 s/d 2.147.486.647 kisaran nilai :-32.768 s/d 32.767 kisaran nilai :-9.223.372.036.854.775.808L s/d 9.223.372.036.854.775.807L kisaran nilai :-128 s/d 127 kisaran nilai :+3.40282347E+38F (7 digit ignifikan) kisaran nilai :+1.79769313486231570E+308 (15 digit signifikan) Karakter dan string char 1 byte 1 karakter String sebuah objek string dan manipulasinya Satu hal yang berbeda dengan C++ adalah untuk String dalam JAVA adalah sebuah objek, yang mengandung beberapa method untuk manipulasi objek tersebut. Meskipun demikian suatu objek String dapat diisi suatu nilai string sebagaimana layaknya variabel biasa. Contoh : String Nama=”JON SHOLEH”; atau : String Nama; Nama = “JON SHOLEH”; Beberapa method dari objek string Nama antara lain : Nama.length() akan menghasilkan : 10 Nama.substring(0,3) akan menghasilkan : “JON” BAB I: Loop dan Array 5 Contoh program yang melibatkan data adalah sebagai berikut : class OperasiDATA { public static void main(String args[]) { int a; float b; double c; String d; a=(int)1/3; b=(float)1/3 ; c=(double)1/3 ; d="JON SHOLEH"; System.out.println("a = " +a); System.out.println("b = " +b); System.out.println("c = " +c); System.out.println("d = " +d); System.out.println("d.length() = " +d.length()); System.out.println("d.substring(0,3) = " +d.substring(0,3)); } } Output dari program tersebut adalah : a = 0 b = 0.333333 c = 0.333333 d = JON SHOLEH d.length() = 10 d.substring(0,3) =JON JAVA mengenal operator sama dengan C++ antara lain : Operator aritmatik : +, - , * dan / untuk : penambahan, pengurangan, perkalian dan pembagian += , yakni : x+=4 ekivalen dengan operasi : x=x+4 -= ; *= dan /= memiliki ekivalensi yang sama dengan -= ++ yaitu : n++ ekivalen dengan n=n+1 (increment by one) -- yaitu : n-- ekivalen dengan n=n-1 (decrement by one) % untuk MODULO, yaitu : 5 % 3 sama dengan 2 Operator relational dan logika < , > , <= dan >= adalah : lebih kecil, lebih besar, lebih kecil atau sama dan lebih besa atau sama == untuk SAMA DENGAN != untuk TIDAK SAMA DENGAN && untuk operator AND || untuk operator OR 2.5. Masukan program dari Keyboard Untuk aplikasi berbasis DOS dengan command line interaktif, salah satu yang selalu menarik untuk dibahas dalam kebanyakan pemrograman adalah masukan dari Keyboard. Untuk masukan berbagai tipe data dari keyboard JAVA BAB I: Loop dan Array 6 tidak menyediakan satu kelas khusus. Tetapi dari package java.io telah didefinisikan suatu class abstract InputStream yang menyediakan beberapa method untuk membaca aliran byte data antara lain method read() untuk membaca sejumlah byte dari keyboard. Arthur van Hoff (1995) mendefinisikan suatu class final yang dinamakan class System yang didalamnya didefinisikan beberapa objek, yaitu :in untuk standard masukan keyboard dan out untuk output ke layar. Untuk selanjutnya method yang diturunkan beberapa method untuk input beberapa type data dari keyboard adalah dari : System.io.read() Sedangkan untuk output ke layar digunakan : System.io.println(String s) Cay Horstmann (1996) mendefinisikan suatu package corejava yang antara lain mendefinisikan class Console yang didalamnya terdifinisi beberapa method untuk masukan keyboard yang memanfaatkan method System.in.read(), antara lain : Console.readString(string prompt) : untuk masukan string dari keyboard Console.readInt(string prompt ) : untuk masukan integer dari keyboard Console.readDouble(string prompt) : untuk masukan double dari keyboard Untuk menggunakan class Console perlu dilakukan import package corejava.* Apabila tidak didahului dengan import maka penggunaan methodmethod diatas akan memunculkan message berikut : Error : undefined variabel Console ! Selain dengan class Console dari Cay Horstmann, Julio Sanchez dan Maria Canton (2002) mendefinisikan klass Keyin yang memanfaatkan method dari kelas InputSream, yaitu antara lain method : Keyin.inChar(String prompt) : untuk input karakter Keyin.inString(String prompt) : untuk input string Keyin.inInt(String prompt) : untuk input integer Keyin.inDouble(String prompt) : untuk input double Dengan demikian untuk membaca beberapa jenis data dari keyboard kita tinggal memilih akan menggunakan method dari class Consoel atau method dari class Keyin, hasilnya sama. Program berikut ini memperagakan masukan nama, umur dan gaji yang masingmasing mewakili tipe :string, integer dan float import corejava.*; public class CobaBaca { public static void main(String[] args) { int u; String Nm; float Gj; BAB I: Loop dan Array 7 Nm=Console.readString("Siapa namamu ?"); u =Console.readInt("Berapa umurmu ?"); Gj=(float)Console.readDouble("Sekarang Gajimu berapa Rp ?"); System.out.println("Hallo "+ Nm); System.out.println("Kau lahir tahun "+(2002-u)); System.out.println("Sekarang kau kaya ya!!! Gajimu :"+Gj); } } Pernyataan import corejava.* dapat tidak disertakan dengan catatan kita memiliki definisi class Console (file Console.java) dalam diretori program yang dikompile. Atau membaca dengan Keyin.IntString dengan menyiapkan dulu definisi class Keyin dalam directori program kita. Output dari program tersebut adalah : Siapa namamu ? JON SALEH <enter> Berapa umurmu ? 25 <enter> Sekarang Gajimu berapa Rp ? 100000 <enter> Hallo JON SALEH Kau lahir tahun 1977 Sekarang kau kaya ya!!! Gajimu : 100000 2.6. Statemen Kondisional Statemen kondisional dalam JAVA memiliki 4 macam syntax : If (kondisi) statemen ; atau If (kondisi) {blok statemen} ; atau If (kondisi) statemen1 else statemen2; atau If (kondisi) {blok statemen -1} else {blok statemen-2} ; Contoh program : // // // // // // -------------------------------------------Membaca dari keyboard :string dan double menggunakan method inString() dan inDouble() dari klass Keyin sehingga tidak diperlukan import :corejava.* --------------------------------------------- public class Sales { public static void main(String[] args) { String NAMA,PESAN; double JUAL,BONUS; NAMA=Keyin.inString("Nama Sales :"); JUAL=Keyin.inDouble("Hasil Penjualan :"); BAB I: Loop dan Array 8 if (JUAL>100000) {BONUS=0.1*JUAL; PESAN="SELAMAT !!";} else {BONUS=0; PESAN="ANDA HARUS LEBIH GIAT LAGI";}; System.out.println("Saudara "+NAMA ); System.out.println("Bonus Anda sebesar : "+BONUS ); System.out.println(PESAN); } } Output program : Nama Sales : BAMBANG <enter> Hasil Penjualan : 99000 <enter> Saudara BAMBANG Bonus Anda sebesar : 0 ANDA HARUS LEBIH GIAT LAGI III. Tugas 1. Buatlah suatu program JAVA untuk menghitung LUAS dan KELILING suatu empat persegi panjang. Masukan dari keyboard berupa PANJANG dan LEBAR, keluaran ke layar adalah luas dan keliling. 2. Buatlah suatu program JAVA untuk menentukan nilai huruf dari suatu ujian dari nilai bilangan dengan ketentuan : Nilai angka <40 nilai huruf : ‘E’ 40<=Nilai angka < 55 nilai huruf : ‘D’ 55<=Nilai angka < 75 nilai huruf : ‘C’ 75<=Nilai angka < 85 nilai huruf : ‘B’ 85<=Nilai nilai huruf : ‘A’ masukan : Nilai angka dari keyboard keluaran : nilai huruf 3. Buatlah suatu program JAVA untuk menentukan MODAL akhir dari suatu tabungan dengan bunga berbunga dengan rumus : MAK =(MAW + B)N MAK=modal akhir MAW=modal awal N = periode penabungan Catatan : Untuk memangkatkan bilangan dalam JAVA digunakan method dari class Math, yaitu : Math.pow(x,n) adalah xn Masukan : MAW dan N Keluaran MAK BAB I: Loop dan Array 9 BAB II LOOP DAN ARRAY I. Kompetensi : Pengenalan statemen loop dalam JAVA, seleksi multiple dan konsep array sebagai objek. II. Teori Singkat : Statemen loop dalam Program JAVA seperti program umumnya dibedakan menjadi loop takhingga dan loop terhingga: 1. Loop takhingga : while (kondisi) { blok instruksi } ; dalam hal ini blok instruksi akan dieksekusi apabila kondisi bernilai benar. Dalam loop ini ada kemungkinan blok instruksi sama sekali tidak dieksekusi apabila pada pengecekan kondisi pertama kali dijumpai kondisi bernilai salah. Apabila diinginkan blok instrtuksi minimal dilakukan satu kali dapat digunakan loop do while dengan sintaks : do {blok isntruksi} while (kondisi) ; Contoh program : Program berikut membaca suatu nilai bilangan real dari keyboard dan mencari akar kuadrat dengan rumusan : akar kuadrat dari a adalah : xnew=(xold+a/xold)/2 selama |xold-xnew| cukup besar. Flowchart pemecahan adalah : START Baca a xnew=a/2 xold=xnew xnew=(xold+a/xold)/2 Cetak xnew a |xnew-xold|>1e-4 STOP Gambar 2.1. Bagan Alir mencari akar kuadrat bilangan BAB I: Loop dan Array 10 Program JAVA adalah sebagai berikut : import corejava.*; // untuk membaca data dari keyboard perlo class Console // tanda // berarti komentar // public class Akar { public static void main(String[] args) { double a; a=Console.readDouble("Masukkan angka real:"); double xnew=a/2; double xold; do { xold=xnew; xnew=(xold+a/xold)/2; System.out.println("xnew : "+xnew); } while (Math.abs(xnew-xold)>1e-4); System.out.println("AKAR KUADRAT DARI "+a+"adalah "+xnew); } } hasil output program adalah : Masukkan angka real : 9 <enter> xnew = 3.25 xnew=3.00962 xnew=3.00002 xnew=3 AKAR KUADRAT DARI 9 adalah 3 2. Loop terhingga : for(nilaiawalCounter ; NilaiAkhirCounter ; perubahanCounter) { blok instruksi } ; Blok instruksi akan dikerjakan selama NilaiAkhirCounter belum benar. Dalam hal ini perubahanCOunter harus merubah counter dari nilai awal menjadi memenuhi nilai akhir counter. Contoh 1 : Program mencetak HELLO INFORMATIKA! 10 kali class Hello2 { public static void main(String args[]) { for (int Counter=1 ; Counter<=10; Counter++) System.out.println("HELLO INFORMATIKA!!"); } } Contoh 2 : Program menghitung n! = 1*2*3*..*n dengan n diinputkan dari keyboard. BAB I: Loop dan Array 11 import corejava.*; class Faktor { public static void main(String args[]) { int n,fak, i; // baca n dari keyboard n=Console.readInt("Masukkan n :"); // tentukan n faktorial fak=1; for (i=1 ; i<=n ; i++) fak=fak*i; System.out.println("Hasil "+n+" ! = "+fak); } } Hasil kompilasi dan eksekusi program adalah sebagai Gambar 2.2. berikut : Gambar 2.2. Kompilasi dan eksekusi Faktor.java 3. Seleksi multiple dengan swicth dan case : Untuk melakukan pilihan ganda dengan beberapa kondisi dapat digunakan pernyataan switch dan case, yang dapat diikuti dengan pernyataan break untuk keluar dari seleksi. Tata tulis pernyataan ini adalah : switch ( variabelSeleksi) { case nilai1: statemen; statemen; .... [break] case nilai2: statemen; statemen; .... [break] ... [default :] statemen; statemen; ... [break] } BAB I: Loop dan Array 12 Statemen-statemen akan dijalankan apabila variabel seleksi bernilai dari salah satu nila1, nilai2 dan seterusnya atau nilai default. Setelah statemen dijalankan apabila dijumpai statemen break, maka kontrol program akan keluar dari blok seleksi switch ..case. Contoh : import corejava.*; class Menu { public static void main(String args[]) { int pil; System.out.println("MENU TERSEDIA :"); System.out.println("[1]. NASI GORENG"); System.out.println("[2]. NASI RAWON "); System.out.println("[3]. SOTO"); pil=Console.readInt("Masukkan Pilihan anda :"); switch(pil) { case 1 : System.out.println("Anda pilih NASI GORENG!"); break; case 2 : System.out.println("Anda pilih NASI RAWON!"); break; case 3 : System.out.println("Anda pilih SOTO"); break; default: System.out.println("Pilihan anda bukan 1,2,3,..!!"); break; } } } Hasil program adalah seperti Gambar 2.2. Perlu dicermati bahwa statemen break paad akhir statemen dalam suatu kasus nilai adalah penting. Apabila steteman break ini tidak dicantumkan maka seteleh deretan statemen dijalankan untuk suatu nilai1 maka deretan statemen setelah nilai2, nilai3 dst samapi nila defaulty akan tetap dijalankan. Hal ini terjadi karena kontrol program tidak diarahkan keluar seleksi. Gambar 2.2. hasil seleksi dengan statemen : switch case BAB I: Loop dan Array 13 4. Array Dalam JAVA array adalah sebuah objek. Dua langkah awal yang diperlukan sebelum dapat mengakses array adalah : - mendefinisikan - mengalokasikan memeory untuk array tersebut Array 1 Dimensi - Array satu dimensi didefinisikan dengan bentuk umum : tipedata[ ] namaArray; atau tipedata namaArray[ ]; Contoh : String[] int[] Nama; Umur; atau String Nama[]; atau int Umur[]; - Untuk mengalokasikan memory tersebut digunakan kata kunci new: Nama =new String[N]; Umur =new int[N]; Dalam hal ini N adalah kapasitas array tersebut, yang selanjutnya berindek mulai dari 0 sampai N-1. Kedua langkah tersebut dapat digabungkan menjadi : String[] Nama=new String[N]; int[] Umur=new int[N]; Selanjutnya Nama dan Umur sebagai objek array dapat diakses, misalnya diiskan data kedalam elemen array sebagai berikut : Nama[0]=”JON”; Umur[0]=25; Nama[1]=”ALI” Umur[1]=30; .... dst Apabila diinginkan inisialisasi data langsung bersamaan dengan deklarasi array, maka langkah alokasi memory dapat tidak dilakukan, misalnya sebagai berikut : String[] Nama={“JON”, “ALI”, “SALEH”, “PUTRI”, “DEDI”}; Int[] Umur={25, 30, 55, 35, 40}; Contoh program berikut menggunakan array Nama dan umur dan mencetaknya dengan loop. class DemoArray1 { public static void main(String args[]) { String[] Nama={"JON", "ALI", "SALEH", "PUTRI", "DEDI"}; int[] Umur={25, 30, 55, 35, 40}; for (int i=0; i<Nama.length; i++) System.out.println(Nama[i]+" " +Umur[i]); } } BAB I: Loop dan Array 14 Output program adalah : JON 25 ALI 30 SALEH 55 PUTRI 35 DEDI 40 Panjang (jumlah elemen) suatu array dapat diketahui dengan menggunakan properti length, seperti terlihat pada program : Nama.length artinya jumlah elemen dari array Nama. Array 2 Dimensi - Array dua dimensi didefinisikan dan dialokasikan dengan cara : tipedata[n][m] namaArray atau tipedata NamaArray[n][m]; Contoh: Dibawah ini contoh program dengan array 2 dimensi dari string untuk simulasi kamus inggris indonesia. Kata dalam program adalah suatu array dua dimensi dari string yang digunakan untuk menyimpan data kata inggris dan indonesia seperti gambar berikut : baris 0 baris 1 baris 0 baris 1 baris 0 Kolom 0 ONE COW RUN RED MEN kolom 1 SATU SAPI LARI MERAH ORANG import corejava.*; class DemoArray2 { //demo array 2 dimensi untuk simulasi kamus //inggris indonesia public static void main(String args[]) { String[][] Kata={ {"ONE", "SATU"}, {"COW", "SAPI"}, {"RUN", "LARI"}, {"RED", "MERAH"}, {"MAN", "ORANG"}}; String KataDicari; int i, k; KataDicari=Console.readString("Ketik Kata Inggris :"); //cari kata k=-1; for (i=0; i<5; i++) if (Kata[i][0].equals(KataDicari) ) k=i; //cek ketemu atau tidak , jika k=-1 tidak ketemu if (k==(-1)) System.out.println("KATA TERSEBUT TIDAK ADA"); else System.out.println("KATA INDONESIA = "+Kata[k][1]); } } BAB I: Loop dan Array 15 Apabila program dijalankan hasilnya sebagai berikut : Gambar 2.3. Eksekusi program kamus INGAT !!! : Untuk menguji kesamaan suatu string dalam JAVA tidak dapat digunakan tanda operator relasi == tetapi menggunakan salah satu method dari object string yaitu equals,dengan tatatulis : s.equals(t) yang akan mengembalikan nilai true apabil string s sama dengan string t. III. TUGAS 1. Buat program JAVA untuk membaca bilangan bulat n. Dengan loop program menentukan deret FIBBONACCI untuk nilai suku-suku yang tidak lebih dari n. Deret FIBBONACCI adalah : 0 1 1 2 3 5 8 13 ... yang berlaku Un=Un-1 + Un-2 dengan U1=0 U2 = 1 Misal : INPUT : n = 40 OUTPUT : 0 1 1 2 3 5 8 13 21 34 2. Buat program JAVA untuk memperbaiki unjuk kerja program simulasi kamus dengan loop while, karena simulasi Kamus dengan loop for pada contoh program sebenarnya kurang efisien, yaitu : pada proses pencarian kata apabila kata sudah ditemukan pada langkah ke i, dengan i< jumlah kata maka program tetap meneruskan pencarian sampaiberputar sebanyak jumlah kata. Dengan loop while program akan berhenti apabila proses pencarian sudah ditemukan. 3. Buat program dengan menggunakan array satu dimensi untuk membaca dan menyimpan data sebanyak n. Program mencari rata-rata dan standard deviasi dari n buah data tersebut. Rumus : untu n data , yaitu : x1, x2, ..., xn Rata-rata = x / n Standard deviasi = [ { x2- (x)2 }/(n-1) ] BAB I: Loop dan Array 16 BAB III PENGANTAR OOP : CLASS DAN METHOD I. Tujuan : Memahami lebih jauh mengenai konsep pemrograman berorientasi objek (Object Orientation Programming = OOP) dalam JAVA. Stuktur data dalam class, method, objek, instance, dan pemahaman modifier : public, private, static, final dan lain-lain. II. Teori Singkat : Konsep pemrograman terstruktur memandang data dan prosedur untuk mengolah data tersebut sebagai sesuatu yang terpisah. Sedangkan dalam OOP data dan fungsi/prosedur pengolah data dikemas dalam suatu class. Fungsi dan prosedur pengolah data dalam JAVA disebut sebagai method, sedangkan data dalam hal ini diistilahkan sebagai properti. Gambar 3.1. menunjukkan perbedaan konsep pemrograman prosedural dan OOP. function function function function Global data Pemrograman prosedural method method data data method method method method class Pemrograman OOP Gambar 3.1. Pendekatan prosedural dan OOP Dari gambar 3.1. dapat dijelaskan bahwa suatu class pada prinsipnya adalah suatu kemasan data dengan method pemroses data tersebut. Konsep inilah yang sering disebut juga sebagai peng-kapsulan (encapsulation). Dalam JAVA tidak ada data global, tetapi ada adlam suatu kelas. JAVA sendiri sebagai bangunan pemrograman mendefinisikan banyak class siap pakai dengan class java sebagai class induk yang memiliki banyak sub-class misalnya : java.lang, java.util, java.awt, java.io, java.net, java.applet dan lain-lain. Kelas, sub-kelas dan objek : Pada prinsipnya membuat program JAVA adalah mendefinisikan class bersama dengan data dan method. Suatu kelas adalah abstraksi untuk frame yang berisi properti dan method. Suatu kelas dapat memiliki banyak sub-kelas. BAB I: Loop dan Array 17 Suatu kelas Buah misalnya dapat memiliki sub kelas BuahJeruk, BuahMangga dan lain-lain. Sementara sub-kelas BuahJeruk dapat memiliki sub-sub-kelas lagi :BuahJerukBali, BuahJerukPurut dst. Apabila kelas adalah suatu abstraksi maka objek atau instance adalah bentuk real dari suatu kelas. Analogi dalam bahasa program adalah sebagai berikut : Objek adalah variabel dan class adalah tipe data. Deklarasi suatu objek juga mengikuti analogi tersebut, misalnya : Deklarasi variabel : int X,Y,Z; double P,Q ; Deklarasi objek dari suatu kelas: NamaKelas Namaobjek; Mahasiswa M1, M2 ; Mahasiswa M[12]; M1 dan M2 adalah objek-objek dari kelas Mahasiswa M adalah array dari objek Objek yang merupakan bentuk konkret dari kelas memiliki identifikasi : - Status dari objek tersebut : dimaksudkan adalah setting data/properti dari objek tersebut - Kemampuan (behavior) dari suatu objek Untuk kelas Anjing : misalnya ada dua atribut, No dan Nama dan memiliki dua kemampuan (behavior), yaitu : Gonggong dan SayHello. class Anjing { String Nama; int No; public void SetData(String m, int o) {Nama=m; No=o; } public void Gonggong(String S) { System.out.println(S+"! " + S + "!! " + S + " !!!"); } public void SayHello() { System.out.println("Hello Saya Anjing No:" +No+ " Nama saya : "+Nama); } } class TesAnjing { public static void main(String args[]) { Anjing AnjingKU=new Anjing(); Anjing AnjingMU=new Anjing(); AnjingKU.SetData("PLEKI",10); AnjingMU.SetData("HELI",77); BAB I: Loop dan Array 18 AnjingKU.Gonggong("GUG"); AnjingKU.SayHello(); AnjingMU.Gonggong("KAING"); AnjingMU.SayHello(); } } Hasil program adalah : GUG! GUG!! GUG!!! Hello Saya Anjing No:10 Nama saya : PLEKI KAING! KAING!! KAING!!! Hello Saya Anjing No:77 Nama saya : HELI Properti dan method dari suatu kelas Suatu kelas didalamnya memiliki data yang sering disebut sebagai properti. Kelas juga memiliki fungsi atau prosedur untuk memanipulasi data tersebut yang disebut sebagi method atau yang telah disebutkan sebagai perilaku. Sebagai contoh kelas Mahasiswa memiliki atribut Nama, Umur ; dan memiliki method untuk mengisi Nama dan Umur , misalnya dinamakan SetData, method untuk mencetak misalnya dinamakan CetakInfo. Definisi dari kelas seperti itu dapat dituliskan sebagai : class Mahasiswa { String Nama; int Umur; public void SetData(String n, int u) { Nama=n; Umur=u;}; public void CetakInfo() { System.out.println("Namaku : "+Nama); System.out.println("Umur : "+Umur); } } Selanjutnya suatu method akan dipanggil dengan tata tulis : Namaobjek.Namamethod Misalnya apabila objeknya adalah M, maka dapat dipanggil method dengan : M.CetakInfo() Untuk memanfaatkan kelas Mahasiswa tersebut dalam program dapat didefinisikan suatu class yang mengandung program utama yang mendefinisikan objek bertipe kelas Mahasiswa, misalnya objek tersebut Mhs1 dan Mhs2. Program sebagai berikut : class TesMhs { public static void main(String orgs[]) { Mahasiswa Mhs1=new Mahasiswa(); Mahasiswa Mhs2=new Mahasiswa(); Mhs1.SetData("JON SALEH",20); Mhs2.SetData("SITI KAMAR MANDI",17); BAB I: Loop dan Array 19 Mhs1.CetakInfo(); Mhs2.CetakInfo(); } } Selanjutnya secara teknis kedua kelas tersebut diketik dalam satu kesatuan dokumen (dapat didefinisikan class Mahasiswa diikuti class TesMhs, atau dapat juga dibalik : class TesMhs diikuti class Mahasiswa). Program disimpan dengan nama file sesuai dengan nama class yang didalamnya terdapat program utama, yaitu : TesMhs.java. Hasil program adalah : Namaku Umur Namaku Umur : : : : JON SALEH 20 SITI KAMAR MANDI 17 Acces modifier : public, static dan private dalam definisi method Dalam JAVA definisi method harus dilakukan didalam class. Dalam definisi class method dapat dipilih beberapa pengenal scope sperti : public, static atau private. Public method : Suatu method dari suatu kelas A dedefiniskan sebagai public berarti sembarang method dari sembarang kelas yang memiliki asses ke objek dari kelas A tersebut dapat memanggil (call) method tersebut. Suatu method sendiri didefiniskan dengan tata tulis : [public] [static] [return value] NamaMethod(daftar argumen) { .... ... } ReturnValue dapat berupa tipe-tipe data :int, double, Stirng, atau tipe-tipe lain. Apabila method tersebut tidak mengembalikan nilai ReturnValue adalah void. private method: Dalam implementasi class umumnya data selalu dideklarasikan sebagai private, yaitu hanya dikenal oleh objek dari kelas tersebut. Untuk implementasi method apabila didefinisikan sebagai public berarti dapat diases oleh kelas lain, maka apabila didefinisikan sebagai private berarti method tersebut hanya dapat diases dari dalam kelas tersebut. Contoh : Untuk kelas Mahasiswa didifnisikan method public void SetData(String n, int u) { Nama=n; Umur=u;}; method ini dapat diases dari kelas lain, yaitu kelas : TesMhs melalui Mhs1.SetData("JON SALEH",20); Apabila kata public dari method tersebut diganti menjadi private : BAB I: Loop dan Array 20 private void SetData(String n, int u) pada saat program dikompile akan terjadi kesalahan dengan pesan : TesMhs.java:6:No method matching SetData(java.lang.String, int) found in class Mahasiswa Mhs1.SetData(“JON SALEH”,20); Nampak bahwa method SetData() menjadi tidak “terlihat” dari kelas TesMhs yang memangghil method tersebut. Method SetData() yang bersifat private dapat diases oleh method lain dari kelas tersebut, misalkan dalam kelas Mahasiswa ditambahkan method baru ISIDATA() yang bersifat public. Method ISIDATA memanggil method SetData() yang secara lengkap definisi kelas Mahasiswa menjadi sebagai berikut : class Mahasiswa { String Nama; int Umur; private void SetData(String n, int u) { Nama=n; Umur=u;}; public void CetakInfo() { System.out.println("Namaku : "+Nama); System.out.println("Umur : "+Umur); } public void ISIDATA(String NN, int II) { SetData(NN,II);}; } Maka dalam class TesMhs method ISIDATA yang memanggil digunakan dengan : Mhs1.ISIDATA("JON SALEH",20); Mhs2.ISIDATA("SITI KAMAR MANDI",17); Hasil program adalah seperti program semula. Static method: Suatu data atau method dari suatu kelas yang menggunakan modifier static memiliki makna bahwa nilainya tetap tidak berubah untuk objek yang berbeda-beda dalam kelas tersebut. Apabila data bersifat static dalam suatu kelas, maka untuk semua objek dari kelas tersebut akan memiliki data yang sama. Contoh: Lihat kembali definisi kelas Mahasiswa: class Mahasiswa { String Nama; int Umur; ... Jika sekarang atribut Nma diberi pengeal static menjadi: class Mahasiswa { static String Nama; int Umur; ... BAB I: Loop dan Array 21 meskipun dari class TesMhs objek Mhs1 dan objek Mhs2 mengeset atribut Nama dengan : Mhs1.ISIDATA("JON SALEH",20); Mhs2.ISIDATA("SITI KAMAR MANDI",17); Ternyata menarik !!!, hasil output program adalah : Namaku Umur Namaku Umur : : : : SITI KAMAR MANDI 20 SITI KAMAR MANDI 17 Terbukti bahwa ernyata untuk objek yang berbeda, atribut Nama yang static nilainya sama. Sama halnya dengan data static, method static memiliki pengertian bahwa method tersebut adalah milik suatu kelas, bukan milik suatu objek dari kelas tersebut. Hal ini mengangapa method main() dalam program selalu didefinisikan sebagai public static. Contoh method static adalah method yang dimiliki oleh kelas Console Console.readInt(paramter) Console.readDouble(parameter) Adapun bentuk umum menggunakan method static dari suatu kelas adalah : NamaKelas.NamaMethodStatic(parameter) Contoh Apllikasi : Seandainya data Mahsiswa dikembangkan sehingga disamping nama dan umur ditambah data : Nilai, suatu array (misalnya berukuran 3) dan RATA untuk mengetahui rata-rata nilai. Selanjutnya dapat didefinisikan suatu method statis CariRata yang berguna untuk mencari rata-rata nilai dari seorang mahasiswa. Method ini merupakan method miliknya klas Mahasiswa. Modifikasi program menjadi sebagai berikut : class Mhs { public static void main(String orgs[]) { DataMhs O1=new DataMhs(); DataMhs O2=new DataMhs(); O1.SetData("JON SALEH",20, 50,60,70); O2.SetData("SITI KAMAR MANDI",17, 80,90,80 ); O1.RATA=DataMhs.CariRata(O1.Nilai) ; O2.RATA=DataMhs.CariRata(O2.Nilai); O1.Cetak(); O2.Cetak(); } } Nama kelas Nama method static argumen class DataMhs { String Nama; int Umur; double RATA; double Nilai[]=new double[3]; public void SetData(String n,int u,double a1,double a2,double a3) BAB I: Loop dan Array { 22 Nama=n; Umur=u; Nilai[0]=a1 ; Nilai[1]=a2; Nilai[2]=a3; }; public void Cetak() { System.out.println("Namaku : "+Nama); System.out.println("Umur : "+Umur); System.out.print("Nilai : "); for (int i=0; i<Nilai.length; i++) System.out.print(Nilai[i]+" "); System.out.println(" "); System.out.println("Rata-ratanya ="+RATA); } public static double CariRata(double x[]) { double jum=0; int i; for (i=0; i<3; i++) jum=jum+x[i]; return (jum/3); } } Hasil program adalah sebagai berikut : Namaku : JON SALEH Umur : 20 Nilai = 50 60 70 Rata-ratanya = 60 Namaku : SITI KAMAR MANDI Umur : 17 Nilai = 80 90 80 Rata-ratanya = 83.3333 III. TUGAS 1. Definisikan suatu kelas Barang yang memiliki properti : KodeBarang, NamaBarang (String) dan HargaBarang (double). Kelas Barang memiliki method SetData (untuk men-set properti) dan method Cetak untuk mencetak KodeBarang, NamaBarang dan HargaBarang dalam posisi satu baris. Definisikan suatu kelas Belanja yang mendeklarasikan Array dari objek barang dan men-set nilai-nilai properti serta mencetaknya dalam bentuk tabel. DAFTAR HARGA BARANG No KodeBarang NamaBarang ... Data Barang dicadangkan sebanyak N Buat dua tipe program 1. Data-data ada dalam program 2. Data-data dientrikan dari papan ketik HargaBarang BAB IV : Constructor, Inheritance & Polymorphism 23 BAB IV CONSTRUCTOR, INHERITANCE & POLYMORPHISM I. Tujuan : Memahami beberapa pilihan inisialisasi objek dengan mengenal konsep constructors dan method overloading. Memahami pula salah satu kunci kekuatan OOP yakni konsep inheritance (pewarisan sifat), pengembangan kelas. Di dalam pengembangan suatu kelas dimungkinkan merancang suatu method dengan nama yang sama dengan method class induk. Hal ini dikenal dengan konsep polymorphism. II. Teori Singkat : Constructor dan Overloading pada constructor Pada saat suatu kelas didefinisikan, tentunya pasti memiliki atribut (data). Atribut atau data ini pada contoh-contoh terdahulu diisi dengan mendefinisikan method SetData(), yang akan dipanggil sesaat setelah suatu objek dari kelas tersebut diciptakan. Perhatikan kembali contoh definisi objek pada kelas TesAnjing pada BAB III : Anjing AnjingKU=new Anjing() Nama kelas nama objek alokasi memory tanpa inisialisasi data Selanjutnya atribut dalam objek AnjingKU di set dengan memanggil method SetData() sebagai berikut : AnjingKU.SetData("PLEKI",10); Cara praktis yang sering digunakan untuk menginisialisasi atribut pada objek saat objek tersebut diciptakan adalah dengan mendefinisikan method yang disebut constructor. Method ini memiliki nama sama dengan nama kelas dan dapat dipilih semua, sebagian atau tanpa parameter. Apabila dalam mendifinisikan suatu kelas sekaligus didefinisikan beberapa jenis constructor, yang sebagai akibatnya constructor tersebut merupakan method-method dengan nama yang sama. Pendefinisian constructor seperti ini dikenal dengan istilah constructor overloading. Contoh: Untuk kelas Anjing seperti pada BAB III dapat diubah definisinya dengan menambah beberapa definisi konstructor : class Anjing { private String Nama="NoName"; private int NoAnjing; private static int Urut=0; // constructor tanpa paramater public Anjing() {NoAnjing=++Urut;}; // data default BAB IV : Constructor, Inheritance & Polymorphism 24 // constructor dengan 1 parameter public Anjing(String n) {this.Nama=n; this.NoAnjing=++Urut;}; // constructor dengan 2 parameter public Anjing(String n, int u) {this.Nama=n; this.NoAnjing=u;}; public void Gonggong(String S) { System.out.println(S+"! " + S + "!! " + S + " !!!"); } public void SayHello() { System.out.println("Hello Saya Anjing No:" +NoAnjing+ " Nama saya : "+Nama); System.out.println(" "); } } //untuk menguji unjuk kerja kelas Anjing class Tes2Anjing { public static void main(String args[]) { // memanggil constructor default Anjing AnjingKU=new Anjing(); Anjing AnjingMU=new Anjing(); AnjingKU.Gonggong("GUG"); AnjingKU.SayHello(); AnjingMU.Gonggong("KAING"); AnjingMU.SayHello(); // memanggil constructor dengan 1 parameter Anjing AnjingNYA=new Anjing("BULDOCK"); AnjingNYA.Gonggong("GHERR"); AnjingNYA.SayHello(); // memanggil constructor dengan 2 parameter Anjing AnjingKITA=new Anjing("HERDER",700); AnjingKITA.Gonggong("KOANG"); AnjingKITA.SayHello(); } } Selanjutnya program disimpan dengan nama file : Tes2Anjing.java. Apabila program dicompile dan dijalankan hasilnya adalah : GUG! GUG!! GUG!!! Hello Saya Anjing No:1 Nama saya : NoName KAING! KAING!! KAING!!! Hello Saya Anjing No:2 Nama saya : NoName BAB IV : Constructor, Inheritance & Polymorphism 25 GHERR! GHERR!! GHERR!!! Hello Saya Anjing No:3 Nama saya : BULDOCK KOANG! KOANG!! KOANG!!! Hello Saya Anjing No:700 Nama saya : HERDER Penjelasan: Untuk definisi objek AnjingKU dan AnjingMU alokasi objek tanpa inisialisasi sehingga digunakan data default, yang nampak paa nama :NoName. Untuk definisi objek AnjingNYA digunakan pemanggilan constructor dengan satu parameter yaitu nama anjing :”BULDOCK” sehingga nomor urut adalah 3. Setiap objek diciptakan dengan construktor default atau 1 parameter maka atribut NoANjingh akan naik 1. Perlu dicermati NoAnjing akan berurut sesuai dengan berapa jumlah objek yang telah diciptakan, dengan memanfaatkan bantuan atribut Urut yang bertipe static. Akhirnya untuk objek AnjingKITA digunakan 2 parameter yaitu nama dan nomor urut anjing. Dalam hal ini NoANjing tidak lagi sesuai dengan o bjek yang diciptakan tetapi diset oleh parameter. Objek this Dalam difinisi constructor dijumpai kata kunci this.Nama dan this.NoAnjing yang merupakan suatu cara untuk mengacu kepada atribut dari objek yang sedang dikerjakan. Inheritance Salah satu kemampuan besar yang merupakan inovasi monumental dalam teknik pemrograman berorientasi objek (OOP) adalah kemampuan suatu kelas untuk mewariskan sifat (atribut) dan kemampuan (method) yang dimiliki pada kelas turunannya. Hal ini memungkinkan pemrogram tidak perlu menulis ulang program yang telah dibuat sebelumnya jika akan mengembangkan programnya cukup dengan menambah kemampuan melalui proses pewarisan. Konsep ini mengambil analogi pada biologi yang mengelompokkan binatang atau tumbuhan berdasarkan kesamaan sifat dan perilakunya dalam :ORDO, GENUS, SPECIES dan beberapa pembagian lain. Untuk lebih jelasnya simak Gambar 4.1. Pada kelas ANIMAL memiliki kemampuan : breathes (bernafas), moves (dapat bergerak) dan reproduces (dapat memiliki keturunan) dan satu atribut :mouth (punya mulut). Kelas ANIMAL memilki tiga kelas turunan, yaitu : BIRD, FISH dan REPTILE. Kelas turunan ini kan mewarisi kemampuan kelas induknya dan (umumnya) memilki kemampuan tambahan atau atribut tambahan, misalnya untuk BIRD disamping memiliki kemampuan breathes, moves dan reproduces juga memiliki kemampuan tambahan flies dan atribut tambahan has feathers. Kelas BIRD masih memiliki sub-kelas CANARY yang memiliki tambahan atribut isyellow dan tambahan kemampuan sing. BAB IV : Constructor, Inheritance & Polymorphism 26 ANIMAL breathes moves reproduces mouth BIRD CANARY flies has feathers FISH swims has scales REPTILE .... sing isyellow Gambar 4.1. Analogi inheritance OOP dalam biologi Dalam OOP dua hal yang dapat diwariskan adalah :atribut dan method. Jika diagram kelas dapat digambarkan sebagai Gambar 4.2. ClasName Dog Attributes Name Weight Color Methods() Bark() Jump() ( a) (b) Gambar 4.2. (a) Diagram kelas, (b) model kelas Dog Contoh : Untuk memperjelas konsep pewarisan daimbil contoh dari buku CoreJava definisi class Employee yang memiliki atribut : name, salary dan hireDay dan memiliki method : constructor print() raiseSalary() hireYear() Selanjutnya dari class Employee akan didefinisikan suatu kelas turunannya, yaitu kelas Manager yang memiliki tambahan atribut secretaryName, juga mengoverloading method print() dan method raiseSalary(). Definisi kelas (kelas Employee sebagai super class) dan sub kelas (kelas Manager sebagai sub class) adalah sebagai berikut : import corejava.*; public class ManagerTest BAB IV : Constructor, Inheritance & Polymorphism { public static void main(String[] args) { Employee[] staff = new Employee[3]; Manager boss =new Manager("Harry Hacker",100000,new Day(1982,10,1)); boss.setSecretaryName("JEANET JACKSON"); staff[0] = boss; staff[1] = new Employee("Carl Cracker", 75000, new Day(1987,12,15)); staff[2] = new Employee("Tony Tester", 38000, new Day(1990,3,15)); int i; for (i = 0; i < 3; i++) staff[i].print(); System.out.println(" "); for (i = 0; i < 3; i++) staff[i].raiseSalary(10); for (i = 0; i < 3; i++) staff[i].print(); } } class Employee { public Employee(String n, double s, Day d) { name = n; salary = s; hireDay = d; } public void print() { System.out.println(name + " " + salary + " " + hireYear()); } public void raiseSalary(double byPercent) { salary *= 1 + byPercent / 100; } public int hireYear() { return hireDay.getYear(); } private String name; private double salary; private Day hireDay; } class Manager extends Employee { public Manager(String n, double s, Day d) { super(n, s, d); secretaryName = ""; } public void raiseSalary(double byPercent) { // add 1/2% bonus for every year of service Day today = new Day(); double bonus = 0.5 * (today.getYear() - hireYear()); super.raiseSalary(byPercent + bonus); } public void setSecretaryName(String n) { secretaryName = n; } 27 BAB IV : Constructor, Inheritance & Polymorphism 28 public void print() { super.print(); System.out.println("his secretary is : "+secretaryName); } public String getSecretaryName() { return secretaryName; } private String secretaryName; } Hasil program adalah sebagai berikut : Harry Hacker 100000 1982 his secretary is : JEANET JACKSON Carl Cracker 75000 1987 Tony Tester 38000 1990 Print() dari class Manager Print() dari class Employee Harry Hacker 120000 1982 his secretary is : JEANET JACKSON Carl Cracker 825000 1987 Tony Tester 41800 1990 Polymorphism: Satu lagi konsep penting dalam OOP adalah konsep polymorphism. Dalam OOP polymorphism dimaksudkan bahwa perancang dapat mendifinisikan suatu method dalam suatu kelas dengan nama yang sama dengan method yang telah didefinisikan pada kelas induknya. Pendefinisian method pada kelaskelas turunan ini dapat dilakukan sepanjang garis “silsilah” pewarisan kelas, sehingga suatu nama method dapat muncul berkali-kali pada suatu kelas, subkelas, sub-sub-kelas dan seterusnya. Pendefinisian method seperti ini juga dikenal dengan istilah method overriding. Apabila method tersebut dipanggil maka objectlah yang akan menentukan method mana yang harus dikerjakan. Sebagai contoh dalam class Employee didefinisikan method print() : class Employee { ... public void print() { System.out.println(name + " " + salary + " " + hireYear()); } Selanjutnya dalam class Manager yang merupakan turunan (lebih dikenal dengan istilah sub-klas) juga didefinisikan method print() yang isinya berbeda dengan method print() pada kelas Employee sbb : class Manager extends Employee { ... public void print() { super.print(); System.out.println("his secretary is : "+secretaryName); } BAB IV : Constructor, Inheritance & Polymorphism 29 Perhatikan isi method print() pada kelas Manager baris pertama memanggil method print() dari object super (dalam hal ini objek super adalah objek Employee, yang merupakan super kelas atau induk dari kelas Manager). Setelah melaksanakan print() dari objek super dilanjtkan dengan mencetak nama sekretaris. Dengan demikian pada saat pemanggilan method print() maka kompiler akan melihat objek mana yang dimaksud, misalnya : Manager boss =new Manager("Harry Hacker",100000,new Day(1982,10,1)); boss.setSecretaryName("JEANET JACKSON"); staff[1] = new Employee("Carl Cracker", 75000, new Day(1987,12,15)); Perhatikan bagian program: staff[i].print() dalam main() Untuk i=0 maka staff[i] adalah objek dari kelas Manager sehingga method print() yang dikerjakan adalah dari kelas Manager (dengan mencetak nama sekretaris) Untuk i=1 dan i=2 maka staff[i] adalah objek dari kelas Employee sehingga method print() yang dikerjakan adalah method print() dari kelas Employee. Hal ini ditunjukkan oleh output program. Satu konsep yang menaraik adalah bahwa suatu objek dari super-kelas Dapat diassign (diberikan )pada objek dari sub-kelas, seperti pernyataan : staff[0]=boss ; class Employee class Manager Hal ini tidak dapat berlaku sebaliknya. Pernyataan boss=staff[0] akan menimbulkan error. Dalam contoh program class Manager dan class Employee juga ada polymorphism untuk method raiseSalary(double byPercent), dimana untuk kelas Employee perhitungan adalah kenaikan salary adalah sebesar (byPercent/100)*salary awal, sedangkan rumus untuk kelas Manager (byPercent+bonus)/100 * salary awal. Sedangkan untk bonus dihitung sebesar setengah masa kerja (bonus = 0.5 * (today.getYear() – hireYear()); BAB IV : Constructor, Inheritance & Polymorphism 30 III. TUGAS 1. Definisikan suatu kelas Lingkaran dengan atribut R dan Luas serta method Cetak() yang menghasilkan output : LINGKARAN DENGAN JEJARI ... R LUASNYA ADALAH .... Definisikan kelas turunan dari kelas Lingkaran yaitu kelas Tabung dengan atribut tambahan TinggiTabung dan VolumeTabung serta overriding method Cetak() dengan menghasilkan output : “TABUNG DENGAN LUAS ALAS ... DAN TINGGI ... VOLUMENYA ADALAH ... Testlah kemampuan kelas tesebut dengan class TesTab simpan dalam file TesTab.java Deklarasi objek lingkaran dan objek tabung adalah : Lingkaran L1=new Lingkaran(2); /// lingkaran jejari 2 Tabung T1 = new tabung(2,4); // tabung Jejari alas 2 tinggi 4 Untuk memanggil method Cetak() L1.Cetak() T1.Cetak() BAB V : Abstract Class dan Package 38 BAB V ABSTRACT CLASS DAN PACKAGE I. Tujuan : Memahami dan mampu membedakan konsep class dan abstract class, serta abstract method dan kapan konsep ini harus dipergunakan. Beberapa pustaka dari class-class java didefinisikan sebagai class abstract yang memberikan peluang kepada programmer untuk menurunkan sendiri class-class dari class abstract yang tersedia. II. Teori Singkat : Pengertian abstract class : Pada BAB II, III dan IV apabila kita mendefinisikan suatu kelas maka kelas tersebut akan digunakan sebagai basis untuk pendefinisian objek-objek dari class tersebut. Pada BAB III definisikan class Anjing dan class Mahasiswa yang digunakan untuk menciptakan objek-objek dari kelas Anjing dan kelas Mahasiswa. Pada BAB IV kita mendefinisikan class Employee dan sub-klass turunannya yaitu class Manager yang masing-masing digunakan untuk menciptakan objek. Suatu kelas sangat mungkin didefinisikan sebagai super class yang darinya diturunkan sub-klas sub-klas turunannya, akan tetapi kita tidak bermaksud mendefinisikan objek dari super class tersebut. Dengan demikian super class tersebut didefinisikan semata-mata hanya sebagai “payung” atau “induk” dari klas-klas turunannya. Dari klas-klas turunan ini lah objek yang sebenarnya akan diciptakan. Suatu super klass yang didefinisikan seperti ini dinamakan sebagai class abstract. Pengertian abstract method : Di dalam class abstract dapat didefinisikan atribut-atribut dan methodmethod. Atribut dan method yang didefinisikan dalam klass abstract dimaksudkan merupakan sesuatu yang umum dan terdapat pada sub-kelas subkelas turunannya. Suatu abstract method didefinisikan dengan cukup mendeklarasikan namanya pada class abstract dan meng-override pada masing-masing kelas turunannya dengan menyesuaikan dengan kebutuhan kelas turunannya tersebut. Suatu class harus didefinisikan sebagai class abstract apabila minimal ada satu method yang didefinisikan sebagai abstract method. Sebagai gambaran diambilkan contoh suatu class Message, yang memiliki sub-class :textMessage, voiceMessage dan faxMessage. Pada setiap jenis sub-klas ada common atribut, yang sama dan berlaku pada setiap subclass yaitu atribut :sender (pengirim). Pada setiap sub-class juga ada common method yang berlaku sama yaitu :getSender(). Untuk method play(), yang ada pada setiap sub-class tetapi memiliki implementasi yang berbeda BAB V : Abstract Class dan Package 39 Message sender getSender() play( ) TextMessage VoiceMessage text filename FaxMessage Gambar 5.1. Hierarchi class abstract Message dan turunannya Kode program untuk implementasi adalah sebagai berikut (Horstmann, 1996) /** * @version 1.00 07 Feb 1996 * @author Cay Horstmann */ import java.io.*; import sun.audio.*; import corejava.*; public class MailboxTest { public static void main(String[] args) { Mailbox mbox = new Mailbox(); while (true) { System.out.println(mbox.status()); String cmd = Console.readString ("play, text, voice, quit> "); if (cmd.equals("play")) { Message m = mbox.remove(); if (m != null) { System.out.println("From: " + m.getSender()); m.play(); } } else if (cmd.equals("text")) { String from = Console.readString("Your name: "); boolean more = true; String msg = ""; System.out.println ("Enter message, 'exit' when done"); while (more) { String line = Console.readString(); if (line.equals("exit")) more = false; else msg = msg + line + "\n"; } mbox.insert(new TextMessage(from, msg)); } else if (cmd.equals("voice")) { String from = Console.readString("Your name: "); BAB V : Abstract Class dan Package String msg = Console.readString("Audio file name: "); mbox.insert(new VoiceMessage(from, msg)); } else if (cmd.equals("quit")) System.exit(0); } } } abstract class Message { public Message(String from) { sender = from; } public abstract void play(); public String getSender() { return sender; } private String sender; } class TextMessage extends Message { public TextMessage(String from, String t) { super(from); text = t; } public void play() { System.out.println(text); } private String text; } class VoiceMessage extends Message { public VoiceMessage(String from, String f) { super(from); filename = f; } public void play() { AudioPlayer ap = AudioPlayer.player; try { AudioStream as = new AudioStream(new FileInputStream(filename)); ap.start(as); } catch(IOException e) {} } private String filename; } class Mailbox { public Message remove() { if (nmsg == 0) return null; Message r = messages[out]; nmsg--; out = (out + 1) % MAXMSG; return r; } public void insert(Message m) { if (nmsg == MAXMSG) return; messages[in] = m; nmsg++; in = (in + 1) % MAXMSG; } 40 BAB V : Abstract Class dan Package 41 public String status() { if (nmsg == 0) return "Mailbox empty"; else if (nmsg == 1) return "1 message"; else if (nmsg < MAXMSG) return nmsg + " messages"; else return "Mailbox full"; } private private private private private final int MAXMSG = 10; int in = 0; int out = 0; int nmsg = 0; Message[] messages = new Message[MAXMSG]; } Bila program dijalankan hasilnya adalah : Gambar 5.2. Hasil output program MailboxTest Program diatas belum mengimplementasikan class faxMessage dan hanay mengimplementasikan class textMessage dan voiceMessage serta class program utamanya. Jika definisi klas-klas dianalisis terlihat bahwa untuk kelas abstract Message memiliki method abstract play() yang belum diimplementasikan dan dicadangkan untuk diimplementasikan (di-override) dari sub-klas turunannya, mengingat play bagi message text cukup dengan mencetak text tersebut sedang play bagi message bagi voice perlu mendefinisikan objek Audioplayer dan memainkan file audio tersebut. Package : Suatu package adalah “bendel” atau pengelompokan kelas-kelas berdasarkan kesamaan atau kemiripan fungsi. Program java memiliki enam paket dalam java class libraray. Pada puncak hierarchi :java adalah suatu kelas BAB V : Abstract Class dan Package 42 teratas yang darinya semua kelas diturunkan. Kelas-kelas yang diturunkan dikelompokkan menjadi 6 package besar , yaitu : java.io java.lang java.applet java.awt java.net java.util Pada beberapa percobaan terdahulu telah dijumpai beberapa definisi class yang diawali dengan kata kunci :import. Kata kunci ini memberitahukan bahwa definisi class yang kita buat akan melibatkan kelas-kelas lain yang terhimpun didalam package yang kita import. Hal ini telah kita lakukan misalnya :import corejava.* Pelibatan kelas dari package dapat hanya sebagian kelas (atau sub klas) atau semuanya, seperti contohnya : import java.io.*; (semua kelas dari package java.io dapat diugunakan) import java.util.Properties; (hanya class Properties dari package java.util) import java.awt.image.ColorModel ; (sub klas ColorModel dari class image dari package awt). Pembuatan suatu package dianjurkan untuk pemrograman skala besar, dimana kita mendefinisikan banyak kelas dengan pengelompokan sesuai tujuan. Pada saat pembuatan suatu package maka kata package harus menjadi statemen pertama, misalnya : package MyFirstpackage public class MyFirstClass { ....} setiap class yang menjadi anggota paket didefinisikan dengan diawali dengan kata package dilanjutkan dengan definisi kelas seperti biasa. Kelas-kelas yang menjadi anggota paket dapat disimpan dalam file-file yang terpisah. File-file java yang merupakan definisi class dari anggota package disimpan dalam satu directori yang sama dengan nama directori adalah nama package tersebut. Contoh: Akan didefinisikan suatu package bernama : geometri Berisi dua kelas : lingkaran dan kelas :epp (empat persegi panjang) Definisi kelas lingkaran : package geometri; public class lingkaran { public lingkaran(double r) {jari=r; luas=3.14*jari*jari; keliling=2*3.14*jari; } BAB V : Abstract Class dan Package 43 public double getLuas() {return luas;} public double getKeliling(){return keliling ;} public void CetakLuas() {System.out.println("Luas LINGKARAN = "+luas); } public void CetakKeliling() {System.out.println("Keliling LINGKARAN = "+keliling); } private double jari; private double luas; private double keliling; } Sedangkan definisi kelas : epp package geometri; public class epp { double panjang; double lebar; double luas; double keliling; public epp(double p, double l) {panjang=p; lebar=l; luas=p*l; keliling=(p+l)*2;} public double getLuas() {return luas;} public double getKeliling(){return keliling;} public void CetakLuas() {System.out.println("Luas EPP = "+luas); } public void CetakKeliling() {System.out.println("Keliling EPP = "+keliling); } } Selanjutnya kedua file disimpan dalam satu directori bernama :geometri Untuk menggunakan paket tersebut didefinisikan kelas utama dengan nama tesGeo.java sebagai berikut : import geometri.*; class tesGeo { public static void main(String args[]) { lingkaran R1 = new lingkaran(1); epp E1=new epp(5,10); R1.CetakLuas(); R1.CetakKeliling(); E1.CetakLuas(); E1.CetakKeliling(); } } BAB V : Abstract Class dan Package 44 Hasil program adalah seperti gambar 5.3. Gambar 5.3. Hasil penggunaan package geometri III. TUGAS 1. Definisikan suatu class abstract bernama :class Orang dengan ketentuan : Dalam kelas tersebut ada atribut :Nama (String: yaitu nama orang tersebut) dan Umur (int :yaitu umur orang tersebut). Constructor dari class Orang didefinisikan dalam class Orang menginisialisasi Nama dan Umur. Didefinisikans method abstract Cetak(), yang akan di-override dalam kelas turunannya. Definisikan dua buah kelas turunan dari class Orang yaitu class :Pegawai dan class Mahasiswa. Untuk class Pegawai dengan ketentuan : Dalam kelas Pegawai ada atribut tambahan yaitu NIP dan Gaji Mendefinisikan method NaikGaji(), yaitu untuk menaikkan gaji sebesar :10% Mendefinisikan method Cetak() untuk mencetak :NIP, Nama, Umur (int) dan Gaji (double) Untuk class Mahasiswa dengan ketentuan : Dalam kelas Mahasiswa ada atribut tambahan yaitu NoMhs (String), Masa studi (int) dan IP (double) Mendefinisikan method Cetak() untuk mencetak :NoMhs, Nama, Umur, Masa studi dan IP Ujilah kemampuan klas tersebut dengan mendefinisikan klass TestOrang.java untuk program utamanya. BAB V : Abstract Class dan Package 39 PERCOBAAN VI PEMROGRAMAN DENGAN awt I. Tujuan : Pengenalan dasar mengenai suatu paket yang sangat luas penerapannya yang dimiliki oleh program JAVA, yaitu package java.awt. Paket ini, AWT=Abstract Window Toolkit, memungkinkan pemrogram merancang aplikasi atau aplet dengan basis grafik, termasuk didalamnya Image, dan intensif menggunakan prosedur-prosedur standard window dan antar muka grafis seperti komponen-komponen button, textedit, checkbox, slider dan lain-lain. Dengan AWT dimungkinkan pula kita untuk merancang animasi. Dalam percobaan ini hanya akan dikenalkan beberapa komponen dasar grafis. II. Teori Singkat : AWT=Abstract Window Toolkit adalah paket JAVA yang didalamnya terdefinisi banyak kelas antara lain : Frame, Graphics, Font, Image dan lainlain. Class Frame Kelas Frame merupakan class yang darinya dapat diturunkan sebuah frame (jendela). Di atas jendela ini dapat dilakukan berbagai pekerjaan grafis seperti membuat garis, kotak, lingkaran, elips, poligon, menulis teks atau menempatkan komponen antar muka grafis seperti button, check box, radio button dan lain-lain. Contoh berikut program untuk menciptakan frame tersebut. import java.awt.*; public class g1 extends Frame { public static void main(String args[]) { Frame f = new Frame(); f.resize(300,200); f.show(); } } Hasil dari program adalah seperti gambar 6.1 Gambar 6.1. Frame atau windows ( 300 point x 200 point) Windows tersebut belum dapat ditutup dengan mengklik mouse pada tanda x dipojok layar. Agar windows tersebut dapat ditutup dengan Ctrl-Alt-Del diakhiri dengan EndTask. Agar suatu window dapat ditutup dengan normal (dengan mengklik x dipojok kanan atas), perlu didefinisikan suatu method handleEvent() dari windows sebagai berikut : BAB V : Abstract Class dan Package 40 public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) System.exit(0); return false; } Class Font dan class Graphics Kelas Font memungkinkan kita mengatur jenis huruf, ukuran huruf, model huruf (tebal,italic dan lain-lain). Contoh pengaturan huruf adalah : setFont(new Font("Times", Font.BOLD, 18) model huruf Times New Romans, huruf tebal 18 point (huruf normal 12 point) Kelas Graphics merupakan class yang memungkinkan kita untuk menulis teks, menggambar garis, kotak lingkaran dan lain-lain. Beberapa method dalam class Graphics antara lain : drawString(String s, x,y) : cetak string dikoordinat x,y drawLine(x1,y1,x2,y2) : cetak garis drawRect(x1,y1,x2,y2) : cetak kotak fillRect(x1,y1,x2,y2) : mengisikotak drawOval(x1,y1,width,height) : cetak lingkaran atau oval drawRoundRect(x1,y1,x2,y2): cetak kotak pojoknya bulat fillRoundRect(x1,y1,x2,y2):mengisi kotak drawPolygon(x1,y1,x2,y2): mencetak poligon drawArc(x,y,widht,height,startangle,stopangle) Untuk menuliskan suatu string di windows pada posisi kolom x dan baris y. Koordinat layar windows adalah :0,0 berada pada pojok kiri atas; x=jumlah point kearah kanan dan y=jumlah point kearah bawah (vertikal), seperti ti pada gambar 6.2. width (x) (0,0) height (y) Gambar 6.2. Koordinat layar grafik Untuk drawOval apabila widht dan height sama akan menghasilkan lingkaran dan apabila tidak sama akan menghasilkan bentuk oval. Contoh porgram yang melibatkan method tersebut adalah seperti class g2 berikut : import java.awt.*; public class g2 extends Frame { public g2() {setTitle("Kotak bertulisan");} public void paint(Graphics g) //untuk judul windows BAB V : Abstract Class dan Package 41 { g.drawRect(10,10,100,60); g.drawRect(8,8,104,64); g.drawString("HELLO MAS ",30,30); g.setFont(new Font("Times", Font.BOLD, 18)); g.drawString("JAVA ",30,50); } public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) System.exit(0); return false; } public static void main(String args[]) { Frame f = new g2(); f.resize(300,200); f.show(); } } Hasil program g2.java adalah sebagai gambar 6.3. berikut : Gambar 6.3. Hasil program g2.java Class Image Salah satu class yang menarik dalam awt adalah class abstract Image yang memungkinkan kita untuk menampilkan dan memanipulasi data Image dalam berbagai format, seperti GIF, SPEG,BMP dan lain-lain Beberapa method yang penting yang berhubungan dengan class Image antara lain : Toolkit.getDefaultToolkit().getImage(nmFILE) yaitu untuk mengambil gambar yang tersimpan dalam file nmFILE. Dalam nmFILE termuat lengkap dengan nama directori dan subdirectory, kecuali file gambar kita ada pada directory yang sama dengan file program. drawImage(objekgambar,x,y,skalaX,skalaY,pengamatGambar); Parameter pertama objekgambar adalah nama objek gambar yang telah diambil dari file ke memory dengan method getImage(). Parameter kedua dan ketiga :x,y adalah koordinat pojok kiri atas dari peletakan gambar pada windows. Paramater kempat dan kelima adalah sekala horisontal dan vertikal dalam satuan point dari gambar. Contoh berikut adalah penggunaan method tersebut : import java.awt.*; import java.awt.Image.*; BAB V : Abstract Class dan Package 42 public class Poto extends Frame { String nmFILE="Sylvestr.GIF"; Image gb=Toolkit.getDefaultToolkit().getImage(nmFILE); public void paint(Graphics g) { setTitle("Gambar Bintang Pilm RAmbo"); g.setColor(Color.magenta); g.drawString("HELLO MAS ",50,260); g.drawImage(gb,20,20,this); setFont(new Font("Times", Font.BOLD, 18)); g.setColor(Color.red); g.drawString("RAMBO !!" ,50,280); } public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) System.exit(0); return false; } public static void main(String args[]) { Frame f = new Poto(); f.resize(250,350); f.show(); } } Dalam progfram di atas drawImage() tidak menentukan skala gambar, sehingga gambar yang ditampilkan adalah sesuai dengan ukuran asli filenya. Adapun output program adalah sebagai dalam Gambar 6.4. Gambar 6.4. Hasil image BAB V : Abstract Class dan Package 43 Untuk melihat efek penskalaan program diatas dapat dimodifikasi dengan mengganti gambar dan mencetak dengan beberapa penskalaan. import java.awt.*; import java.awt.Image.*; public class Poto extends Frame { String nmFILE="Dessyrat.GIF"; Image gb=Toolkit.getDefaultToolkit().getImage(nmFILE); public void paint(Graphics g) { setTitle("Gambar 5 buah Dessy"); g.drawImage(gb,20,20,50,60,this); g.drawImage(gb,80,20,50,60,this); g.drawImage(gb,140,20,70,90,this); g.drawImage(gb,20,110,90,120,this); g.drawImage(gb,120,130,90,50,this); // skala tak imbang } public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) System.exit(0); return false; } public static void main(String args[]) { Frame f = new Poto(); f.resize(250,300); f.show(); } } Hasil program terlihat seperti pada gambar 6.5. Gambar 6.5. Hasil penskalaan image Hal yang perlu diperhatikan dalam pensklaan adalah keseimbangan antara lebar (width) dan tinggi (height) darai gambar, apabila ini tidak seimbang akan dapat BAB V : Abstract Class dan Package 44 “merusak” gambar seperti tampak pada Gambar 6.5. untuk skala yang terakhir, lebar lebih besar dari tinggi, yang tidak sesuai dengan gambar aslinya. Antar Muka Grafis Kelas awt disamping menyediakan kemampuan untuk menggamabr bentukbentuk geometris dan foto juga menyediakan kemampuan untuk antar muka grafis. Karena keterbatasan ruang pada kesempatan ini dicoba beberapa komponen yang akan dicoba adalah komponen :Botton, Menu dan EditText. Button : Program untuk peragaan button adalah : import java.awt.*; public class ButtonTest extends Frame { public ButtonTest() { setTitle("ButtonTest"); setLayout(new FlowLayout()); add(new Button("Yes")); add(new Button("No")); add(new Button("Ok")); add(new Button("Cancel")); add(new Button("Abort")); add(new Button("Retry")); add(new Button("Ignore")); } public boolean handleEvent(Event evt) { if (evt.id == Event.WINDOW_DESTROY) System.exit(0); return super.handleEvent(evt); } public boolean action(Event evt, Object arg) { if (arg.equals("Yes")) setBackground(Color.yellow); else if (arg.equals("No")) setBackground(Color.blue); else if (arg.equals("Ok")) setBackground(Color.orange); else if (arg.equals("Cancel")) setBackground(Color.cyan); else if (arg.equals("Abort")) setBackground(Color.pink); else if (arg.equals("Retry")) setBackground(Color.red); else if (arg.equals("Ignore")) setBackground(Color.white); else return false; repaint(); return true; } public static void main(String[] args) { Frame f = new ButtonTest(); f.resize(320, 200); f.show(); } } Hasil adalah sebagai berikut : BAB V : Abstract Class dan Package 45 Gambar 6.6. Hasil program ButtonTest Setiap tombol apabila di klik akan menyebabkan warna Frame berubah, tombol “Yes” adalah kuning, tombol “No” adalah biru, tombol “Ok” orange dan seterusnya. III. Tugas 1. Buatlah program untuk menggambar mobil sebagai berikut : 2. Buatlah program dengan komponen antar muka grafis untuk membaca Panjang dan Lebar suatu empat persegi panjang dengan EditText dan menampilkan Luas dan Keliling. Layout sebagai berikut : Kotak untuk memasukkan Panjang dan Lebar adalah EditText. Tombol HitungLuas dan HitungKell apabila diklik maka pada kotak luas dan kotak keliling akan muncul hasilnya apabila dalam kotak Panjnag dan Lebar ada datanya. Bila tombol Clear di klik semua EditText dibersihkan. PROGRAM HITUNG LUAS DAN KELILING PANJANG: : LEBAR: LUAS : KELILING: : HitungLuas HitungKell Clear