Uncategorized

Tutorial Pemrograman Berorientasi Obyek dengan C++ : Inheritance (Studi Kasus)

Berikut ini merupakan contoh source code sifat inheritance dalam pemrograman berorientasi obyek :

// ---------------------------------------------
// 	Program contoh penggunaan pewarisan
//	  menggunakan Turbo C++ versi 3.0
// ---------------------------------------------
//	Filename : PEGAWAI.CPP
// ---------------------------------------------
# include <iostream.h>
const int batas = 80;
class pegawai // kelas induk
{
private:
char nama [batas];
unsigned long nip;
public:
void getdata()
{
cout << endl << " Input Nama : ";
cin >> nama;
cout << " Input NIP : ";
cin >> nip;
}
void putdata()
{
cout << endl << " Nama : " << nama;
cout << endl << " NIP : " << nip;
}
};
class manajer : public pegawai // kelas turunan
{
private:
char bagian [batas];
double tunjangan;
public:
void getdata()
{
pegawai::getdata();
cout << " Input Bagian: ";
cin >> bagian;
cout << " Input Tunjangan Rp: ";
cin >> tunjangan;
}
void putdata()
{
pegawai::putdata();
cout << "\n Bagian	: "<< bagian;
cout << "\n Tunjangan	: "<< tunjangan;
}
};
class staff:public pegawai //kelas turunan
{
private:
char bagian[batas];
public:
void getdata()
{
pegawai::getdata();
cout << " Input Bagian : ";
cin >> bagian;
}
void putdata()
{
pegawai::putdata();
cout << "\n Bagian:" << bagian;
}
};
////kelas abstrak//
class buruh_operasional:public pegawai
{
};
int main()
{
manajer m1,m2;
staff s1;
buruh_operasional b1;
cout<<endl;
cout<<"Input Data Manajer 1";
m1.getdata();
cout<<endl;
cout<<"Input Data Manajer 2";
m2.getdata();
cout<<endl;
cout<<"Input Data Staff 1";
s1.getdata();
cout<<"\nInput Data Buruh Operasional 1";
b1.getdata();
cout<<"\nData manajer 1";
m1.putdata();
cout<<"\nData manajer 2";
m2.putdata();
cout<<"\nData staff";
s1.putdata();
cout<<"\nData buruh operasional";
b1.putdata();
cout << endl;
return 0;
}

Program di atas merupakan program untuk melakukan input data pegawai. Kelas-kelas yang terdapat dalam program di atas yaitu kelas pegawai (kelas induk), kelas manajer (kelas turunan), kelas staff (kelas turunan), dan kelas buruh_operasional (kelas turunan yang bersifat abstrak). Kelas buruh_operasional merupakan kelas turunan yang bersifat abstrak karena elemen kelas tersebut mempunyai sifat yang sama dengan kelas pegawai dan sama sekali tidak mempunyai sifat khusus yang lainnya.

Untuk lebih jelasnya berikut merupakan uraian serta pembahasan tentang masing-masing baris program di atas yaitu sebagai berikut :

