Pemrograman Berorientasi Objek (PBO) merupakan salah satu pilar penting dalam dunia pengembangan perangkat lunak modern. Di tingkat Sekolah Menengah Atas (SMA), kelas 11 menjadi gerbang awal yang krusial untuk memahami konsep-konsep dasar PBO. Memasuki semester 1, siswa akan diperkenalkan pada fundamental seperti objek, kelas, enkapsulasi, pewarisan, dan polimorfisme. Penguasaan materi ini tidak hanya membekali siswa dengan keterampilan teknis, tetapi juga melatih pola pikir logis dan analitis yang sangat berharga.
Artikel ini akan membahas secara mendalam beberapa contoh soal PBO yang umum ditemui pada Kelas 11 Semester 1, lengkap dengan penjelasan solusi dan konsep yang mendasarinya. Tujuannya adalah agar siswa dapat lebih memahami materi, mengidentifikasi area yang perlu diperkuat, dan terbiasa dalam menghadapi berbagai jenis tantangan soal.
Sebelum kita melangkah ke contoh soal, mari kita tinjau kembali beberapa konsep kunci yang akan sering muncul:
Soal:
Buatlah sebuah kelas bernama Mobil dengan atribut merk, warna, dan tahunProduksi. Kelas ini juga harus memiliki metode tampilkanInfo() yang akan mencetak informasi lengkap tentang mobil tersebut. Selanjutnya, buatlah dua objek dari kelas Mobil, yaitu mobil1 dan mobil2, dengan data yang berbeda, dan panggil metode tampilkanInfo() untuk masing-masing objek.
Penjelasan Konsep:
Soal ini berfokus pada fundamental pembuatan kelas dan objek. Kita perlu mendefinisikan struktur data (atribut) dan perilaku (metode) dalam sebuah kelas, lalu menciptakan instance dari kelas tersebut.
Solusi (Menggunakan Java sebagai contoh bahasa):
// Mendefinisikan kelas Mobil
class Mobil
// Atribut (variabel instance)
String merk;
String warna;
int tahunProduksi;
// Konstruktor (opsional, tapi sering digunakan untuk inisialisasi objek)
// Dalam contoh ini, kita akan menginisialisasi atribut melalui setter atau langsung
// Jika ada konstruktor, itu akan dipanggil saat objek dibuat.
// Metode untuk menampilkan informasi mobil
public void tampilkanInfo()
System.out.println("Merk: " + merk);
System.out.println("Warna: " + warna);
System.out.println("Tahun Produksi: " + tahunProduksi);
System.out.println("--------------------");
// Metode setter untuk mengubah atribut (opsional, tapi baik untuk enkapsulasi)
public void setMerk(String merk)
this.merk = merk;
public void setWarna(String warna)
this.warna = warna;
public void setTahunProduksi(int tahunProduksi)
this.tahunProduksi = tahunProduksi;
// Kelas utama untuk menjalankan program
public class DemoMobil
public static void main(String args)
// Membuat objek mobil1 dari kelas Mobil
Mobil mobil1 = new Mobil();
mobil1.merk = "Toyota";
mobil1.warna = "Merah";
mobil1.tahunProduksi = 2020;
// Membuat objek mobil2 dari kelas Mobil
Mobil mobil2 = new Mobil();
mobil2.merk = "Honda";
mobil2.warna = "Biru";
mobil2.tahunProduksi = 2022;
// Memanggil metode tampilkanInfo() untuk objek mobil1
System.out.println("Informasi Mobil 1:");
mobil1.tampilkanInfo();
// Memanggil metode tampilkanInfo() untuk objek mobil2
System.out.println("Informasi Mobil 2:");
mobil2.tampilkanInfo();
// Contoh penggunaan setter (jika ada)
// mobil1.setWarna("Hitam");
// System.out.println("Informasi Mobil 1 setelah diubah:");
// mobil1.tampilkanInfo();
Penjelasan Solusi:
class Mobil ... : Mendefinisikan kelas Mobil.String merk; String warna; int tahunProduksi;: Mendeklarasikan atribut (variabel instance) yang akan dimiliki oleh setiap objek Mobil.public void tampilkanInfo() ... : Mendefinisikan metode tampilkanInfo() yang akan mencetak nilai dari atribut-atribut objek. Kata kunci this (jika digunakan dalam konteks yang lebih kompleks seperti konstruktor atau setter) merujuk pada objek yang sedang aktif.public class DemoMobil ... : Kelas utama yang berisi metode main() untuk menjalankan program.Mobil mobil1 = new Mobil();: Membuat objek baru bernama mobil1 dari kelas Mobil. Kata kunci new digunakan untuk mengalokasikan memori dan membuat instance dari kelas.mobil1.merk = "Toyota";: Mengakses dan memberikan nilai pada atribut merk dari objek mobil1. Tanda titik (.) digunakan untuk mengakses anggota (atribut atau metode) dari sebuah objek.mobil1.tampilkanInfo();: Memanggil metode tampilkanInfo() pada objek mobil1.>
Soal:
Modifikasi kelas Mobil dari soal sebelumnya agar atribut merk, warna, dan tahunProduksi bersifat private. Tambahkan metode getter dan setter publik untuk setiap atribut. Kemudian, dalam metode main(), buat objek Mobil dan coba ubah warnanya menggunakan metode setter, lalu tampilkan kembali informasinya. Jelaskan mengapa penggunaan private dan getter/setter penting.
Penjelasan Konsep:
Soal ini menekankan pada prinsip enkapsulasi. Dengan menjadikan atribut private, kita mencegah akses langsung dari luar kelas. Metode getter digunakan untuk mendapatkan nilai atribut, dan metode setter digunakan untuk mengubah nilai atribut. Ini memberikan kontrol lebih besar terhadap bagaimana data diakses dan dimodifikasi.
Solusi (Menggunakan Java):
// Mendefinisikan kelas Mobil dengan enkapsulasi
class Mobil
// Atribut bersifat private
private String merk;
private String warna;
private int tahunProduksi;
// Konstruktor untuk inisialisasi awal
public Mobil(String merk, String warna, int tahunProduksi)
this.merk = merk;
this.warna = warna;
this.tahunProduksi = tahunProduksi;
// Getter untuk atribut merk
public String getMerk()
return merk;
// Setter untuk atribut merk
public void setMerk(String merk)
this.merk = merk;
// Getter untuk atribut warna
public String getWarna()
return warna;
// Setter untuk atribut warna
public void setWarna(String warna)
// Contoh validasi: warna tidak boleh kosong
if (warna != null && !warna.trim().isEmpty())
this.warna = warna;
else
System.out.println("Error: Warna tidak boleh kosong.");
// Getter untuk atribut tahunProduksi
public int getTahunProduksi()
return tahunProduksi;
// Setter untuk atribut tahunProduksi
public void setTahunProduksi(int tahunProduksi)
// Contoh validasi: tahun produksi harus positif
if (tahunProduksi > 0)
this.tahunProduksi = tahunProduksi;
else
System.out.println("Error: Tahun produksi harus positif.");
// Metode untuk menampilkan informasi mobil
public void tampilkanInfo()
System.out.println("Merk: " + getMerk()); // Menggunakan getter
System.out.println("Warna: " + getWarna()); // Menggunakan getter
System.out.println("Tahun Produksi: " + getTahunProduksi()); // Menggunakan getter
System.out.println("--------------------");
// Kelas utama untuk menjalankan program
public class DemoEnkapsulasi
public static void main(String args)
// Membuat objek mobil1 menggunakan konstruktor
Mobil mobil1 = new Mobil("Toyota", "Merah", 2020);
// Menampilkan informasi awal
System.out.println("Informasi Mobil 1 Awal:");
mobil1.tampilkanInfo();
// Mengubah warna mobil menggunakan setter
System.out.println("Mengubah warna mobil 1 menjadi Hitam...");
mobil1.setWarna("Hitam");
// Mencoba mengubah tahun produksi dengan nilai tidak valid
System.out.println("Mencoba mengubah tahun produksi menjadi -100...");
mobil1.setTahunProduksi(-100);
// Menampilkan informasi setelah perubahan
System.out.println("Informasi Mobil 1 Setelah Perubahan:");
mobil1.tampilkanInfo();
// Contoh akses langsung atribut (akan error jika atribut private)
// mobil1.merk = "Honda"; // Ini akan menyebabkan error kompilasi
Penjelasan Solusi:
private String merk;: Atribut merk, warna, dan tahunProduksi kini dideklarasikan sebagai private. Ini berarti mereka hanya dapat diakses dari dalam kelas Mobil itu sendiri.public Mobil(String merk, String warna, int tahunProduksi): Sebuah konstruktor ditambahkan untuk memudahkan inisialisasi objek saat pertama kali dibuat.public String getMerk() return merk; : Metode getMerk() adalah getter untuk atribut merk. Metode ini mengembalikan nilai dari merk.public void setWarna(String warna) ... : Metode setWarna() adalah setter untuk atribut warna. Di dalamnya, terdapat logika validasi untuk memastikan warna yang dimasukkan tidak kosong. Jika valid, nilai atribut warna akan diperbarui.mobil1.setWarna("Hitam");: Di dalam main(), kita menggunakan metode setWarna() untuk mengubah warna mobil, bukan mengakses atribut warna secara langsung.setTahunProduksi, kita bisa menambahkan validasi agar tahun produksi tidak negatif.int menjadi long), kita hanya perlu mengubah kode di dalam kelas tersebut (metode getter/setter), tanpa perlu mengubah kode di luar kelas yang menggunakan kelas tersebut, asalkan signature getter/setter tetap sama.>
Soal:
Buatlah sebuah kelas induk bernama Kendaraan dengan atribut nomorPlat dan metode bergerak(). Buat dua kelas turunan dari Kendaraan, yaitu Mobil dan Motor. Kelas Mobil memiliki atribut tambahan jumlahPintu, sedangkan kelas Motor memiliki atribut tambahan tipeMesin. Ubah metode bergerak() pada kelas Mobil dan Motor agar spesifik untuk masing-masing jenis kendaraan.
Penjelasan Konsep:
Soal ini menguji pemahaman tentang pewarisan. Kelas Mobil dan Motor akan mewarisi nomorPlat dan metode bergerak() dari kelas Kendaraan. Mereka juga dapat menambahkan atribut dan perilaku baru, serta mengesampingkan (override) metode dari kelas induk.
Solusi (Menggunakan Java):
// Kelas Induk (Superclass)
class Kendaraan
String nomorPlat;
public Kendaraan(String nomorPlat)
this.nomorPlat = nomorPlat;
public void bergerak()
System.out.println("Kendaraan dengan nomor plat " + nomorPlat + " sedang bergerak.");
// Kelas Turunan (Subclass) 1
class Mobil extends Kendaraan
int jumlahPintu;
public Mobil(String nomorPlat, int jumlahPintu)
super(nomorPlat); // Memanggil konstruktor kelas induk
this.jumlahPintu = jumlahPintu;
// Mengesampingkan (override) metode bergerak() dari kelas Kendaraan
@Override
public void bergerak()
System.out.println("Mobil dengan nomor plat " + nomorPlat + " melaju di jalan raya dengan " + jumlahPintu + " pintu.");
public void bukaPintu()
System.out.println("Pintu mobil dibuka.");
// Kelas Turunan (Subclass) 2
class Motor extends Kendaraan
String tipeMesin;
public Motor(String nomorPlat, String tipeMesin)
super(nomorPlat); // Memanggil konstruktor kelas induk
this.tipeMesin = tipeMesin;
// Mengesampingkan (override) metode bergerak() dari kelas Kendaraan
@Override
public void bergerak()
System.out.println("Motor dengan nomor plat " + nomorPlat + " berakselerasi dengan mesin tipe " + tipeMesin + ".");
public void gasPol()
System.out.println("Motor digas pol!");
// Kelas utama untuk menjalankan program
public class DemoPewarisan
public static void main(String args)
// Membuat objek Mobil
Mobil sedan = new Mobil("B 1234 ABC", 4);
System.out.println("--- Informasi Mobil ---");
sedan.bergerak(); // Memanggil metode bergerak() yang sudah di-override
sedan.bukaPintu(); // Memanggil metode spesifik mobil
System.out.println("Nomor Plat: " + sedan.nomorPlat); // Mengakses atribut yang diwariskan
System.out.println("Jumlah Pintu: " + sedan.jumlahPintu); // Mengakses atribut spesifik mobil
System.out.println();
// Membuat objek Motor
Motor sport = new Motor("AD 5678 XYZ", "150cc");
System.out.println("--- Informasi Motor ---");
sport.bergerak(); // Memanggil metode bergerak() yang sudah di-override
sport.gasPol(); // Memanggil metode spesifik motor
System.out.println("Nomor Plat: " + sport.nomorPlat); // Mengakses atribut yang diwariskan
System.out.println("Tipe Mesin: " + sport.tipeMesin); // Mengakses atribut spesifik motor
System.out.println();
// Contoh pemanggilan metode bergerak() dari kelas induk jika tidak di-override
// Kendaraan kendaraanUmum = new Kendaraan("Z 9999 DEF");
// kendaraanUmum.bergerak();
Penjelasan Solusi:
class Kendaraan ... : Kelas induk Kendaraan memiliki atribut nomorPlat dan metode bergerak().class Mobil extends Kendaraan ... : Kata kunci extends menunjukkan bahwa Mobil adalah kelas turunan dari Kendaraan. Mobil mewarisi nomorPlat dan bergerak().super(nomorPlat);: Di dalam konstruktor Mobil, super(nomorPlat) memanggil konstruktor kelas induk (Kendaraan) untuk menginisialisasi atribut nomorPlat.@Override public void bergerak() ... : Anotasi @Override menandakan bahwa metode bergerak() di kelas Mobil menggantikan (meng-override) metode bergerak() yang diwariskan dari Kendaraan. Implementasinya menjadi spesifik untuk mobil.sedan.bergerak();: Saat metode bergerak() dipanggil pada objek sedan (tipe Mobil), versi yang di-override di kelas Mobil yang akan dijalankan.>
Soal:
Buatlah sebuah array yang berisi objek-objek dari kelas Mobil dan Motor (yang dibuat pada soal sebelumnya). Iterasi melalui array tersebut dan panggil metode bergerak() untuk setiap objek. Amati bagaimana metode bergerak() yang sesuai akan dipanggil secara otomatis berdasarkan tipe objek yang sebenarnya.
Penjelasan Konsep:
Polimorfisme memungkinkan kita untuk memperlakukan objek dari kelas yang berbeda (tetapi memiliki hubungan pewarisan) seolah-olah mereka adalah objek dari kelas induk. Dalam kasus ini, kita dapat menyimpan objek Mobil dan Motor dalam array bertipe Kendaraan dan memanggil bergerak() pada masing-masing objek.
Solusi (Menggunakan Java):
// (Kelas Kendaraan, Mobil, Motor sama seperti pada Contoh Soal 3)
// Kelas utama untuk menjalankan program
public class DemoPolimorfisme
public static void main(String args)
// Membuat array yang dapat menampung objek Kendaraan (termasuk Mobil dan Motor)
Kendaraan armada = new Kendaraan;
// Menambahkan objek Mobil dan Motor ke dalam array
armada = new Mobil("B 9876 XYZ", 2);
armada = new Motor("AD 1122 DEF", "200cc");
armada = new Mobil("L 5555 GHI", 4);
System.out.println("--- Demonstrasi Polimorfisme ---");
// Iterasi melalui array dan memanggil metode bergerak()
for (int i = 0; i < armada.length; i++)
System.out.println("Objek ke-" + (i + 1) + ":");
armada.bergerak(); // Ini adalah inti polimorfisme!
System.out.println();
System.out.println("--- Akhir Demonstrasi ---");
// Contoh lain: Menggunakan loop for-each
System.out.println("n--- Demonstrasi Polimorfisme (For-Each) ---");
for (Kendaraan k : armada)
k.bergerak();
System.out.println("--- Akhir Demonstrasi ---");
Penjelasan Solusi:
Kendaraan armada = new Kendaraan;: Kita membuat sebuah array bernama armada yang bertipe Kendaraan. Ini berarti array ini dapat menyimpan objek-objek yang merupakan instance dari Kendaraan atau kelas yang mewarisi dari Kendaraan (seperti Mobil dan Motor).armada = new Mobil("B 9876 XYZ", 2);: Kita menambahkan objek Mobil ke dalam array Kendaraan. Ini dimungkinkan karena Mobil adalah turunan dari Kendaraan.armada = new Motor("AD 1122 DEF", "200cc");: Demikian pula, objek Motor juga ditambahkan.armada.bergerak();: Di dalam loop, ketika kita memanggil bergerak() pada armada, Java secara dinamis menentukan tipe objek yang sebenarnya disimpan di indeks tersebut. Jika armada adalah objek Mobil, maka metode bergerak() dari Mobil yang akan dipanggil. Jika armada adalah objek Motor, maka metode bergerak() dari Motor yang akan dipanggil. Ini disebut runtime polymorphism atau dynamic method dispatch.Truk), kita cukup menambahkannya ke array tanpa mengubah loop yang ada.if-else atau switch-case untuk menentukan tipe objek sebelum memanggil metode.>
Memahami dan menguasai konsep-konsep PBO seperti kelas, objek, enkapsulasi, pewarisan, dan polimorfisme adalah kunci keberhasilan dalam pembelajaran pemrograman berorientasi objek di kelas 11. Contoh-contoh soal yang disajikan di atas mencakup dasar-dasar yang paling sering diujikan.
Penting bagi siswa untuk tidak hanya menghafal sintaks, tetapi juga memahami mengapa suatu konsep PBO digunakan dan bagaimana konsep tersebut memberikan manfaat dalam pengembangan perangkat lunak. Latihan terus-menerus dengan berbagai variasi soal, mencoba memecahkan masalah nyata, dan berdiskusi dengan teman atau guru akan memperkuat pemahaman Anda. Selamat belajar dan selamat menguasai PBO!
>