Pemrograman Berorientasi Objek (PBO) merupakan fondasi penting dalam pengembangan perangkat lunak modern. Di tingkat Sekolah Menengah Atas (SMA), khususnya di kelas 12 semester 2, siswa diharapkan mampu memahami dan mengimplementasikan konsep-konsep PBO secara mendalam. Materi PBO tidak hanya tentang menghafal sintaks, tetapi lebih kepada pemahaman paradigma yang memungkinkan pembuatan kode yang modular, mudah dipelihara, dan dapat digunakan kembali.
Artikel ini akan menyajikan serangkaian contoh soal PBO yang relevan untuk siswa kelas 12 semester 2, lengkap dengan penjelasan rinci mengenai konsep yang diuji. Tujuannya adalah untuk membantu siswa menguasai materi, mengidentifikasi area yang perlu diperdalam, dan mempersiapkan diri menghadapi ujian akhir.
Prasyarat dan Fokus Materi
Sebelum mendalami contoh soal, mari kita ingat kembali beberapa konsep kunci PBO yang biasanya menjadi fokus di kelas 12 semester 2:
Kita akan membahas contoh soal yang mencakup kombinasi dari konsep-konsep ini. Bahasa pemrograman yang umum digunakan dalam konteks ini adalah Java atau C++. Untuk konsistensi, kita akan menggunakan sintaks yang lebih menyerupai Java dalam penjelasan, namun prinsipnya dapat diterapkan pada bahasa PBO lainnya.
Soal:
Buatlah sebuah kelas Buku yang merepresentasikan sebuah buku. Kelas ini harus memiliki atribut judul (String), penulis (String), dan stok (int).
judul dan penulis harus bersifat private dan hanya dapat diakses melalui metode getter.stok harus bersifat private dan dapat diubah nilainya melalui metode setter. Selain itu, buatlah metode tambahStok(int jumlah) yang menambahkan nilai stok dengan jumlah yang diberikan. Pastikan jumlah yang ditambahkan tidak negatif.Buku yang menerima judul, penulis, dan stok awal.displayInfo() yang menampilkan informasi lengkap buku (judul, penulis, dan stok).Penjelasan Konsep yang Diuji:
Soal ini menguji pemahaman dasar tentang:
private untuk atribut judul, penulis, dan stok menunjukkan prinsip enkapsulasi, di mana data dilindungi dari akses langsung dari luar kelas.Buku saat pertama kali dibuat.getJudul(), getPenulis() untuk membaca nilai atribut private, dan setStok() untuk memodifikasi stok.tambahStok() sebagai metode yang melakukan operasi spesifik pada atribut stok dengan validasi.Contoh Implementasi (Java-like):
public class Buku
private String judul;
private String penulis;
private int stok;
// Konstruktor
public Buku(String judul, String penulis, int stokAwal)
this.judul = judul;
this.penulis = penulis;
this.stok = stokAwal;
// Getter untuk judul
public String getJudul()
return judul;
// Getter untuk penulis
public String getPenulis()
return penulis;
// Getter untuk stok (opsional, tapi baik untuk melengkapi)
public int getStok()
return stok;
// Setter untuk stok
public void setStok(int stokBaru)
if (stokBaru >= 0) // Validasi agar stok tidak negatif
this.stok = stokBaru;
else
System.out.println("Error: Stok tidak boleh negatif.");
// Metode kustom untuk menambah stok
public void tambahStok(int jumlah)
if (jumlah > 0)
this.stok += jumlah;
System.out.println(jumlah + " buku '" + this.judul + "' berhasil ditambahkan ke stok. Stok sekarang: " + this.stok);
else
System.out.println("Error: Jumlah stok yang ditambahkan harus positif.");
// Metode untuk menampilkan informasi buku
public void displayInfo()
System.out.println("--------------------");
System.out.println(" " + this.judul);
System.out.println("Penulis: " + this.penulis);
System.out.println("Stok: " + this.stok);
System.out.println("--------------------");
public static void main(String args)
// Contoh penggunaan kelas Buku
Buku buku1 = new Buku("Laskar Pelangi", "Andrea Hirata", 50);
buku1.displayInfo();
buku1.tambahStok(15);
buku1.displayInfo();
buku1.setStok(100);
buku1.displayInfo();
// Mencoba memasukkan nilai negatif untuk stok
buku1.setStok(-5);
buku1.displayInfo(); // Stok seharusnya tidak berubah
Soal:
Buatlah sebuah kelas Kendaraan sebagai kelas induk dengan atribut merk (String) dan tahunProduksi (int). Kelas ini memiliki konstruktor untuk menginisialisasi atribut tersebut dan sebuah metode tampilkanDetail() yang menampilkan merk dan tahun produksi.
Selanjutnya, buatlah dua kelas turunan dari Kendaraan:
Mobil dengan atribut tambahan jumlahPintu (int). Tambahkan konstruktor untuk Mobil yang memanggil konstruktor kelas induk dan menginisialisasi jumlahPintu. Override metode tampilkanDetail() untuk menambahkan informasi jumlah pintu.Motor dengan atribut tambahan tipeMesin (String). Tambahkan konstruktor untuk Motor yang memanggil konstruktor kelas induk dan menginisialisasi tipeMesin. Override metode tampilkanDetail() untuk menambahkan informasi tipe mesin.Penjelasan Konsep yang Diuji:
Soal ini berfokus pada:
Mobil dan Motor mewarisi merk dan tahunProduksi dari Kendaraan. Ini menghindari duplikasi kode.Kendaraan sebagai superclass, Mobil dan Motor sebagai subclass.super() untuk memanggil konstruktor kelas induk dari konstruktor kelas turunan.tampilkanDetail() di kelas turunan untuk memberikan perilaku yang spesifik.Contoh Implementasi (Java-like):
// Kelas Induk (Superclass)
class Kendaraan
protected String merk; // Menggunakan protected agar bisa diakses oleh subclass
protected int tahunProduksi;
public Kendaraan(String merk, int tahunProduksi)
this.merk = merk;
this.tahunProduksi = tahunProduksi;
public void tampilkanDetail()
System.out.println("Merk: " + merk);
System.out.println("Tahun Produksi: " + tahunProduksi);
// Kelas Turunan (Subclass) Mobil
class Mobil extends Kendaraan
private int jumlahPintu;
public Mobil(String merk, int tahunProduksi, int jumlahPintu)
super(merk, tahunProduksi); // Memanggil konstruktor kelas induk
this.jumlahPintu = jumlahPintu;
// Override method tampilkanDetail
@Override
public void tampilkanDetail()
super.tampilkanDetail(); // Memanggil method tampilkanDetail dari kelas induk
System.out.println("Jumlah Pintu: " + jumlahPintu);
// Kelas Turunan (Subclass) Motor
class Motor extends Kendaraan
private String tipeMesin;
public Motor(String merk, int tahunProduksi, String tipeMesin)
super(merk, tahunProduksi); // Memanggil konstruktor kelas induk
this.tipeMesin = tipeMesin;
// Override method tampilkanDetail
@Override
public void tampilkanDetail()
super.tampilkanDetail(); // Memanggil method tampilkanDetail dari kelas induk
System.out.println("Tipe Mesin: " + tipeMesin);
public class MainKendaraan
public static void main(String args)
Mobil avanza = new Mobil("Toyota", 2022, 4);
Motor ninja = new Motor("Kawasaki", 2023, "2-Silinder");
System.out.println("Detail Mobil:");
avanza.tampilkanDetail();
System.out.println("nDetail Motor:");
ninja.tampilkanDetail();
Soal:
Buatlah sebuah kelas Kalkulator dengan beberapa metode:
tambah(int a, int b) yang menjumlahkan dua bilangan bulat.tambah(double a, double b) yang menjumlahkan dua bilangan desimal. (Ini adalah contoh method overloading).KalkulatorIlmuan yang mewarisi dari Kalkulator. Tambahkan metode tambah(int a, int b, int c) yang menjumlahkan tiga bilangan bulat.tambah(int a, int b) di KalkulatorIlmuan untuk menambahkan fungsionalitas tambahan, misalnya mencetak pesan bahwa operasi penjumlahan dilakukan oleh kalkulator ilmuan. (Ini adalah contoh method overriding).Penjelasan Konsep yang Diuji:
Soal ini fokus pada dua aspek polimorfisme:
Contoh Implementasi (Java-like):
// Kelas Induk
class Kalkulator
// Method Overloading: Menjumlahkan dua integer
public int tambah(int a, int b)
System.out.println("Menjumlahkan dua integer (Kalkulator Biasa)...");
return a + b;
// Method Overloading: Menjumlahkan dua double
public double tambah(double a, double b)
System.out.println("Menjumlahkan dua double (Kalkulator Biasa)...");
return a + b;
// Kelas Turunan
class KalkulatorIlmuan extends Kalkulator
// Method Overloading tambahan di kelas turunan
public int tambah(int a, int b, int c)
System.out.println("Menjumlahkan tiga integer (Kalkulator Ilmuan)...");
return a + b + c;
// Method Overriding: Mengganti implementasi tambah(int, int) dari kelas induk
@Override
public int tambah(int a, int b)
System.out.println("Melakukan operasi penjumlahan oleh Kalkulator Ilmuan!");
return super.tambah(a, b); // Memanggil implementasi dari kelas induk (opsional jika ingin menambahkan fungsionalitas)
public class MainPolimorfisme
public static void main(String args)
Kalkulator kalkulatorBiasa = new Kalkulator();
KalkulatorIlmuan kalkulatorIlmuan = new KalkulatorIlmuan();
// Menguji Method Overloading pada KalkulatorBiasa
System.out.println("Hasil tambah(5, 3) : " + kalkulatorBiasa.tambah(5, 3));
System.out.println("Hasil tambah(5.5, 3.2) : " + kalkulatorBiasa.tambah(5.5, 3.2));
System.out.println("n--------------------n");
// Menguji Method Overriding dan Overloading pada KalkulatorIlmuan
// Panggilan ke tambah(int, int) akan menggunakan implementasi di KalkulatorIlmuan
System.out.println("Hasil tambah(10, 20) : " + kalkulatorIlmuan.tambah(10, 20));
// Panggilan ke tambah(int, int, int) akan menggunakan implementasi di KalkulatorIlmuan
System.out.println("Hasil tambah(10, 20, 30) : " + kalkulatorIlmuan.tambah(10, 20, 30));
// Jika kita ingin menguji method tambah(double, double) dari kelas induk
// kita bisa memanggilnya secara eksplisit jika tidak di-override
// System.out.println("Hasil tambah(10.1, 20.2) : " + kalkulatorIlmuan.tambah(10.1, 20.2)); // Ini akan error jika tidak ada tambah(double, double) di KalkulatorIlmuan
// Untuk memanggil method dari kelas induk yang tidak di-override (jika ada di kelas induk saja):
// Anda bisa membuat instance Kalkulator untuk memanggilnya, atau jika ada di KalkulatorIlmuan.
// Dalam kasus ini, tambah(double, double) hanya ada di Kalkulator.
// Jika Anda ingin KalkulatorIlmuan bisa melakukan ini, Anda harus mewarisinya juga atau menambahkannya di KalkulatorIlmuan.
// Namun, jika kita memanggilnya dari instance KalkulatorIlmuan, ia akan mencari di kelasnya sendiri terlebih dahulu.
// Jika tidak ada, ia akan mencari di superclass.
System.out.println("Hasil tambah(10.1, 20.2) : " + kalkulatorIlmuan.tambah(10.1, 20.2));
Soal:
Bentuk dengan sebuah abstract method hitungLuas(). Buatlah kelas turunan Persegi dan Lingkaran dari Bentuk. Implementasikan hitungLuas() untuk menghitung luas persegi (sisi sisi) dan luas lingkaran (π jari-jari * jari-jari).interface bernama BisaTerbang dengan sebuah metode terbang(). Buatlah kelas Burung dan Pesawat yang mengimplementasikan BisaTerbang. Implementasikan metode terbang() untuk masing-masing kelas.Penjelasan Konsep yang Diuji:
Soal ini menguji pemahaman tentang abstraksi melalui dua mekanisme utama:
Contoh Implementasi (Java-like):
// Bagian 1: Menggunakan Abstract Class
// Abstract Class
abstract class Bentuk
public abstract double hitungLuas(); // Abstract method
// Kelas Turunan 1
class Persegi extends Bentuk
private double sisi;
public Persegi(double sisi)
this.sisi = sisi;
@Override
public double hitungLuas()
return sisi * sisi;
// Kelas Turunan 2
class Lingkaran extends Bentuk
private double jariJari;
private static final double PI = 3.14159;
public Lingkaran(double jariJari)
this.jariJari = jariJari;
@Override
public double hitungLuas()
return PI * jariJari * jariJari;
// Bagian 2: Menggunakan Interface
// Interface
interface BisaTerbang
void terbang(); // Metode abstrak secara default
// Kelas Implementasi 1
class Burung implements BisaTerbang
@Override
public void terbang()
System.out.println("Burung mengepakkan sayapnya dan terbang tinggi.");
// Kelas Implementasi 2
class Pesawat implements BisaTerbang
@Override
public void terbang()
System.out.println("Pesawat menyalakan mesinnya dan lepas landas.");
public class MainAbstraksi
public static void main(String args)
// Penggunaan Abstract Class
System.out.println("--- Penggunaan Abstract Class ---");
Bentuk persegi = new Persegi(5.0);
Bentuk lingkaran = new Lingkaran(7.0);
System.out.println("Luas Persegi: " + persegi.hitungLuas());
System.out.println("Luas Lingkaran: " + lingkaran.hitungLuas());
System.out.println("n--------------------n");
// Penggunaan Interface
System.out.println("--- Penggunaan Interface ---");
BisaTerbang burung = new Burung();
BisaTerbang pesawat = new Pesawat();
burung.terbang();
pesawat.terbang();
Tips Belajar Efektif untuk PBO:
Penutup
Pemahaman yang kuat terhadap konsep-konsep Pemrograman Berorientasi Objek akan membuka pintu ke dunia pengembangan perangkat lunak yang lebih luas. Contoh soal di atas mencakup inti materi PBO yang biasanya diajarkan di kelas 12 semester 2. Dengan terus berlatih dan mendalami setiap konsep, Anda akan semakin mahir dalam merancang dan membangun aplikasi yang kompleks dan efisien. Selamat belajar dan teruslah berkarya!