Pemrograman Berorientasi Objek (PBO) merupakan salah satu topik fundamental dalam kurikulum informatika, khususnya di jenjang Sekolah Menengah Atas. Di kelas 12, PBO menjadi semakin mendalam, membekali siswa dengan pemahaman yang kokoh untuk menghadapi tantangan dunia pengembangan perangkat lunak. Semester 1 di kelas 12 biasanya berfokus pada konsep-konsep inti PBO, mulai dari dasar-dasar kelas dan objek, enkapsulasi, pewarisan, hingga polimorfisme.
Memahami konsep-konsep ini tidak cukup hanya dengan teori. Latihan soal yang bervariasi dan menantang adalah kunci untuk menguasai PBO. Artikel ini akan menyajikan beberapa contoh soal PBO kelas 12 semester 1 yang mencakup berbagai aspek penting, disertai dengan pembahasan mendalam untuk membantu Anda memahami setiap langkah solusi.
Sebelum masuk ke contoh soal, mari kita tinjau kembali beberapa konsep kunci PBO yang akan sering muncul:
Mari kita mulai dengan beberapa contoh soal yang dirancang untuk menguji pemahaman Anda terhadap konsep-konsep di atas. Kita akan menggunakan bahasa pemrograman Java sebagai contoh, karena merupakan salah satu bahasa yang paling umum digunakan untuk mengajarkan PBO di sekolah.
>
Soal 1: Dasar-Dasar Kelas dan Objek (Enkapsulasi)
Sebuah perpustakaan memiliki koleksi buku. Setiap buku memiliki judul, penulis, dan tahun terbit. Buatlah sebuah kelas Buku yang merepresentasikan sebuah buku. Kelas ini harus memiliki atribut-atribut tersebut dan metode untuk menampilkan informasi lengkap buku. Pastikan atribut-atributnya bersifat private dan gunakan metode public (getter) untuk mengaksesnya.
Pembahasan:
Untuk soal ini, kita perlu membuat sebuah kelas bernama Buku. Kelas ini akan memiliki tiga atribut: judul, penulis, dan tahunTerbit. Sesuai dengan prinsip enkapsulasi, atribut-atribut ini akan dideklarasikan sebagai private untuk mencegah akses langsung dari luar kelas.
Selanjutnya, kita perlu membuat metode public untuk mengakses nilai dari atribut-atribut private tersebut. Metode ini dikenal sebagai getter. Selain itu, kita akan membuat sebuah metode untuk menampilkan informasi buku secara keseluruhan.
// Kelas Buku
public class Buku
// Atribut private untuk enkapsulasi
private String judul;
private String penulis;
private int tahunTerbit;
// Konstruktor untuk menginisialisasi objek Buku
public Buku(String judul, String penulis, int tahunTerbit)
this.judul = judul;
this.penulis = penulis;
this.tahunTerbit = tahunTerbit;
// Getter untuk judul
public String getJudul()
return judul;
// Getter untuk penulis
public String getPenulis()
return penulis;
// Getter untuk tahunTerbit
public int getTahunTerbit()
return tahunTerbit;
// Metode untuk menampilkan informasi buku
public void tampilkanInfo()
System.out.println(" " + judul);
System.out.println("Penulis: " + penulis);
System.out.println("Tahun Terbit: " + tahunTerbit);
// Metode utama untuk menguji kelas Buku
public static void main(String args)
// Membuat objek Buku
Buku buku1 = new Buku("Laskar Pelangi", "Andrea Hirata", 2005);
Buku buku2 = new Buku("Bumi Manusia", "Pramoedya Ananta Toer", 1980);
// Menampilkan informasi buku menggunakan getter dan metode tampilkanInfo()
System.out.println("Informasi Buku 1:");
buku1.tampilkanInfo();
System.out.println("Judul buku 2 (melalui getter): " + buku2.getJudul());
System.out.println("nInformasi Buku 2:");
buku2.tampilkanInfo();
Penjelasan:
private String judul;: Mendeklarasikan atribut judul sebagai private. Ini berarti judul hanya dapat diakses dari dalam kelas Buku itu sendiri.public Buku(String judul, String penulis, int tahunTerbit): Ini adalah konstruktor kelas Buku. Saat kita membuat objek Buku baru, konstruktor ini akan dipanggil dan nilai-nilai yang diberikan akan digunakan untuk menginisialisasi atribut objek. Kata kunci this digunakan untuk membedakan antara parameter konstruktor dan atribut kelas.public String getJudul() return judul; : Ini adalah getter untuk atribut judul. Metode ini bersifat public sehingga dapat dipanggil dari luar kelas. Metode ini mengembalikan nilai dari atribut judul.public void tampilkanInfo() ... : Metode ini mencetak informasi lengkap dari objek Buku ke konsol.public static void main(String args): Ini adalah metode utama (entry point) program. Di sini, kita membuat dua objek Buku (buku1 dan buku2), kemudian memanggil metode tampilkanInfo() dan getJudul() untuk mendemonstrasikan cara kerja kelas.>
Soal 2: Pewarisan (Inheritance)
Sebuah perusahaan memiliki berbagai jenis karyawan, seperti Karyawan Tetap dan Karyawan Kontrak. Keduanya memiliki nama dan NIK (Nomor Induk Karyawan). Karyawan Tetap memiliki gaji pokok, sedangkan Karyawan Kontrak memiliki durasi kontrak.
Buatlah kelas Karyawan sebagai kelas induk yang memiliki atribut nama dan NIK. Kemudian, buatlah dua kelas turunan: KaryawanTetap dan KaryawanKontrak.
KaryawanTetap mewarisi dari Karyawan dan menambahkan atribut gajiPokok.KaryawanKontrak mewarisi dari Karyawan dan menambahkan atribut durasiKontrak.Sertakan konstruktor yang sesuai dan metode untuk menampilkan informasi masing-masing jenis karyawan.
Pembahasan:
Soal ini akan menguji pemahaman tentang pewarisan. Kita akan membuat kelas dasar Karyawan yang berisi atribut umum. Kemudian, KaryawanTetap dan KaryawanKontrak akan mewarisi dari Karyawan dan menambahkan atribut spesifik mereka.
// Kelas Induk: Karyawan
class Karyawan
private String nama;
private String nik;
// Konstruktor Karyawan
public Karyawan(String nama, String nik)
this.nama = nama;
this.nik = nik;
// Getter untuk nama
public String getNama()
return nama;
// Getter untuk NIK
public String getNik()
return nik;
// Metode umum untuk menampilkan informasi dasar karyawan
public void tampilkanInfoDasar()
System.out.println("Nama: " + nama);
System.out.println("NIK: " + nik);
// Kelas Turunan: KaryawanTetap
class KaryawanTetap extends Karyawan
private double gajiPokok;
// Konstruktor KaryawanTetap
public KaryawanTetap(String nama, String nik, double gajiPokok)
super(nama, nik); // Memanggil konstruktor kelas induk (Karyawan)
this.gajiPokok = gajiPokok;
// Getter untuk gajiPokok
public double getGajiPokok()
return gajiPokok;
// Metode untuk menampilkan informasi KaryawanTetap
public void tampilkanInfo()
super.tampilkanInfoDasar(); // Memanggil metode dari kelas induk
System.out.println("Jenis: Karyawan Tetap");
System.out.println("Gaji Pokok: Rp " + gajiPokok);
// Kelas Turunan: KaryawanKontrak
class KaryawanKontrak extends Karyawan
private int durasiKontrak; // dalam bulan
// Konstruktor KaryawanKontrak
public KaryawanKontrak(String nama, String nik, int durasiKontrak)
super(nama, nik); // Memanggil konstruktor kelas induk (Karyawan)
this.durasiKontrak = durasiKontrak;
// Getter untuk durasiKontrak
public int getDurasiKontrak()
return durasiKontrak;
// Metode untuk menampilkan informasi KaryawanKontrak
public void tampilkanInfo()
super.tampilkanInfoDasar(); // Memanggil metode dari kelas induk
System.out.println("Jenis: Karyawan Kontrak");
System.out.println("Durasi Kontrak: " + durasiKontrak + " bulan");
// Kelas utama untuk pengujian
public class PengelolaKaryawan
public static void main(String args)
KaryawanTetap kt = new KaryawanTetap("Budi Santoso", "123456789", 5000000.0);
KaryawanKontrak kk = new KaryawanKontrak("Siti Aminah", "987654321", 12);
System.out.println("--- Informasi Karyawan Tetap ---");
kt.tampilkanInfo();
System.out.println("n--- Informasi Karyawan Kontrak ---");
kk.tampilkanInfo();
Penjelasan:
class Karyawan: Ini adalah kelas induk. Memiliki atribut nama dan nik, serta metode tampilkanInfoDasar().class KaryawanTetap extends Karyawan: Kata kunci extends menunjukkan bahwa KaryawanTetap adalah kelas turunan dari Karyawan. Ia mewarisi nama dan nik.super(nama, nik);: Di dalam konstruktor kelas turunan, super() digunakan untuk memanggil konstruktor dari kelas induk. Ini penting untuk menginisialisasi atribut yang diwariskan.super.tampilkanInfoDasar();: Di dalam metode tampilkanInfo() pada kelas turunan, kita memanggil metode tampilkanInfoDasar() dari kelas induk untuk menampilkan informasi umum karyawan sebelum menambahkan informasi spesifiknya.class KaryawanKontrak extends Karyawan: Sama seperti KaryawanTetap, kelas ini mewarisi dari Karyawan.>
Soal 3: Polimorfisme
Misalkan kita memiliki sebuah kelas Hewan dengan metode bersuara(). Kemudian, kita memiliki kelas turunan Kucing dan Anjing, yang keduanya mengimplementasikan ulang (override) metode bersuara() dengan suara yang berbeda.
Buatlah kelas Hewan dan kelas turunannya Kucing serta Anjing. Demonstrasikan bagaimana polimorfisme bekerja dengan menggunakan array objek Hewan yang dapat menyimpan objek Kucing dan Anjing.
Pembahasan:
Soal ini berfokus pada polimorfisme, khususnya method overriding. Kita akan membuat kelas induk Hewan dengan metode bersuara(). Kemudian, kelas Kucing dan Anjing akan memiliki implementasi bersuara() mereka sendiri. Kunci dari polimorfisme di sini adalah kemampuan kita untuk memperlakukan objek Kucing dan Anjing sebagai objek Hewan dalam konteks tertentu, dan memanggil metode bersuara() yang sesuai dengan objek yang sebenarnya.
// Kelas Induk: Hewan
class Hewan
public void bersuara()
System.out.println("Hewan ini membuat suara...");
// Kelas Turunan: Kucing
class Kucing extends Hewan
@Override // Menandakan bahwa metode ini meng-override metode dari kelas induk
public void bersuara()
System.out.println("Meow!");
// Kelas Turunan: Anjing
class Anjing extends Hewan
@Override // Menandakan bahwa metode ini meng-override metode dari kelas induk
public void bersuara()
System.out.println("Guk! Guk!");
// Kelas utama untuk pengujian Polimorfisme
public class KebunBinatang
public static void main(String args)
// Membuat objek Kucing dan Anjing
Kucing kucing1 = new Kucing();
Anjing anjing1 = new Anjing();
System.out.println("--- Demonstrasi Polimorfisme ---");
// Menggunakan objek secara langsung
System.out.println("Kucing bersuara:");
kucing1.bersuara();
System.out.println("Anjing bersuara:");
anjing1.bersuara();
System.out.println("n--- Menggunakan Array Objek Hewan ---");
// Membuat array objek Hewan yang dapat menampung objek dari kelas turunan
Hewan koleksiHewan = new Hewan;
koleksiHewan = new Kucing(); // Objek Kucing disimpan sebagai Hewan
koleksiHewan = new Anjing(); // Objek Anjing disimpan sebagai Hewan
// Iterasi melalui array dan memanggil metode bersuara()
// Perhatikan bahwa metode yang dipanggil adalah yang sesuai dengan objek sebenarnya
for (Hewan hewan : koleksiHewan)
hewan.bersuara(); // Polimorfisme terjadi di sini!
Penjelasan:
class Hewan: Kelas induk dengan metode bersuara() yang generik.@Override: Anotasi ini opsional tetapi sangat direkomendasikan. Ini memberi tahu compiler bahwa metode ini dimaksudkan untuk meng-override metode dari kelas induk. Jika implementasi tidak sesuai, compiler akan memberikan error.class Kucing extends Hewan dan class Anjing extends Hewan: Kelas turunan yang meng-override metode bersuara() untuk memberikan implementasi spesifik.Hewan koleksiHewan = new Hewan;: Ini adalah inti dari demonstrasi polimorfisme. Kita membuat sebuah array bertipe Hewan. Namun, kita dapat menyimpan objek dari kelas turunan (Kucing dan Anjing) ke dalam array ini karena kelas turunan adalah "jenis khusus" dari kelas induk.hewan.bersuara();: Ketika loop berjalan, meskipun variabel hewan bertipe Hewan, Java akan secara dinamis menentukan objek apa yang sebenarnya direferensikan oleh hewan saat itu. Kemudian, ia akan memanggil metode bersuara() yang sesuai dengan objek tersebut (yaitu, Kucing.bersuara() atau Anjing.bersuara()). Inilah yang disebut runtime polymorphism.>
Soal 4: Kombinasi Konsep (Enkapsulasi, Pewarisan, Polimorfisme)
Sebuah sistem manajemen toko memiliki berbagai jenis produk: Buku, Elektronik, dan Pakaian. Semua produk memiliki nama, harga, dan ID unik.
Produk sebagai kelas induk dengan atribut nama, harga, dan id. Sertakan metode tampilkanDetail() yang akan di-override oleh kelas turunan.Buku yang mewarisi dari Produk dan menambahkan atribut penulis dan halaman. Override tampilkanDetail() untuk menyertakan informasi penulis dan halaman.Elektronik yang mewarisi dari Produk dan menambahkan atribut merek dan garansi. Override tampilkanDetail() untuk menyertakan informasi merek dan garansi.Pakaian yang mewarisi dari Produk dan menambahkan atribut ukuran dan warna. Override tampilkanDetail() untuk menyertakan informasi ukuran dan warna.Buatlah sebuah program yang dapat menyimpan berbagai jenis produk dalam sebuah array Produk dan kemudian menampilkan detail dari setiap produk menggunakan polimorfisme.
Pembahasan:
Soal ini menggabungkan ketiga konsep utama PBO: enkapsulasi (melalui penggunaan getter/setter jika diperlukan, meskipun dalam contoh ini fokus pada metode tampilkanDetail), pewarisan (untuk membuat hierarki produk), dan polimorfisme (untuk menampilkan detail produk secara dinamis).
// Kelas Induk: Produk
class Produk
private String nama;
private double harga;
private String id;
public Produk(String nama, double harga, String id)
this.nama = nama;
this.harga = harga;
this.id = id;
public String getNama()
return nama;
public double getHarga()
return harga;
public String getId()
return id;
// Metode yang akan di-override oleh kelas turunan
public void tampilkanDetail()
System.out.println("ID: " + id);
System.out.println("Nama Produk: " + nama);
System.out.println("Harga: Rp " + harga);
// Kelas Turunan: Buku
class Buku extends Produk
private String penulis;
private int halaman;
public Buku(String nama, double harga, String id, String penulis, int halaman)
super(nama, harga, id);
this.penulis = penulis;
this.halaman = halaman;
public String getPenulis()
return penulis;
public int getHalaman()
return halaman;
@Override
public void tampilkanDetail()
super.tampilkanDetail(); // Panggil metode dari kelas induk
System.out.println("Penulis: " + penulis);
System.out.println("Jumlah Halaman: " + halaman);
// Kelas Turunan: Elektronik
class Elektronik extends Produk
private String merek;
private String garansi; // Contoh: "1 Tahun", "6 Bulan"
public Elektronik(String nama, double harga, String id, String merek, String garansi)
super(nama, harga, id);
this.merek = merek;
this.garansi = garansi;
public String getMerek()
return merek;
public String getGaransi()
return garansi;
@Override
public void tampilkanDetail()
super.tampilkanDetail(); // Panggil metode dari kelas induk
System.out.println("Merek: " + merek);
System.out.println("Garansi: " + garansi);
// Kelas Turunan: Pakaian
class Pakaian extends Produk
private String ukuran;
private String warna;
public Pakaian(String nama, double harga, String id, String ukuran, String warna)
super(nama, harga, id);
this.ukuran = ukuran;
this.warna = warna;
public String getUkuran()
return ukuran;
public String getWarna()
return warna;
@Override
public void tampilkanDetail()
super.tampilkanDetail(); // Panggil metode dari kelas induk
System.out.println("Ukuran: " + ukuran);
System.out.println("Warna: " + warna);
// Kelas utama untuk pengujian Sistem Manajemen Toko
public class ManajemenToko
public static void main(String args)
// Membuat array Produk yang dapat menampung berbagai jenis produk
Produk inventaris = new Produk;
// Menambahkan objek produk ke dalam array
inventaris = new Buku("Filosofi Teras", 95000.0, "BK001", "Henry Manampiring", 340);
inventaris = new Elektronik("Smartphone X", 7500000.0, "EL001", "TechBrand", "2 Tahun");
inventaris = new Pakaian("Kaos Oblong", 150000.0, "PA001", "L", "Biru Dongker");
inventaris = new Buku("Sapiens: A Brief History of Humankind", 180000.0, "BK002", "Yuval Noah Harari", 496);
inventaris = new Elektronik("Laptop Pro", 15000000.0, "EL002", "CompTech", "1 Tahun");
System.out.println("--- Inventaris Toko ---");
System.out.println("=======================");
// Iterasi melalui array dan menampilkan detail setiap produk
for (Produk produk : inventaris)
produk.tampilkanDetail(); // Polimorfisme: memanggil metode yang sesuai
System.out.println("-----------------------");
Penjelasan:
Produk: Bertindak sebagai base class yang mendefinisikan atribut dan metode umum. Metode tampilkanDetail() di sini adalah contoh dari metode yang dirancang untuk di-override.Buku, Elektronik, Pakaian): Masing-masing mewarisi dari Produk dan menambahkan atribut spesifik. Mereka meng-override metode tampilkanDetail() untuk menampilkan informasi yang lebih rinci, sambil tetap memanggil super.tampilkanDetail() untuk menampilkan informasi umum dari kelas induk.ManajemenToko: Bagian main mendemonstrasikan penggunaan polimorfisme. Array inventaris bertipe Produk tetapi menyimpan objek dari kelas turunan. Ketika produk.tampilkanDetail() dipanggil dalam loop, Java memastikan bahwa implementasi tampilkanDetail() yang benar untuk objek Buku, Elektronik, atau Pakaian yang sedang diproseslah yang dieksekusi.Menguasai Pemrograman Berorientasi Objek di kelas 12 adalah investasi penting untuk masa depan Anda di dunia teknologi. Contoh-contoh soal di atas mencakup konsep-konsep inti seperti enkapsulasi, pewarisan, dan polimorfisme. Dengan memahami struktur kelas, bagaimana objek berinteraksi, dan bagaimana konsep-konsep ini dapat dikombinasikan, Anda akan lebih siap untuk menghadapi tugas pemrograman yang lebih kompleks dan tantangan di dunia nyata.
Ingatlah bahwa latihan adalah kunci. Cobalah untuk memodifikasi kode contoh, membuat skenario Anda sendiri, dan bereksperimen dengan berbagai kemungkinan. Semakin banyak Anda berlatih, semakin dalam pemahaman Anda, dan semakin percaya diri Anda dalam menerapkan prinsip-prinsip PBO. Selamat belajar!