Monday, October 24, 2011

Object Oriented Programming: Konsep Class dalam C#.NET


Pada pembahasan sebelumnya kita sudah mengetahui manfaat penggunaan class sebagai salah satu alat untuk pemrosesan data. Pada artikel ini kita akan membahas lebih dalam tentang pemahaman konsep class dalam C#.NET. Bagi kita yang sudah pernah belajar bahasa pemrograman lain yang juga menerapkan paradigma object oriented programming seperti Java tentu akan lebih mudah memahami karena pada dasarnya konsep class pada C#.NET maupun Java adalah sama. Yang sedikit membedakan hanyalah pada implementasi code-nya saja. Untuk lebih memudahkan pemahaman konsep class, dalam artikel ini kita tidak hanya membahas konsep class secara teori dan contoh umum melainkan kita akan membedah contoh langsung dari aplikasi yang pernah kita buat.

Keterkaitan Objek dan Class

Di dunia nyata, kita dapat menemui banyak sekali objek (object) seperti buku, mobil, rumah, manusia, dll. Pada umumnya, objek-objek dapat dikenali dari kata-kata benda yang kita ketahui. Setiap objek pasti mempunyai ciri-ciri yang spesifik selain ciri-ciri yang mungkin sama dengan yang objek yang lain. Misalnya, objek buku mempunyai salah satu ciri yaitu judul yang tidak akan ditemui pada objek mobil. Mobil juga mempunyai salah satu ciri yaitu jenis mesinyang tidak dimiliki oleh objek buku. Objek buku dan mobil juga dapat mempunyai ciri yang sama misalnya warna. Setiap objek biasanya mempunyai perilaku tertentu. Misalnya, mobil punya perilaku berlari, manusia punya perilaku membaca dan lain-lain. Poin penting yang perlu kita perhatikan di sini adalah objek memiliki wujud, ciri-ciri, dan perilaku atau tindakan.
Pada pemrograman berorientasi objek (object oriented programming) atau biasa disingkat OOP, objek digunakan sebagai dasar pemikiran. Objek digambarkan sebagai sesuatu yang mempunyai wujud, ciri-ciri, dan perilaku masing-masing. Dengan kemampuan itu pula maka suatu objek dapat berinteraksi dengan objek yang lain. Dalam OOP, setiap objek akan direprentasikan dalam sebuah class. Jadi, class merupakan bentuk representasi objek dalam dunia nyata dalam OOP. Suatu class dapat mengandung beberapa property yang merepresentasikan ciri-ciri dari objek serta beberapa method atau function yang mereprentasikan perilaku dari objek.

Struktur Code Sebuah Class

Kita akan membedah kembali code untuk class GuestBook yang sudah pernah kita buat sebelumnya (lihat PoetryWeb4). Berikut ini ditampilkan struktur code dari class GuestBook dengan beberapa modifikasi yaitu penyederhanaan jumlah property serta penyertaan fungsi.
1 public class GuestBook
2 {
3    public GuestBook()
4    {
5        _Name = "Anonim";
6    }
7
8    private string _Name = string.Empty;
9    public string Name
10    {
11        get { return _Name; }
12        set { _Name = value; }
13    }
14
15    private string _Address = string.Empty;
16    public string Address
17    {
18        get { return _Address; }
19        set { _Address = value; }
20    }
21
22    public string GetInfo()
23    {
24        return _Name + " from " + _Address;
25    }
26 }
Baris pertama code menunjukkan cara kita mendefinisikan sebuah class yaitu dengan awalan “public class” diikuti dengan nama class. Kata public merupakan salah satu bentuk modifierselain protected dan private yang menandakan level akses ke class. Kata “class” sendiri adalah penanda yang diperlukan oleh compiler C# untuk mengenali class yang kita definisikan. Selanjutnya, definisi atau code dari sebuah class dituliskan di antara sepasang kurung kurawal {}.

Constructor

