Wednesday, February 24, 2010

Tiga pilar dasar dalam Java - Inheritance, Polimorphism, Encapsulation

Bagi yang mereka yang baru mempelajari Java yang merupakan bahasa pemrograman berorientasi objek termasuk saya, pastinya akan selalu menghadapi kesulitan dalam perubahan paradigma pemrograman. Adapun perubahan itu adalah dari pradigma prosedural menuju paradigma permograman objek. Perubahan yang sangat berpengaruh terhadap pola pikir dan algoritma dalam menyusun sebuah program ataupun aplikasi. Terlihat sepele namun sebenarnya disinilah perjuangan sesungguhnya. Sebelumnya, programmer hanya menyusun program yang terdiri dari baris-baris instruksi dengan dukungan modul-modul tambahan. Program dieksekusi secara baris per baris walaupun tetap memungkinkan untuk melakukan lompatan-lompatan ke baris-baris tertentu. Namun masalah sebenarnya terjadi saat pengembangan program tersebut.

Dalam bahasa pemrograman yang berorientasi objek khususnya Java, penulisan program tak hanya mengacu pada runtutan instruksi. Inti dari program dipecah-pecah menjadi lebih sederhana dalam bentuk kelas-kelas. Kelas ini merepresentasikan sebuah struktur baru penyelesaian masalah pemrograman dimana fungsi-fungsi khusus dari program dibebankan kepadanya. Kelas inilah yang nantinya dibangun oleh Java menjadi objek.
Objek merepresentasikan suatu entitas selayaknya sebuah benda dalam dunia nyata. Sebagai contoh, dalam suatu sistem perkuliahan tentunya terdapat banyak entitas-entitas yang memiliki fungsi serta karakteristik tersendiri seperti mahasiswa, dosen, dan yang lainnya. Seperti itulah objek dalam Java dibuat. Objek memiliki karakteristik serta fungsinya tersendiri yang telah digambarkan sebelumnya oleh kelas dimana ia berasal. Kelas menyederhanakan suatu objek dengan membentuk struktur karakteristik serta fungsi-fungsi yang dimiliki objek tersebut. Misalkan seorang mahasiswa memiliki karakteristik pembeda seperti nama dan npm yang menjadi identitas unik mereka, serta memiliki fungsi atau tugas untuk belajar, bersosialisasi dan lain sebagainya.

Dalam Java karakteristik yang dimiliki oleh kelas disebut dengan atribut, dan fungsinya disebut sebagai method. Kelas dalam java dapat menurunkan sifat-sifatnya ke kelas lain (inheritance), menyembunyikan kompleksitas struktur internalnya (encapsulation), serta memiliki banyak bentuk yang berbeda (polymorphism). Tiga konsep inilah yang menjadi pilar dalam Java.


A.    Inheritance

Inheritance atau pewarisan, memungkinkan programmer untuk menurunkan sifat-sifat serta fungsi-fungsi dari suatu kelas ke kelas lain. Kelas asal disebut juga superclass dan kelas turunannya disebut sebagai subclass. Atribut-atribut serta method yang dimiliki oleh superclass akan diwariskan ke subclass, sehingga programmer hanya perlu menuliskan kode-kode program sekali saja pada superclass dan mempermudah dalam pengembangan aplikasi.
Untuk mendapatkan turunan dari superclass, kita dapat menggunakan kata kunci extend. Untuk mempermudah mari kita lihat contoh program dibawah ini,

public class Mobil {
    // cunstructor dari kelas Mobil
    public Mobil() {
        System.out.println(“cunstructor kelas Mobil..”);
    }
    // atribut dari kelas Mobil
    private String tipeMobil;
    private String warna;
    // method dari kelas Mobil
    public void hidupkan() {
        System.out.println(“mesin mobil dihidupkan..”);
    }
    public void gas() {
       System.out.println(“mobil melaju…”);
    }
    public void rem() {
       System.out.println(“mobil melambat..”);
    }
    public void matikan() {
       System.out.println(“mesin mobil dimatikan..”);
    }
}


Kemudian kita buat kelas lain yaitu kelas Sedan. Karena Sedan masih merupakan salah satu jenis dari Mobil, maka kita tak perlu menuliskan kembali method dan atribut yang kiranya umum dimiliki mobil. Kita hanya perlu menurunkan kelas Sedan dari kelas Mobil dengan menggunakan kata kunci extend. Sebagai contoh,

public class Sedan extend Mobil {
    // constructor dari kelas Sedan
    public Sedan() {
        System.out.println(“constructor dari Sedan”);
    }
    // kode lain yang dibutuhkan
}


Walaupun deklarasi kelas Sedan hanya sesederhana itu, namun sebenarnya Sedan secara otomatis telah memiliki method dari kelas Mobil seperti method gas, rem, matikan, dan hidupkan. Serta atribut seperti tipe dan warna. Sebagai contoh, kita buat kelas baru untuk mengimplementasikan hasil pewarisan tadi.

