Pemrograman Berorientasi Objek JAVA

32

Click here to load reader

description

Java Scrib

Transcript of Pemrograman Berorientasi Objek JAVA

  • Pemrograman Berorientasi Objek

    - 1 -

    0002

    Tujuan Materi Setelah menyelesaikan bagian ini anda diharapkan: 9 Mengetahui dan memahami konsep Pemrograman Berorientasi Objek (Object Oriented Programming,

    OOP). 9 Mampu membedakan konsep pemrograman tradisional dengan Pemrograman Berorientasi Objek. 9 Mampu menerapkan konsep Pemrograman Berorientasi Objek dalam pembuatan program aplikasi. 9 Mampu mengembangkan program aplikasi dengan konsep Pemrograman Berorientasi Objek.

    77..11 PPeennggaannttaarr

    Metode Pemrograman Berorientasi Objek (Object Oriented Programming, OOP) menawarkan suatu teknik pembuatan dan pengembangan program aplikasi dengan cara yang mudah dan menyenangkan. Berbagai program aplikasi berbasis Windows dibangun menggunakan metode pemrograman ini. Konsep yang digunakan dalam OOP berbeda dengan metode pemrograman tradisional seperti metode pemrograman prosedural. Terdapat beberapa aspek yang harus diketahui sehubungan dengan metode OOP. Meski demikian, metode OOP bukannya tanpa masalah; persoalan besar yang dihadapi dalam metode ini adalah sulitnya memahami konsep objek beserta aspek-aspek yang terkait, misalnya class, inheritance dan lain-lain. Masalah besar lainnya adalah besarnya sumber daya komputer yang diperlukan, misalnya kita memerlukan memori lebih banyak dibandingkan dengan jika kita membuat program dengan metode tradisional. Dua buah objek yang identik akan memerlukan dua area memori berbeda walaupun dari sisi data dan proses keduanya memiliki jumlah dan jenis yang sama. Hal ini disebabkan karena data dan proses pada kedua objek tersebut dipisahkan oleh komputer. Bagian ini juga membahas tentang class, yaitu cikal-bakal objek. Class merupakan aspek penting yang harus diketahui jika anda ingin belajar tentang OOP. Setelah membahas tentang class, secara bertahap kita juga akan membahas tentang proses pembuatan dan pengembangan objek. Jika anda membutuhkan informasi lengkap tentang konsep Object Oriented anda bisa membaca referensi yang menjelaskan konsep Object Oriented murni tanpa merujuk pada sebuah bahasa pemrograman, sedangkan buku ini mencoba mengimplementasikan konsep Object Oriented menggunakan bahasa Java. Seluruh materi pada bagian ini akan dijelaskan dengan cara yang mudah dipahami, bahkan mungkin anda akan menilai bahwa materinya berbeda jauh dengan materi di buku-buku referensi asli yang membahas metode OOP. Penjelasan yang rumit dan bersifat teoritis akan kita hindari. Jika anda membutuhkan penjelasan yang lebih detail, anda bisa membaca buku-buku referensi yang khusus membahas tentang Pemrograman Berorientasi Objek. Secara lengkap materi-materi yang akan kita bicarakan dalam bab ini adalah: 1. Objek 2. Classification

    a. Abstraction b. Encapsulation c. Constructor

    i. Single constructor ii. Constructor dengan parameter iii. Multiple constructor

    d. Inheritance e. Polymorphism

    3. Package 4. Contoh Kasus

    a. Class Penduduk b. Class Karyawan c. Class Mahasiswa d. Class Menwa

    BAB 7

    PPEEMMRROOGGRRAAMMAANN BBEERROORRIIEENNTTAASSII OOBBJJEEKK

  • Pemrograman Berorientasi Objek

    - 2 -

    77..22 OObbjjeekk

    Terdapat fungsi untuk menghitung luas lingkaran dengan rumus yang sudah dikenal luas: .r2. Notasi atau phi adalah konstanta sedangkan r adalah variabel, sehingga hasil perhitungan akan sangat ditentukan oleh besar kecilnya nilai r, atau dengan kata lain hasil perhitungan berbanding lurus dengan perubahan nilai r.

    x r2luas lingk a ran

    ja ri-ja ri ( r )

    Fungsi menghitung luas lingkaran ini membutuhkan data jari-jari lingkaran. Sekarang asumsikan ada tiga lingkaran yang akan kita hitung luasnya, masing-masing dengan nilai jari-jari 5, 20 dan 34. Dengan pendekatan 5 angka desimal perhitungan luas ketiga lingkaran tersebut diperlihatkan sebagai berikut: D ata ja r i- ja r i 5 > > >

    x 5 2Lua s = 78 .53982

    5

    D ata ja r i- ja r i 20 > >

    x 2 0 2Luas = 125 6 .6370 6

    20

    D ata ja r i- ja r i 34 > >

    x 3 4 2Luas = 363 1 .6811 1

    34

    Melalui fungsi yang sama bisa diperoleh hasil perhitungan yang berbeda-beda tergantung data masukan yang diberikan. Lebih jauh lagi, seandainya suatu ketika ada perubahan rumus menghitung luas lingkaran, maka perubahan tersebut akan berdampak pada tiga lingkaran tersebut. Hal ini bisa dianalogikan dengan mesin parut kelapa: jika mesin tersebut mengalami perubahan desain misalnya, maka perubahan tersebut akan berdampak pada orang-orang yang memarut kelapa dengan mesin tersebut.

    Jika setiap lingkaran kita anggap sebagai sebuah objek dimana di dalam objek tersebut terdapat data jari-jari lingkaran dan fungsi untuk menghitung luas dan keliling lingkaran, maka untuk menghitung luas dan keliling beberapa lingkaran kita membutuhkan beberapa objek sejenis. Setiap objek bertanggung jawab terhadap data dan fungsi di dalamnya. Tidak ada hubungan antara objek yang satu dengan objek

    lainnya.

    77..33 CCllaassssiiffiiccaattiioonn

    Sebuah pabrik garmen menerima order pembuatan kaos bergambar sebanyak 100 buah. Keseratus kaos tersebut akan diberi gambar donald-bebek. Dengan alasan menghemat biaya dan efisiensi waktu, pihak pabrik akan membuat satu model gambar saja. Pada model gambar ini pabrik garmen melakukan desain gambar, pengaturan warna dan hal-hal lain yang diperlukan sehubungan dengan gambar sablon yang akan ditempelkan di kaos. Pihak pabrik tidak perlu membuat 100 model gambar donald-bebek untuk 100 kaos, cukup satu gambar untuk seluruh kaos. Pembuatan model kaos harus memperhitungkan ongkos

    OObbjjeekk mmeerruuppaakkaann kkeessaattuuaann aannttaarraa ddaattaa ddaann ffuunnggssii yyaanngg mmeemmpprroosseess ddaattaa

    tteerrsseebbuutt

  • Pemrograman Berorientasi Objek

    - 3 -

    menggambar, ongkos bahan warna dan sebagainya, sehingga lebih efisien jika model yang dibuat hanya satu untuk kemudian di-copy-paste pada beberapa kaos. Dari ilustrasi ini ada dua hal yang bisa diketahui:

    Ada sebuah cetakan atau model. Cetakan ini bersifat abstrak, tidak bisa digunakan oleh user, karena cetakan ini bukanlah benda yang bisa dipakai. Cetakan sablon ini identik dengan class. [pernahkan anda membayangkan membeli barang menggunakan cetakan uang ?]

    Ada kaos yang akan dijadikan sasaran mewujudkan cetakan tersebut. Kaos ini bersifat kongkrit, bisa dilihat dan digunakan. Kaos yang disablon tidak lain adalah objek. [sehari-hari anda membeli barang dengan uang yang nyata]

    Proses pembuatan class harus dilakukan sedemikian rupa sehingga seluruh data yang diperlukan oleh objek bisa didaftarkan. Untuk class yang kompleks hal ini tentu merupakan pekerjaan yang rumit. Konsep OOP menawarkan kemudahan dengan cara mengembangkan class yang telah kita buat. Kita bisa saja membuat suatu class yang merupakan pengembangan dari class yang telah ada sebelumnya. Classification adalah suatu proses pembentukan class. Secara

    umum sebuah class Java didefinisikan dengan format sebagai berikut: class NamaClass { definisi_data_member; definisi_member_function; }

    Blok program ini merupakan bentuk dasar pembentukan class di Java. Pada bagian selanjutnya kita akan mengimplementasikan bentuk tersebut dengan kasus yang lebih real. Sebuah class (atau objek nantinya) memiliki dua komponen: 1. Data member (anggota data), yaitu variabel-variabel yang menyatakan karakteristik suatu objek.

    Sebuah objek lingkaran memiliki karakteristik yang dinyatakan dengan nilai jari-jari. 2. Member function (fungsi anggota), yaitu fungsi-fungsi yang bertugas memanipulasi nilai pada data-

    member. Fungsi yang paling sering ada pada sebuah objek adalah fungsi untuk mengubah dan menginformasikan nilai dari data-member objek.

    77..33..11 AAbbssttrraaccttiioonn

    Abstraction adalah suatu proses dimana kita melakukan desain class dan menentukan data dan method yang akan dimiliki oleh sebuah class. Sebuah bangun geometri lingkaran dideskripsikan dengan bentuk seperti di bawah ini:

    Sekarang anda bayangkan terdapat beberapa lingkaran. Setiap lingkaran memiliki jari-jari. Nilai jari-jari tersebut mungkin sama mungkin juga berbeda, yang pasti adalah setiap lingkaran memiliki jari-jari. Nilai jari-jari sebuah lingkaran bersifat bebas, tidak tergantung pada nilai jari-jari lingkaran lain. Jadi jari-jari adalah data yang dimiliki oleh sembarang lingkaran, dan inilah yang menjadi karakteristik bangun geometri lingkaran. Berdasarkan fakta ini maka kita bisa membuat class untuk objek lingkaran. Class ini kita beri nama Lingkaran, disesuaikan dengan nama bangun geometri yang akan kita buat. (anda bebas memberi nama sesuai keinginan). Class Lingkaran ini memiliki karakteristik sebagai berikut:

    r

    Lingkaran memiliki jari-jari (radius atau r) untuk menyatakan ukurannya. Semakin besar nilai jari-jarinya semakin besar ukuran lingkaran tersebut dan sebaliknya.

    PPeerrbbeeddaaaann ccllaassss ddaann oobbjjeekk:: 11.. CCllaassss mmeerruuppaakkaann ddeessaaiinn

    ddaann oobbjjeekk mmeerruuppaakkaann ppeerrwwuujjuuddaann ssuuaattuu ccllaassss..

    22.. CCllaassss bbeerrssiiffaatt aabbssttrraakk ddaann oobbjjeekk bbeerrssiiffaatt kkoonnggkkrriitt..

  • Pemrograman Berorientasi Objek

    - 4 -

    1. Memiliki jari-jari. 2. Memiliki beberapa method: 9 Mengubah nilai jari-jari, 9 Memperoleh informasi jari-jari, 9 Menghitung luas lingkaran, 9 Menghitung keliling lingkaran.

    Langkah berikutnya adalah membuat format class Lingkaran berdasarkan karakteristik tersebut di atas.

    class Lingkaran { data: jari-jari method: update jari-jari informasi jari-jari hitung luas hitung keliling }

    Sampai di sini tahap perancangan class bisa dianggap selesai. Pada bagian selanjutnya kita akan melakukan implementasi class ini secara mendetail. 77..33..22 EEnnccaappssuullaattiioonn

    Data yang ada pada suatu objek tidak boleh diubah secara langsung dari luar objek tersebut. Perubahan secara langsung dari luar objek bisa berakibat data-data di dalam objek mengalami kondisi bad value yang pada akhirnya berimbas pada tidak berfungsinya sebuah objek sebagaimana yang dikehendaki. Di satu sisi kita tidak bisa menjamin bahwa pengguna objek akan memasukkan data-data yang valid; seringkali programmer terjangkit penyakit iseng, mencoba hal-hal yang dianggap baru. Pada saat anda diminta memasukkan password untuk

    sebuah software, kemungkinan besar anda akan mencoba memasukkan data sembarang, dengan harapan data itu benar. Di sisi lain kita yakin bahwa suatu ketika lingkungan luar memerlukan informasi dari objek kita, atau mungkin lingkungan luar ingin mengubah informasi yang tersimpan di dalam objek. Dengan demikian harus ada mekanisme untuk mengubah data objek dan menginformasikan data tersebut ke lingkungan luar. Proteksi terhadap data objek harus diiringi dengan mekanisme untuk mengakses data tersebut. Memang tidak semua data yang ada di dalam objek boleh diperkenalkan ke lingkungan luar; kita harus selektif menentukan data mana yang boleh diakses dan data mana yang tidak boleh diakses dari luar. Dengan sering berlatih anda akan mampu secara cepat menentukan data mana yang boleh di-publish ke luar dan data mana yang hanya boleh diketahui oleh lingkungan dalam objek. Kembali kepada contoh tentang lingkaran, nilai jari-jari haruslah dinamis, tidak boleh statis. Walaupun demikian perlu disadari bahwa nilai jari-jari tersebut tidak boleh negatif atau nol, karena tidak mungkin sebuah bangun geometri berdimensi nol atau negatif. Jika data jari-jari di-publish secara umum ke luar objek, maka ada kemungkinan user akan memberi nilai nol atau negatif ke dalamnya. Untuk mengatasi ini kita harus menyediakan method khusus yang menangani perubahan nilai jari-jari ini. Di dalam method ini ada mekanisme untuk memeriksa validitas data jari-jari yang baru masuk. Jika data tersebut valid, proses perubahan akan dilanjutkan dengan mengubah nilai jari-jari sesuai dengan data yang baru masuk tersebut. Tetapi jika ternyata data yang masuk tidak valid, objek akan menolak data tersebut dan mempertahankan nilai sebelumnya. Berikut ini diberikan kode program untuk class Lingkaran secara lengkap. Perhatikan bagaimana kita melakukan pengamanan terhadap data objek. Kata kunci private digunakan untuk mengunci data atau method agar tidak terlihat dari luar objek. Sebaliknya, kata kunci public digunakan untuk mem-publish data atau method agar dikenal dari luar objek.

    EEnnccaappssuullaattiioonn mmeerruuppaakkaann iinnttii ddaarrii mmeettooddee OOOOPP

    ddiimmaannaa ddaattaa oobbjjeekk ddiilliinndduunnggii ddaarrii ppeerruubbaahhaann sseeccaarraa llaannggssuunngg ddaarrii lluuaarr

    MMeetthhoodd ddiigguunnaakkaann uunnttuukk mmeennggkkoommuunniikkaassiikkaann ddaattaa ddaallaamm ccllaassss ddeennggaann lliinnggkkuunnggaann lluuaarr ccllaassss,, mmiissaallnnyyaa uunnttuukk mmeennggeettaahhuuii

    bbeerraappaa nniillaaii jjaarrii--jjaarrii lliinnggkkaarraann ssaaaatt iinnii kkiittaa mmeennyyeeddiiaakkaann mmeetthhoodd kkhhuussuuss.. PPeennggaakksseessaann ddaattaa oobbjjeekk sseeccaarraa llaannggssuunngg ttiiddaakk

    ddiippeerrbboolleehhkkaann.. HHaall iinnii ddiijjeellaasskkaann ppaaddaa bbaaggiiaann sseellaannjjuuttnnyyaa..

  • Pemrograman Berorientasi Objek

    - 5 -

    Program 7.1

    1 class Lingkaran 2 { 3 private double jariJari; 4 5 public void setJariJari (double r) 6 { 7 if (r > 0) jariJari = r; 8 } 9 10 public double getJariJari() 11 { 12 return (jariJari); 13 } 14 15 public double hitungLuas() 16 { 17 return (Math.PI * jariJari * jariJari); 18 } 19 20 public double hitungKeliling() 21 { 22 return (Math.PI * 2.0 * jariJari); 23 } 24 }

    Penamaan method mengikuti ciri-ciri dari kebanyakan perintah standar Java. Ciri-ciri tersebut adalah: 1. Method yang bertugas mengubah nilai ke dalam objek diberi awalan set, misalnya setJariJari(). Nama

    method setelah kata set sama dengan nama variabel data objek yang akan diubah nilainya, misalnya setJariJari() menyatakan bahwa data yang akan diubah adalah nilai dari data objek bernama jariJari.

    2. Method yang bertugas mengambil nilai dari dalam objek diberi awalan get, misalnya getLuas().Nama method setelah kata get sama dengan nama variabel data objek yang akan diketahui nilainya, misalnya getJariJari() menyatakan bahwa data yang akan diketahui nilainya adalah data objek bernama jariJari.

    3. Method dengan tugas selain point 1 dan 2 akan diberi nama sesuai dengan tugas yang dikerjakan oleh method tersebut.

    Instruksi pada baris 3 menyatakan bahwa kita mendeklarasikan variabel jariJari dengan scope lokal, artinya variabel ini hanya dikenal di dalam class Lingkaran. Lingkungan luar class (atau objek) tidak mengenal variabel ini sehingga kita perlu menyediakan method yang berguna untuk mengkomunikasikan data jari-jari dengan lingkungan luar class. Method setJariJari(double) digunakan untuk mengubah nilai jariJari (baris 10-13) dan method getJariJari() digunakan untuk memperoleh nilai jari-jari yang sedang aktif pada objek lingkaran (baris 15-18). Secara bagan kita bisa menggambarkan class Lingkaran ini dengan bentuk sebagai berikut:

    77..33..33 CCoonnssttrruuccttoorr

    Setelah kita mendeklarasikan sebuah variabel, apakah kita yakin mengenai nilai awal yang disimpan di dalam variabel tersebut ? Tanpa memberinya nilai awal, yakinkah kita bahwa mula-mula variabel tersebut

    Lingkaran

    double jariJari

    void setJariJari (double) double getJariJari() double hitungLuas() double hitungKeliling()

  • Pemrograman Berorientasi Objek

    - 6 -

    menyimpan data nol ? Bagi anda yang pernah menggunakan bahasa pemrograman selain Java, tentunya anda berasumsi bahwa Java akan menetapkan nilai nol sebagai nilai awal numerik dan string kosong (null-string) sebagai nilai awal data string. Tentu anda masih ingat materi di buku jilid 1 bagaimana ketatnya Java terhadap variabel yang tidak diberi nilai awal. Pada saat kita membuat sebuah class, kita harus bisa memastikan tentang nilai awal yang disimpan oleh seluruh data objek nantinya. Karena data objek menunjukkan karakteristik objek tersebut, maka seluruh nilai yang tersimpan di dalamnya haruslah logis dan valid, misalnya jari-jari lingkaran tidak boleh nol atau negatif. Secara mudah bisa kita katakan bahwa kita akan membuat sebuah method yang berfungsi untuk mengubah nilai seluruh data objek, katakanlah method bernama initAllValue(). Itu betul, tetapi yang menjadi persoalan adalah bagaimana nilai awal yang disimpan oleh data objek pada saat objek tersebut baru diciptakan, bukan pada saat objek sudah ada. Method initAllValue() hanya bisa dipanggil pada saat objek sudah ada, bukan pada saat objek baru dibuat. Metode OOP hadir dengan adanya sebuah method khusus yang disebut constructor yang akan dipanggil secara otomatis pada saat sebuah objek diciptakan. Kita tidak usah melakukan pemanggilan terhadap constructor ini; Java-lah yang akan melakukannya. Keunikan ini bisa kita manfaatkan untuk melakukan proses inisialisasi seluruh data objek. Dengan kata lain proses pemberian nilai awal seluruh data objek dilakukan melalui constructor. Isi constructor itu sendiri bisa berupa pemanggilan method internal atau instruksi lain. Sebagaimana fungsi atau method pada umumnya, constructor juga bisa memiliki variasi parameter. Kita bisa menerapkan konsep function-overloading pada constructor. Secara umum ada tiga variasi constructor: 1. Single constructor, yaitu hanya ada satu constructor pada class. 2. Constructor dengan parameter, yaitu constructor dengan data yang bisa kita kirim pada saat

    penciptaan objek. 3. Multiple constructor, yaitu terdapat beberapa constructor yang bisa kita pilih pada saat penciptaan

    objek. 77..33..33..11 SSiinnggllee CCoonnssttrruuccttoorr

    Single constructor menyatakan bahwa hanya ada satu constructor dalam class. Hal ini biasanya ditemukan pada class yang sederhana. Dengan menggunakan contoh lingkaran kita akan membuat sebuah constructor untuk proses inisialisasi nilai jari-jari. Kita akan memberikan data awal 1 (satu) sebagai nilai default untuk jari-jari, dengan asumsi nilai ini merupakan nilai terkecil untuk sebuah satuan panjang. Anda boleh saja memberikan nilai lain kecuali angka negatif atau nol. Program 7.2 berikut ini merupakan modifikasi dari program 7.1 dimana kita sudah menambahkan constructor pada class Lingkaran. Perhatikan bagaimana constructor ini bekerja.

    Program 7.2

    1 class Lingkaran 2 { 3 private double jariJari; 4 5 public Lingkaran() 6 { 7 setJariJari (1); 8 } 9 10 public void setJariJari (double r) 11 { 12 if (r > 0) jariJari = r; 13 } 14 15 public double getJariJari() 16 { 17 return (jariJari); 18 } 19 20 public double hitungLuas() 21 { 22 return (Math.PI * jariJari * jariJari);

  • Pemrograman Berorientasi Objek

    - 7 -

    23 } 24 25 public double hitungKeliling() 26 { 27 return (Math.PI * 2.0 * jariJari); 28 } 29 }

    Baris 5 sampai 8 mengimplementasikan penggunaan constructor sebagai proses inisialisasi data objek. Di sini constructor berisi instruksi yang memanggil method internal setJariJari(). Kita tetap menggunakan method setJariJari() sebagai method pengubah nilai objek, hanya saja lokasi pemanggilannya dilakukan melalui constructor dan waktu eksekusinya adalah pada saat objek baru diciptakan.

    Kedua program 7.1 dan 7.2 bisa kita compile tanpa kesalahan tapi tidak bisa kita jalankan karena kode-kode tersebut hanya merupakan implementasi class. Dengan kata lain kita baru saja membuat sebuah modul bernama Lingkaran. Jika anda mencoba menjalankan kedua program ini Java akan menampilkan pesan kesalahan yang menyatakan bahwa fungsi main() tidak ada dalam file.

    Solusinya adalah kita harus membuat sebuah class lain yang berisi rutin program yaitu class dengan fungsi main(). Class baru ini memiliki karakteristik sebagai berikut:

    Dideklarasikan sebagai class public. Nama class menjadi nama file. Berisi seluruh kode class Lingkaran. [anda bisa melakukan copy-and-paste seluruh kode class

    Lingkaran untuk menghemat waktu] Program 7.3 berikut ini merupakan program lengkap yang bisa dicompile dan dijalankan. Program ini kita beri nama CobaLingkaran_1 sesuai dengan nama class utamanya: CobaLingkaran_1. Kami akan menunjukkan bagaimana 3 (tiga) buah objek bertipe lingkaran dapat dibuat sekaligus hanya dengan mendefinisikan satu class.

    Program 7.3

    1 class Lingkaran 2 { 3 private double jariJari; 4 5 public Lingkaran() 6 { 7 setJariJari (1); 8 } 9 10 public void setJariJari (double r) 11 { 12 if (r > 0) jariJari = r; 13 } 14 15 public double getJariJari() 16 { 17 return (jariJari); 18 } 19 20 public double hitungLuas() 21 { 22 return (Math.PI * jariJari * jariJari); 23 } 24 25 public double hitungKeliling() 26 { 27 return (Math.PI * 2.0 * jariJari); 28 } 29 } 30 31 public class CobaLingkaran_1 32 {

    KKaarraakktteerriissttiikk ccoonnssttrruuccttoorr:: 1. Didefinisikan public 2. Memiliki nama sama

    dengan nama class

  • Pemrograman Berorientasi Objek

    - 8 -

    33 public static void main (String[] args) 34 { 35 Lingkaran abc = new Lingkaran(); 36 Lingkaran pqr = new Lingkaran(); 37 Lingkaran xyz = new Lingkaran(); 38 39 System.out.println ("Data default :"); 40 System.out.println ("--------------"); 41 System.out.println ("Jari-jari ABC : " + abc.getJariJari()); 42 System.out.println ("Jari-jari PQR : " + pqr.getJariJari()); 43 System.out.println ("Jari-jari XYZ : " + xyz.getJariJari()); 44 System.out.println(); 45 46 abc.setJariJari (5); 47 pqr.setJariJari (3.2); 48 xyz.setJariJari (1.8); 49 50 System.out.println ("Data sekarang :"); 51 System.out.println ("---------------"); 52 System.out.println ("Jari-jari ABC : " + abc.getJariJari()); 53 System.out.println ("Jari-jari PQR : " + pqr.getJariJari()); 54 System.out.println ("Jari-jari XYZ : " + xyz.getJariJari()); 55 System.out.println(); 56 } 57 }

    Mula-mula ketiga objek lingkaran abc, pqr dan xyz memiliki data jari-jari yang sama seperti yang ditentukan melalui constructor class. Kemudian ketiga data ini kita ganti dengan nilai yang baru. Output program 7.3 diperlihatkan berikut ini:

    abc, pqr dan xyz adalah tiga objek yang berbeda sekalipun berasal dari class yang sama. Perubahan data pada salah satu objek tidak berpengaruh pada objek yang lain. Anda bisa membuat objek sebanyak yang anda inginkan. 77..33..33..22 CCoonnssttrruuccttoorr ddeennggaann PPaarraammeetteerr

    Kekurangan dari pemakaian single constructor seperti pada program 7.3 di atas adalah kita tidak bisa menentukan secara langsung nilai default jari-jari lingkaran. Setidaknya kita memerlukan dua langkah untuk melakukan setting data jari-jari sesuai yang kita kehendaki:

    Menciptakan objek, Memanggil method setJariJari().

    Sekarang kita akan meringkas dua pekerjaan ini menjadi satu: menentukan data jari-jari langsung pada saat penciptaan objek. Dalam hal ini kita akan menyisipkan parameter pada constructor, sehingga program 7.3 kita modifikasi menjadi program 7.4 berikut ini. Agar anda tidak rancu dengan program sebelumnya, program 7.4 ini kita beri nama CobaLingkaran_2.

    Program 7.4

  • Pemrograman Berorientasi Objek

    - 9 -

    1 class Lingkaran 2 { 3 private double jariJari; 4 5 public Lingkaran (double r) 6 { 7 if (r > 0) 8 jariJari = r; 9 else 10 jariJari = 1.0; 11 } 12 13 public void setJariJari (double r) 14 { 15 if (r > 0) jariJari = r; 16 } 17 18 public double getJariJari() 19 { 20 return (jariJari); 21 } 22 23 public double hitungLuas() 24 { 25 return (Math.PI * jariJari * jariJari); 26 } 27 28 public double hitungKeliling() 29 { 30 return (Math.PI * 2.0 * jariJari); 31 } 32 } 33 34 public class CobaLingkaran_2 35 { 36 public static void main (String[] args) 37 { 38 Lingkaran abc = new Lingkaran(5); 39 Lingkaran pqr = new Lingkaran(3.2); 40 Lingkaran xyz = new Lingkaran(1.8); 41 42 System.out.println ("Data default :"); 43 System.out.println ("--------------"); 44 System.out.println ("Jari-jari ABC : " + abc.getJariJari()); 45 System.out.println ("Jari-jari PQR : " + pqr.getJariJari()); 46 System.out.println ("Jari-jari XYZ : " + xyz.getJariJari()); 47 System.out.println(); 48 } 49 }

    Modifikasi constructor tampak pada baris 5-10. Dampaknya adalah bagian deklarasi objek (baris 37-39) ikut berubah karena constructor yang ada sekarang mengharuskan pengiriman data.

    77..33..33..33 MMuullttiippllee CCoonnssttrruuccttoorr

    Seakan harus memenuhi semua keinginan, kedua kondisi constructor di atas dirasakan belum bisa memenuhi keinginan user. Ada user yang ingin menggunakan constructor model pertama (single), tapi ada juga user yang lebih suka menggunakan constructor model kedua (berparameter). Kemungkinan menemui dua tipe user seperti ini menyebabkan kita perlu memasukkan beberapa model constructor ke dalam class. Dengan kata lain kita akan membuat beberapa constructor yang bisa dipilih oleh user. Semakin kompleks class yang kita buat akan semakin banyak variasi constructor yang akan terjadi. Program 7.5 berikut ini menyajikan bagaimana ide multiple-constructor diterapkan pada class Lingkaran. Program ini kita beri nama CobaLingkaran_3.

  • Pemrograman Berorientasi Objek

    - 10 -

    Program 7.5

    1 class Lingkaran 2 { 3 private double jariJari; 4 5 public Lingkaran() 6 { 7 setJariJari (1); 8 } 9 10 public Lingkaran (double r) 11 { 12 if (r > 0) 13 jariJari = r; 14 else 15 jariJari = 1.0; 16 } 17 18 public void setJariJari (double r) 19 { 20 if (r > 0) jariJari = r; 21 } 22 23 public double getJariJari() 24 { 25 return (jariJari); 26 } 27 28 public double hitungLuas() 29 { 30 return (Math.PI * jariJari * jariJari); 31 } 32 33 public double hitungKeliling() 34 { 35 return (Math.PI * 2.0 * jariJari); 36 } 37 } 38 39 public class CobaLingkaran_3 40 { 41 public static void main (String[] args) 42 { 43 Lingkaran abc = new Lingkaran(5); 44 Lingkaran pqr = new Lingkaran(3.2); 45 46 System.out.println ("Data default :"); 47 System.out.println ("--------------"); 48 System.out.println ("Jari-jari ABC : " + abc.getJariJari()); 49 System.out.println ("Jari-jari PQR : " + pqr.getJariJari()); 50 System.out.println(); 51 } 52 }

    Baris 5-8 merupakan constructor pertama: tanpa parameter. Di dalamnya kita menentukan nilai jari-jari default sama dengan satu. Kemudian pada baris 10-16 kita membuat constructor model kedua: berparameter. Baris 43 dan 44 menunjukkan bagaimana penciptaan objek dapat dilakukan dengan memanggil salah satu dari dua constructor yang ada.

    Secara tidak langsung objek abc akan diinisialisasi dengan data 1.0 karena objek ini dibuat tanpa menyertakan data awal untuk jari-jari.

    77..33..44 IInnhheerriittaannccee

    Inheritance bisa diterjemahkan secara bebas sebagai pewarisan. Yang dimaksud dengan inheritance adalah konsep dimana kita bisa membuat sebuah class baru dengan mengembangkan class yang pernah

  • Pemrograman Berorientasi Objek

    - 11 -

    dibuat sebelumnya, bisa jadi class lama tersebut dibuat oleh pihak lain. Metode OOP memungkinkan kita memperoleh seluruh data dari class induk (base-class) untuk diberikan kepada class anak (derived-class) tanpa harus melakukan copy-and-paste seluruh kode base-class. Kita ambil contoh sebagai berikut. Kita akan membuat class Silinder. Sebuah bangun geometri silinder bisa digambar sebagai berikut:

    Berdasarkan gambar tersebut kita bisa membuat bagan untuk class Silinder dengan mencantumkan seluruh data dan methodnya.

    Sekarang kita bandingkan class Lingkaran yang telah kita buat sebelum ini dengan class Silinder yang akan kita buat. Untuk memudahkan pembaca kedua class tersebut kami tampilkan berdampingan.

    Dari perbandingan tersebut kita melihat ada data dan method yang sama pada kedua class. Kita juga bisa melihat bahwa class Silinder merupakan superset dari class Lingkaran. Metode OOP mengijinkan kita untuk membuang data dan method dari class superset yang ada pada class subset-nya. Secara otomatis seluruh data dan method dari class subset disalinkan ke class superset-nya.

    Silinder

    double jariJari double tinggi

    void setJariJari (double) void setTinggi (double) double getJariJari() double getTinggi() double hitungLuas() double hitungVolume()

    Lingkaran

    double jariJari

    void setJariJari (double) double getJariJari() double hitungLuas() double hitungKeliling()

    Silinder

    double jariJari double tinggi

    void setJariJari (double) void setTinggi (double) double getJariJari() double getTinggi() double hitungLuas() double hitungVolume()

    Kedua ujung silinder memiliki bentuk lingkaran yang dihubungkan dengan suatu permukaan pada jarak tertentu. Jika jarak kedua ujung silinder kita sebut tinggi silinder (t) maka bisa kita simpulkan bahwa selain t silinder juga memiliki r, yaitu jari-jari lingkaran pada kedua ujungnya.

    t

  • Pemrograman Berorientasi Objek

    - 12 -

    Tidak semua method class Lingkaran kita hilangkan pada class Silinder. Method hitungLuas() tetap digunakan, hanya saja isinya berbeda, karena menghitung luas lingkaran tentu berbeda dengan menghitung luas silinder. Pada class Silinder kita menambahkan method hitungVolume(), karena bangun geometri silinder adalah 3-dimensi. Untuk method hitungKeliling(), meskipun pada class Silinder sudah kita buang, namun user tetap bisa menggunakannya karena method ini secara otomatis diwariskan ke class Silinder. Padahal kita tahu silinder tidak memiliki keliling. Struktur kedua class ini bisa digambarkan secara hirarki sebagai berikut, mengikuti model Unified Modelling Language (UML) dari Rumbaugh dkk:

    Program 7.6 berikut ini merupakan implementasi Java untuk class Silinder.

    Program 7.6

    1 class Silinder extends Lingkaran 2 { 3 private double tinggi; 4 5 public Silinder() 6 { 7 setJariJari (1); 8 setTinggi (1); 9 } 10 11 public Silinder (double r, double t) 12 { 13 setJariJari (r); 14 setTinggi (t); 15 } 16 17 public void setTinggi (double t) 18 { 19 if (t > 0) tinggi = t; 20 } 21

    Lingkaran

    double jariJari

    void setJariJari (double) double getJariJari() double hitungLuas() double hitungKeliling()

    Silinder

    double tinggi

    void setTinggi (double) double getTinggi() double hitungLuas() double hitungVolume()

    Lingkaran

    double jariJari

    void setJariJari (double) double getJariJari() double hitungLuas() double hitungKeliling()

    Silinder

    double tinggi

    void setTinggi (double) double getTinggi() double hitungLuas() double hitungVolume()

  • Pemrograman Berorientasi Objek

    - 13 -

    22 public double getTinggi() 23 { 24 return (tinggi); 25 } 26 27 public double hitungLuas() 28 { 29 return ( super.hitungLuas() * 2.0 + super.hitungKeliling() * tinggi ); 30 } 31 32 public double hitungKeliling() 33 { 34 return (Math.PI * 2.0 * jariJari); 35 } 36 }

    Kata kunci extends menyatakan bahwa suatu class merupakan turunan dari class lain. Pada baris 1 kita mendefinisikan class Silinder sebagai turunan dari class Lingkaran. Kemudian, constructor pada class Silinder kita buat dua buah. Pertimbangan kita adalah class ini memiliki dua buah data, jari-jari dan tinggi, sehingga data yang bisa diinisialisasi ada dua. Sebenarnya kita harus menyiapkan 4 (empat) constructor. Constructor pertama menginisialisasi data dengan nilai default. Constructor kedua menginisialisasi data jari-jari alas silinder. Constructor ketiga menginisialisasi data tinggi silinder. Constructor keempat menginisialisasi kedua data jari-jari dan tinggi silinder.

    Yang kemudian menjadi persoalan adalah constructor kedua dan ketiga memerlukan sebuah data dengan tipe sama: double. Penulisan dua constructor seperti ini Silinder (double r) inisialisasi jari-jari silinder dan Silinder (double t) inisialisasi tinggi silinder memiliki makna yang sama. Java tidak menilai dua constructor tersebut sebagai dua constructor berbeda, walaupun kita memberi nama parameter berbeda. Yang menjadi titik beratnya adalah tipe data kedua parameter di atas sama, sehingga kedua constructor tersebut dianggap hanya ada satu. Dengan alasan ini maka kita hanya membuat constructor pertama dan keempat pada class Silinder. Agar program 7.6 bisa di-compile anda harus menyisipkan seluruh kode class Lingkaran (copy-and-paste) dan meletakkannya di atas class Silinder. Selain itu program ini belum bisa dijalankan karena belum memiliki fungsi main(). Secara lengkap program 7.6 ditulis menjadi program 7.7 berikut ini.

    Program 7.7

    1 //---------------------------- 2 // Definisi class Lingkaran 3 //---------------------------- 4 class Lingkaran 5 { 6 private double jariJari; 7 8 public Lingkaran() 9 { 10 setJariJari (1); 11 } 12 13 public void setJariJari (double r) 14 { 15 if (r > 0) jariJari = r; 16 } 17 18 public double getJariJari() 19 { 20 return (jariJari); 21 } 22 23 public double hitungLuas() 24 { 25 return (Math.PI * jariJari * jariJari);

  • Pemrograman Berorientasi Objek

    - 14 -

    26 } 27 28 public double hitungKeliling() 29 { 30 return (Math.PI * 2.0 * jariJari); 31 } 32 } 33 34 //--------------------------- 35 // Definisi class Silinder 36 //--------------------------- 37 class Silinder extends Lingkaran 38 { 39 private double tinggi; 40 41 public Silinder() 42 { 43 setJariJari (1); 44 setTinggi (1); 45 } 46 47 public Silinder (double r, double t) 48 { 49 setJariJari (r); 50 setTinggi (t); 51 } 52 53 public void setTinggi (double t) 54 { 55 if (t > 0) tinggi = t; 56 } 57 58 public double getTinggi() 59 { 60 return (tinggi); 61 } 62 63 public double hitungLuas() 64 { 65 return ( super.hitungLuas() * 2.0 + super.hitungKeliling() * tinggi ); 66 } 67 68 public double hitungKeliling() 69 { 70 return (Math.PI * 2.0 * jariJari); 71 } 72 } 73 74 //------------------------ 75 // Definisi class utama 76 //------------------------ 77 public class CobaSilinder 78 { 79 public static void main (String[] args) 80 { 81 Silinder abc = new Silinder(); 82 Silinder xyz = new Silinder(23.5, 73.1); 83 84 System.out.println ("Data silinder ABC:"); 85 System.out.println ("------------------"); 86 System.out.println (" * Jari-jari : " + abc.getJariJari()); 87 System.out.println (" * Tinggi : " + abc.getTinggi()); 88 System.out.println (" * Luas : " + abc.hitungLuas()); 89 System.out.println (" * Volume : " + abc.hitungVolume()); 90 System.out.println(); 91 92 System.out.println ("Data silinder XYZ:"); 93 System.out.println ("------------------"); 94 System.out.println (" * Jari-jari : " + xyz.getJariJari()); 95 System.out.println (" * Tinggi : " + xyz.getTinggi()); 96 System.out.println (" * Luas : " + xyz.hitungLuas()); 97 System.out.println (" * Volume : " + xyz.hitungVolume()); 98 System.out.println(); 99 } 100 }

    Output program:

  • Pemrograman Berorientasi Objek

    - 15 -

    Penulisan super.hitungLuas() pada baris 65 menyatakan bahwa kita mengambil nilai method hitungLuas() yang ada di class induk. Seandainya kata super dihilangkan, maka Java akan menganggap method yang harus dipanggil ada di class Silinder. Kata super kita gunakan karena method dengan nama hitungLuas() ada di class

    Silinder dan class Lingkaran, sehingga kita harus memastikan method mana yang akan kita gunakan. Kecuali untuk tujuan rekursif, penggunaan kata kunci super akan mencegah terjadinya pemanggilan method secara rekursif yang tidak dikehendaki. Penjelasan serupa juga berlaku untuk pemanggilan super.hitungKeliling(). Lebih jauh lagi, jika anda memberikan perintah

    System.out.println (abc.hitungKeliling());

    komputer akan memberikan output

    Kita tahu bahwa benda 3-dimensi tidak memiliki keliling karena bentuk-ruangnya. Kenyataannya, kita masih bisa mengakses method untuk menghitung kelilingnya. Dalam kasus seperti ini kita harus membatasi pewarisan data atau method agar tidak bisa diakses dari luar namun tetap bisa diwariskan ke class di bawahnya. Modifikasi perlu dilakukan di class Lingkaran. [hanya ditampilkan seperlunya]

    33 protected double hitungKeliling() 34 { 35 return (Math.PI * 2.0 * jariJari); 36 }

    Kata kunci protected digunakan untuk membuat pertahanan baru dengan membatasi akses ke data atau method pada suatu class hanya untuk class turunannya saja, tidak termasuk ke bagian lain yang hanya menggunakan class tersebut. Class Lingkaran yang telah mengalami perubahan ini harus di-compile ulang, begitu juga dengan class Silinder sebagai class turunannya harus di-compile ulang. Sekarang, jika di dalam program utama kita memberikan instruksi

    System.out.println (abc.hitungKeliling());

    Maka pada saat proses compile komputer akan memberikan pesan kesalahan

    Method untuk menghitung keliling lingkaran sudah tidak bisa diakses karena method ini didefinisikan secara protected.

    KKaattaa kkuunnccii ssuuppeerr mmeerruujjuukk kkeeppaaddaa ccllaassss iinndduukk ssaattuu

    ttiinnggkkaatt ddii aattaass ccllaassss aannaakk

  • Pemrograman Berorientasi Objek

    - 16 -

    77..33..55 PPoollyymmoorrpphhiissmm

    Secara mudah polymorphism bisa disamakan dengan method-overloading, dimana di dalam sebuah class terdapat beberapa method dengan nama sama. [lihat materi function-overloading pada buku jilid 1] Sebuah method bernama tulisData() yang berfungsi menampilkan data string misalnya, tentu tidak bisa menangani masukan berupa data numerik, boolean maupun karakter; demikian juga sebaliknya. Solusi yang bisa dilakukan adalah dengan menyediakan beberapa method tulisData() yang akan menangani setiap tipe data, sehingga data apa pun yang diberikan sebagai parameter tetap bisa diproses. Perhatikan contoh berikut ini:

    Program 7.8

    1 //----------------------------- 2 // Definisi class TampilData 3 //----------------------------- 4 class TampilData 5 { 6 public void tulisData (String data) 7 { 8 System.out.println (data); 9 } 10 11 public void tulisData (int data) 12 { 13 System.out.println (data); 14 } 15 16 public void tulisData (double data) 17 { 18 System.out.println (data); 19 } 20 21 public void tulisData (char data) 22 { 23 System.out.println (data); 24 } 25 } 26 27 //------------------------ 28 // Definisi class utama 29 //------------------------ 30 public class Polymorphism 31 { 32 public static void main(String[] args) 33 { 34 TampilData xyz = new TampilData(); 35 36 System.out.print ("Cetak data STRING : "); 37 xyz.tulisData ( "STIKOM, Surabaya" ); 38 39 System.out.print ("Cetak data INTEGER : "); 40 xyz.tulisData ( 530 ); 41 42 System.out.print ("Cetak data DOUBLE : "); 43 xyz.tulisData ( 22.0 / 7.0 ); 44 45 System.out.print ("Cetak data CHAR : "); 46 xyz.tulisData ( 'R' ); 47 } 48 }

    Output program:

    Method tulisData() akan bereaksi dengan satu dari 4 (empat) macam cara tergantung dari data yang dipassing ke dalamnya. Keragaman model aksi ini disebut polymorph atau banyak-bentuk.

  • Pemrograman Berorientasi Objek

    - 17 -

    Program 7.8 juga bisa dimodifikasi sebagai berikut: [perhatikan baris 13, 18 dan 23]

    Program 7.9

    1 //----------------------------- 2 // Definisi class TampilData 3 //----------------------------- 4 class TampilData 5 { 6 public void tulisData (String data) 7 { 8 System.out.println (data); 9 } 10 11 public void tulisData (int data) 12 { 13 tulisData (Integer.toString (data)); 14 } 15 16 public void tulisData (double data) 17 { 18 tulisData (Double.toString (data)); 19 } 20 21 public void tulisData (char data) 22 { 23 tulisData (Character.toString (data)); 24 } 25 } 26 27-48 sama dengan program 7.8

    Instruksi baris 13, 18 dan 23 kita ubah dengan memanggil method tulisData() yang mengolah data string (baris 8). Di sini setiap data yang masuk diubah menjadi data string terlebih dulu baru kemudian ditampilkan ke layar. Program ini memberikan output sama seperti program 7.8 di atas. 77..44 PPaacckkaaggee

    Sejauh ini seluruh class yang kita buat harus menyatu dengan program utama [class dengan fungsi main()]. Sebuah program yang baik haruslah mampu menggunakan modul atau class dari file lain tanpa harus menyalin file tersebut ke dalam file yang sedang di-edit. Java dan beberapa bahasa pemrograman tradisional menyediakan sarana untuk melakukan hal ini. Perbedaan di antara bahasa pemrograman ini hanya pada istilah untuk menyebutkan file modul tersebut. Bahasa Basic menggunakan istilah chain, bahasa Pascal menggunakan istilah unit atau include, bahasa C/C++ menggunakan istilah header, sementara Java menggunakan istilah package. Package adalah sebuah directory yang berisi sekumpulan file .class dengan kegunaan spesifik. Berbeda dengan bahasa lain, Java mengorganisasikan package dalam bentuk directory, dimana di dalam directory ini bisa terdapat satu atau lebih file java yang telah di-compile atau dalam bentuk .class. Di dalam directory tersebut bisa juga terdapat satu atau lebih sub-directory yang memiliki file .class atau sub-directory lain. Proses pembentukan directory package tidak sama dengan pembuatan directory [atau folder] yang selama ini kita kenal. Barangkali kita terbiasa menggunakan software Windows Explorer untuk membuat directory, atau menggunakan perintah MD pada sistem operasi DOS. Class yang akan kita masukkan ke dalam package harus mencantumkan nama package di baris pertama. Secara otomatis file hasil compilenya akan dimasukkan ke dalam directory yang tidak lain nama package tersebut. Instruksi untuk meng-compile class Java menjadi package adalah

    javac d

    directory_target tidak sama dengan nama package. Opsi ini digunakan untuk mengarahkan di directory mana kita akan membuat directory baru sebagai nama package. Anda bisa melakukan setting EditPlus agar bisa meng-compile package dengan cara berikut:

  • Pemrograman Berorientasi Objek

    - 18 -

    Nama directory tidak boleh mengandung spasi atau karakter lain yang tidak valid. Di atas kita telah membuat dua class: Lingkaran dan Silinder. Sekarang kita akan membuat kedua class tersebut menjadi package agar program lain yang menggunakannya tidak menyertakan kode kedua class ini di dalamnya. Mula-mula kita akan memodifikasi class Lingkaran.

    Program 7.10

    1 package modul; 2 3 public class Lingkaran 4 { 5 private double jariJari; 6 7 public Lingkaran() 8 { 9 setJariJari (1); 10 } 11 12 public Lingkaran (double r) 13 { 14 if (r > 0) 15 jariJari = r; 16 else 17 jariJari = 1.0; 18 } 19 10 public void setJariJari (double r) 11 { 22 if (r > 0) jariJari = r; 23 } 24 25 public double getJariJari() 26 { 27 return (jariJari); 28 } 29 30 public double hitungLuas() 31 { 32 return (Math.PI * jariJari * jariJari); 33 } 34 35 public double hitungKeliling() 36 { 37 return (Math.PI * 2.0 * jariJari); 38 } 39 }

    Kata kunci package digunakan untuk menyatakan nama package yang akan kita buat. Nama package sengaja dipilih modul agar kita mudah mengingat bahwa di dalam package ini kita menyimpan modul-modul program. Anda boleh menggunakan nama lain sesuai keinginan dengan memperhatikan karakteristik pembuatan package. Tampilan berikut merupakan kondisi directory tempat kami membuat program Java di

    bab ini sebelum file package kita compile. Hal ini tentu berbeda di komputer yang anda gunakan. Perhatikan, tidak ada directory bernama modul di dalamnya.

    Perhatikan baris ini

    KKaarraakktteerriissttiikk ppaacckkaaggee:: 1. Bersifat public 2. Diawali dengan huruf

    kecil

  • Pemrograman Berorientasi Objek

    - 19 -

    Sekarang kita compile class Lingkaran yang sudah dimodifikasi menjadi package. Tampilan berikut merupakan kondisi di komputer kami setelah proses compile dilakukan.

    Sebuah directory bernama modul telah dibuat secara otomatis oleh Java. Apa isinya ?

    Ternyata file Lingkaran.class yang merupakan hasil compile dari Lingkaran.java ada di dalam directory modul, bukan di directory yang sama dengan file javanya seperti yang selama ini kita ketahui. Kita teruskan dengan melakukan modifikasi class Silinder. Beberapa hal harus kita pahami terlebih dulu:

    Class Silinder merupakan turunan dari class Lingkaran. Class Lingkaran harus sudah dicompile terlebih dulu, dan ini sudah kita lakukan. Di dalam class Silinder harus ada instruksi yang mengarahkan Java agar mengambil modul

    Lingkaran dari directory modul. Class Silinder itu sendiri harus menyertakan package modul agar hasil compile-nya disimpan di

    directory modul. Karena directory modul sudah ada sebelumnya maka penyertaan ini hanya akan menambahkan daftar file .class ke dalam directory modul, bukan membuat directory baru bernama modul.

    Berikut ini kode class Silinder yang telah mengalami modifikasi:

    Program 7.11

    1 package modul; 2 3 import modul.Lingkaran;

  • Pemrograman Berorientasi Objek

    - 20 -

    4 5 //--------------------------- 6 // Definisi class Silinder 7 //--------------------------- 8 class Silinder extends Lingkaran 9 { 10 private double tinggi; 11 12 public Silinder() 13 { 14 setJariJari (1); 15 setTinggi (1); 16 } 17 18 public Silinder (double r, double t) 19 { 20 setJariJari (r); 21 setTinggi (t); 22 } 23 24 public void setTinggi (double t) 25 { 26 if (t > 0) tinggi = t; 27 } 28 29 public double getTinggi() 30 { 31 return (tinggi); 32 } 33 34 public double hitungLuas() 35 { 36 return ( super.hitungLuas() * 2.0 + super.hitungKeliling() * tinggi ); 37 } 38 39 public double hitungKeliling() 40 { 41 return (Math.PI * 2.0 * jariJari); 42 } 43 }

    Kata kunci import digunakan untuk menyatakan bahwa file ini menggunakan modul dari suatu package. Setelah file ini di-compile kondisi directory menjadi :

    Sekarang di dalam directory modul ada dua file .class. Setiap file java yang didesain sebagai package modul akan menambah daftar file ini. Implementasi penggunaan sebuah package tidak sulit. Cukup dengan meng-import package yang dikehendaki, jadilah sudah. Berikut ini adalah contoh penggunaan class Lingkaran seperti program 7.5.

    Program 7.12

    1 import modul.Lingkaran; 2 3 public class UjiLingkaran 4 { 5 public static void main (String[] args) 6 { 7 Lingkaran abc = new Lingkaran(5); 8 Lingkaran pqr = new Lingkaran(3.2); 9 10 System.out.println ("Data default :"); 11 System.out.println ("--------------"); 12 System.out.println ("Jari-jari ABC : " + abc.getJariJari());

  • Pemrograman Berorientasi Objek

    - 21 -

    13 System.out.println ("Jari-jari PQR : " + pqr.getJariJari()); 14 System.out.println(); 15 } 16 }

    Output program:

    Penggunaan package memberikan beberapa keuntungan: 1. Program utama terlihat ramping sesuai kebutuhan. 2. Pembacaan alur program menjadi lebih terfokus. 3. Penelusuran lokasi kesalahan program lebih mudah dilakukan. 4. Waktu yang diperlukan oleh komputer untuk menyimpan kode program lebih cepat. 5. Efisiensi waktu untuk maintenance program menjadi lebih terjamin.

    77..55 CCoonnttoohh KKaassuuss

    Setelah kita mempelajari dasar-dasar OOP, pada sub bab ini kita akan menerapkan metode OOP dengan mengambil peristiwa sehari-hari. Pertama kali kita akan mendefinisikan class Penduduk, suatu class yang kita desain untuk menyatakan objek penduduk secara umum. Pada sub bab berikutnya kita akan mengembangkan class ini menjadi class yang lebih spesifik yaitu class Karyawan. Tentu kita paham bahwa seorang karyawan, selain bertindak sebagai pekerja pada suatu instansi, juga merupakan anggota masyarakat. Dengan demikian statusnya sebagai penduduk biasa tidak bisa dihilangkan. Yang terakhir, kita akan membuat class Mahasiswa yang juga merupakan pengembangan dari class Penduduk. Sama seperti karyawan, seorang mahasiswa selain bertindak sebagai pelajar suatu perguruan tinggi juga merupakan anggota masyarakat biasa, sehingga statusnya sebagai penduduk tidak bisa diabaikan. 77..55..11 CCllaassss PPeenndduudduukk

    Kita mulai pembahasan ini dengan mendefinisikan class Penduduk. Data seorang penduduk sangat banyak, ada nama, tempat lahir, tanggal lahir, jenis kelamin, pekerjaan, jumlah tanggungan, status perkawinan dan sebagainya. Pada bagian ini kita akan menggunakan beberapa data saja, yaitu nama, tanggal lahir (terdiri dari tanggal, bulan dan tahun), status dan jenis kelamin, sekedar sebagai contoh untuk menjelaskan penggunaan metode OOP dalam masalah kependudukan. Bagan class Penduduk bisa digambarkan sebagai berikut:

    Meng-compile package berbeda dengan meng-compile file program biasa

  • Pemrograman Berorientasi Objek

    - 22 -

    Kemudian kita buat listing program Java untuk class Penduduk tersebut. Class ini kita simpan ke dalam package modul seperti dua class sebelumnya.

    Program 7.13

    1 package modul; 2 3 //--------------------------- 4 // Definisi class Penduduk 5 //--------------------------- 6 public class Penduduk 7 { 8 private String nama; 9 private short tanggalLahir; 10 private short bulanLahir; 11 private int tahunLahir; 12 private char status; 13 private boolean jenisKelamin; 14 15 public Penduduk() 16 { 17 nama = "NONAME"; 18 tanggalLahir = 1; 19 bulanLahir = 1; 20 tahunLahir = 2003; 21 status = 'B'; 22 jenisKelamin = true; 23 } 24 25 private String getNama() 26 { 27 return (nama); 28 } 29 30 public String getDataLahir() 31 { 32 return ( Short.toString(tanggalLahir) + '-' + Short.toString(bulanLahir) + '-' + Integer.toString(tahunLahir) ); 33 } 34 35 public String getInfoDataLahir() 36 { 37 String s1 = Short.toString(tanggalLahir); 38 String s2 = ; 39 String s3 = Integer.toString(tahunLahir) 40 41 switch (bulanLahir) 42 { 43 case 1 : s2 = Januari; break; 44 case 2 : s2 = Februari; break; 45 case 3 : s2 = Maret; break;

    Penduduk

    String nama short tanggalLahir short bulanLahir int tahunLahir char status boolean jenisKelamin

    String getNama() String getDataLahir() String getInfoDataLahir() char getStatus() String getInfoStatus() boolean getJenisKelamin() String getInfoJenisKelamin() void setNama(String) void setDataLahir(short,short,int) void setStatus(char) void setJenisKelamin(boolean) void informasi()

  • Pemrograman Berorientasi Objek

    - 23 -

    46 case 4 : s2 = April; break; 47 case 5 : s2 = Mei; break; 48 case 6 : s2 = Juni; break; 49 case 7 : s2 = Juli; break; 50 case 8 : s2 = Agustus; break; 51 case 9 : s2 = September; break; 52 case 10 : s2 = Oktober; break; 53 case 11 : s2 = Nopember; break; 54 case 12 : s2 = Desember; 55 } 56 57 return ( s1 + + s2 + + s3 ); 58 } 59 60 public char getStatus() 61 { 62 return (status); 63 } 64 65 public char getInfoStatus() 66 { 67 String temp = ""; 68 69 switch (status) 70 { 71 case 'B' : temp = "Belum menikah"; break; 72 case 'M' : temp = "Menikah"; break; 73 case 'D' : temp = "Duda"; break; 74 case 'J' : temp = "Janda"; 75 } 76 77 return (temp); 78 } 79 80 public boolean getJenisKelamin() 81 { 82 return (jenisKelamin); 83 } 84 85 public boolean getInfoJenisKelamin() 86 { 87 if (jenisKelamin) 88 return (Laki-laki); 89 else 90 return (Perempuan); 91 } 92 93 public void setNama (String n) 94 { 95 nama = n; 96 } 97 98 public void setDataLahir (short tanggal, short bulan, int tahun) 99 { 100 tanggalLahir = tanggal; 101 bulanLahir = bulan; 102 tahunLahir = tahun; 103 } 104 105 public void setStatus (char status) 106 { 107 if ( (status == 'B') || (status == 'M') || (status == 'D') || (status == 'J') ) 108 this.status = status; 109 } 110 111 public void setJenisKelamin (boolean jenisKelamin) 112 { 113 this.jenisKelamin = jenisKelamin; 114 } 115 116 public void informasi() 117 { 118 System.out.println ("Nama : " + nama); 119 System.out.println ("DataLahir : " + getInfoDataLahir()); 120 System.out.println ("Status : " + getInfoStatus()); 121 System.out.println ("J.Kelamin : " + getInfoJenisKelamin()); 122 } 123 }

  • Pemrograman Berorientasi Objek

    - 24 -

    Untuk menguji class tersebut cobalah membuat program kecil seperti berikut ini:

    Program 7.14

    1 import modul.Penduduk; 2 3 public class UjiPenduduk 4 { 5 public static void main(String[] args) 6 { 7 Penduduk xyz = new Penduduk(); 8 9 xyz.informasi(); 10 } 11 }

    Output program:

    Coba anda ubah data-data variabel xyz tersebut lalu jalankan lagi programnya. Dengan terus berlatih insya Allah anda akan semakin memahami metode OOP ini.

    77..55..22 CCllaassss KKaarryyaawwaann

    Seorang karyawan adalah warga masyarakat yang bekerja di suatu instansi, swasta maupun negeri. Di instansi tempatnya bekerja, karyawan tersebut memiliki data-data kepegawaian, misalnya nomor induk pegawai (nip), tanggal mulai bekerja, pangkat, golongan, jabatan dan sebagainya. Kesimpulannya, ada data tambahan disamping data-data kependudukan yang sudah dimiliki. Sebagai latihan di sub bab ini kita akan menggunakan beberapa data saja, yaitu nip, tanggal-bulan-tahun mulai bekerja dan jabatan. Untuk membuat class Karyawan kita perlu melakukan inherit dari class Penduduk. Secara hirarki, keadaan class Karyawan bisa dibuat dalam bentuk bagan sebagai berikut:

  • Pemrograman Berorientasi Objek

    - 25 -

    Langkah selanjutnya adalah membuat class Karyawan dalam kode Java.

    Program 7.15

    1 package modul; 2 3 import modul.Penduduk; 4 5 //--------------------------- 6 // Definisi class Karyawan 7 //--------------------------- 8 public class Karyawan extends Penduduk 9 { 10 private String nip; 11 private short tanggalMasuk; 12 private short bulanMasuk; 13 private int tahunMasuk; 14 private String jabatan; 15 16 public Karyawan() 17 { 18 super(); 19 20 nip = "000"; 21 tanggalMasuk = 1; 22 bulanMasuk = 1; 23 tahunMasuk = 1990; 24 jabatan = "staff"; 25 } 26 27 public String getNip() 28 {

    Penduduk

    String nama short tanggalLahir short bulanLahir int tahunLahir char status boolean jenisKelamin

    String getNama() String getDataLahir() String getInfoDataLahir() char getStatus() String getInfoStatus() boolean getJenisKelamin() String getInfoJenisKelamin() void setNama(String) void setDataLahir(short,short,int) void setStatus(char) void setJenisKelamin(boolean) void informasi()

    Karyawan

    String nip short tanggalMasuk short bulanMasuk int tahunMasuk String jabatan

    String getNip() String getMasukKerja() String getInfoMasukKerja() String getJabatan() void setNip(String) void setMasukKerja(short,short,int) void setJabatan(String) void informasi()

  • Pemrograman Berorientasi Objek

    - 26 -

    29 return (nip); 30 } 31 32 public String getMasukKerja() 33 { 34 return ( Short.toString(tanggalMasuk) + '-' + Short.toString(bulanMasuk) + '-' + Integer.toString(tahunMasuk) ); 35 } 36 37 public String getInfoMasukKerja() 38 { 39 String s1 = Short.toString(tanggalMasuk); 40 String s2 = ""; 41 String s3 = Integer.toString(tahunMasuk); 42 43 switch (bulanMasuk) 44 { 45 case 1 : s2 = "Januari"; break; 46 case 2 : s2 = "Februari"; break; 47 case 3 : s2 = "Maret"; break; 48 case 4 : s2 = "April"; break; 49 case 5 : s2 = "Mei"; break; 50 case 6 : s2 = "Juni"; break; 51 case 7 : s2 = "Juli"; break; 52 case 8 : s2 = "Agustus"; break; 53 case 9 : s2 = "September"; break; 54 case 10 : s2 = "Oktober"; break; 55 case 11 : s2 = "Nopember"; break; 56 case 12 : s2 = "Desember"; 57 } 58 59 return ( s1 + ' ' + s2 + ' ' + s3 ); 60 } 61 62 public String getJabatan() 63 { 64 return (jabatan); 65 } 66 67 public void setNip (String nip) 68 { 69 this.nip = nip; 70 } 71 72 public void setMasukKerja ( short tanggal, short bulan, int tahun ) 73 { 74 tanggalMasuk = tanggal; 75 bulanMasuk = bulan; 76 tahunMasuk = tahun; 77 } 78 79 public void setJabatan (String jabatan) 80 { 81 this.jabatan = jabatan; 82 } 83 84 public void informasi() 85 { 86 super.informasi(); 87 88 System.out.println ("NIP : " + nip); 89 System.out.println ("Masuk kerja : " + getInfoMasukKerja()); 90 System.out.println ("Jabatan : " + getJabatan()); 91 } 92 }

    Contoh program untuk menguji class Karyawan:

    Program 7.16

    1 import modul.Karyawan; 2 3 public class UjiKaryawan 4 { 5 public static void main(String[] args)

  • Pemrograman Berorientasi Objek

    - 27 -

    6 { 7 Karyawan xyz = new Karyawan(); 8 9 xyz.informasi(); 10 } 11 }

    Output program:

    Method informasi() yang diwariskan oleh class Penduduk akan di-overwrite oleh class Karyawan, karena cara menampilkan informasi maupun jumlah data yang harus diinformasikan berbeda pada kedua class tersebut, namun class Karyawan boleh memanggil method informasi() dari class Penduduk pada salah satu instruksinya, seperti tampak pada baris nomor 86.

    77..55..33 CCllaassss MMaahhaassiisswwaa

    Contoh selanjutnya adalah class Mahasiswa, sebuah class yang merepresentasikan model objek mahasiswa. Sebagaimana class Karyawan, class Mahasiswa juga merupakan class inherit dari class Penduduk. Sengaja kami tampilkan dua class turunan dari class Penduduk agar anda bisa memahami bahwa sebuah class bisa diturunkan menjadi sejumlah kelas lain secara tidak terbatas. Pada saat seorang calon mahasiswa mendaftarkan diri untuk masuk ke sebuah perguruan tinggi, pihak lembaga akan menyimpan banyak data calon mahasiswa tersebut, seperti nama, alamat, tempat dan tanggal lahir, nomor telpon, tanggal-bulan-tahun mendaftar dan sebagainya. Kemudian, setelah melalui orientasi, calon mahasiswa tersebut secara resmi diangkat menjadi mahasiswa perguruan tinggi yang bersangkutan. Pada saat ini mahasiswa sudah mempunyai nomor induk mahasiswa (NIM), kode jurusan, kode program studi dan beberapa data lain yang diproses oleh lembaga pendidikan tersebut. Dari beberapa data yang tersedia, kita hanya akan menggunakan dua data yang dianggap cukup mewakili, yaitu NIM dan tanggal-bulan-tahun masuk. Bagan hirarki class Mahasiswa dihubungkan dengan class Penduduk ditunjukkan sebagai berikut:

  • Pemrograman Berorientasi Objek

    - 28 -

    Berikut ini adalah implementasi desain class Mahasiswa ke dalam kode Java.

    Program 7.17

    1 package modul; 2 3 import modul.Penduduk; 4 5 //---------------------------- 6 // Definisi class Mahasiswa 7 //---------------------------- 8 public class Mahasiswa extends Penduduk 9 { 10 private String nim; 11 private short tanggalMasuk; 12 private short bulanMasuk; 13 private int tahunMasuk; 14 15 public Mahasiswa() 16 { 17 super(); 18 19 nim = "000"; 20 tanggalMasuk = 1; 21 bulanMasuk = 8; 22 tahunMasuk = 2003; 23 } 24 25 public String getNim() 26 { 27 return (nim); 28 } 29 30 public String getMasukKuliah() 31 { 32 return ( Short.toString(tanggalMasuk) + '-' + Short.toString(bulanMasuk) + '-' + Integer.toString(tahunMasuk) ); 33 } 34 35 public String getInfoMasukKuliah() 36 { 37 String s1 = Short.toString(tanggalMasuk); 38 String s2 = ""; 39 String s3 = Integer.toString(tahunMasuk); 40 41 switch (bulanMasuk) 42 { 43 case 1 : s2 = "Januari"; break; 44 case 2 : s2 = "Februari"; break; 45 case 3 : s2 = "Maret"; break;

    Penduduk

    String nama

    dst

    String getNama()

    dst

    Mahasiswa

    String nim short tanggalMasuk short bulanMasuk int tahunMasuk

    String getNim() String getMasukKuliah() String getInfoMasukKuliah() void setNim(String) void setMasukKuliah(short,short,int) void informasi()

  • Pemrograman Berorientasi Objek

    - 29 -

    46 case 4 : s2 = "April"; break; 47 case 5 : s2 = "Mei"; break; 48 case 6 : s2 = "Juni"; break; 49 case 7 : s2 = "Juli"; break; 50 case 8 : s2 = "Agustus"; break; 51 case 9 : s2 = "September"; break; 52 case 10 : s2 = "Oktober"; break; 53 case 11 : s2 = "Nopember"; break; 54 case 12 : s2 = "Desember"; 55 } 56 57 return ( s1 + ' ' + s2 + ' ' + s3 ); 58 } 59 60 public void setNim (String nim) 61 { 62 this.nim = nim; 63 } 64 65 public void setMasukKuliah ( short tanggal, short bulan, int tahun ) 66 { 67 tanggalMasuk = tanggal; 68 bulanMasuk = bulan; 69 tahunMasuk = tahun; 70 } 71 72 public void informasi() 73 { 74 super.informasi(); 75 76 System.out.println ("NIM : " + nim); 77 System.out.println ("Masuk kuliah : " + getInfoMasukKuliah()); 78 } 79 }

    Secara keseluruhan, bagan 3 (tiga) class yang sudah kita buat ditunjukkan sebagai berikut:

    77..55..44 CCllaassss MMeennwwaa

    Contoh selanjutnya adalah class Menwa, sebuah class yang merepresentasikan model objek resimen mahasiswa. Resimen mahasiswa adalah sebuah organisasi mahasiswa yang mendidik mahasiswa agar memiliki kedisiplinan, tanggung jawab dan sifat-sifat keperwiraan ala militer, namun tetap dalam kapasitasnya sebagai mahasiswa. Class Menwa memperoleh data warisan dari class Mahasiswa, dan secara

    Penduduk

    String nama

    dst

    String getNama()

    dst

    Mahasiswa

    String nim

    dst

    String getNim()

    dst

    Karyawan

    String nip

    dst

    String getNip()

    dst

  • Pemrograman Berorientasi Objek

    - 30 -

    tidak langsung juga memperoleh data warisan dari class Penduduk. Sebagai data tambahan kita hanya menggunakan data ID yang menyatakan nomor identitas seorang anggota menwa di kesatuannya. Secara bagan hirarki, keadaan class Menwa bisa digambar sebagai berikut:

    Seperti class induk, sebuah class anak juga bisa diturunkan menjadi sejumlah class anak lagi secara tak terbatas. Class yang berada di jenjang terbawah akan mendapat warisan sejumlah besar data dari seluruh induknya tanpa harus melakukan pengetikan seluruh data tersebut. Ini sebabnya mengapa di awal bab kami katakan bahwa metode OOP menawarkan suatu teknik pembuatan dan pengembangan program aplikasi dengan cara yang mudah dan menyenangkan.

    Program 7.18

    1 package modul; 2 3 import modul.Mahasiswa; 4 5 //------------------------ 6 // Definisi class Menwa 7 //------------------------ 8 public class Menwa extends Mahasiswa 9 { 10 private String id; 11 12 public Menwa() 13 { 14 super(); 15 16 id = "000"; 17 } 18 19 public String getId() 20 { 21 return (id); 22 } 23 24 public void setId (String id) 25 { 26 this.id = id; 27 } 28 29 public void informasi() 30 { 31 super.informasi();

    Penduduk

    String nama dst

    String getNama() dst

    Mahasiswa

    String nim dst

    String getNim() dst

    Karyawan

    String nip dst

    String getNip() dst

    Menwa

    String id

    String getId() void setId(String) void informasi()

  • Pemrograman Berorientasi Objek

    - 31 -

    32 33 System.out.println ("ID : " + id); 34 } 35 }

    Setelah seluruh class di-compile sesuai dengan urutan pembuatannya, maka anda akan melihat seluruh file class di dalam sebuah directory modul. Berikut ini merupakan contoh tampilan directory modul di komputer kami.

  • Pemrograman Berorientasi Objek

    - 32 -

    Halaman ini sengaja dikosongkan