Baris ke-3 memiliki bentuk yang mirip dengan baris definisi class di baris pertama. Perbedaannya adalah tidak adanya kata “class” dan keberadaan () di akhir nama class. Bagian inilah yang disebut sebagai constructor dari sebuah class. Bentuknya sebuah fungsi yang tidak memiliki tanda kembalian (return type) dan memiliki nama yang sama dengan nama class. Pengertian fungsi dan return type akan kita bahas selanjutnya dalam artikel ini. Baris ke-4 s.d. ke-6 menunjukkan definisi dari constructor yang dapat kita isi dengan code tertentu yang kita perlukan. Pada umumnya, code di dalam constructor ini melakukan proses inisialisasi setiap variabel atau property yang dimiliki oleh class. Dalam contoh di atas, constructor melakukan inisialisasi variabel _Name yang dimiliki oleh class GuestBook. Setiap constructor dari sebuah class akan selalu dipanggil atau dijalankan secara otomatis ketika sebuah sebuahinstance dari class tersebut dibuat. Perhatikan code berikut:
1 // sebuah instance dibuat, diberi nama tamu1
2 GuestBook tamu1 = new GuestBook();
3 // satu instance lagi dibuat dan diberi nama tamu2
4 GuestBook tamu2 = new GuestBook();
5
6 // menampilkan isi property Name dari tamu1
7 lblName.Text = tamu1.Name;
8 // mengubah isi property Name dari tamu2
9 tamu2.Name = "Gatot Wahyudi";
10 // menampilkan isi property Name dari tamu2
11 lblName.Text = tamu2.Name;
Class dapat diibaratkan sebagai sebuah pabrik objek sedangkan instance dari class adalah setiap objek yang diproduksi oleh pabrik tersebut. Contoh di atas menunjukkan bahwa GuestBook merupakan pabrik dari objek. Adapun tamu1 dan tamu2 merupakan instance dari class GuestBook. Setiap instance inilah yang nantinya mempunyai ciri spesifik masing-masing. Contoh yang lain misalnya kita mempunyai class Mobil maka instance yang dapat dibuat antara lain Honda dan Ferrari dimana kita mengetahui masing-masing instance tersebut adalah sama-sama objek Mobil namun memiliki ciri-ciri yang berbeda dari segi nama, ukuran mesin, kecepatan maksimum, dll.
Pada contoh cuplikan code di atas kita juga mencoba untuk menampilkan isi dari property Namedari objek tamu1 pada label lblName. Dengan perintah tersebut kita akan mendapati bahwa label lblName akan menampilkan teks “Anonim”. Bagaimana bisa demikian sedangkan kita belum pernah mengubah property Name dari objek tamu1? Jawabannya adalah pengaruh dariconstructor. Seperti yang sudah dijelaskan sebelumnya, ketika sebuah instance dibuat makaconstructor akan dipanggil atau dijalankan secara otomatis. Dengan kata lain, setiap baris perintah pada code di dalam constructor akan dieksekusi. Pada code class GuestBook, pada awalnya property _Name didefinisikan untuk berisi string kosong atau “” melalui perintahprivate string _Name = string.Empty;. Selanjutnya, code di dalam constructor melakukan perubahan nilai dari property _Name dengan teks “Anonim”. Dengan demikian, secara otomatis setiap kita membuat instance dari class GuestBook maka property _Name akan selalu berisi teks “Anonim”. Ini berarti property _Name pada instance tamu2 juga bernilai “Anonim” ketika pertama kali dibuat. Nilai property tersebut baru berubah ketika code tamu2.Name = “Gatot Wahyudi”;dieksekusi.

Property

