Menu Horisontal

Selasa, 03 Juli 2012

Mencoba Mengerti OOP


Pemrograman berorientasi objek atau Object Oriented Programming (OOP) menjadi sebuah fenomena yang mempunyai dampak sangat besar di dunia komputasi, terlebih setelah munculnya Java sebagai bahasa pemrograman yang mengimplementasikan konsep ini secara penuh. Artinya, di Java, segala sesuatu yang menyusun aplikasi terdiri atas kumpulan objek. Tidak ada satu komponenpun di Java yang dapat berjalan tanpa melibatkan objek. Ini berbeda dengan beberapa bahasa lain yang sebenarnya berkonsep prosedural, tapi menyelipkan konsep OOP di dalamnya. Beberapa persepsi yang tidak tepat tentang OOP, antara lain:
  • Menyebut hasil kompilasi dengan sebutan object, kemudian menyebut bahasa tersebut sebagai OOP
  • Menganggap event-driven programming adalah OOP, misalnya seperti yang ada di VB.
Melalui artikel ini, saya mencoba untuk menggambarkan secara sederhana seperti apakah konsep OOP tersebut dan memberi contoh implementasinya dalam bahasa Java. Jika Anda belum familiar dengan Java, artikel “Belajar Java, mulai dari mana” mungkin bisa membantu.
Di dalam OOP, komponen pembangun aplikasi adalah class dan object. Secara sederhana, class dapat digambarkan sebagai cetakan, dan object adalah sesuatu yang dihasilkan dari cetakan tersebut. Contohnya, bila kita mempunyai cetakan (class) Mobil, maka kita bisa membuat object mobil sebanyak yang kita mau. Ada 2 komponen penting dalam sebuah class, property (sifat) dan method (behavior/kelakuan). Object yang dibuat dari class tertentu akan memiliki sifat dan kelakuan sesuai dengan yang didefinisikan di class tersebut.
01package suhearie.blog.oop;
02 
03public class Mobil {
04 
05    private String model;
06 
07    private int kecepatan;
08 
09    private int bahanBakar;
10 
11    public Mobil(String model) {
12        this.model = model;
13    }
14 
15    public void maju() {
16        kecepatan = 5;
17    }
18 
19    public void berhenti() {
20        kecepatan = 0;
21    }
22 
23    public static void main(String[] args) {
24        Mobil myCivic = new Mobil("Civic");
25        Mobil myCamry = new Mobil("Camry");
26    }
27 
28}
Pada contoh di atas, class Mobil memiliki property model dengan tipe data String dan propertykecepatan dengan tipe data integer. Property-property ini yang akan menentukan karakteristik atau sifat dari object tersebut, apa modelnya, berapa kecepatannya, dan berapabahanBakarnya saat ini. Selain itu, class mobil juga mempunyai method untuk menyuruh mobil tersebut maju dan menyuruhnya berhenti.
Satu blok kode yang spesial dari sebuah class adalah constructor. Constructor dideklarasikan dengan tanpa return value, dan namanya harus sama persis dengan nama classnya. Kita akan memanggil constructor ini ketika akan membuat sebuah object baru dari class tersebut. Di Java, bila kita tidak mendeklarasikan satupun constructor, compiler akan secara otomatis menambahkan default constructor.
Method public static void main (String[] args) adalah entry point aplikasi Java. Di dalam method tersebut kita membuat 2 buah object dari class Mobil. Satu object kita beri nama myCivic yang kedua kita beri nama myCamry. Dua object tersebut adalah object yang berbeda, tidak terkait satu sama lain. Kita dapat menyuruh myCivic untuk maju, sementara myCamry masih diam di tempat.
Object berinteraksi dengan object lainnya dengan mengakses property nya atau memanggil method yang telah didefinisikan di class tersebut.
Ada 4 konsep yang sangat berkaitan dengan OOP. Mereka adalah Encapsulation, Inheritance, Abstraction, dan Polymorphism. Kita akan menjelajahi keempat hal tersebut dengan detail pada bagian berikut.
1. Encapsulation
Encapsulation berarti membungkus informasi atau data ke dalam sebuah object. Di dalam OOP, kita akan selalu mengakses data melalui object. Tidak ada data yang tersebar disana-sini diluar object. Konsep ini dipertegas dengan adanya penentu akses (access modifier) pada deklarasi property dan method.
Pada contoh di atas, property model dan kecepatan dideklarasikan dengan akses private, yang berarti property ini tidak dapat diakses secara langsung oleh object lain. Selain private, Java menyediakan penentu akses lainnya (dengan urutan yang semakin “terbuka”) yaitu default(tanpa modifier), protected dan public. Penentu akses public membuat property akan dapat diakses secara langsung dari semua object yang lain. Hal ini sangat tidak dianjurkan karena object lain dapat mengubah isi dari property tersebut, dan membuat object target menjadi tidak konsisten. Bayangkan bila property bahanBakar bisa langsung diubah dari class lain menjadi -10 (minus sepuluh), keadaan object mobil tersebut tentunya menjadi tidak logis.
2. Inheritance
Di dalam OOP, kita bisa membuat sebuah class dengan meng-extend class lain sehingga class baru tersebut mewarisi property dan method dari class yang di-extend atau bisa disebut parent class.
01package suhearie.blog.oop;
02 
03class Orang {
04 
05    protected String nama;
06 
07    protected String umur;
08 
09    public void makan() {
10        System.out.println("Saya sedang makan");
11    }
12 
13    public void minum() {
14        System.out.println("Saya sedang minum");
15    }
16 
17    public void tidur() {
18        System.out.println("Saya sedang tidur");
19    }
20}
21 
22class Bayi extends Orang {
23 
24    public void menangis() {
25        System.out.println("Huahuahua");
26    }
27}
28 
29class Karyawan extends Orang {
30 
31    public void bekerja() {
32        System.out.println("Sibuk nih");
33    }
34}
Class Bayi dan class Karyawan dideklarasikan dengan meng-extend class Orang, dimana class Orang tersebut sudah memiliki beberapa property dan method. Dengan demikian, class Bayi mewarisi mewarisi semua property dan method yang dideklarasikan di class Orang, kemudian menambahkan satu method menangis. Begitu juga dengan class Karyawan yang menambahkan method bekerja.
01public static void main(String[] args) {
02 
03    Bayi bayi = new Bayi();
04    bayi.makan();
05    bayi.menangis();
06 
07    Karyawan karyawan = new Karyawan();
08    karyawan.minum();
09    karyawan.bekerja();
10}
Jadi, karena Bayi dan Karyawan mewarisi method-method yang udah kita declare di class Orang, kita tidak perlu menulis ulang method-method tersebut, secara otomatis Bayi dan Karyawan juga bisa makan, minum, dan tidur.
Tujuannya adalah supaya kita tidak perlu rewrite apa yang bisa di reuse. Apa keuntungan reuse dibanding rewrite ?
Kalau rewrite, kita harus copy paste ke semua class. Kemudian kalau suatu saat kita harus mengubah isi method itu, maka harus mengubah di tiga tempat (Orang, Bayi, dan Karyawan). Kalau reuse, cukup deklarasikan satu kali, kemudian jika ingin mengubah cukup ubah di satu tempat.
3. Abstraction
Abstraction merupakan konsep generalisasi dari beberapa komponen yang sejenis, dan biasanya dilakukan dengan pemisahan antara spesifikasi dan implementasi.
1package suhearie.blog.oop.abstraction;
2 
3public interface Televisi {
4 
5    public void nyalakan();
6 
7    public void matikan();
8 
9}
01public class TelevisiA implements Televisi {
02 
03    public void nyalakan() {
04        System.out.println("1");
05        System.out.println("2");
06        System.out.println("3");
07        System.out.println("Televisi A menyala");
08    }
09 
10    public void matikan() {
11        System.out.println("3");
12        System.out.println("2");
13        System.out.println("1");
14        System.out.println("Televisi A mati");
15    }
16}
01public class TelevisiB implements Televisi {
02 
03    public void nyalakan() {
04        System.out.println("Televisi B langsung menyala");
05    }
06 
07    public void matikan() {
08        System.out.println("Televisi B langsung mati");
09    }
10}
01public class RemoteControl {
02 
03    public static void main(String[] args) {
04        Televisi myTV = null;
05 
06        // kendalikan Televisi A
07        myTV = new TelevisiA();
08        myTV.nyalakan();
09        myTV.matikan();
10 
11        // kendalikan Televisi B
12        myTV = new TelevisiB();
13        myTV.nyalakan();
14        myTV.matikan();
15    }
16 
17}
Di atas telah dibuat sebuah interface Televisi yang mendefinisikan bahwa sebuah televisi bisa dinyalakan dan dimatikan. Interface hanya menentukan spesifikasi tanpa menyebutkan implementasinya. Class TelevisiA dan TelevisiB merupakan implementasi dari spesifikasi tersebut. Kedua class ini mengimplementasikan method nyalakan dan matikan dengan cara yang berbeda. TelevisiA menghitung 1,2,3 terlebih dahulu sebelum menyala dan sebelum mati, sementara TelevisiB langsung menyala dan langsung mati.
Class RemoteControl mencoba mengendalikan kedua televisi ini dengan mengandalkan spesifikasi yang ada. Tentunya TelevisiA dan TelevisiB berhasil dikendalikan dari remote control, meskipun implementasinya bisa berbeda.
4. Polymorphism
Polymorphism dapat diterjemahkan secara bebas mejadi”banyak bentuk”. Dalam OOP, kita bisa mendefinisikan sebuah class yang meng-extend class lain dan meng-override atau mengimplementasi ulang isi sebuah method.
01class Orang {
02    protected String nama;
03 
04    protected String umur;
05 
06    public void makan() {
07        System.out.println("Saya sedang makan");
08    }
09 
10    public void minum() {
11        System.out.println("Saya sedang minum");
12    }
13 
14    public void tidur() {
15        System.out.println("Saya sedang tidur");
16    }
17 
18    public static void main(String[] args) {
19        Orang orang = new Bayi();
20        orang.makan();
21 
22        orang = new Karyawan();
23        orang.makan();
24    }
25}
01class Bayi extends Orang {
02 
03    public void menangis() {
04        System.out.println("Huahuahua");
05    }
06 
07    public void makan() {
08        System.out.println("Bayi makan bubur");
09    }
10}
01class Karyawan extends Orang {
02 
03    public void bekerja() {
04        System.out.println("Sibuk nih");
05    }
06 
07    public void makan() {
08        System.out.println("Karyawan makan pizza");
09    }
10}
Pemanggilan orang.makan() pada object bayi dan karyawan akan menghasilkan output yang berbeda karena pada saat runtime, Java akan mengeksekusi implementasi aktual dari masing-masing object.

Tidak ada komentar: