PEMROGRAMAN BERORIENTASI OBJEK
Pengantar
Pemrograman Berorientasi Objek sebenarnya bukanlah bahasa pemrograman
baru, tetapi jalan baru untuk berpikir dan merancang aplikasi yang
dapat membantu memecahkan persoalan mengenai pengembangan perangkat
lunak. Pemrograman berorientasi objek disusun dan dipahami oleh ilmuwan
yang memandang dunia sebagai populasi objek yang berinteraksi dengan
yang lain. Prosedur yang digunakan dalam objek dipandang sebagai
kepentingan kedua karena tergantung pada objek itu sendiri.
Tentunya hal tersebut berbeda dengan pemrograman terstruktur.
Pemrograman terstruktur mempunyai sifat pemisahan data dengan kode yang
mengolahnya.
Pemrograman Berorientasi Objek (PBO) adalah metode pemrograman yang
meniru cara kita memperlakukan sesuatu (benda). Ada tiga karakteristik
bahasa Pemrograman Berorientasi Objek, yaitu :
1. Pengkapsulan (Encapsulation) : mengkombinasikan suatu struktur dengan fungsi yang memanipulasinya untuk membentuk tipe data baru yaitu kelas (class).
2. Pewarisan (Inheritance) : mendefinisikan suatu kelas dan
kemudian menggunakannya untuk membangun hirarki kelas turunan, yang mana
masing-masing turunan mewarisi semua akses kode maupun data kelas
dasarnya.
3. Polimorphisme (Polymorphism) : memberikan satu aksi untuk
satu nama yang dipakai bersama pada satu hirarki kelas, yang mana
masing-masing kelas hirarki menerapkan cara yang sesuai dengan dirinya.
Pengkapsulan (Encapsulation)
Salah satu keistimewaan C++ adalah pengkapsulan. Pengkapsulan adalah
mengkombinasikan suatu struktur dengan fungsi yang memanipulasinya untuk
membentuk tipe data baru yaitu kelas (class).
Kelas akan menutup rapat baik data maupun kode. Akses item di dalam
kelas dikendalikan. Pengendalian ini tidak hanya berupa data tetapi juga
kode. Saat kelas akan digunakan, kelas harus sudah dideklarasikan. Yang
penting, pemakai kelas mengetahui deskripsi kelas, tetapi bukan
implementasinya. Bagi pemakai, detail internal kelas tidak penting.
Konsep ini disebut penyembunyian informasi (information hiding).
Untuk menggunakan kelas, kita perlu mengetahui sesuatu tentangnya.
Kita perlu mengetahui fungsi apa yang bisa digunakan dan data apa saja
yang dapat diakses. Fungsi yang dapat digunakan dan data yang dapat
diakses disebut antarmuka pemakai (user interface). Antarmuka pemakai
menceritakan bagaimana kelas berperilaku, bukan bagaimana kelas dibuat.
Kita tidak perlu mengetahui implementasi kelas. Sekali kelas dibuat,
kita bisa memakainya berulang-ulang. Bagi pandangan pemakai, kelas
adalah kotak hitam dengan perilaku tertentu.
Kendali Akses terhadap Kelas
Tugas kelas adalah untuk menyembunyikan informasi yang tidak diperlukan oleh pemakai. Ada tiga macam pemakai kelas:
1. kelas itu sendiri
2. pemakai umum
3. kelas turunan
Setiap macam pemakai mempunyai hak aksesnya masing-masing. Hak akses
ini ditandai dengan kenampakan anggota kelas. Kelas pada C++ menawarkan
tiga aras kenampakan anggota kelas (baik anggota data maupun fungsi
anggota):
1. private
Anggota kelas private mempunyai kendali akses yang paling ketat.
Dalam bagian private, hanya fungsi anggota dari kelas itu yang dapat
mengakses anggota private atau kelas yang dideklarasikan sebagai teman
(friend).
2. public
Dalam bagian public, anggotanya dapat diakses oleh fungsi anggota
kelas itu sendiri, instance kelas, fungsi anggota kelas turunan. Suatu
kelas agar bisa diakses dari luar kelas, misalnya dalam fungsi main(),
perlu mempunyai hak akses publik. Hak akses ini yang biasanya digunakan
sebagai perantara antara kelas dengan dunia luar.
3. protected
Suatu kelas dapat dibuat berdasarkan kelas lain. Kelas baru ini
mewarisi sifat-sifat dari kelas dasarnya. Dengan cara ini bisa dibentuk
kelas turunan dari beberapa tingkat kelas dasar. Bila pada kelas dasar
mempunyai anggota dengan hak akses terproteksi, maka anggota kelas ini
akan dapat juga diakses oleh kelas turunannya. Anggota kelas terproteksi
dibentuk dengan didahului kata kunci protected. Pada bagian protected,
hanya fungsi anggota dari kelas dan kelas-kelas turunannya yang dapat
mengakses anggota.
Pewarisan (Inheritance)
Suatu kelas dapat diciptakan berdasarkan kelas lain. Kelas baru ini mempunyai sifat-sifat yang sama dengan kelas pembentuknya, ditambah sifat-sifat khusus lainnya. Dengan pewarisan kita dapat menciptakan kelas baru yang mempunyai sifat sama dengan kelas lain tanpa harus menulis ulang bagian-bagian yang sama. Pewarisan merupakan unsur penting dalam pemrograman berorientasi objek dan merupakan blok bangunan dasar pertama penggunaan kode ulang (code reuse). Jika tidak ada fasilitas pewarisan ini, maka pemrograman dalam C++ akan tidak banyak berbeda dengan pemrograman C, hanya perbedaan dalam pengkapsulan saja yang menggunakan kelas sebagai pengganti struktur. Yang perlu menjadi catatan di sini adalah bahwa data dan fungsi yang dapat diwariskan hanya yang bersifat public dan protected. Untuk data dan fungsi private tetap tidak dapat diwariskan. Hal ini disebabkan sifat protected yang hanya dapat diakses dari dalam kelas saja.
Sifat pewarisan ini menyebabkan kelas-kelas dalam pemrograman berorientasi objek membentuk hirarki kelas mulai dari kelas dasar, kelas turunan pertama, kelas turunan kedua dan seterusnya. Sebagai gambaran misalnya ada hirarki kelas unggas.
Sebagai kelas dasar adalah Unggas. Salah satu sifat Unggas adalah
bertelur dan bersayap. Kelas turunan pertama adalah Ayam, Burung dan
Bebek. Tiga kelas turunan ini mewarisi sifat kelas dasar Unggas yaitu
bertelur dan bersayap. Selain mewarisi sifat kelas dasar, masing-masing
kelas turunan mempunyai sifat khusus, Ayam berkokok, Burung terbang dan
Bebek berenang. Kelas Ayam punya kelas turunan yaitu Ayam Kampung dan
Ayam Hutan. Dua kelas ini mewarisi sifat kelas Ayam yang berkokok.
Tetapi dua kelas ini juga punya sifat yang berbeda, yaitu: Ayam Kampung
berkokok panjang halus sedangkan Ayam hutan berkokok pendek dan kasar.
Jika hirarki kelas Unggas diimplementasikan dalam bentuk program, maka
secara sederhana dapat ditulis sebagai berikut:
Dapat dilihat, bahwa kelas Ayam dan kelas Bebek dapat menjalankan
fungsi Bertelur() yang ada dalam kelas Unggas meskipun fungsi ini bukan
merupakan anggota kelas Ayam dan kelas Bebek. Kelas AyamKampung dapat
menjalankan fungsi Berkokok() yang ada dalam kelas Ayam walaupun dua
fungsi tersebut bukan merupakan anggota kelas AyamKampung. Sifat-sifat
di atas yang disebut dengan pewarisan (inheritance).
Polimorfisme
Polimorfisme merupakan fitur pemrograman berorientasi objek yang
penting setelah pengkapsulan dan pewarisan. Polimorfisme berasal dari
bahasa Yunani, poly (banyak) dan morphos (bentuk).
Polimorfisme menggambarkan kemampuan kode C++ berperilaku berbeda
tergantung situasi pada waktu run (program berjalan).
Konstruksi ini memungkinkan untuk mengadakan ikatan dinamis (juga
disebut ikatan tunda, atau ikatan akhir). Kalau fungsi-fungsi dari
suatu kelas dasar didefinisikan ulang atau ditindih pada kelas turunan,
maka objek-objek yang dihasilkan hirarki kelas berupa objek polimorfik.
Polimorfik artinya mempunyai banyak bentuk atau punya kemampuan untuk
mendefinisi banyak bentuk. Perhatikan kelas sederhana berikut :
Kelas TX berisi fungsi FA dan FB, dimana fungsi FB memanggil fungsi
FA. Kelas TY, yang merupakan turunan dari kelas TX, mewarisi fungsi FB,
tetapi mendefinisikan kembali fungsi FA. Yang perlu diperhatikan di sini
adalah fungsi TX::FB yang memanggil fungsi TY::FA dalam konteks
perilaku polimorfisme. Berapakah output dari program ini? Jawabnya
adalah 4.5 dan bukan 13.5! Mengapa? Jawabannya adalah karena kompiler
memecahkan ungkapan Y.FB(3) dengan menggunakan fungsi warisan TX::B,
yang akan memanggil fungsi TX::FA. Oleh karena itu fungsi TY::FA
ditinggalkan dan tidak terjadi perilaku polimorfisme. C++ menetapkan
persoalan ini dan mendukung perilaku polimorfisme dengan menggunakan
fungsi virtual. Fungsi virtual, yang mengikat kode pada saat runtime,
dideklarasikan dengan menempatkan kata kunci virtual sebelum tipe hasil
fungsi. Untuk program di atas, kode double FA(double p) tulis menjadi
virtual double FA(double p) baik di kelas TX maupun yang ada di kelas
TY. Dengan perubahan ini maka output dari program di atas menjadi 13.5.
Fungsi dari adanya polymorpishm adalah untuk mendapatkan metode yang
sama dengan perilaku yang berbeda-beda dari class. Hirarki dari class
secara abstrak mendefinisikan data utama dan kemampuan tingkah laku dari
sebuah keluarga class, sehingga setiap anggota dari keluarga class
memiliki kemampuan utama dan semua object dalam keluarga class dapat
merespon terhadap metode.
Mekanisme dari polymorpishm ialah :
1. Murni dengan bahasa OOP, smalltalk semua object merupakan bagian yang sama dari hirarki object.
2. C++ sebagai hybrid bahasa OOP, membutuhkan pointer ke supeclass
object (sebuah pointer dari superclass dapat menunjuk langsung ke
subclass tanpa seleksi).
Metode polymorpishm pada C++ :
1. Superclass mendefinisikan metode yang virtual (polymorpic).
2. Subclass dapat mendefinisikan sendiri versi mereka tentang virtual metodenya.
Virtual metode di deklarasikan superclass dan virtual keywordnya digunakan sebelum mendeklarasikan superclass metodenya.
Contoh :
{ virtual int draw (); // virtual keyword dibutuhkan ;
Pada definisi yang terpisah virtual keyword tidak digunakan .
Contoh :
{ virtual int draw (); // virtual keyword tidak dibutuhkan ;
Sekali superclass virtual maka semua subclass menjadi virtual.
Untuk mendukung polymorpishm C++ menggunakan pointer. Pointer dari
superclass dapat digunakan untuk menunjuk subclass tanpa seleksi, hal
ini dikarenakan subclass merupakan bagian dari superclass. Sedangkan
pointer dari subclass tidak dapat menunjuk langsung ke superclass
karena superclass merupakan supertype dari subtype.
Untuk virtual methode ini dalam C++ ada beberapa aturan antara lain :
1. Virtual metode dapat dibuat static, karena virtual metode merupakan
milik semua object dan tidak dapat menjadi bagian class secra
keseluruhan.
2. Menggunakan virtual keyword pada deklarasi virtual metode, pada
superclass harus menggunakan virtual keyword dalam deklarasinya
sedangkan subclass dapat menggunakan atau tidak dan virtual keyword
tidak digunakan dalam definisi terpisah dari virtual metode.