OOP

Saat ini, cukup banyak bahasa pemrograman yg menggunakan konsep OOP (Object Oriented Programming), salah satunya adalah C++. OOP menjadikan kode program sebagai sekumpulan objek yang berisi kumpulan method dan properti yang saling berkaitan. OOP seperti konsep di alam di mana tiap objek punya sifat, keadaan dan tindakan. Selain itu, dalam OOP, objek bisa berkomunikasi melalui message.

Sebelum membuat objek, kalian perlu mendeklarasikan classnya terlebih dahulu. Class adalah blue print dari suatu object. Cara mendeklarasikan class hampir sama dengan struct.  Di dalam class, terdapat member berupa variabel yang disebut dengan atribut. Bedanya, di dalam class terdapat function yang disebut dengan method. Method bisa mengakses atribut di dalam class tanpa harus menyertakannya sebagai parameter. Penggabungan properti dan method di dalam class disebut enkapsulasi. 

Deklarasi Class

Class punya atribut dan method dengan tipe data yang berbeda-beda. Atribut adalah variabel-variabel yang merupakan anggota dari class. Dalam bahasa pemrograman lain, atribut disebut juga dengan properti atau field.

Contoh deklarasi Class bisa kalian lihat di bawah ini.
Class nama_kelas{
    private :
        char nama[30];
        char kelas[10];
    protected :
        int spesial;
    public :
        method1();
        method2(int a, int b);
}

Pada contoh di atas kita mendeklarasikan class. Class tersebut punya beberapa atribut dan method yang hak aksesnya berbeda-beda. Methodku() adalah method di dalam class tersebut. 

Access Modifier

Access modifier adalah batasan hak akses untuk suatu atribut atau method dari class. Pelanggaran hak akses akan menyebabkan error. Access modifier yang tersedia dalam bahasa C++ yaitu :

  • Public adalah access modifier default yang membolehkan anggota dari suatu kelas untuk digunakan di luar method dari objek. 
  • Private membatasi akses supaya anggota dari suatu kelas hanya boleh digunakan oleh method dari objek itu sendiri.
  • Protected, aksesnya terbatas pada method milik "turunan" dan objek itu sendiri. Kalau access modifier "dilanggar", maka akan muncul error saat dicompile.

Selanjutnya, kita akan mencoba untuk menggunakan class dalam kode program.

#include <iostream>

using namespace std;

class kelasku{
    public :
        int method1(){
            cout << "method ke-" << atribut_public << endl;
            return 0;
        }

        int method2(int i);
        int atribut_public;
   
    protected :
        int atributku1;
   
    private :
        int atributku2; 
};


int kelasku::method2(int i){
    cout << "method ke-" << i;
    return 0;
}

kelasku x; 

int main() {
    x.atribut_public=1;
    x.method1();
    x.method2(2);
}
Output :
method ke-1
method ke-2

Class di atas mempunyai 2 method dan beberapa atribut. Tiap method dan atribut memiliki hak aksesnya masing-masing sesuai access modifier yang ada di atasnya. Method-method dalam class tersebut yaitu method1 dan method2. 

Isi method bisa dituliskan secara langsung di dalam deklarasi class, maupun di luar deklarasi. Method yang akan ditulis terpisah dari deklarasi class-nya perlu ditulis dalam bentuk seperti prototype function dengan operator "::".

This

Method akan menggunakan atribut jika tidak ada parameter atau variabel lokal dengan nama yang sama. Tapi, jika ada variabel lokal atau parameter dengan nama yang sama dengan atribut yang ingin kalian pakai, itu akan berbeda. Kalian perlu menggunakan this.

#include <iostream>

using namespace std;

class kelasku{
    public :
        int method1(){
            cout << "method ke-" << this->atribut_public << endl;
            return 0;
        }
        int method2(int i){
            cout << "method ke-" << i;
            return 0;
        }

        int atribut_public;
   
    protected :
        int atributku1;
   
    private :
        int atributku2; 
};

kelasku x; 

int main() {
    x.atribut_public=1;
    x.method1();
    x.method2(2);
}
Output :
method ke-1
method ke-2

