Thursday, March 10, 2016

Konsep OOP Abstract Class

Posted by on Thursday, March 10, 2016

Abstract Class adalah kelas yang tidak dapat diinstansiasi. Method dalam kelas abstract tidak berisi kode implementasi program namun hanya dideklarasikan saja. Nantinya, method-method tersebut di override oleh sub-class nya.
 Contohnya :

public abstract void iniMethod();

Deklarasi method ini disebut dengan prototype method.
Java memiliki aturan-aturan dalam penggunaan method abstract dan abstract class sebagai berikut :
- Class yang di dalamnya terdapat abstract method harus dideklarasikan sebagai abstract class.
- Abstract class tidak dapat diinstansi, tetapi harus di turunkan
- Abstract class tidak dapat diinstansi (menjadi objek dari class abstract), tetapi kita dapat mendeklarasikan suatu variable yang bertipe abstract class dan membuat instansi dari variabel tersebut yang bertipe class turunan dari abstract class tersebut (teknik polymorphism).
- Sebuah class dapat dideklarasikan sebagai abstract class meskipun class tersebut tidak memiliki abstract method.
- Abstract method tidak boleh mempunyai body method dan demikian juga sebaliknya bahwa method yang tidak ditulis body methodnya maka harus dideklarasikan sebagai abstract method.

Jadi, fungsi abstract class tak lain adalah untuk membuat prototype bagi class di tingkatan paling atas dalam hierarki class dan subclass-nya yang menyediakan detail implementasi dari abstract class tersebut.
Sekarang kita akan coba mengimplementasikan konsep abstract class. Misalkan kita punya soal sebagai berikut :

CV. Maju Mundur memiliki 40 orang pegawai, dimana ke-40 pegawainya tersebut terbagi menjadi 2 status kepegawaian, yaitu sebagian pegawai tetap dan sebagian yang lain (sisanya) adalah pegawai kontrak. Secara umum perbedaan antara keduanya adalah pegawai tetap selain mendapatkan gaji juga mendapatkan tunjangan yang besarnya 200 ribu, sedangkan pegawai kontrak hanya mendapatkan gaji saja. Dari kasus diatas, dapat digambarkan class-class pegawai sebagai berikut :

- Class PegawaiKontrak, dengan atribut :
NoPeg : no pegawai kontrak (diinputkan)
Nama : nama pegawai (diinputkan)
MasaKontrak : lama kontrak pegawai (diinputkan)
Kehadiran : jumlah hari masuk dalam 1 bulan (diinputkan)
UangMakan : besarnya 6 ribu dikali jumlah kehadiran(tidak diinputkan)
Gaji : besarnya gaji pokok yang diterima tiap bulan(diinputkan)

- Class PegawaiTetap, dengan atribut :
NoPeg : no pegawai kontrak (diinputkan)
Nama : nama pegawai (diinputkan)
Kehadiran : jumlah hari masuk dalam 1 bulan (diinputkan)
Tunjangan : besarnya 200 ribu (tidak diinputkan)
UangMakan : besarnya 6 ribu dikali jumlah kehadiran(tidak diinputkan)
Gaji : besarnya gaji pokok yang diterima tiap bulan(diinputkan)

Method-method yang harus ada :
- hitungGaji() : untuk menghitung gaji bersih pegawai, dimana untuk pegawai kontrak = Uang Makan + Gaji, pegawai tetap = Tunjangan + Uang Makan + Gaji
- lihatData() : untuk menampilkan data-data pegawai secara lengkap beserta total gaji yang diterima (gaji bersih)

Dari kedua class diatas, analisa dan desainlah superclass yang tepat untuk kasus tersebut. Setelah itu buatlah class utama yaitu class PegawaiMajuMundur (yang menggunakan class-class diatas). Tentukan pula modifier yang tepat untuk semua class diatas (termasuk superclass-nya, mana yg final class dan mana yang abstract class).

Pertama, buat abstract class dengan nama Pegawai.java. Di dalam kelas ini terdapat dua method abstract yaitu hitung gaji dan lihat data.

/**
*
* @author Wim Sonevel
*/
public abstract class Pegawai {
abstract void hitungGaji();
abstract void lihatData();
}

Buat kelas PegawaiKontrak.java lalu extends dari kelas Pegawai. Override dua method dari kelas Pegawai.
/**
*
* @author Wim Sonevel
*/
public class PegawaiKontrak extends Pegawai{
int noPeg, kehadiran, gaji;
String nama, masaKontrak;

public PegawaiKontrak(int noPeg, String nama, String masaKontrak, int kehadiran, int gaji){
this.noPeg = noPeg;
this.nama = nama;
this.masaKontrak = masaKontrak;
this.kehadiran = kehadiran;
this.gaji = gaji;
}

public int getUangMakan(){
return 6000 * kehadiran;
}
//setter
public void setNoPeg(int noPeg){
this.noPeg = noPeg;
}
public void setNama(String nama){
this.nama = nama;
}
public void setMasaKontrak(String masaKontrak){
this.masaKontrak = masaKontrak;
}
public void setKehadiran(int kehadiran){
this.kehadiran = kehadiran;
}
public void setGaji(int gaji){
this.gaji = gaji;
}

public void lihatData(){
System.out.println("No. Pegawai : "+noPeg);
System.out.println("Nama Pegawai : "+nama);
System.out.println("Masa Kontrak : "+masaKontrak);
System.out.println("Kehadiran : "+kehadiran);
System.out.println("Uang Makan : "+getUangMakan());
System.out.println("Gaji : "+gaji);
}
public void hitungGaji(){
int gajiBersih = getUangMakan() + gaji;
System.out.println("Gaji Bersih : "+gajiBersih);
}
}