1. Semua baris yang diawali dengan dua buah tanda slash (//), akan dianggap sebagai baris komentar dan tidak akan berpengaruh pada hasil eksekusi program. Biasanya, baris komentar dipakai oleh Programmer untuk memberikan penjelasan atau keterangan tentang maksud program tersebut. Bagian dari program di atas yang menggunakan dua buah tanda slash (//) yaitu :

// ---------------------------------------------
// 	Program contoh penggunaan pewarisan
//	  menggunakan Turbo C++ versi 3.0
// ---------------------------------------------
//	Filename : PEGAWAI.CPP
// ---------------------------------------------
... //kelas induk
...
... //kelas turunan
...
... //kelas turunan
...
... //kelas abstrak
...

2. Pernyataan yang diawali dengan tanda (#) merupakan pernyataan untuk menyertakan preprocessor. Pernyataan ini bukan untuk dieksekusi. Pernyataan seperti #include <iostream.h> berarti memerintahkan kompiler untuk menyertakan file header iostream.h.Dalam file header ini, terdapat beberapa fungsi standar yang dipakai dalam proses input dan output. Seperti misalnya perintah cout dan cin yang dipakai dalam program di atas merupakan bagian dari file header iostream.h.Bagian dari program di atas yang menggunakan dua tanda (#) yaitu :

...
# include <iostream.h>
...

3. Pernyataan const int batas = 80, digunakan untuk mendeklarasikan konstanta batas yang mempunyai nilai bulat (integer) sama dengan 80. Konstanta ini dideklarasikan di awal program karena akan dipakai pada semua kelas dalam program tersebut.

4. Pada kelas pegawai (merupakan kelas induk), terdapat ungkapan-ungkapan sebagai berikut :

class pegawai // kelas induk
{
private:
char nama [batas];
unsigned long nip;
public:
void getdata()
{
cout << endl << " Input Nama : ";
cin >> nama;
cout << " Input NIP : ";
cin >> nip;
}
void putdata()
{
cout << endl << " Nama : " << nama;
cout << endl << " NIP : " << nip;
}
};

Pada kelas pegawai, nama kelas ditulis dengan sintaks class pegawai, yang menunjukkan bahwa pegawai adalah nama suatu kelas. Tampak bahwa terdapat dua buah perubah akses (anggota kelas) yang digunakan pada kelas ini yaitu private dan public. Yang termasuk perubah akses private yaitu variabel nama (bertipe data karakter (char) dengan panjang maksimum 80, sesuai nilai variabel batas) dan nip (bertipe data bilangan bulat tak bertanda / unsigned long integer).Yang termasuk perubah akses public yaitu metode getdata (bertipe void) dan putdata (bertipe void). Suatu fungsi yang tidak menghasilkan suatu nilai apapun maka bagian return type ini diganti dengan void .

Di dalam metode getdata terdapat fungsi cout dan cin. Fungsi cout digunakan untuk menampilkan suatu form (komentar yang meminta input sesuatu dari user) ke layar. Misal ungkapan  cout << endl << ” Input Nama : ” berfungsi untuk menampilkan form “Input Nama :” ke layar agar user memberikan input berupa nama. Kemudian fungsi cin digunakan untuk memasukkan input yang diberikan user ke dalam suatu variabel. Misal ungkapan cin >> nama; berfungsi untuk memasukkan input yang diberikan user ke dalam variabel nama. Metode  getdata yang terdapat pada masing-masing kelas (kelas manajer dan kelas staff) mempunyai fungsi yang sama seperti pada kelas induk ini.

Di dalam metode putdata terdapat ungkapan seperti cout << endl << “ Nama : “ << nama, artinya yaitu input data yang diberikan user ke variabel nama akan ditampilkan ke layar kembali sebagai output di sebelah kanan karakter “Nama :”. Metode  putdata yang terdapat pada masing-masing kelas (kelas manajer dan kelas staff) mempunyai fungsi yang sama seperti pada kelas induk ini.

5. Pada kelas manajer (merupakan kelas turunan), terdapat ungkapan-ungkapan sebagai berikut :

class manajer : public pegawai // kelas turunan
{
private:
char bagian [batas];
double tunjangan;
public:
void getdata()
{
pegawai::getdata();
cout << " Input Bagian: ";
cin >> bagian;
cout << " Input Tunjangan Rp: ";
cin >> tunjangan;
}
void putdata()
{
pegawai::putdata();
cout << "\n Bagian	: "<< bagian;
cout << "\n Tunjangan	: "<< tunjangan;
}
};

Nama kelas ditulis dengan sintaks class manajer, yang menunjukkan bahwa manajer adalah nama suatu kelas. Ungkapan class manajer : public pegawai mengandung arti bahwa pada kelas manajer ini akan digunakan data dan fungsi yang bersifat public pada kelas pegawai. Tampak juga terdapat dua buah perubah akses (anggota kelas) yang digunakan pada kelas ini yaitu private dan public. Yang termasuk perubah akses private yaitu variabel bagian (bertipe data karakter (char) dengan panjang maksimum 80, sesuai nilai variabel batas) dan tunjangan (bertipe data bilangan pecahan / double).Yang termasuk perubah akses public yaitu metode getdata (bertipe void) dan putdata (bertipe void). Suatu fungsi yang tidak menghasilkan suatu nilai apapun maka bagian return type ini diganti dengan void. Karena kelas manajer ini merupakan kelas turunan, maka variabel bagian dan tunjangan merupakan variabel khusus dalam kelas ini.

Pada metode getdata terdapat ungkapan pegawai::getdata() yang artinya bahwa pada metode ini (kelas turunan) merujuk pada elemen-elemen getdata yang ada pada kelas pegawai (kelas induk), sehingga kelas manajer terdiri dari variabel nama, nip, bagian, dan tunjangan. Oleh sebab itu, pada kelas manajer ini hanya perlu ditambahkan isi metode getdata yang bersifat khusus dalam kelas ini yaitu variabel bagian dan tunjangan. Inilah yang disebut sebagai inheritance (pewarisan) dalam pemrograman berorientasi obyek. Hal yang sama juga berlaku dalam metode putdata.

6. Pada kelas staff (merupakan kelas abstrak), terdapat ungkapan-ungkapan sebagai berikut :

class staff:public pegawai //kelas turunan
{
private:
char bagian[batas];
public:
void getdata()
{
pegawai::getdata();
cout << " Input Bagian : ";
cin >> bagian;
}
void putdata()
{
pegawai::putdata();
cout << "\n Bagian:" << bagian;
}
};

Nama kelas ditulis dengan sintaks class staff, yang menunjukkan bahwa staff adalah nama suatu kelas. Ungkapan class staff : public pegawai mengandung arti bahwa pada kelas staff ini akan digunakan data dan fungsi yang bersifat public pada kelas pegawai. Tampak juga terdapat dua buah perubah akses (anggota kelas) yang digunakan pada kelas ini yaitu private dan public. Yang termasuk perubah akses private yaitu variabel bagian (bertipe data karakter (char) dengan panjang maksimum 80, sesuai nilai variabel batas).Yang termasuk perubah akses public yaitu metode getdata (bertipe void) dan putdata (bertipe void). Suatu fungsi yang tidak menghasilkan suatu nilai apapun maka bagian return type ini diganti dengan void. Karena kelas staff ini merupakan kelas turunan, maka variabel bagian merupakan variabel khusus dalam kelas ini.

Pada metode getdata terdapat ungkapan pegawai::getdata() yang artinya bahwa pada metode ini (kelas turunan) merujuk pada elemen-elemen getdata yang ada pada kelas pegawai (kelas induk), sehingga kelas staff terdiri dari variabel nama, nip, dan bagian. Oleh karena itu, pada kelas staff ini hanya perlu ditambahkan isi metode getdata yang bersifat khusus dalam kelas ini yaitu variabel bagian. Inilah yang disebut sebagai konsep inheritance (pewarisan) dalam pemrograman berorientasi obyek. Hal yang sama juga berlaku dalam metode putdata.

7. Pada kelas buruh_operasional (merupakan kelas abstrak), terdapat ungkapan-ungkapan sebagai berikut :

////kelas abstrak//
class buruh_operasional:public pegawai
{
};

Nama kelas ditulis dengan sintaks class buruh_operasional, yang menunjukkan bahwa buruh_operasional adalah nama suatu kelas. Ungkapan class buruh_operasional : public pegawai mengandung arti bahwa pada kelas buruh_operasional ini akan digunakan data dan fungsi yang bersifat public pada kelas pegawai. Tampak bahwa dalam kelas ini tidak mengandung data atau fungsi (termasuk metode) diantara tanda kurung kurawal. Keadaan seperti ini berarti kelas buruh_operasional ini tidak mempunyai variabel-variabel khusus yang membedakan dengan kelas induk (kelas pegawai). Artinya data dan fungsi (termasuk metode) yang digunakan dalam kelas ini sama persis dengan data dan fungsi (termasuk metode) yang digunakan dalam kelas induk (kelas pegawai), sehingga programmer tidak perlu menuliskan lagi semua bagian-bagian yang sama tersebut. Hal ini menunjukkan salah satu keuntungan pemrograman berorientasi obyek yang menggunakan konsep pewarisan. Seorang programmer memungkinkan untuk menghindari penulisan ulang fungsi dan data anggota berulang kali pada bagian yang sama.

8. Bagian program utama dalam keseluruhan program di atas yaitu sebagai berikut :

int main()
{
manajer m1,m2;
staff s1;
buruh_operasional b1;
cout<<endl;
cout<<"Input Data Manajer 1";
m1.getdata();
cout<<endl;
cout<<"Input Data Manajer 2";
m2.getdata();
cout<<endl;
cout<<"Input Data Staff 1";
s1.getdata();
cout<<"\nInput Data Buruh Operasional 1";
b1.getdata();
cout<<"\nData manajer 1";
m1.putdata();
cout<<"\nData manajer 2";
m2.putdata();
cout<<"\nData staff";
s1.putdata();
cout<<"\nData buruh operasional";
b1.putdata();
cout << endl;
return 0;
}

Penulisan listing program untuk bagian program utama selalu diawali dengan fungsi int main (). Fungsi dari program utama di atas yaitu untuk menentukan prosedur dan langkah eksekusi terhadap masing-masing kelas yang telah dibuat.

Pernyataan seperti manajer m1,m2; digunakan untuk melakukan inisialisasi terhadap kelas manajer ke variabel m1 dan m2. Demikian halnya pernyataan staff s1; dan buruh_operasional b1;.

Pernyataan yang berbentuk seperti :

…
cout<<endl;
cout<<"Input Data Manajer 1";
m1.getdata();
...

digunakan untuk menampilkan obyek m1 (yaitu Input Data Manajer 1) sesuai dengan metode getdata yaitu menampilkan suatu form yang berfungsi untuk meminta (memasukkan) input data kepada user. Fungsi endl digunakan untuk memasukkan suatu karakter dalam baris yang baru (new line).

Pernyataan yang berbentuk seperti :

…
cout<<"\nData manajer 1";
m1.putdata();
...

digunakan untuk menampilkan output obyek m1 sesuai dengan metode putdata yaitu menampilkan hasil eksekusi input data yang didapat dari metode getdata.

9.  Tanda kurung kurawal ({…}) digunakan untuk menandai bagian suatu isi kelas, bagian isi metode-metode di dalam kelas (behaviour), serta bagian isi program utama.

10. Tanda titik koma (;) digunakan untuk menandai akhir penulisan data dan fungsi dalam program. Tanda titik koma tidak digunakan untuk mengakhiri nama kelas, nama metode, nama perubah akses, serta inisialisasi program utama.

Hasil eksekusi terhadap program di atas yaitu :

praktikum@komputer07:~$ g++ PEGAWAI.CPP
In file included from /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/backward/iostream.h:31,
from PEGAWAI.CPP:8:
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for  the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
praktikum@komputer07:~$ ./a.out
Input Data Manajer 1
Input Nama : Budi
Input NIP : 54321
Input Bagian: Konsumsi
Input Tunjangan Rp: 300000
Input Data Manajer 2
Input Nama : Alex
Input NIP : 85362
Input Bagian: Keuangan
Input Tunjangan Rp: 400000
Input Data Staff 1
Input Nama : Adi
Input NIP : 42532
Input bagian : Perlengkapan
Input Data Buruh Operasional 1
Input Nama : Basuki
Input NIP : 67353
Data manajer 1
Nama : Budi
NIP : 54321
Bagian : Konsumsi
Tunjangan      : 300000
Data manajer 2
Nama : Alex
NIP : 85362
Bagian : Keuangan
Tunjangan      : 400000
Data staff
Nama : Adi
NIP : 42532
Bagian:Perlengkapan
Data buruh operasional
Nama : Basuki
NIP : 67353