Pada dasarnya yang dimaksud dari property suatu class adalah setiap variabel yang didefinisikan untuk menyimpan segala informasi terkait class tersebut. Dari code class di atas, pada dasarnya class GuestBook hanya mengandung dua buah property yaitu _Name dan _Address yang sama-sama berjenis string. Jadi, code yang yang menunjukkan definisi tersebut hanya pada baris ke-8 dan ke-15 seperti cuplikan berikut:
...
8    private string _Name = string.Empty;
...
15    private string _Address = string.Empty;
...
Pada umumnya setiap property dari suatu class didefinisikan dengan modifier “private” yang menandakan bahwa objek lain atau perintah di luar objek tidak dibolehkan untuk mengubah nilainya secara langsung. Pada bahasa pemrograman Java, satu-satunya cara untuk mengubah nilai dari sebuah property adalah melalui sebuah fungsi atau method. Ini merupakan bentuk dari apa yang dinamakan enkapsulasi (encapsulation). Enkapsulasi merupakan sebuah cara untuk menyembunyikan detil dari suatu objek. Dalam hal ini, code perintah tidak perlu tahu bagaimana property dari sebuah class disimpan. Code perintah atau objek di luar class hanya diperbolehkan untuk ‘meminta’ objek yang bersangkutan untuk melakukan dengan caranya sendiri. Karena itu objek dari luar melakukan permintaan perubahan nilai property dengan mekanisme pemanggilan fungsi. Selanjutnya class yang bersangkutan akan mendefinisikan sendiri caranya mengubah nilai property berdasarkan definisi fungsi tersebut.
Pada dasarnya C# sebagai penganut OOP juga mengharuskan penggunaan fungsi sebagai cara untuk meminta sebuah objek untuk memodifikasi nilai dari property-nya. Namun, C# sedikit berbeda dengan Java dimana kita tidak perlu membuat dua fungsi untuk mengakses dan mengubah nilai dari setiap property. C# mengenal apa yang dinamakan accessor atau aksesor. Aksesor berbentuk seperti fungsi karena mengandung return type tetapi tidak mengandung argument sehingga tidak memerlukan tanda “()” setelah nama aksesor. Biasanya satu buah accessor yang didefinisikan merepresentasikan satu buah property dari class. Sebuah accessor dapat mengandung aksesor get saja, aksesor set saja atau bahkan keduanya. Aksesor get berfungsi mengembalikan nilai yang sesuai dengan jenis property. Jika property didefinisikan sebagai property berjenis string maka aksesor get harus mengembalikan string pula. Aksesor set berfungsi melakukan perubahan terhadap nilai property dengan perintah implisit value. Nilai yang kita gunakan untuk mengeset property harus sama dengan jenis dari property.
Dengan penjelasan di atas berarti seharusnya kita sudah memahami definisi aksesor untuk property _Name pada class GuestBook. Berikut ini adalah cuplikan code class GuestBook khusus pada pada bagian property _Name dan aksesor Name.
...
8    private string _Name = string.Empty;
9    public string Name
10    {
11        get { return _Name; }
12        set { _Name = value; }
13    }
...
Berikut ini adalah contoh penggunakan aksesor Name tersebut:
1 // mengeset nilai property Name
2 tamu1.Name = "Aisyah Putri";
3
4 // mengakses nilai property Name
5 lblName.Text = tamu1.Name;
Perlu diketahui bahwa aksesor get dan set akan dipanggil secara otomatis sesuai dengan bentuk perintah. Jika perintahnya berbentuk penugasan (assignment) seperti pada baris kedua di atas maka yang dieksekusi adalah code aksesor set. Jika perintahnya berbentuk pengaksesan seperti pada baris kelima maka yang dieksekusi adalah code aksesor get. Sebagai pembahasan terakhir di bagian Property class, kita perlu melakukan redefinisi istilah property terkait implementasinya dalam code C#. Dengan adanya implementasi aksesor maka nama aksesor itulah yang akhirnya disebut sebagai property class. Adapun variabel yang berkaitan dengan aksesor disebut sebagai field class. Pada contoh code GuestBook, bagian code public string Name { … } menandakan definisi property Name sedangkan bagian codeprivate string _Name = string.Empty; menandakan definisi dari sebuah field _Name. Selanjutnya, property Name berkorespondensi dengan field _Name yang artinya setiap perintah get dan set dari aksesor Name akan berhubungan dengan pengaksesan dan penugasan pada field _Name. Pada umumnya, nama property dan field yang bersesuaian dibuat mirip seperti contoh Name dan _Name atau Address dan _Address. Tujuannya adalah untuk memudahkan mengingat dan kerapian code. Namun, pada dasarnya tidak ada aturan khusus untuk mengaitkan nama property dan field.