Buat kelas PegawaTetap.java lalu extends kelas Pegawai. Sama halnya dengan kelas PegawaiKontrak.java
/**
*
* @author Wim Sonevel
*/
public class PegawaiTetap extends Pegawai{
int noPeg, kehadiran, gaji;
String nama;
public final int tunjangan = 200000;

public PegawaiTetap(int noPeg, String nama, int kehadiran, int gaji){
this.noPeg = noPeg;
this.nama = nama;
this.kehadiran = kehadiran;
this.gaji = gaji;
}

public int getUangMakan(){
return 6000 * kehadiran;
}
//setter
public void setNoPeg(int noPeg){
this.noPeg = noPeg;
}
public void setNama(String nama){
this.nama = nama;
}
public void setKehadiran(int kehadiran){
this.kehadiran = kehadiran;
}
public void setGaji(int gaji){
this.gaji = gaji;
}

public void lihatData(){
System.out.println("No. Pegawai : "+noPeg);
System.out.println("Nama Pegawai : "+nama);
System.out.println("Kehadiran : "+kehadiran);
System.out.println("Uang Makan : "+getUangMakan());
System.out.println("Tunjangan : "+tunjangan);
System.out.println("Gaji : "+gaji);
}
public void hitungGaji(){
int gajiBersih = getUangMakan() + gaji;
System.out.println("Gaji Bersih : "+gajiBersih);
}
}

Kemudian kita akan menginstasiasi kelas PegawaiKontrak dan PegawaiTetap di KelasUtama.java
/**
*
* @author Wim Sonevel
*/
import java.io.*;
public class KelasUtama {
public static void main(String[] args){
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

Pegawai pg;
PegawaiKontrak pk = new PegawaiKontrak(0, "", "", 0, 0);
PegawaiTetap pt = new PegawaiTetap(0, "", 0, 0);

while(true){
System.out.println("MENU UTAMA");
System.out.println("=====================");
System.out.println("1. Input Data Pegawai");
System.out.println("2. Lihat Data Pegawai");
System.out.println("3. Keluar");

int pilih1 = 0;
int pilih2 = 0;
try{
System.out.print("Masukkan pilihan [1]/[2]/[3] : ");
pilih1 = Integer.parseInt(br.readLine());

if(pilih1==1){
System.out.println("1. Pegawai Kontrak");
System.out.println("2. Pegawai Tetap");
System.out.print("Masukkan pilihan [1]/[2] : ");
pilih2 = Integer.parseInt(br.readLine());

if(pilih2==1){
System.out.print("Input no. pegawai kontrak : ");
int no = Integer.parseInt(br.readLine());
System.out.print("Input nama pegawai kontrak : ");
String nama = br.readLine();
System.out.print("Input masa kontrak : ");
String masa = br.readLine();
System.out.print("Input kehadiran : ");
int hadir = Integer.parseInt(br.readLine());
System.out.print("Input gaji : ");
int gaji = Integer.parseInt(br.readLine());

pk = new PegawaiKontrak(no, nama, masa, hadir, gaji);
System.out.println("=====DATA TERSIMPAN=====\n");
}
System.out.print("Masukkan pilihan [1]/[2] : ");
pilih2 = Integer.parseInt(br.readLine());

if(pilih2==2){
System.out.print("Input no. pegawai tetap : ");
int no = Integer.parseInt(br.readLine());
System.out.print("Input nama pegawai tetap : ");
String nama = br.readLine();
System.out.print("Input kehadiran : ");
int hadir = Integer.parseInt(br.readLine());
System.out.print("Input gaji : ");
int gaji = Integer.parseInt(br.readLine());

pt = new PegawaiTetap(no, nama, hadir, gaji);
System.out.println("=====DATA TERSIMPAN=====\n");
}
}else if(pilih1==2){
System.out.println("===DATA PEGAWAI KONTRAK===");
pg = pk;
pg.lihatData();
pg.hitungGaji();
System.out.println("===DATA PEGAWAI TETAP===");
pg = pt;
pg.lihatData();
pg.hitungGaji();
}else{
System.exit(0);
}
}catch(IOException e){
System.out.println(e);
}
}
}
}

Jika di jalankan maka outputnya sebagai berikut :
MENU UTAMA
=====================
1. Input Data Pegawai
2. Lihat Data Pegawai
3. Keluar Masukkan pilihan [1]/[2]/[3] : 1
1. Pegawai Kontrak
2. Pegawai Tetap Masukkan pilihan [1]/[2] : 1
Input no. pegawai kontrak : 12345
Input nama pegawai kontrak : Wim
Input masa kontrak : 5
Input kehadiran : 20
Input gaji : 3000000
 =====DATA TERSIMPAN=====

Masukkan pilihan [1]/[2] : 2
Input no. pegawai tetap : 54321
Input nama pegawai tetap : Sonevel
Input kehadiran : 20
Input gaji : 4000000
=====DATA TERSIMPAN=====

MENU UTAMA
=====================
1. Input Data Pegawai
2. Lihat Data Pegawai
3. Keluar Masukkan pilihan [1]/[2]/[3] : 2

===DATA PEGAWAI KONTRAK===
 No. Pegawai : 12345
Nama Pegawai : Wim
Masa Kontrak : 5
Kehadiran : 20
Uang Makan : 120000
Gaji : 3000000
Gaji Bersih : 3120000

===DATA PEGAWAI TETAP===
No. Pegawai : 54321
Nama Pegawai : Sonevel
Kehadiran : 20
Uang Makan : 120000
Tunjangan : 200000
Gaji : 4000000
Gaji Bersih : 4120000

MENU UTAMA
=====================
1. Input Data Pegawai
2. Lihat Data Pegawai
3. Keluar Masukkan pilihan [1]/[2]/[3] :

Sekian dan Terima Kasih
Happy Coding :)
close