Jumat, 09 Januari 2009

Konsep OOP Dengan C++

Seperti yang dijelaskan dalam tulisan sebelumnya, C++ merupakan bahasa pemrograman C yang ditambahkan dengan kemampuan pemrograman berorientasi objek (OOP – Object Oriented Programming). OOP merupakan bentuk penyederhanaan dari bahasa prosedural hingga program mudah untuk dikembangkan terutama untuk program yang kompleks. Dengan OOP kita memecah program kedalam sub-sub program yang dinamakan dengan kelas.

Untuk membuat kelas di dalam C++, kita menggunakan syntax class. Dengan membagi program menjadi kelas-kelas akan mempermudah perawatan dan pengembangan program. Dengan kelas juga dapat mencegah penulisan kode yang berulang dalam program, karena kelas bersifat reusable (dapat digunakan ulang).

Berikut contoh pembuatan kelas dalam C++ :


# include

using namespace std;

class pertama {
int nilai1;

public:
void set_nilai1(int nilai1_A);
int get_nilai1();
void tampil_nilai1();
};

//pengaplikasian fungsi-fungsi yang terdapat dalam kelas pertama
void pertama:::set_nilai1(int nilai1_A){
nilai1=nilai1_A;
}

int pertama::get_nilai1(){
return nilai1;
}
void pertama::tampil_nilai1(){
cout<<”Nilai kelas pertama = “<}

//Fungsi utama untuk menjalankan
program yang kita buat
int main(){
pertama p; //membuat objek yang bertipe kelas pertama

p.set_nilai1(10); //mengeset nilai

p.tampil_nilai1() //tampilkan hasil

return 0;
}

What is OOP - Tiga Pilar OOP Itukah??

Begitu banyak buku mengenai Object Oriented Programming (OOP) telah ditulis. Akan tetapi hingga saat ini, pemahaman mengenai OOP dirasa masih kurang. Saya kira sebab-musabab-nya adalah terletak pada dua hal:

  1. Buku OOP selalu memulai pembahasannya dengan SYNTAX bahasa OOP, yang memang paling popular yaitu : Encapsulation, Inheritance, dan Polymorphism.
  2. Selalu mulai dengan contoh paradigma keluarga buah-buahan, atau kendaraan, atau jenis-jenis binatang, yang memang merupakan object di dunia nyata, tapi relevansinya dengan dunia programming, yg sangat virtual, yg penuh kreativitas dan khayalan, sangatlah jauh. Yang terbaik dari contoh ini adalah ya itu… untuk melatih menghafal syntax-syntax OOP di atas.

Oleh karena itu artikel singkat ini bertujuan untuk mencoba menjelaskan OOP dari sudut pandang yang lain, yang tidak terikat dengan bahasa pemrograman apapun. Karena, you know what, kita bisa ber-OOP-ria menggunakan bahasa apapun, yes hanya dengan BASIC Interpreter, dengan Assembly, kita bisa ber-OOP dengan sangat sempurna.

1.1. Mengapa OOP

Kita langsung saja ke permasalahan paling mendasar, sedasar-dasar-nya, pertanyaan yang seharusnya selalu terngiang-ngiang di pikiran setiap Software Developer yg memang NIAT programming, yaitu:

  1. “MENGAPA OOP BISA MENGURANGI BUG”.
  2. “MENGAPA OOP BISA MENINGKATKAN KEMAMPUAN KITA UNTUK MEMBUAT PROGRAM YANG LEBIH BESAR DAN LEBIH RUWET”.

Jawabnya hanya satu : LOKALISASI.

Konsep ini dikenal dengan banyak nama : encapsulation, independensi, modular, object, re-usable, information hiding, dll, dll, apapun nama keren lainnya. Intinya hanya berisi dua jurus:

1.1.1. Semua yang bisa dikumpulkan jadi satu, kumpulkan jadi satu

Otak orang terbatas. Size program tidak terbatas. Jadi sepintar apapun seseorang, kalau otaknya yang terbatas itu tidak digunakan dengan baik tidak akan bisa menghasilkan program yg bermanfaat. Bahkan yang otaknya idiot-pun kalau digunakan dengan baik, akan menghasilkan sesuatu yang luar biasa. Pernah nonton film “Forrest Gump”-kan, ini adalah film yang seharusnya ditonton oleh semua software developer.