Method atau Function

Method atau function atau fungsi merupakan representasi dari perilaku objek. Istilah method lebih umum dikenal pada bahasa pemrograman Java sedangkan pada C# lebih dikenal dengan istilah fungsi. Baik method maupun fungsi mempunyai maksud yang sama. Jika kita melihat contoh objek di dunia nyata, misalnya Mobil, mobil mempunyai beberapa fungsi yang dapat dia jalankan seperti berlari, mengerem, dan berbunyi (klakson). Perilaku ini dapat direpresentasikan dalam fungsi misalnya run()brake(), dan horn(). Pada umumnya, setiap fungsi mempunyai jenis kembalian atau return type dari hasil eksekusi fungsinya. Sebagai contoh fungsi fungsi run() akan menghasilkan mobil dalam kondisi berlari, fungsi brake() menghasilkan mobil dalam kondisi berhenti, dan fungsi horn() menghasilkan bunyi klakson. Selain itu, sifat fungsi ada yang dapat diakses atau dipicu dari luar atau hanya bisa dipicu oleh objek itu sendiri. Sebagi contoh, fungsi brake() pada mobil bisa dilakukan oleh manusia yang mengendarainya namun bisa terdapat fungsi lain misalnya pengatur AC yang berjalan otomatis. Dalam fungsi, jenis akses ini dikenal sebagai modifier. Modifier yang umum dikenal ada 3(tiga) yaitu publicprotected, dan private. Modifier public menandakan bahwa fungsi dapat diakses dari objek lain, protected menandakan bahwa fungsi dapat diakses oleh objek lain dalam satu keturunan (inheritance), dan private menandakan bahwa fungsi hanya dapat diakses oleh objek yang bersangkutan saja. Adanya tanda () pada fungsi menandakan bahwa sebuah fungsi dapat menerima arguments yang berjumlah dari nol sampai dengan sesuai kebutuhan. Arguments pada fungsi merepresentasikan input atau masukan yang akan diproses dalam fungsi. Contoh nyata bentuk argumen untuk fungsi mengerem pada mobil adalah besarnya tekanan kaki kita pada pedal rem.
Berikut ini adalah beberapa contoh definisi fungsi dengan beberapa jenis modifierreturn type, dan jumlah argument:
public int Break(decimal power)
{
if(power == 100) return 1;
else return 0;
}

protected string SayHello()
{
return "Hello World";
}

private void Run(decimal power, int gear)
{
if(power > 0 &&  gear > 0) _IsRun = true;
}
Demikianlah pembahasan singkat kita tentang salah satu konsep dasar dan penting pada bahasa pemrograman berorientasi objek C#.NET. Walaupun mungkin tidak terlalu panjang, semoga lebih memudahkan pemahaman kita tentang konsep OOP terutama terkait implementasinya dalam code C#. Konsep class ini sangat perlu (harus) kita kuasai karena merupakan dasar pemrograman C# selanjutnya. Selain konsep class, dalam OOP masih dikenal konsep Inheritance dan keterkaitannya dengan konsep overloading dan overriding. Konsep OOP tersebut juga sangat penting dikuasai dan kita akan mencoba membahasnya di artikel selanjutnya.

2 comments:

  1. terimakasih mas, sangat bermanfaat :D

    ReplyDelete
  2. Makasih mas, atas informasinya. Cukup bermanfaat bagi saya untuk memahami OOP dengan c#. Jangan lupa mampir juga ke web saya www.JualTutorialKu.com

    ReplyDelete