Abstraction
Menyembunyikan detail implementasi, fokus pada "kontrak" atau "aturan main".
1. Pengantar & Analogi Dunia Nyata
Abstraction itu kayak Syarat Kelulusan dari kampus. Kampus cuma membuat aturan besar: "Setiap mahasiswa WAJIB punya Tugas Akhir & Sidang".
Kampus tidak peduli gimana detail teknisnya.
- Ada yang bikin Game RPG.
- Ada yang bikin Robot IoT.
- Ada yang bikin Aplikasi Web.
Yang penting, method sidang() itu ada dan harus dijalankan oleh setiap mahasiswa. Kampus cuma memberikan kerangka (interface/abstract), mahasiswa yang mengisi detailnya (concrete implementation).
Identity vs Capability
Biar gak bingung bedanya Abstract Class sama Interface:
- Abstract Class (Identity): Menjelaskan SIAPA dia.
- Contoh:
Mahasiswa(Abstrak).MahasiswaTeknik,MahasiswaSastra(Konkrit). Karena gak mungkin ada orang yang cuma "Mahasiswa" doang tanpa jurusan.
- Contoh:
- Interface (Capability): Menjelaskan APA YANG BISA dia lakukan.
- Contoh:
BisaCoding,BisaPresentasi. Mahasiswa Teknik bisa coding, Mahasiswa Sastra mungkin tidak.
- Contoh:
2. Konsep Teknis
Abstraction adalah proses menyembunyikan detail implementasi yang rumit dan hanya menampilkan fungsionalitas penting kepada pengguna.
Di Java, kita pakai dua cara:
- Abstract Class: Kelas setengah jadi (bisa punya method biasa + abstract method).
- Interface: Kontrak murni (semua method otomatis abstract/public).
3. Komponen Utama
A. Abstract Class
- Kelas yang gak bisa dibikin object-nya langsung (
new Student()-> ERROR). - Dipakai kalau kita mau bikin template dasar yang sebagian sudah jadi.
B. Interface
- Isinya cuma daftar method kosong (janji/kontrak).
- Dipakai kalau kita mau "memaksa" class lain untuk punya perilaku tertentu.
- Kata kuncinya
implements.
Multiple Implementation
Ini keunggulan Interface!
Kalau extends cuma bisa satu (Single Inheritance), tapi implements bisa BANYAK.
class MahasiswaHebat implements JagoCoding, JagoPresentasi, JagoOrganisasi { ... }
Perbedaan Utama
Berikut adalah perbandingan Abstract Class vs Interface:
| Fitur | Abstract Class | Interface |
|---|---|---|
| Pewarisan | extends (Single Inheritance) | implements (Multiple Inheritance) |
| Constructor | Punya | Tidak punya |
| Variable | Bebas (static, final, non-final) | Otomatis public static final (Konstanta) |
| Method | Bisa ada body-nya (Concrete) | Default kosong (Abstract), kecuali method default |
Aturan Instansiasi
Kamu TIDAK BISA membuat object langsung dari Interface/Abstract Class.
FinalProject fp = new FinalProject(); // ❌ Compile Error!
4. Studi Kasus Koding (Java)
Kita pakai Interface FinalProject sebagai kontrak kelulusan.
File 1: FinalProject.java (Kontrak)
// Interface: Cuma berisi 'janji'
public interface FinalProject {
// Method ini KOSONG (gak ada body {})
// Siapapun yang pakai interface ini, WAJIB bikin isinya.
void presentDefense();
}File 2: Implementasi (Mahasiswa Kreatif)
// Mahasiswa Game Dev MENYETUJUI kontrak FinalProject
public class GameDevProject implements FinalProject {
@Override
public void presentDefense() {
System.out.println("Mendemonstrasikan Game RPG 3D buatan sendiri.");
}
}
// Mahasiswa IoT MENYETUJUI kontrak FinalProject
public class IoTProject implements FinalProject {
@Override
public void presentDefense() {
System.out.println("Menunjukkan sistem Smart Home dengan sensor.");
}
}File 3: Main.java (Eksekusi)
public class Main {
public static void main(String[] args) {
// Kita gak bisa bikin object dari Interface langsung
// FinalProject project = new FinalProject(); // ❌ ERROR! Karena abstrak.
// Tapi kita bisa tampung implementasinya ke dalam variabel Interface
// (Polymorphism juga main di sini!)
FinalProject skripsiSaya = new GameDevProject();
FinalProject skripsiTeman = new IoTProject();
System.out.println("--- Sidang Skripsi Hari Ini ---");
// Penguji gak perlu tau detail kodingannya
// Cukup panggil method yang dijanjikan di Interface
skripsiSaya.presentDefense();
// Output: Mendemonstrasikan Game RPG 3D buatan sendiri.
skripsiTeman.presentDefense();
// Output: Menunjukkan sistem Smart Home dengan sensor.
}
}5. Bedah Kode
interface FinalProject: Ini cuma kertas perjanjian. "Siapa yang mau lulus, harus bisapresentDefense!".implements FinalProject:GameDevProjectdanIoTProjecttanda tangan kontrak. Mereka wajib nulis kode untuk methodpresentDefense. Kalau tidak, error compile!FinalProject skripsiSaya = ...: DiMain, kita lihat variabelnya bertipeFinalProject, tapi isinya object nyata (GameDevProject). Ini membuat kode fleksibel. Kita bisa ganti isinya jadiIoTProjecttanpa ubah tipe variabelnya.
6. Latihan
Sebuah sistem operasi membutuhkan driver universal untuk mencetak dokumen. Semua jenis dokumen (Tagihan, Laporan, Surat) harus memiliki kemampuan standar "Bisa Dicetak".
Gunakan Interface untuk membuat kontrak "Printable":
1. Interface Printable
- Method
void print(): Kontrak wajib tanpa implementasi.
2. Class Invoice (implements Printable)
- Attributes:
nomorInvoice(String),jumlah(int). - Constructor: Menerima
nomorInvoicedanjumlah. - Implementasi Method:
print(): CetakMencetak Invoice #<nomor> senilai Rp<jumlah>.
3. Class Report (implements Printable)
- Attributes:
judul(String). - Constructor: Menerima
judul. - Implementasi Method:
print(): CetakMencetak Laporan: <judul>.
Output yang Diharapkan
Mencetak Invoice #INV-001 senilai Rp150000
Mencetak Laporan: Laporan Tahunan7. Kesimpulan
Abstraction menyembunyikan kerumitan di balik layar.
- Penguji Sidang (User) tidak perlu tau ribetnya coding game engine.
- Dia cuma perlu tau satu hal: Mahasiswa ini bisa
presentDefense()atau tidak.
Selamat! 🚀 Kamu sudah mempelajari 4 pilar utama OOP:
- Encapsulation: Melindungi data.
- Inheritance: Mewarisi sifat (Reusability).
- Polymorphism: Satu nama, banyak bentuk.
- Abstraction: Menyembunyikan detail, fokus pada kontrak.
Sistemmu sudah rapi dengan Abstraction, tapi apa yang terjadi jika koneksi internet putus saat sidang? Mari belajar menangani situasi darurat di modul selanjutnya: Exception Handling