September 13, 2026
PBO 3: Enkapsulasi dan Akses Modifier
Enkapsulasi
By Muhammad Fauza Asfadani
6 min read
Enkapsulasi
Enkapsulasi adalah proses membungkus data (variabel) dan metode (fungsi) dalam satu unit yang disebut objek, dimana detail implementasi disembunyikan dari pengguna luar. Manfaat dari enkapsulasi adalah :
- Keamanan data : Mencega perubahan data yang tidak sah.
- Kemudahan pemeliharaan : Memisahkan antarmuka (interface) dari implementasi sehingga perubahan pada kode tidak mempengaruhi pengguna kelas.
- Modularitas : Membuat sistem lebih modular, sehingga lebih mudah dikelola dan dipahami.
Pendeklarasian dari enkapsulasinya sebagai berikut:
public class Kendaraan {
private String nama; // Hanya bisa diakses di dalam kelas ini
protected int kecepatanMaks; // Bisa diakses di package yang sama dan subclass
public String jenisMesin; // Bisa diakses dimana saja
public Kendaraan (String Nama, int Kecepatan, String Mesin) {
this.nama = Nama;
this.kecepatanMaks = Kecepatan;
this.jenisMesin = Mesin;
}
// Getter dan Setter utk private nama
public String getNama() {
return nama;
}
public void setNama(String Nama) {
this.nama = Nama;
}
// Method public utk menampilkan informasi kendaraan
public void displayInfo() {
System.out.println("Nama Kendaraan: " + nama);
System.out.println("Kecepatan Max : " + kecepatanMaks+"km/h");
System.out.println("Jenis mesin\t: " + jenisMesin);
}public class Kendaraan {
private String nama; // Hanya bisa diakses di dalam kelas ini
protected int kecepatanMaks; // Bisa diakses di package yang sama dan subclass
public String jenisMesin; // Bisa diakses dimana saja
public Kendaraan (String Nama, int Kecepatan, String Mesin) {
this.nama = Nama;
this.kecepatanMaks = Kecepatan;
this.jenisMesin = Mesin;
}
// Getter dan Setter utk private nama
public String getNama() {
return nama;
}
public void setNama(String Nama) {
this.nama = Nama;
}
// Method public utk menampilkan informasi kendaraan
public void displayInfo() {
System.out.println("Nama Kendaraan: " + nama);
System.out.println("Kecepatan Max : " + kecepatanMaks+"km/h");
System.out.println("Jenis mesin\t: " + jenisMesin);
}Akses Modifier
Akses modifier merupakan mekanisme dalam PBO yang digunakan untuk mengontrol visibilitas dan aksesbilitas anggota kelas. Di java ada 4 jenis akses modifier, yaitu:
Private access modifier
Hanya bisa diakses dari dalam kelas yang mendefinisikannya. Tidak dapat langsung didefinisikan di kelas lain meskipun dalam 1 package yang sama. Contoh penggunaan,
public class Kendaraan {
private String nama;
// Untuk mengakses dan mengubah nilai harus menggunakan metode getter() dan setter()
public String getNama() {
return nama;
}
public void setNama(String Nama) {
this.nama = Nama;
}
}public class Kendaraan {
private String nama;
// Untuk mengakses dan mengubah nilai harus menggunakan metode getter() dan setter()
public String getNama() {
return nama;
}
public void setNama(String Nama) {
this.nama = Nama;
}
}Manfaat :
- Menyembunyikan detail implementasi.
- Melindungi data dari modifikasi yang tidak disengaja atau tidak valid.
Gunakan private ketika Anda ingin sepenuhnya melindungi anggota kelas dari akses luar, seperti (password, saldo bank, atau detail pentingh lainnya).
Protected Access Modifier
Dapat diakses oleh kelas berbeda dengan package yang sama, serta subclass (kelas yang mewarisi) meskipun di package yang berbeda. Contoh,
public class Komputer {
protected String prosesor;
// Mengakses dari kelas yang sama
public void tampilkanProsesor() {
System.out.println("Prosesor: " + prosesor);
}
}
// Subclass yang mengakses di kelas yang mewarisi
public class Laptop extends Komputer {
public void tampilkanSpesifikasi() {
System.out.println("Laptop menggunakan" + prosesor );
}
}public class Komputer {
protected String prosesor;
// Mengakses dari kelas yang sama
public void tampilkanProsesor() {
System.out.println("Prosesor: " + prosesor);
}
}
// Subclass yang mengakses di kelas yang mewarisi
public class Laptop extends Komputer {
public void tampilkanSpesifikasi() {
System.out.println("Laptop menggunakan" + prosesor );
}
}Manfaat :
- Memungkinkan akses lebih luas dalam hierarki kelas (inheritance), tetapi tetap menjaga perlindungan dari akses langsung oleh kelas non subclass.
Gunakan protected ketika Anda ingin memberikan akses kepada subclass atau kelas-kelas lain dalam package yang sama, tetapi tetap melindungi anggota dari akses luar package.
Public Access Modifier
Akses yang sangat terbuka, dapat diakses dari mana saj baik dari kelas yang berada di package yang sama maupun package yang berbeda. Contoh,
public class Kendaraan {
public String jenisMesin;
// Mengakses dari kelas yang sama
public void tampilkanJenisMesin() {
System.out.println("Jenis Mesin: " + jenisMesin);
}
}
public class Main {
// Mengakses di kelas yang bebeda dan bukan kelas yang mewarisinya
public static void main(String[] args) {
Kendaraan mobil = new Kendaraan();
mobil.jenisMesin = "Bensin";
mobil.tampilkanJenisMesin(); // Output: Jenis
Mesin: Bensin
}
}public class Kendaraan {
public String jenisMesin;
// Mengakses dari kelas yang sama
public void tampilkanJenisMesin() {
System.out.println("Jenis Mesin: " + jenisMesin);
}
}
public class Main {
// Mengakses di kelas yang bebeda dan bukan kelas yang mewarisinya
public static void main(String[] args) {
Kendaraan mobil = new Kendaraan();
mobil.jenisMesin = "Bensin";
mobil.tampilkanJenisMesin(); // Output: Jenis
Mesin: Bensin
}
}Manfaat :
- Memudahkan akses untuk anggota yang bersifat umum atau tidak memerlukan kontrol khusus.
Gunakan public ketika Anda ingin membuat anggota kelas dapat diakses dari mana saja.
Default (Package-Private) Access Modifier
Hanya bisa di akses dipackage yang sama dan tanpa pengecualian. Contohnya,
class Produk {
String namaProduk; // Default, tidak ada keyword public/protected/private
void tampilkanProduk() {
System.out.println("Nama Produk: " + namaProduk);
}
}class Produk {
String namaProduk; // Default, tidak ada keyword public/protected/private
void tampilkanProduk() {
System.out.println("Nama Produk: " + namaProduk);
}
}Manfaat :
- Mengamankan anggota kelas untuk digunakan hanya dalam package yang sama, cocok untuk menjaga modularitas.
Gunakan akses default ketika Anda hanya ingin anggota kelas diakses oleh kelas-kelas dalam package yang sama, tetapi tidak ingin memberikan akses luar package.
Praktikum
Membuat proyek dan package baru.
Membuat kelas Kendaraan.
- Menggunakan enkapsulasi untuk melindungi datanya
Mengakses data dan metode dari kelas Kendaraan.
- Membuat objek dari kelas Kendaraan dan menampilkan data menggunakan
getter. - Mengubah data menggunakan
setter, dan melihat bagaimana data diatur melalui metode yang disediakan.
Menerapkan akses modifier pada kelas kendaraan.
- Merubah modifier atribut kecepatanMaks menjadi
protected. - Merubah modifier atribut jenisMesin menjadi
public. - Menghilangkan metode
setter()dangetter()untuk atribut kecepatanMaks dan jenisMesin. - Mempertahankan metode
setter()dangetter()untuk atribut nama.
Mencoba akses modifier (protected).
- Membuat kelas baru dengan nama mobil yang mewarisi (menjadi subclass) dari kelas kendaraan.
- Menambahkan atribut khusus subclass.
- Membuat kelas baru lagi untuk mengakses subclass nya.
Hasil dan Analisis
Di kelas Kendaraan, tidak berbeda dengan praktikum serta tugas pada pertemuan sebelumnya. Karena pada praktikum sebelumnya juga sudah diberikan pengantar terhadap enkapsulasi dan modifier khususnya private. Penggunaan metode getter() dan setter() terbukti dapat menjadi jalur akses terhadap atribut dengan akses modifier private. Proses mengganti data pada gambar 3 terbukti berhasil yang dibuktikan oleh gambar dibawah ini.
Dilihat pada gambr 7, bahwa data kendaraan yang diset pertama kali dengan data ;
Kendaraan motor = new Kendaraan("Honda", "Naked", 2017); Kendaraan motor = new Kendaraan("Honda", "Naked", 2017);Berhasil dirubah datanya dengan metode setter() dan menampilkannya dengan metode getter(),
motor.setMerek("Yamaha");
motor.setModel("Fairing");motor.setMerek("Yamaha");
motor.setModel("Fairing");Selain itu penerapan akses modifier protected dan public juga terbukti sesuai dengan dasar teori yang ada. Atribut kecepatanMaks yang diatur dengan modifier protected dapat diakses di kelas yang sama melalui metode tampilkanInfoMobil()
public void displayInfo() {
System.out.println("Nama Kendaraan: " + nama);
System.out.println("Kecepatan Max : " + kecepatanMaks+"km/h");
System.out.println("Jenis mesin\t: " + jenisMesin);
}public void displayInfo() {
System.out.println("Nama Kendaraan: " + nama);
System.out.println("Kecepatan Max : " + kecepatanMaks+"km/h");
System.out.println("Jenis mesin\t: " + jenisMesin);
}. Selain itu penerapan sub kelas mobil yang mewarisi kelas kendaraan, di dalamnya terdapat metode infoMobil(),
public void infoMobil() {
// Atribut kecepatan dapat daiakses karena protected
System.out.println("Kecepatan maks : " + kecepatanMaks+"km/h");
System.out.println("Jumlah pintu\t: " + jumlahPintu);
}public void infoMobil() {
// Atribut kecepatan dapat daiakses karena protected
System.out.println("Kecepatan maks : " + kecepatanMaks+"km/h");
System.out.println("Jumlah pintu\t: " + jumlahPintu);
}yang juga mengakses atribut kecepatanMaks dari kelas kendaraan (dapat dilihat di gambar 5). Hasil dapat dibuktikan melalui output dari kode gambar 6 berikut
Selain itu hak akses atribut juga dapat dilihat dari pop up rekomendasi ketik yang dimunculkan netbeans,
dilihat dari gambar pop up tersebut ke 3 atribut memiliki logonya tersendiri. Atribut jenisMesin dengan akses modifier public berlogo kotak polos. Lalu atribut kecepatanMaks dengan akses modifier protected berlogo kotak dengan kunci, dan juga nama dengan akses modifier private berlogo kotak dengan gembok. Hal tersebut akan memudakan pengerjaan pada sekala besar yang line kode nya sudah lebih dari ratusan, ribuan, bahkan lebih dari itu.
Tugas Modul 4
Kelas manusia.
public class Manusia {
private String Nama;
protected int Usia;
public String Pekerjaan;
// constructor
public Manusia (String nama, int usia, String pekerjaan) {
this.Nama = nama;
this.Usia = usia;
this.Pekerjaan = pekerjaan;
}
// method setter dan getter nama
public String getNama() {
return Nama;
}
public void setNama(String nama) {
this.Nama = nama;
}
}public class Manusia {
private String Nama;
protected int Usia;
public String Pekerjaan;
// constructor
public Manusia (String nama, int usia, String pekerjaan) {
this.Nama = nama;
this.Usia = usia;
this.Pekerjaan = pekerjaan;
}
// method setter dan getter nama
public String getNama() {
return Nama;
}
public void setNama(String nama) {
this.Nama = nama;
}
}Sub kelas pekerjaan
public class Pekerja extends Manusia {
private long Gaji;
public Pekerja (String Nama, int Usia, String Pekerjaan, long Gaji) {
super(Nama, Usia, Pekerjaan);
this.Gaji = Gaji;
}
// getter dan setter atribut gaji
public long getGaji() {
return Gaji;
}
public void setGaji(long gaji) {
this.Gaji = gaji;
}
public void infoPekerja() {
System.out.println("Nama \t: " + Pekerja.super.getNama());
// System.out.println("Nama \t: " + Nama); // Akses langsung getNama() di kelas pekerja
System.out.println("Usia \t: " + Usia + "tahun");
System.out.println("Pekerjaan : " + Pekerjaan);
System.out.println("Gaji \t:" + getGaji() + "Rupiah");
}
}public class Pekerja extends Manusia {
private long Gaji;
public Pekerja (String Nama, int Usia, String Pekerjaan, long Gaji) {
super(Nama, Usia, Pekerjaan);
this.Gaji = Gaji;
}
// getter dan setter atribut gaji
public long getGaji() {
return Gaji;
}
public void setGaji(long gaji) {
this.Gaji = gaji;
}
public void infoPekerja() {
System.out.println("Nama \t: " + Pekerja.super.getNama());
// System.out.println("Nama \t: " + Nama); // Akses langsung getNama() di kelas pekerja
System.out.println("Usia \t: " + Usia + "tahun");
System.out.println("Pekerjaan : " + Pekerjaan);
System.out.println("Gaji \t:" + getGaji() + "Rupiah");
}
}Kelas main
public class main {
public static void main(String[] args) {
System.out.println("Membuat objek dari kelas pekerja");
Pekerja corporate = new Pekerja("Asfa", 27, "Data Scientist", 15000000);
corporate.infoPekerja();
// Mengubah nama pekerja
corporate.setNama("Asfadani");
System.out.println("\ninfo setelah nama diubah");
corporate.infoPekerja();
}
}public class main {
public static void main(String[] args) {
System.out.println("Membuat objek dari kelas pekerja");
Pekerja corporate = new Pekerja("Asfa", 27, "Data Scientist", 15000000);
corporate.infoPekerja();
// Mengubah nama pekerja
corporate.setNama("Asfadani");
System.out.println("\ninfo setelah nama diubah");
corporate.infoPekerja();
}
}
Pemanggilan atribut nama secara langsung di kelas pekerja akan menghasilkan eror, karena pembatasan dari modifier tersebut yang hanya membatasi pemanggilan di kelasnya sendiri tidak dapat dikelas atau sub kelas lain meskipun di 1 package yang sama. Maka dari itu penggunaan metode getter() dan setter() menjadikan atribut nama dapat diakses di kelas lain.
Untuk kelas protected yang syaratnya dapat dipanggil di kelas yang sama dan kelas yang mewarisinya. Karena kelas pekerja adalah kelas yang mewarisi kelas manusia, maka atribut uisa dapat dipnggil di kelas pekerja secara langsung. Dan juga untuk kelas public tidak ada pembatasan pemanggilan sama sekali, maka dari itu kelas pekerja dapat dengan bebas mengakses atribut pekerjaan di kelas manusia.
Kesimpulan
Demikian praktikum kali ini, percobaan pengimplementasian enkapsulasi dengan berbagai akses modifier berhasil diselesaikan. Perbedaan akses dari masing masing akses modifier juga dapat dibuktikan dari praktikumnya. Dimana modifier private hanya bisa diakses di kelasnya sendiri, untuk mengakses di kelas lain harus di siapkan metode getter dan setter. Kemudian modifier protected dapat diakses di kelas nya langsung maupun kelas yang mewarisinya. Dan modifier public dapat diakses di mana saja dengan bebas.
Sekian praktikum dari saya, bila ada salah kata mohon maaf dan terimakash.
Referensi dan Lampiran
Sebagai bagian dari transparansi dan dokumentasi teknis, seluruh kode sumber yang digunakan dalam praktikum ini telah diunggah ke repositori GitHub. Hal ini juga bertujuan untuk memudahkan pengelolaan versi (version control) di masa mendatang.
- Repositori GitHub: https://github.com/asfadani/asfadani_kuliah.git
- Modul : Modul 4: Enkapsulasi dan Akses Modifier— I mam Adi Nata, M.Kom. — Universitas Tidar.
Disusun Oleh
Muhammad Fauza Asfadani / 2505060011