A. Pengertian Abstraksi
Menyembunyikan detail yang tidak penting dan hanya menampilkan fitur penting dari suatu objek.
Contoh Singkat:
Saat menekan tombol "start" pada motor:
- Yang kita lihat hanya tombolnya
- Kita tidak perlu tahu bagaimana busi menyala, oli berjalan, piston bekerja, dll
→ Itulah abstraksi.
B. Analogi Abstraksi dalam Kehidupan Nyata
1. ATM
Saat menekan “Tarik Tunai”:
- Kamu tidak tahu proses enkripsi
- Kamu tidak tahu komunikasi ke server bank
- Kamu tidak tahu bagaimana saldo dikurangi
Kamu hanya melihat fitur penting: tarik uang.
Detail kompleks tersembunyi.
2. Tombol Lampu
- Kamu hanya menekan saklar
- Kamu tidak perlu tahu kabel mana
- Kamu tidak perlu tahu tegangan listrik
Fokus pada apa (menyalakan), bukan bagaimana.
3. Kendaraan
Semua kendaraan bisa “bergerak”, tetapi:
- Mobil → roda
- Kapal → baling-baling
- Pesawat → mesin turbofan
Kata “bergerak” adalah abstraksi, sedangkan cara bergeraknya berbeda-beda.
4. Pahlawan Super
Semua pahlawan bisa “menyerang”, tetapi:
- Iron Man → laser
- Thor → palu
- Hulk → pukulan
Nama tindakan sama (“menyerang”), tapi cara berbeda.
C. Tujuan Abstraksi
3. Memisahkan konsep apa yang harus dilakukan dari bagaimana melakukannya.
4. Mencegah pengguna mengakses detail yang tidak diperlukan.
5. Mempermudah pengembangan sistem skala besar.
D. Mengapa Abstraksi Penting dalam PBO?
- Tanpa abstraksi, programmer harus tahu detail mesin, database, UI, struktur data, dll.
- Dengan abstraksi, setiap bagian sistem dapat berkomunikasi tanpa tahu cara kerja internal.
Contoh:
Program kasir cukup memanggilpembayaran.qris(), tanpa tahu cara bank memverifikasi transaksi.E. Jenis Abstraksi dalam PBO
- Menyembunyikan data dalam class menggunakan private.
- Diakses melalui getter/setter (ini mirip enkapsulasi).
- Abstract Class
- Interface
F. Abstraksi Menggunakan Abstract Class
1. Pengertian Abstract Class
- Class yang tidak dapat dibuat objek secara langsung.
- Mengandung method abstrak (tanpa isi).
- Berfungsi sebagai template / kerangka dasar.
Format:
public abstract class NamaClass {public abstract void namaMethod();}
2. Contoh Abstract Class
public abstract class Bentuk {public abstract double hitungLuas();}
Penjelasan:
Bentukadalah konsep umum- Semua bentuk pasti punya luas, tapi cara menghitungnya beda-beda.
- Karena rumusnya berbeda, method
hitungLuas()dibuat abstrak.
G. Subclass Konkret (Implementasi Abstraksi)
Subclass 1: Persegi
public class Persegi extends Bentuk {private double sisi;public Persegi(double sisi) {this.sisi = sisi;}@Overridepublic double hitungLuas() {return sisi * sisi;}}
Subclass 2: Lingkaran
public class Lingkaran extends Bentuk {private double r;public Lingkaran(double r) {this.r = r;}@Overridepublic double hitungLuas() {return Math.PI * r * r;}}
Class Main (Pengujian)
public class Main {public static void main(String[] args) {Bentuk b1 = new Persegi(5);Bentuk b2 = new Lingkaran(7);System.out.println("Luas Persegi : " + b1.hitungLuas());System.out.println("Luas Lingkaran : " + b2.hitungLuas());}}
Output
Luas Persegi : 25.0Luas Lingkaran : 153.93804002589985
H. Pembahasan Kode (Ringkas & Jelas)
1. Kenapa Bentuk harus abstrak?
Karena Bentuk adalah konsep umum yang tidak bisa dibuat objek secara nyata.
2. Kenapa hitungLuas() abstrak?
Karena setiap bentuk memiliki rumus berbeda, jadi detail perhitungan diserahkan ke subclass.
3. Apa manfaatnya?
Saat menambah bentuk baru (misalnya Segitiga), kita tidak perlu mengubah class lain.
I. Abstraksi Menggunakan Interface
Interface mendefinisikan perilaku murni tanpa implementasi.
Contoh Interface
public interface Kendaraan {void bergerak();}
Subclass yang Mengimplementasikan Interface
public class Mobil implements Kendaraan {public void bergerak() {System.out.println("Mobil bergerak dengan roda.");}}public class Kapal implements Kendaraan {public void bergerak() {System.out.println("Kapal bergerak dengan baling-baling.");}}
Main
public class Main {public static void main(String[] args) {Kendaraan k1 = new Mobil();Kendaraan k2 = new Kapal();k1.bergerak();k2.bergerak();}}
Output:
Mobil bergerak dengan roda.Kapal bergerak dengan baling-baling.
J. Studi Kasus
Sistem Pembayaran Kantin Digital
Abstract Class
public abstract class Pembayaran {public abstract void prosesPembayaran(int total);}
Subclass
public class Cash extends Pembayaran {@Overridepublic void prosesPembayaran(int total) {System.out.println("Bayar tunai sebesar: " + total);}}public class QRIS extends Pembayaran {@Overridepublic void prosesPembayaran(int total) {System.out.println("Bayar via QRIS sebesar: " + total);}}
Pembayaran p = new QRIS();p.prosesPembayaran(15000);
Bayar via QRIS sebesar: 15000