Dengan dikumpulkan jadi satu sedekat mungkin, kalau kita melakukan perubahan, kita dapat dengan mudah mencari bagian mana saja yang harus dicek. Ini penting, karena dengan otak yang terbatas, kita tidak mungkin ingat bagian program mana saja yang harus kita cek kalau kita melakukan perubahan.

1.1.2. Yang tidak perlu diketahui oleh yang lain, jangan di-publish

Dengan tidak mem-publish sesuatu yang tidak perlu diketahui oleh yang lain, ini menjamin variable-variable yang sudah kita kumpulkan jadi satu (dengan teknik di atas), tidak diutak-atik oleh bagian program yang lain. Dengan otak yang terbatas kita tidak mungkin setiap kali ingat bahwa sebuah variable tidak boleh diakses sembarangan.

Hmm, seperti halnya “lokalisasi” yang baik untuk merapihkan W/PTS supaya tidak merusak masyarakat, ternyata baik juga untuk merapihkan code-code yang tuna-susila.

1.2. Private Modifier adalah Fitur Terpenting dari Bahasa OOP

Dengan merenungkan kedua teknik tersebut, kita akan memahami mengapa teknik pemrograman ini disebut “OBJECT”. Karena itu memang seperti object. Kalau kita membeli barang / object, TV, buah, DVD, mobil, laptop, PC, dll, dll, kita tidak pernah pusing dengan apa isinya, dan tidak bisa mengutak-atik isinya karena terlindung di dalam boxnya. Yang perlu kita perhatikan adalah bagaimana menggunakannya, atau interface-nya. NOTE : hanya ini kesamaan object oriented dengan object dunia nyata – jangan diperpanjang menjadi contoh programming object oriented programming karena nggak kebayang program keluarga buah-buah-an punya manfaat apa (selain daripada digunakan oleh yang mencari contoh seenaknya).

Perhatikan bahwa saya tidak menyebutkan “bahasa”, tetapi hanya “teknik”, yang berarti memberi penekanan bahwa teknik OOP tidak terikat dengan bahasa pemorgraman apapun.

Bahkan sesungguhnya, bahasa OOP tidak memberikan sumbangsih banyak ke konsep ini, bahasa OOP hanya menambahkan SATU (YES, HANYA SATU) fitur untuk menunjang konsep ini, yaitu : private modifer (YES, HANYA PRIVATE MODIFIER).

Penemu konsep OOP (kalaupun ada) sangatlah jenius, dengan menyebutkan konsep “Object”, dia sudah menemukan sebuah penekanan MAHA penting dari teknik pemrograman. Dengan bahasa pemrograman paling muktahir sebelum OOP, semua konsep OOP bisa diimplementasikan dengan baik, hanya kurang fitur private variable tersebut.

Mari kita renungkan hal-hal berikut.

Encapsulation, Inheritence, dan Polymorphism, hanyalah teknik penulisan syntax yang lebih convenience saja. That’s all. Dengan gampang kita bisa melakukan ketiga syntax tersebut (Encapsulation, Inheritence, dan Polymorphism) menggunakan bahasa non-OOP.

  1. Encapsulation bisa disubtitusi dengan fungsi yang parameter pertamanya adalah handle. Contoh yang paling popular adalah Win32 API. Contoh:

