OOP : Encapsulation
Encapsulation adalah proses menggabungkan data member (field/property) dan perilaku (method/function) ke dalam sebuah unit (class, interface, struct).
Contoh Encapsulation di dunia nyata
Contohnya adalah Tas dan isinya. Dalam ilustrasi ini, semua isi tas seperti buku, pulpen, penggaris, dll disatukan dan disimpan dalam sebuah tas. Kita tidak bisa mengambil pulpen, buku, dan berbagai barang lain yang ada di dalam tas tanpa kita membuka terlebih dahulu tas tersebut.
Contoh Code
class Bank
{
public long AccountNumber;
public string Name;
public int Balance;
public void GetBalance()
{
}
public void WithdrawAmount()
{
}
public void Deposit()
{
}
}
Pada contoh diatas, class Bank adalah contoh dari encapsulation. Data member dan method dari class tersebut diikat dalam satu unit, yaitu class Bank.
Di sini, encapsulation mengikat detail implementasi dari class Bank. Jika ada code yg ingin mengakses field & method yang ada pada class Bank, maka harus melakukan inisialisasi objek dari class Bank harus terlebih dahulu, contohnya seperti code di bawah ini.
Bank bank = new Bank();
// Property dan method di bawah ini tidak dapat diakses tanpa
// mendeklarasikan objek dari class bank terlebih dahulu.
bank.AccountNumber = 12345678;
bank.Name = "Kristiadhy";
bank.GetBalance();
bank.WithdrawAmount();
Penyembunyian data dalam Encapsulation.
Keuntungan terbesar dari encapsulation adalah data hiding atau penyembunyian data, proses dimana kita menyembunyikan data internal dari dunia luar. Penyembunyian data juga dikenal sebagai Enkapsulasi Data (Data Encapsulation).
Untuk dapat menyembunyikan dan mengekspose data, maka kita membutuhkan access modifier. Access Modifier adalah kata kunci yang menentukan tingkat aksesibilitas dari sebuah kelas, metode, variabel, dan anggota lain.
Dalam C#, pada umumnya access modifier dapat dibagi menjadi 4 (meskipun bisa lebih jika menggabungkan beberapa access modifier), contohnya:
Private.
Anggota nya hanya dapat diakses di dalam class itu sendiri.
Protected.
Anggotanya dapat diakses di dalam class dan semua class turunannya.
Internal.
Anggotanya dapat diakses dalam assembly yang sama.
Public.
Anggotanya dapat diakses oleh assembly yang sama atau assembly lain yang berbeda namun mereferensikannya.
Berikut contoh code nya:
public class BankDataEncapsulation
{
// Field balance disembunyikan dari akses di luar class
// caranya dengan menggunakan access modifier private
private double balance;
// Membuat public Setter and Getter methods
// Public Getter method
// Method ini digunakan untuk mengembalikan nilai dari variabel balance
public double GetBalance()
{
// Kita bisa menambahkan validasi jika perlu
return balance;
}
// Public Setter Method
// Method ini digunakan untuk memberikan nilai pada variabel balance
public void SetBalance(double balance)
{
// Kita dapat menambahkan validasi untuk melakukan pengecekan
// apakah data yang diinputkan sudah benar/tidak.
this.balance = balance;
}
}
Pada contoh code diatas, dalam class tersebut kita memiliki field balance yang di-set sebagai private. Field tersebut tidak akan dapat diakses oleh siapapun di luar class nya (sekalipun class tersebut sudah di-inisialisasi menjadi sebuah objek). Contohnya bisa dilihat pada code di bawah ini.
BankDataEncapsulation bankEncapsulation = new BankDataEncapsulation();
bankEncapsulation.balance; //Baris ini akan menghasilka compile Time Error
Lalu bagaimana jika kita ingin memanipulasi nilai balance yang ada pada class BankDataEncapsulation? Kita dapat melakukannya dengan mengakses method getter and setter yang sudah diset sebagai public. Silahkan lihat contoh code di bawah ini.
BankDataEncapsulation bankEncapsulation = new BankDataEncapsulation();
bankEncapsulation.SetBalance(500);
Console.WriteLine(bankEncapsulation.GetBalance());
Dengan cara ini maka field balance aman dan terkunci sehingga tidak bisa dilakukan perubahan nilai kecuali dengan cara-cara yang sudah diijinkan oleh class tersebut melalui access modifier tertentu. Hal ini akan menjamin keamanan data.
Sebagai tambahan, ketika kita ingin menambahkan validasi pada nilai balance, maka kita bisa menambahkannya dengan memodifikasi method getter dan setter, sehingga kita tidak perlu merubah penulisan code pada saat pemanggilan method. Berikut contoh code nya.
public double GetBalance()
{
// Pada method getter kita menambahkan validasi
if(balance > 1000000)
throw new Exception("Anda tidak bisa cek saldo diatas 1000000");
return balance;
}
public void SetBalance(double balance)
{
// Kita juga menambahkan validasi pada method setter
if(balance < 0)
throw new Exception("Saldo tidak boleh negatif");
this.balance = balance;
}
Kita bisa lihat .eskipun ada penambahan logic pada kedua method tersebut, namun penulisan saat pemanggilan method tetap sama/tidak berubah, masih tetap seperti ini.
BankDataEncapsulation bankEncapsulation = new BankDataEncapsulation();
bankEncapsulation.SetBalance(500);
Console.WriteLine(bankEncapsulation.GetBalance());
Hal ini akan sangat menguntungkan karena kita tidak perlu melakukan banyak peyesuaian ketika terjadi perubahan logic. Ini adalah salah satu contoh manfaat sederhana dari konsep Encapsulation.
Beberapa manfaat Encapsulation.
Perlindungan data.
Kita bisa melakukan validasi data sebelum menyimpannya dalam variabel.
Penyembunyian data.
Caller tidak akan tahu tentang implementasi dari bagian di dalam class tersebut.
Keamanan.
Prinsip enkapsulasi membantu mengamankan kode kita karena memastikan bahwa unit lain (class, interface, dll) tidak dapat mengakses data secara langsung.
Fleksibilitas.
Prinsip encapsulation membuat kode kita lebih fleksibel, memungkinkan programmer untuk dengan mudah mengubah atau memperbarui kode.
Kontrol.
Prinsip enkapsulasi memberikan kontrol yang lebih besar terhadap data yang disimpan dalam variabel. Sebagai contoh, kita dapat mengontrol data dengan memvalidasi apakah data tersebut cukup baik untuk disimpan dalam variabel.
Kita sudah mengenal dan mempelajari mengenai salah satu konsep dari 4 pilar OOP yaitu Encapsulation, selanjutnya kita akan belajar mengenai konsep lain dalam OOP yaitu Polymorphism.
Subscribe to my newsletter
Read articles from Kristiadhy directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Kristiadhy
Kristiadhy
Experienced Full Stack .NET developer with a proven track record of designing and implementing robust business applications. Proficient in using ASP.NET Core Web API, Blazor, and WinForms to deliver high-quality, efficient code and scalable solutions. Strong focus on implementing industry best practices for cleaner and scalable outcomes.