Kalau this pada contoh di atas dihilangkan, hasilnya akan tetap sama. Tapi, kalian akan perlu this jika kalian ingin memastikan tidak ada kesalahan karena kesamaan nama identifier.

Konstruktor dan Destructor

Beberapa hal lagi yang perlu dipelajari terkait OOP adalah konstruktor dan destruktor. Constructor / konstruktor adalah method yang otomatis dieksekusi saat objek baru dibuat. Sebaliknya, destructor / destruktor akan dieksekusi saat objek dihapus.
#include <stdio.h>

class objekku{
    private:
        int rahasia;
    public:
        objekku(int);
        ~objekku();
        int a;
        int b;
};

objekku::objekku(int x){
    this->rahasia=x+1;
    this->a=x;
    b=a+1;
    printf("objek dibuat\n");
}

objekku::~objekku(){
    printf("\nobjek dimusnahkan\n");
}

int main(){
objekku o(2);
    printf("a: %d\n", o.a);
    printf("b: %d", o.b);
    return 0;
}
Output :
objek dibuat
a: 2
b: 3
objek dimusnahkan

Constructor dan destructor didekarasikan seperti method dan bisa memiliki parameter. Constructor dan destructor dinamai sesuai dengan nama class-nya. Beda constructor dan destructor ada pada tanda ~ yang dimiliki destructor. Constructor dipanggil saat objek dibuat. Sebaliknya, destructor dijalankan saat objek dihapus.

Friend

Hak akses yang sudah saya sebutkan di atas hanya berlaku pada class biasa. Hak akses dari class yang access modifier-nya private dan protected masih bisa diakses anggota function atau kelas lain yang dinyatakan sebagai "friend".

#include <iostream>

using namespace std;

class kelas1{
    public :
        void mulai(){
            cout << "Data Siswa Sekolah" << endl;
        }

        kelas1(){
    	    jmurid=30;
    	}
   
    private :
        int jmurid;
    
    friend class kelas2;
    //definisikan bahwa kelas2 adalah friend
};

class kelas2{
	private :
	    int jmurid;
	public :
    	void tampilkan_kelas1(kelas1& tk){
    	    cout << "murid kelas1 : ";
    	    cout << tk.jmurid << endl;
            cout << "murid kelas2 : ";
            cout << this->jmurid << endl;
    	}
    	
    	kelas2(){
    	    jmurid=31;
    	}
};

kelas1 x; 
kelas2 y;

int main() {
    x.mulai();
    y.tampilkan_kelas1(x);
}
Output :
Data Siswa Sekolah
murid kelas1 : 30
murid kelas2 : 31

Kalau kalian menghilangkan definisi class friend kelas1 dari kelas2, maka pesan error akan muncul saat kode program dicompile. Kalian juga bisa mendefinisikan function sebagai friend dari suatu class.

Istilah-Istilah dalam OOP

Berikut ini istilah-istilah penting yang berkaitan dengan OOP.

  1. Class : blueprint atau prototype dari object-object tertentu yang memiliki kesamaan attribute dan method. 
  2. Attribute / atribut : anggota class yang menunjukkan suatu bentuk karakteristik atau status dari object.
  3. Method / behavior : action yang bisa dikerjakan oleh suatu object.
  4. Constructor : Method yang dipanggil / dijalankan saat object dibuat. Dalam bahasa C++, konstruktor diberi nama yang sama dengan nama class-nya.
  5. Destuctor :  Method yang dipanggil / dijalankan saat object dihapus / dimusnahkan.
  6. Inheritance : Pewarisan (atau mungkin bisa dibilang duplikasi) ciri dan anggota satu objek kepada objek lain yang mungkin mempunyai kesamaan sekaligus anggota tambahan.
  7. Overriding : Perubahan isi method dari kelas ortu (parent) dalam kelas turunan.
  8. Overloading : Function atau method dengan nama sama tapi berisi parameter yang berbeda.
  9. Encapsulation / enkapsulasi:  Penyatuan data dan function yang digunakan untuk memproses data tersebut.
  10. Polimorfisme : polimorfisme digunakan untuk membuat ikatan sementara antara parent class / kelas induk dengan child class / kelas anak menggunakan pointer. Secara sederhana, arti polimorfisme adalah banyak bentuk.