a. “objWindow.Resize(…” à “WndResize(hWindow, …)“

  1. Inheritance (yg katanya adalah untuk re-usable) bisa disubtitusi dengan mudah menggunakan “containment” (struktur data yang di dalamnya mempunyai struktur data lain). Contoh:

a. “class DialogBox : Window {…“ à “class DialogBox {Window myParent; …“

  1. Polymorphism, well, ini dengan mudah disubtitusi menggunakan teknik penamaan fungsi yang baik, atau menggunakan fungsi yang parameternya struktur data. Contoh:

a. “CreateWindow(), CreateWindow(int xLoc, int yLoc)“ à “WndCreateWindow(), WndCreateWindow_2(int xLoc, int yLoc)”

Ketiga hal tersebut, yang disebut sebagai pilar dari Object Oriented Programming, adalah OMONG KOSONG belaka. Dengan mudah kita bisa mematahkan argumen developer yang menyebutkan manfaat OOP adalah ketiga pilar tersebut. Dan sesungguhnya developer tersebut belum mengerti apapun mengenai OOP.

Yang terbaik dari ketiga hal tersebut adalah penamaan yang keren, yang membantu penjualan compiler OOP, karena ini lebih menjual daripada compiler yang hanya menambah fitur “private variable” J

1.3. Teknik OOP Lokalisasi selain Private Modifier

Jadi apakah saja teknik-teknik OOP yang sesungguhnya… berikut adalah sebagian dari teknik OOP yang sepenuhnya hanya berdasarkan konsep LOKALISASI di atas. Sebagian dipandang begitu kampungan sehingga orang malu menyebutkannya, tetapi inilah contoh-contoh teknik OOP yang sesungguhnya.

Intermezzo : Kalau kalian mengamati improvement yang dilakukan oleh designer Microsoft .net Framework terhadap bahasa-bahasa pemrograman, terutama C# dan VB .net, termasuk Visual Studio .net, teknik-teknik lokalisasi berikut ini sangat di-emphasize oleh VS .net. Inilah salah satu reason utama mengapa kita memilih VS .net dan Ms .net Framework.

1.3.1. Definisi Variable Sedekat Mungkin dengan Lokasi Digunakannya Variable tersebut Pertama Kali

Jika ada monitor yang seukuran dinding, monitor tersebut adalah monitor terbaik untuk programming. Mengapa? Karena dengan demikian kita bisa sekaligus melihat banyak hal, aka “lokalisasi”. Sayangnya monitor seperti itu sangatlah mahal. Oleh karena itu dengan mendeclare variable sedekat mungkin dengan lokasi digunakannya variable tersebut pertama kali adalah sebuah fitur yang sangat baik karena dengan begitu kita yakin:

  1. Variable tersebut berada di lokasi terdekat dengan lokasi yang menggunakan variable tersebut, sehingga kemungkinan besar bisa kita lihat langsung di layar monitor kita yang terbatas.
  2. Kita yakin bahwa variable tersebut belum pernah digunakan di code-code yang mendahului deklarasi variable tersebut (hampir seperti private modifier).

Teknik ini sering dianggap tabu, karena banyak pelajaran dasar pemrograman kita yang dimulai dengan Pascal, yang syntax model lamanya adalah mengharuskan kita untuk mendeklarasi segala sesuatu di bagian atas fungsi / program. Perlu dinote bahwa teknik Pascal yang seperti itu mungkin ada kaitannya teknik kompilasi, dimana compiler yang memungkinkan deklarasi variable di mana saja, relatif lebih sulit dibuat.

Keuntungan lain dari deklarasi variable sedekat mungkin adalah kita dapat menerapkan teknik copy/cut-paste dengan lebih clean.

Note : sering terjadi salah persepsi bahwa copy/cut-paste adalah teknik yang jelek. Yang jelek adalah jika dan hanya jika teknik copy/cut-paste tersebut menghasilkan code yang redundan. Jika tidak itu adalah teknik yang sangat baik karena jelas mempercepat coding.

1.3.2. Code Editor Searching

Sebaik apapun teknik lokalisasi kita terapkan, tidaklah mungkin sempurna. Tentu ada bagian dari code kita, yang mau tidak mau tersebar di mana-mana. Dengan fitur searching dari code editor, memungkinkan kita untuk menemukan code-code tersebut dengan mudah. Dengan demikian walaupun lokasi dari code-code tersebut tidak berada di satu file, dan bahkan mungkin beda folder dan solution, tetap terasa dekat. Inilah salah satu bentuk implementasi teknik lokalisasi yang nyata.

Kalau kalian mengamati, fitur “Searh” di Visual Studio .net, adalah fitur search tercepat yang pernah ada. VS .net keliatannya bahkan menggunakan sebuah teknologi “text” caching dan algoritma khusus untuk ini. That is OOP concept.

1.3.3. Pattern Debugging

In very often case, you can simply find bug, by just watching the pattern of your program. When you find something un-usual, that means there is “something”. Of course, this can be done only WHEN YOU PROGRAM IN STANDARD MANNER (so it is very important that as long as it is possible, to always write program in standard manner). (Dan inilah kegunaan utama dari sebuah standar, bukan debat kusir Camel Notation atau Hungarian Notation. Debat bagusan warna Biru atau Orange ya.)

Note

When your pattern bends but it turns out that it must be so, IT IS AN INDICATION YOU HAVE TO GIVE IT A COMMENT. This way you will save your time (I bet you will forget about this just in the next day) and your colleagues.

Dengan pattern debugging, Anda bisa melihat code dari sudut pandang yang berbeda. Kesamaan dari pattern di seluruh aplikasi, adalah sebuah bentuk dari teknik lokalisasi juga, karena pada saat bersamaan Anda bisa melihat code-code yang saling terkait (walaupun code-code tersebut mempunyai lokasi fisik yang jauh).

Yup inilah OOP. Dan ini juga mengapa saya tidak terlalu setuju untuk membanding “object” di software dan “object” dunia nyata. Karena keduanya berbeda jauh, yang satu virtual, yang lain nyata. “Object” dunia nyata tidak bisa seperti ini ( menurut teori Fisika non-quantum yang merupakan persepsi kebanyakan orang J ).

Dengan membandingkannya dengan “object” dunia nyata, lebih cenderung menghancurkan pengertian developer mengenai OOP – daripada manfaat yang didapat.

1.3.4. COMMENT

Comment, yach comment, adalah OOP. Kenapa? Dengan comment memungkinkan kita untuk menjangkau / menyatukan code-code yang tidak terjangkau dengan teknik-teknik lokalisasi yang ada (private modifier, deklarasi variable sedekat mungkin, code editor searching, pattern debugging, dll). Dengan comment kita bisa mengetahui bahwa sebuah code affect kemana saja, dan juga mengapa code kita agak “aneh” karena mengakomodir behavior dari code yang lain. Ini adalah lokalisasi karena pada satu waktu kita bisa melihat seluruh code yg terkait.

Anw that comment is TRULY OOP too My Friends!

(Dan hebatnya sekarang ada gerakan untuk membuang comment dari code, dibilangnya apa itu… “bad smell”. Coool, so kalau gerakan ini sukses, terima-kasih banyak, karena persyaratan software developer masa depan adalah harus dilengkapi dengan indra keenam.)

1.3.5. “Goto” adalah OOP, BETUL BETUL OOP

Satu teknik yang dipandang kampungan oleh sebagian besar orang adalah “Goto”. Kasihan sekali Goto, karena yang salah sebenarnya adalah pengguna Goto, bukan Goto-nya sendiri.

Goto sangatlah baik, dan sangat-sangat baik sekali untuk digunakan sebagai error handling. Dengan goto memungkinkan kita untuk memisahkan antara “normal flow” dari aplikasi dan “error handling”. Kenapa ini perlu dipisahkan? Karena error handling biasanya sangat simple dan jarang terkait dengan normal flow (note : error handling yang terkait dengan normal flow aplikasi, bisa dipastikan itu bukanlah error handling, melainkan bagian dari normal flow aplikasi). Dengan demikian kehadiran error handling di tengah-tengah normal flow aplikasi, tentu sangat mengganggu clarity dari code kita. Tidak ada gunanya kita ber-lokalisasi, tetapi jika yang dilokalisasi adalah caut-marut. So Goto membantu emphasize OOP.

Anw, karena kesalahan persepsi tersebut, and tx juga, diciptakan sebuah syntax khusus untuk error handling yang lebih convenience, yakni : Try-Catch. Tanpa memahami esensi dari error handling di atas, atau inti dari konsep lokalisasi di OOP, Anda tidak akan bisa menghargai manfaat sesungguhnya dari Goto maupun Try-Catch.

1.4. Fitur Bahasa OOP yang Baik selain Private Modifier

1.4.1. Re-usable

Re-usable adalah kata yang selalu didengung-dengungkan oleh developer OOP. Sayangnya saya belum pernah menemukan satu developer-pun yang bisa menunjukkan ini dengan baik.

Contoh yang selalu digunakan untuk menunjukkan re-usable adalah ke-tiga-pilar-omong-kosong itu.

Re-usable itu sudah ada, bahkan di Bahasa Assembly yang paling primitif-pun sudah ada. Kalau Anda punya fungsi, dan fungsi itu bisa digunakan oleh seluruh bagian dari code, ini adalah re-usable. Perkara fungsi itu letaknya ada di object, module, manifest yang berbeda (beda exe), dll, selama fungsi itu bisa kita akses, namanya adalah re-usable. Ok.

Jadi apa yang ditambahkan oleh OOP ke masalah re-usable ini? Inilah sifat khusus dari Inherintance, baik Implementation Inheritance maupun Interface Inheritance, yang bermanfaat untuk re-usable.

Re-usable yang sudah secara sejak dulu tersedia adalah “calling re-usable”, yaitu banyak code memanggil sebuah code. Jika Anda mempunyai sebuah fungsi “CalculateBonus”, dan fungsi ini dipanggil dari modul Sales Order dan Delivery Order, ini adalah “calling re-usable”.

Yang belum tersedia secara explisit di bahasa-bahasa non-OOP adalah “callback re-usable” (kecuali menggunakan pointer, tetapi pointer berpotensi menimbulkan masalah lain yang lebih serius). Jika Anda membuat aplikasi seperti Trilian Messenger, yaitu sebuah program chatting yang mempunyai fitur untuk chat dengan berbagai messenger lain seperti Yahoo! Messenger, MSN Messenger, Google Messenger, ICQ, dll, akan lebih convenience jika Anda menyediakan satu macam user interface untuk chatting yang bisa bekerja dengan semua messenger tersebut. Atau seperti Windows yang bisa mengakses berbagai macam hardware. Inilah problem yang solusi paling baiknya adalah menggunakan “callback re-usable’.

Keliatannya bedanya? Untuk “callback re-usable”, code pemanggilnya yang digunakan bersama-sama (untuk kasus “calling re-usable”, code yang dipanggil yang digunakan bersama-sama).

Inilah improvement Bahasa OOP terhadap re-usable. Note : yang di-improve adalah Bahasa-nya, bukan konsep Lokalisasi, dan pada kenyataanya ini juga merupakan implementasi dari konsep Lokalisasi. Karena tanpa Bahasa OOP-pun kita bisa lakukan “callback re-usable”.

Dengan memahami teknik “Lokalisasi”, baru Anda bisa menyelami kegunaan sesungguhnya daripada Inherintance.

1.4.2. Declarative Programming

Kesalahan terbesar dari design Microsoft Transaction Server adalah memisahkan behavior dari sebuah code, ke tempat yang jauh sekali dari code-nya (di Transaction Server Administration). Ini bertentangan sekali dengan konsep Lokalisasi.

Inilah yang diimprove dengan Declarative Programming. Untuk yang belum tahu inilah salah satu contoh syntax Declarative Programming:

[Serializable]

public class SomeClass

{

[Serializable]” adalah sebuah declarative yang menyatakan sebuah class support fitur “seriazable” (bisa disimpan dalam bentuk XML). Dengan Declarative Programming, memungkinkan property-property diatur langsung di tempat yang sedekat mungkin dengan code yang diaturnya, bukan di tempat yang nun-jauh ntah dimana.

Sebenarnya inipun merupakan sebuah bentuk dari “callback re-usable”, maksudnya ujung-ujungnya diimplementasikan sebagai Interface Inheritance juga.

konsep OOP di java

Konsep OOP di Java

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:

aMethod(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 blueprint­nya. 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.

Penutup

Tutorial kali ini memang hanya membahas konsep, jadi wajar bila anda merasa tutorial kali ini terlalu teoritis. Namun jangan kecewa dulu, karena di tutorial berikutnya kita akan membahas lebih jauh mengenai kelas dan objek, interface, pewarisan, dan metode dalam bahasa Java. Sambil menunggu anda punya banyak waktu untuk memahami konsep yang dibahas di atas.