Pemrograman berorientasi objek diciptakan untuk mempermudah pengembangan program dengan cara mengikuti model yang telah ada dalam kehidupan nyata. Dalam paradigma ini, sesuai dengan model kehidupan nyata, segala bagian (entiti) dari suatu permasalahan adalah objek. Objek-objek ini kemudian juga dapat berupa gabungan dari beberapa objek yang lebih kecil. Sebagai contoh, tengoklah sebuah mobil. Mobil adalah sebuah objek dalam kehidupan nyata. Namun mobil sendiri terbentuk dari beberapa objek yang lebih kecil seperti roda ban, mesin, jok, dll. Mobil sebagai objek yang merupakan gabungan dari objek yang lebih kecil dibentuk dengan membentuk hubungan antara objek-objek penyusunnya. Begitu juga dengan sebuah program. Objek besar dapat dibentuk dengan menggabungkan beberapa objek-objek dalam bahasa pemrograman. Objek-objek tersebut berkomunikasi dengan saling mengirim pesan kepada objek lain.
Konsep-konsep pemrograman berorientasi objek dalam Java
secara umum sama dengan yang digunakan oleh
bahasa-bahasa lain. Jadi kebanyakan konsep yang kita bahas
juga terdapat dalam bahasa selain Java. Namun,
terkadang terdapat perbedaan-perbedaan kecil antara penerapan konsep-konsep
tersebut dalam masing-masing bahasa. Perbedaan-perbedaan ini juga akan dijelaskan seiring penjelasan masing-masing konsep.
Objek
Dalam penjelasan mengenai analogi, kita
sudah menyinggung mengenai objek. Sekarang kita akan
mengupas lebih dalam tentang objek sebagai konsep kunci dari pemrograman
berorientasi objek.
Baik dalam dunia nyata atau dalam sebuah program, sebuah
objek memiliki dua karakteristik, yaitu state dan behaviour. State adalah
keadaan dari sebuah objek, seperti mobil memiliki state warna, model, tahun pembuatan, kondisi, dll. Sedang behaviour
adalah kelakuan dari objek tersebut, seperti mobil dapat melaju, membelok,
membunyikan klakson, dll. Objek menyimpan statenya dalam satu atau lebih variabel,
dan mengimplementasikan behaviournya
dengan metode. Dengan penjelasan di atas, dapat
disimpulkan bahwa objek adalah bagian software yang dibentuk dengan variabel-variabel
dan metode-metode yang berhubungan dengan variabel tersebut.
Dengan karakteristik tersebut, kita
dapat memodelkan berbagai objek dalam kehidupan nyata ke dalam objek-objek
dalam sebuah program. Lebih lanjut kita dapat
memodelkan objek-objek abstrak ke dalam sebuah program. Contoh umum untuk konsep abstrak seperti ini adalah objek Event, yaitu objek untuk mewakili
peristiwa klik atau tombol ditekan.
Sebuah objek yang dibentuk dari sebuah kelas
biasa disebut instans dalam
terminologi OOP. Artinya objek tersebut adalah wujud nyata
dari sebuah kelas. Variabel dan metode dari instans ini disebut variabel
instans dan metode instans.
Setiap instans
menyimpan variabelnya sendiri-sendiri, jadi nilai variabel untuk tiap instans bisa berbeda.
Message (Pesan)
Objek-objek yang bekerja sama
membentuk suatu sistem harus saling berkomunikasi untuk menjalankan
sistem
tersebut. Dalam sebuah program, objek-objek berkomunikasi satu sama lain
dengan mengirimkan pesan. Sebagai contoh, jika sebuah objek ingin
memanggil metode
dari objek lain, maka objek ini akan mengirimkan
sebuah pesan yang meminta objek
tujuan untuk menjalankan metode yang dikehendaki. Pesan ini akan berisi
informasi-informasi yang dibutuhkan objek tujuan untuk dapat menunaikan
permintaan tadi.
Sebuah pesan dibentuk
oleh informasi berikut ini: 1) objek yang dituju; 2) nama
metode yang ingin dipanggil; 3) parameter yang dibutuhkan metode tersebut. Misalnya:
anotherObject.aMethod(parameter1);
Bila sebuah objek ingin memanggil metode
miliknya sendiri, maka informasi pertama adalah dirinya sendiri. Untuk menunjuk diri sendiri dalam Java digunakan kata kunci this. Maka contoh sebelumnya akan menjadi:
this.aMethod(parameter1);
Atau kita dapat menghilangkan informasi pertama sehingga
menjadi:
Method(parameter1);
karena bila informasi pertama
tidak ada, kompiler akan secara otomatis menunjuk ke objek itu sendiri.
Ada dua
keuntungan dalam penggunaan pesan,
yaitu: 1) semua kebutuhan interaksi antarobjek dapat dilakukan; 2) objek-objek
yang saling berinteraksi tidak harus berada dalam satu proses atau bahkan dalam
satu komputer.
Kelas
Kelas adalah semacam cetakan, atau template,
untuk membuat objek. Ibaratkan sebuah rancangan rumah
yang digunakan untuk membangun ratusan rumah. Rumah
yang dibangun tersebut adalah objek dari kelas rancangan rumah. Hal ini
dapat dilakukan karena semua objek rumah yang dibangun memiliki karakteristik
yang sama, sehingga dapat dibuatkan semacam blueprintnya. Tetapi objek-objek
yang dibangun tetap akan memiliki bentuk fisik tertentu
sendiri-sendiri, seperti variabel dalam sebuah program, atau pintu sebuah objek
rumah. Dengan penjelasan ini, kelas dapat kita definisikan kembali menjadi
sebuah blueprint, atau
prototipe, yang mendefinisikan variabel dan metode yang sama
untuk semua objek sejenis.
Sebagai contoh, misalkan kita ingin
membuat kelas Rumah, maka kita
harus membuat sebuah kelas yang mendefinisikan semua variabel yang dimiliki
objek dari kelas tersebut. Selain itu, kelas tersebut
juga harus mendeklarasikan metode-metode yang dimiliki objek dari kelas dan
juga membuat implementasi dari metode tersebut. Dengan
adanya kelas ini, kita dapat membuat sebanyak apapun objek-objek rumah yang
sejenis, yaitu jenis yang didefinisikan oleh kelas Rumah. Setiap objek Rumah
diciptakan, sistem akan mengalokasikan sejumlah memori
untuk objek tersebut dan variabel-variabelnya. Dengan begitu setiap
objek akan memiliki salinan masing-masing untuk setiap variabel instans.
Setelah mengenal konsep kelas, saatnya Anda
dikenalkan dengan variabel kelas. Variabel kelas sebenarnya sama dengan variabel instans.
Bedanya adalah, setiap objek berbagi satu dan hanya satu
variabel kelas, tapi masing-masing memiliki salinan dari variabel instans. Misalkan kelas Rumah yang kita buat hanya akan mendukung 2 lantai, dan setiap objek Rumah terdiri atas 2 lantai. Maka informasi ini cukup disimpan satu kali, karena nilainya tidak
berbeda untuk semua objek. Lebih jauh, bila ada satu objek yang mengubah
nilai dari variabel kelas, maka semua objek sejenis lainnya akan
mengikuti perubahan itu. Di samping variabel, terdapat juga metode kelas. Metode
jenis ini dapat langsung dipanggil melalui kelas dan bukan dari instans kelas tersebut.
Pewarisan
Terminologi asing untuk pewarisan
adalah inheritance. Mungkin dalam literatur lain Anda akan sering menjumpai istilah ini. Secara gamblang,
pewarisan berarti sebuah kelas mewarisi state
dan behaviour dari kelas lain.
Sebagai contoh, sebuah kelas RumahMewah
akan mewarisi state
dan behaviour dari kelas Rumah. Begitu juga
dengan kelas RumahSederhana.
Kelas RumahMewah
dan RumahSederhana disebut subkelas, atau kelas anak, dari kelas
Rumah, yang disebut superkelas, atau kelas induk.
Seluruh subkelas akan mewarisi (inherits) state dan behaviour dari
superkelasnya. Dengan begitu, semua subkelas dari superkelas yang sama akan memiliki state dan behaviour yang sama. Namun,
masing-masing subkelas bisa menambah sendiri state atau behaviournya. Misalkan, pada kelas Rumah
tidak terdapat variable kolamRenang,
namun subkelas RumahMewah
memiliki variabel tersebut. Contoh lain
misalnya kelas Rumah tidak memiliki metode nyalakanAlarm,
namun rumah mewah memiliki metode itu.
Dalam kasus tertentu subkelas mungkin
memiliki implementasi behaviour yang berbeda dengan superkelasnya. Hal seperti ini disebut override. Contohnya
subkelas SepedaBalap memiliki
implementasi metode ubahGigi
yang berbeda dengan implementasi metode tersebut pada superkelas Sepeda.
Tingkat pewarisan tidak hanya terbatas
pada dua tingkatan. Dari contoh di atas, kita bisa
saja membuat subkelas dari kelas SepedaBalap,
dan seterusnya. Kita bisa terus memperpanjang tingkat
pewarisan ini sepanjang yang kita butuhkan. Dengan begitu,
subkelas-subkelas
yang dibuat akan lebih khusus dan lebih
terspesialisasi. Namun terdapat batasan pewarisan dalam Java
yang disebut single inheritance.
Artinya sebuah kelas hanya dapat mewarisi sifat dari satu dan
hanya satu superkelas saja. Dalam beberapa bahasa
pemrograman berorientasi objek lain, yang berlaku adalah multiple
inheritance. Artinya sebuah kelas dapat mewarisi sifat dari beberapa
superkelas
sekaligus.
Dalam Java, terdapat kelas Object yang merupakan superkelas dari semua kelas dalam
Java, baik yang builtin ataupun yang kita buat sendiri, lansung maupun tidak
langsung. Karena itu sebuah variabel bertipe Object
akan dapat menyimpan referensi ke objek apapun dalam
bahasa Java. Kelas Object ini
memiliki behaviour yang
dibutuhkan semua objek untuk dapat dijalankan di Java Virtual Machine. Sebagai contoh, semua kelas mewarisi metode toString dari kelas Object, yang mengembalikan representasi String dari objek tersebut.
Manfaat penggunaan konsep pewarisan antara lain: pertama, kita
dapat menggunakan kembali kelas-kelas yang kita buat (sebagai superkelas) dan
membuat kelas-kelas baru berdasar superkelas tersebut dengan karakteristik yang
lebih khusus dari behaviour umum yang dimiliki superkelas. Kedua,
kita dapat membuat superkelas yang hanya mendefinisikan behaviour namun tidak
memberi implementasi dari metode-metode yang ada. Hal ini berguna jika
kita ingin membuat semacam template kelas. Kelas semacam ini
disebut kelas abstrak, karena
behaviournya masih abstrak dan belum diimplementasikan. Subkelas-subkelas dari kelas semacam ini, yang disebut kelas
konkret, mengimplementasikan behaviour abstrak tersebut sesuai dengan kebutuhan
masing-masing.
Sedikit penjelasan mengenai kelas
abstrak, kelas ini bisa memiliki hanya satu atau lebih metode abstrak.
Subkelas dari kelas ini bertanggung jawab untuk memberikan
implementasi untuk metode-metode abstrak tersebut. Sebagai
akibat dari keberadaan metode abstrak ini, kelas abstrak tidak dapat
diinstanskan
(dibuatkan instansnya) atau digunakan untuk menciptakan sebuah objek
dari kelas
tersebut.
Interface
Arti harfiah dari interface
adalah antarmuka, yaitu suatu alat untuk digunakan benda-benda yang
tidak
terhubung secara langsung untuk berinteraksi. Dalam bahasa
pemrograman, interface digunakan
oleh berbagai objek yang tidak terhubung untuk saling berinteraksi. Jadi
dalam bahasa pemrograman, interface dapat didefinisikan sebagai koleksi
definisi
metode-metode dan variabel-variabel konstan, namun tanpa implementasi.
Implementasi akan dilakukan oleh kelas-kelas yang mengimplements
interface ini. Tanpa implementasi di sini tidak seperti pada kelas
abstrak yang merupakan metode-metode yang tidak melakukan apa-apa,
melainkan
hanya sekedar nama metode saja.
Sebelumnya telah dijelaskan bahwa sebuah
kelas tidak dapat menjadi subkelas dari beberapa superkelas, melainkan hanya
bisa menjadi subkelas dari satu superkelas saja. Hal
ini membuat desain program lebih rapi dan teratur, sehingga dapat mengurangi
kompleksitas program. Namun, terkadang hal ini dapat menjadi suatu
halangan yang tidak menyenangkan, yaitu saat kita membutuhkan suatu kelas yang
memiliki sifat-sifat dari dua atau lebih kelas lain. Pada
masalah seperti ini, interface dapat
memberikan alternatif jalan keluar.
Dengan adanya interface
maka beberapa kelas akan dapat menangani interaksi
yang sama namun dengan behaviour yang bisa berbeda. Misalnya beberapa kelas
mengimplementasi sebuah interface
yang sama, maka kelas-kelas tersebut dapat menangani
interaksi sesuai interface tersebut,
namun tiap kelas dapat memiliki implementasi yang berbeda-beda.
Begitu juga bila sebuah kelas mengimplementasi
banyak interface, maka kelas tersebut akan dapat menangani
interaksi-interaksi sesuai salah satu interface yang diimplement oleh
kelas
tersebut. Namun, kelas tersebut harus mengimplementasi
sendiri behaviournya. Di sinilah letak perbedaan penggunaan interface
dengan multiple inheritance. Dalam multiple inheritance, layaknya single
inheritance, subkelas tidak
harus mengimplementasikan sendiri behaviournya karena secara default
kelas
tersebut akan mengikuti behaviour superkelasnya.
No comments:
Post a Comment