Menguasai Pemrograman Berorientasi Objek di Kelas 12: Contoh Soal dan Pembahasan Lengkap Semester 1
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.
Konsep Kunci PBO yang Akan Dibahas:
Sebelum masuk ke contoh soal, mari kita tinjau kembali beberapa konsep kunci PBO yang akan sering muncul:
- Kelas (Class): Cetak biru atau template untuk membuat objek. Mendefinisikan atribut (data) dan perilaku (metode/fungsi) yang akan dimiliki oleh objek.
- Objek (Object): Instansiasi dari sebuah kelas. Merupakan entitas nyata yang memiliki atribut dan dapat melakukan perilaku yang didefinisikan dalam kelasnya.
- Atribut (Attribute)/Properti: Variabel yang menyimpan data atau keadaan suatu objek.
- Metode (Method)/Fungsi: Blok kode yang mendefinisikan perilaku atau aksi yang dapat dilakukan oleh suatu objek.
- Konstruktor (Constructor): Metode khusus yang dipanggil secara otomatis saat sebuah objek dibuat. Biasanya digunakan untuk menginisialisasi atribut objek.
- Enkapsulasi (Encapsulation): Mekanisme untuk membungkus data (atribut) dan metode yang beroperasi pada data tersebut ke dalam satu unit (kelas). Tujuannya adalah untuk melindungi data dari akses langsung yang tidak diinginkan dan menyederhanakan penggunaan objek.
- Pewarisan (Inheritance): Mekanisme di mana sebuah kelas (kelas anak/subclass) dapat mewarisi atribut dan metode dari kelas lain (kelas induk/superclass). Ini mendukung prinsip "Don’t Repeat Yourself" (DRY) dan memungkinkan pembuatan hierarki kelas.
- Polimorfisme (Polymorphism): Kemampuan objek dari kelas yang berbeda untuk merespons panggilan metode yang sama dengan cara yang berbeda. Ini memungkinkan fleksibilitas dan ekstensibilitas dalam kode.
Contoh Soal dan Pembahasan
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 atributjudulsebagaiprivate. Ini berartijudulhanya dapat diakses dari dalam kelasBukuitu sendiri.public Buku(String judul, String penulis, int tahunTerbit): Ini adalah konstruktor kelasBuku. Saat kita membuat objekBukubaru, konstruktor ini akan dipanggil dan nilai-nilai yang diberikan akan digunakan untuk menginisialisasi atribut objek. Kata kuncithisdigunakan untuk membedakan antara parameter konstruktor dan atribut kelas.public String getJudul() return judul;: Ini adalah getter untuk atributjudul. Metode ini bersifatpublicsehingga dapat dipanggil dari luar kelas. Metode ini mengembalikan nilai dari atributjudul.public void tampilkanInfo() ...: Metode ini mencetak informasi lengkap dari objekBukuke konsol.public static void main(String args): Ini adalah metode utama (entry point) program. Di sini, kita membuat dua objekBuku(buku1danbuku2), kemudian memanggil metodetampilkanInfo()dangetJudul()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.
- Kelas
KaryawanTetapmewarisi dariKaryawandan menambahkan atributgajiPokok. - Kelas
KaryawanKontrakmewarisi dariKaryawandan menambahkan atributdurasiKontrak.
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 atributnamadannik, serta metodetampilkanInfoDasar().class KaryawanTetap extends Karyawan: Kata kunciextendsmenunjukkan bahwaKaryawanTetapadalah kelas turunan dariKaryawan. Ia mewarisinamadannik.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 metodetampilkanInfo()pada kelas turunan, kita memanggil metodetampilkanInfoDasar()dari kelas induk untuk menampilkan informasi umum karyawan sebelum menambahkan informasi spesifiknya.class KaryawanKontrak extends Karyawan: Sama sepertiKaryawanTetap, kelas ini mewarisi dariKaryawan.
>
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 metodebersuara()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 Hewandanclass Anjing extends Hewan: Kelas turunan yang meng-override metodebersuara()untuk memberikan implementasi spesifik.Hewan koleksiHewan = new Hewan;: Ini adalah inti dari demonstrasi polimorfisme. Kita membuat sebuah array bertipeHewan. Namun, kita dapat menyimpan objek dari kelas turunan (KucingdanAnjing) ke dalam array ini karena kelas turunan adalah "jenis khusus" dari kelas induk.hewan.bersuara();: Ketika loop berjalan, meskipun variabelhewanbertipeHewan, Java akan secara dinamis menentukan objek apa yang sebenarnya direferensikan olehhewansaat itu. Kemudian, ia akan memanggil metodebersuara()yang sesuai dengan objek tersebut (yaitu,Kucing.bersuara()atauAnjing.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.
- Buat kelas
Produksebagai kelas induk dengan atributnama,harga, danid. Sertakan metodetampilkanDetail()yang akan di-override oleh kelas turunan. - Buat kelas
Bukuyang mewarisi dariProdukdan menambahkan atributpenulisdanhalaman. OverridetampilkanDetail()untuk menyertakan informasi penulis dan halaman. - Buat kelas
Elektronikyang mewarisi dariProdukdan menambahkan atributmerekdangaransi. OverridetampilkanDetail()untuk menyertakan informasi merek dan garansi. - Buat kelas
Pakaianyang mewarisi dariProdukdan menambahkan atributukurandanwarna. OverridetampilkanDetail()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:
- Kelas
Produk: Bertindak sebagai base class yang mendefinisikan atribut dan metode umum. MetodetampilkanDetail()di sini adalah contoh dari metode yang dirancang untuk di-override. - Kelas Turunan (
Buku,Elektronik,Pakaian): Masing-masing mewarisi dariProdukdan menambahkan atribut spesifik. Mereka meng-override metodetampilkanDetail()untuk menampilkan informasi yang lebih rinci, sambil tetap memanggilsuper.tampilkanDetail()untuk menampilkan informasi umum dari kelas induk. - Kelas
ManajemenToko: Bagianmainmendemonstrasikan penggunaan polimorfisme. ArrayinventarisbertipeProduktetapi menyimpan objek dari kelas turunan. Ketikaproduk.tampilkanDetail()dipanggil dalam loop, Java memastikan bahwa implementasitampilkanDetail()yang benar untuk objekBuku,Elektronik, atauPakaianyang sedang diproseslah yang dieksekusi.
Kesimpulan
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!