Di dalam Pemrograman Berorientasi Obyek (PBO) atau Object Oriented Programming (OOP), selain fitur inheritance, terdapat pula sebuah fitur di mana akan memudahkan kita, sebagai seorang programmer, untuk memikirkan ide dasar dalam mengkonstruksi sebuah class dengan fungsionalnya secara sederhana. Melalui fitur ini, untuk sementara kita bisa mengabaikan fungsionalnya secara detil dengan tidak menghilangkan fungsionalnya secara umum. Fitur ini disebut dengan abstraksi (abstraction).
Abstraksi juga merupakan salah satu kemampuan problem solving melalui pendekatan berpikir komputasional (computational thinking).
Artikel ini akan menjelaskan bagaimana konsep abstraksi secara lebih dalam di PBO, bagaimana karakteristiknya, cara implementasinya di Java, serta studi kasus penerapannya.
Untuk memudahkan pemahaman tentang konsep abstraksi, pertama akan diberikan sebuah contoh kasus. Misalkan kita diminta membuat program untuk menghitung luas dan keliling dari beberapa bangun datar, yaitu: persegi panjang, persegi, dan lingkaran, dengan pendekatan PBO. Untuk memudahkan ide pembuatan program, kita bisa menyederhanakan permasalahannya. Kita bisa mulai dari memikirkan grand desainnya, yaitu bagaimana kita mengkonstruksi sebuah class yaitu BangunDatar. Hal ini dikarenakan problem utamanya adalah tentang bangun datar. Selanjutnya, class BangunDatar secara umum memiliki fitur atau fungsional untuk menghitung luas dan keliling berdasarkan kasus yang diberikan. Untuk sementara, kita tidak perlu pedulikan unsur dari BangunDatar tersebut, dan bagaimana cara menghitung luas dan kelilingnya. Hal ini disebabkan unsur dan cara perhitungan luas dan keliling yang berbeda-beda untuk setiap bangun datar. Setelah kita memikirkan grand desain dari class BangunDatarnya, selanjutnya barulah kita pikirkan bagaimana mengidentifikasi unsur dari setiap jenis bangun datar, serta cara perhitungan luas dan kelilingnya secara detail.
Cara berpikir seperti di atas, berarti kita menerapkan konsep abstraksi. Class BangunDatar yang secara umum memiliki fungsionalitas untuk menghitung luas dan keliling, namun sifat keduanya masih abstrak. Hal ini disebabkan masih belum jelasnya unsur dari setiap bangun datar, serta bagaimana cara menghitung luas dan kelilingnya. Adapun detil dari penjabaran unsur bangun datar, serta cara perhitungan luas dan kelilingnya baru akan diberikan di setiap jenis bangun datar, yang dalam hal ini nantinya diposisikan sebagai subclass dari BangunDatar tersebut.
Karakteristik Abstraksi
Berikut ini beberapa karakteristik dari penerapan konsep abstraksi:
- Class yang masih bersifat abstrak tidak bisa dibuat obyeknya (instansiasi)
- Konsep abstraksi hanya bisa diterapkan melalui penerapan konsep pewarisan (inheritance)
- Jika ada sebuah class bersifat abstrak (superclass), maka subclassnya WAJIB mengimplementasikan method yang masih abstrak dari superclassnya.
- Jika subclassnya belum mengimplementasikan method superclass yang masih abstrak, maka subclassnya juga bersifat abstrak.
Implementasi Abstraksi di Java
Bagaimana implementasi abstraksi di Java? Pada bagian berikut ini akan dipaparkan bagaimana cara membuat class yang abstrak dan bagaimana mengimplementasikannya ke dalam subclassnya.
Untuk membuat class yang abstrak, caranya cukup mudah yaitu hanya menambahkan label ‘abstract’ pada method yang masih abstrak. Selanjutnya di depan nama classnya juga diberikan label ‘abstract‘. Perhatikan contoh di bawah ini.
public abstract class MyClass {
void myMethod1(){
System.out.println("Hello");
}
abstract void myMethod2();
}
Dalam contoh di atas, method myMethod2() sifatnya masih abstrak disebabkan belum jelasnya apa yang akan dilakukan dari method tersebut. Sedangkan myMethod1() tidaklah abstrak karena jelas dia akan mencetak “Hello” ketika dipanggil. Dikarenakan ada salah satu method di dalam class MyClass yang abstrak, sehingga secara umum class tersebut juga abstrak. Oleh karena itu perlu ditambahkan label ‘abstract’ di depan nama classnya.
Berdasarkan karakteristik abstraksi sebelumnya, kita tidak bisa melakukan instansiasi dari class MyClass dikarenakan keabstrakannya. Jika tetap dilakukan, maka akan error.
Selanjutnya, dari class MyClass yang masih abstrak, kita bisa membuat subclassnya. Subclass ini nantinya hukumnya WAJIB mengimplementasikan semua method yang masih abstrak dari superclassnya, dalam hal ini adalah myMethod2(). Perhatikan contoh berikut:
public class MyClass2 extends MyClass {
void myMethod2(){
System.out.println("Hello World");
}
}
Apabila class MyClass2 belum mengimplementasikan atau menjabarkan apa yang akan dilakukan dari myMethod2() yang masih abstrak milik superclassnya, maka MyClass2 nantinya juga akan bersifat abstrak (perlu dilabeli ‘abstract‘ supaya tidak error). Apabila MyClass2 masih abstrak dan dia punya subclass lagi, misalnya MyClass3, maka MyClass3 ini wajib mengimplementasikan myMethod2(), jika tidak maka MyClass3 ini juga bersifat abstrak. Demikian seterusnya.
Studi Kasus
Setelah penjabaran tentang teknis bagaimana menerapkan abstraksi di Java, selanjutnya akan diberikan studi kasus yang menerapkan konsep tersebut. Kasus yang akan diambil adalah sama seperti contoh yang diberikan di awal tutorial ini, yaitu tentang membuat program untuk menghitung luas dan keliling bangun datar: persegi panjang, persegi, dan lingkaran.
Dengan menggunakan diagram UML, kita bisa mendesain struktur class-classnya sebagai berikut:
Dari diagram UML di atas, tampak bahwa kita bisa mendesain class BangunDatar yang bersifat abstrak. Secara umum class ini memiliki fitur untuk menghitung luas melalui method hitungLuas(), menghitung keliling dengan method hitungKeliling(), serta untuk menampilkan hasilnya (luas dan keliling) melalui tampilHasil(). Adapun hitungLuas() dan hitungKeliling(), keduanya masih abstrak (ditandai dengan tulisan italic pada UML) dikarenakan formula keduanya berbeda-beda untuk setiap bangun datar. Sedangkan untuk tampilHasil() tidaklah abstrak.
Berikut ini isi kode program Java dari class BangunDatar.
public abstract class BangunDatar {
// method abstrak
abstract double hitungLuas();
abstract double hitungKeliling();
// method non abstrak
void tampilHasil(){
System.out.println("Luasnya: " + this.hitungLuas());
System.out.println("Kelilingnya: " + this.hitungKeliling());
}
}
Method tampilHasil() dalam hal ini tidak abstrak karena sudah jelas di dalamnya hanya menampilkan hasil hitung luas dan kelilingnya. Namun, proses perhitungan keduanya masih belum jelas (abstrak).
Selanjutnya akan dibuat class untuk setiap bangun datarnya, yaitu class PersegiPanjang, class Persegi, dan class Lingkaran. Apabila dilihat dari desain UML nya, maka ketiga class ini merupakan subclass dari class BangunDatar. Di setiap class ini nanti bisa ditambahkan atribut-atribut yang disesuaikan dengan class masing-masing, sesuai dengan unsur yang ada di setiap jenis bangun datar tersebut. Dikarenakan ketiga class tersebut adalah subclass dari BangunDatar yang abstrak, maka ketiganya wajib untuk mengimplementasikan method hitungLuas() dan hitungKeliling() yang masih abstrak.
Berikut ini adalah kode program untuk masing-masing class tersebut.
public class Lingkaran extends BangunDatar {
int jejari;
@Override
double hitungLuas(){
return Math.PI * this.jejari * this.jejari;
}
@Override
double hitungKeliling(){
return 2 * Math.PI * this.jejari;
}
}
public class PersegiPanjang extends BangunDatar {
int panjang;
int lebar;
@Override
double hitungLuas(){
return this.panjang * this.lebar;
}
@Override
double hitungKeliling(){
return 2 * (this.panjang + this.lebar);
}
}
public class Persegi extends BangunDatar {
int sisi;
@Override
double hitungLuas(){
return this.sisi * this.sisi;
}
@Override
double hitungKeliling(){
return 4 * this.sisi;
}
}
Secara teknis, untuk mengimplementasikan method yang masih abstrak dari superclassnya adalah dengan melakukan overriding terhadap method tersebut, seperti yang ditunjukkan pada kode program Java di atas untuk setiap classnya.
Setelah subclass tiap jenis bangun datar dibuat, selanjutnya kita coba menerapkannya untuk menghitung luas beberapa bangun datar. Berikut ini adalah kode program untuk main class nya.
public class MainClass {
public static void main(String[] args) {
// hitung luas & keliling lingkaran r=10
Lingkaran l1 = new Lingkaran();
l1.jejari = 10;
l1.tampilHasil();
// hitung luas & keliling persegi panjang p=10 l=5
PersegiPanjang pp1 = new PersegiPanjang();
pp1.panjang = 10;
pp1.lebar = 5;
pp1.tampilHasil();
// hitung luas & keliling persegi s=7
Persegi p1 = new Persegi();
p1.sisi = 7;
p1.tampilHasil();
}
}
Mudah bukan konsep abstraksi ini? Melalui penerapan abstraksi seperti di atas, nantinya akan memudahkan bagi programmer untuk menambah lagi jenis bangun datar lainnya, misalnya bangun segitiga atau jajaran genjang. Dalam hal ini cukup dengan membuat subclass dari BangunDatar nya, saja dan menjabarkan formula untuk menghitung luas dan keliling masing-masing. Dengan penerapan abstraksi akan lebih memudahkan dalam memahami struktur ide pengembangan program, terutama struktur class-classnya.
Anda dapat melihat versi tutorialnya dalam bentuk video melalui Youtube di bawah ini, sekaligus diberikan contoh studi kasus lainnya.
Demikian tutorial tentang konsep Abstraksi di dalam PBO serta implementasinya di Java. Selamat belajar dan semoga bermanfaat.