public class inheritanceMobil {
    public void main (String []args) {
        Mobil mobil = new Mobil();
        Sedan sedan = new Sedan();
        System.out.println(“panggil method gas dan rem milik mobil”);
        mobil.gas();
        mobil.rem();
        System.out.println(“panggil method gas dan rem milik sedan hasil pewarisan”);
        sedan.gas();
        sedan.rem();
    }
}


Kemudian compile dan jalankan kelas polimorfismeMobil, maka kita akan mendapatkan output sebagai berikut :

cunstructor kelas Mobil..
cunstructor kelas Sedan..
panggil method gas dan rem milik mobil
mobil melaju…
mobil melambat…
panggil method gas dan rem milik sedan hasil pewarisan
mobil melaju…
mobil melambat…


Dari output diatas terlihat bahwa secara implisit, kelas Sedan telah memiliki method rem dan gas seperti halnya kelas Mobil. Method tersebut didapatnya dari hasil pewarisan dari kelas Mobil.


B.    Polimorfisme
Polimorfisme memungkinkan sebuah kelas untuk memiliki banyak bentuk yang berbeda. Maksudnya dengan satu method yang sama, kita bisa mendapatkan fungsi yang berbeda. Untuk mempermudah, kita ambil contoh dari kelas Mobil dan Sedan sebelumnya. Misalkan pada kelas Sedan, kita tambahkan method gas dan rem tersendiri yang memiliki fungsi berbeda dari kelas Mobil.

public class Sedan extend Mobil {
    // constructor dari kelas Sedan
    public Sedan() {
        System.out.println(“constructor dari Sedan”);
    }
    // method gas sendiri yang dimiliki oleh kelas Sedan
    public void gas() {
       System.out.println(“mobil Sedan melaju cepat…”);
    }
    public void rem() {
       System.out.println(“mobil Sedan melambat..”);
    }
}


Kemudian untuk membuktikan perbedaan fungsinya, kita membuat satu kelas lagi untuk mengimplementasikan kedua kelas tersebut.

public class polimorfismeMobil {
    public static void main (String []args) {
        Mobil mobil = new Mobil();
        Sedan sedan = new Sedan();
        System.out.println(“panggil method gas dan rem milik mobil”);
        mobil.gas();
        mobil.rem();
        System.out.println(“panggil method gas dan rem milik sedan”);
        sedan.gas();
        sedan.rem();
    }
}


Kemudian compile dan jalankan kelas polimorfismeMobil, maka kita akan mendapatkan output sebagai berikut :

cunstructor kelas Mobil..
cunstructor kelas Sedan..
panggil method gas dan rem milik mobil
mobil melaju…
mobil melambat…
panggil method gas dan rem milik sedan
mobil Sedan melaju cepat…
mobil Sedan melambat…


terlihat bahwa output dari method gas dan rem milik kelas Mobil dan Sedan berbeda. Method gas dan rem milik Sedan akan mengacu pada kelas Sedan itu sendiri walaupun sebenarnya kelas Sedan telah diwarisi method gas dan rem milik kelas Mobil. Inilah yang dinamakan polimorfisme. Polimorfisme mengubah sifat menurut objek sesuai acuan dan secara otomatis akan menjalankan method yang tepat dari objek yang menjadi acuan tersebut.

C.    Encapsulation
Inti dari konsep encapsulation adalah menyembunyikan kompleksitas suatu kelas dari kelas lain yang mengaksesnya. Sebagai contoh, kita ambil kelas Mobil dan memodifikasinya untuk mengimplementasikan encapsulation.

public class Mobil {
    // cunstructor dari kelas Mobil
    public Mobil() {
        System.out.println(“cunstructor kelas Mobil..”);
    }
    // atribut dari kelas Mobil
    private String tipeMobil;
    private String warna;
   /************************************
    *  method dari kelas Mobil sebelumnya
    ***********************************/
    // method accessor kelas Mobil
    public String getTipeMobil() {
       return tipeMobil;
    }
    public String getWarna() {
       return warna;
    }
   // method mutator kelas mobil
    public void setTipeMobil (String tipeMobil) {
        this.tipeMobil = tipeMobil;
    }
    public void setWarna (String warna) {
       this.warna = warna;
    }
}


Perhatikan bahwa atribut dari tipeMobil dan warna memiliki access modifier private yang berarti bahwa atribut tersebut tidak dapat diakses dari kelas manapun selain kelas Mobil. Namun atribut masih tetap dapat dipakai dengan menggunakan accessor dan mutator method. Inilah contoh sederhana dalam menyembunyikan informasi suatu kelas dari kelas lain atas dasar penyederhanaan kompleksitas pemrograman. Kelas lain tidak perlu tahu kompleksitas desain dan struktur dari suatu kelas yang menjadi internal fungsi dari kelas tesebut, namun tetap bisa mendapatkan informasi yang diperlukan.

1 comment: