Encapsulation
Encapsulation atau Enkapsulasi merupakan salah satu konsep penting dalam Object-Oriented Programming (OOP).
Secara sederhana, enkapsulasi adalah konsep menggabungkan data dan perilaku yang berkaitan ke dalam satu class.
Data biasanya direpresentasikan melalui attribute, sedangkan perilaku direpresentasikan melalui method.
Dengan demikian, sebuah object tidak hanya menyimpan data, tetapi juga memiliki method yang dapat digunakan untuk bekerja dengan data tersebut.
Pengertian Encapsulation
Enkapsulasi dapat dipahami sebagai proses membungkus data dan function yang berkaitan dalam satu wadah, yaitu class.
Tanpa OOP, data dan function dapat tersebar di berbagai bagian program.
Dengan enkapsulasi, kita dapat mengelompokkan data dan perilaku yang saling berkaitan.
Secara konsep:
Class
│
├── Data
│ ├── name
│ └── age
│
└── Behavior
├── shout()
└── speak()
Data dan perilaku tersebut kemudian menjadi bagian dari object yang dibuat dari class.
Contoh Encapsulation
Misalnya kita ingin merepresentasikan seorang player.
Seorang player memiliki data:
name
age
dan memiliki perilaku:
shout()
speak()
Kita dapat mengelompokkannya ke dalam satu class:
class PlayerCharacter:
def __init__(self, name, age):
self.name = name
self.age = age
def shout(self):
return f"My name is {self.name}"
Kemudian kita dapat membuat object:
player1 = PlayerCharacter("Andrei", 100)
Object tersebut memiliki data dan perilaku:
player1
│
├── name = "Andrei"
├── age = 100
│
└── shout()
Inilah salah satu bentuk sederhana dari enkapsulasi.
Data dan Perilaku dalam Satu Class
Salah satu manfaat utama enkapsulasi adalah data dan operasi terhadap data tersebut dapat ditempatkan dalam satu class.
Contohnya:
class PlayerCharacter:
def __init__(self, name, age):
self.name = name
self.age = age
def shout(self):
return f"My name is {self.name}"
Pada contoh tersebut:
Data
├── name
└── age
Perilaku
└── shout()
Keduanya berada dalam class PlayerCharacter.
Dengan demikian, kita dapat memahami object sebagai sebuah unit yang memiliki data dan perilaku.
Mengakses Attribute
Object dapat digunakan untuk mengakses attribute yang dimilikinya.
Contoh:
player1 = PlayerCharacter("Andrei", 100)
print(player1.name)
print(player1.age)
Output:
Andrei
100
Attribute tersebut merupakan data yang dimiliki oleh object player1.
Mengakses Method
Object juga dapat menjalankan method yang didefinisikan di dalam class.
Contoh:
player1 = PlayerCharacter("Andrei", 100)
print(player1.shout())
Output:
My name is Andrei
Method shout() dapat mengakses data name melalui self.
def shout(self):
return f"My name is {self.name}"
Dengan demikian, method dapat bekerja dengan data yang dimiliki object.
Bundling Data dan Perilaku
Salah satu tujuan utama enkapsulasi adalah bundling, yaitu mengelompokkan data dan operasi yang berkaitan.
Tanpa enkapsulasi, kita mungkin memiliki struktur seperti:
Data Player
↓
name
age
Function Player
↓
shout()
speak()
attack()
Data dan function dapat tersebar di berbagai bagian program.
Dengan enkapsulasi:
PlayerCharacter
│
├── name
├── age
├── shout()
├── speak()
└── attack()
Semua komponen yang berkaitan dengan player dapat dikelompokkan dalam satu class.
Encapsulation dan Pemodelan Dunia Nyata
Enkapsulasi juga membantu kita memodelkan berbagai objek dalam dunia nyata.
Misalnya sebuah Bank Account memiliki data:
account_number
owner
balance
dan perilaku:
deposit()
withdraw()
check_balance()
Secara konsep:
BankAccount
│
├── Data
│ ├── account_number
│ ├── owner
│ └── balance
│
└── Behavior
├── deposit()
├── withdraw()
└── check_balance()
Semua komponen tersebut dapat dikelompokkan dalam class BankAccount.
Encapsulation dan Reusability
Setelah sebuah class dibuat, kita dapat menggunakannya untuk membuat banyak object.
Contohnya:
class PlayerCharacter:
def __init__(self, name, age):
self.name = name
self.age = age
def shout(self):
return f"My name is {self.name}"
Kemudian:
player1 = PlayerCharacter("Andrei", 100)
player2 = PlayerCharacter("Budi", 25)
player3 = PlayerCharacter("Andi", 30)
Ketiga object tersebut memiliki struktur dan perilaku yang berasal dari class yang sama.
Secara konsep:
PlayerCharacter
│
┌───────────┼───────────┐
↓ ↓ ↓
player1 player2 player3
│ │ │
Data Data Data
Method Method Method
Kita tidak perlu menulis ulang seluruh struktur untuk setiap player.
Encapsulation Membantu Organisasi Program
Ketika aplikasi semakin besar, jumlah data dan function dapat bertambah dengan cepat.
Tanpa struktur yang baik, program dapat menjadi sulit dipahami dan dipelihara.
Enkapsulasi membantu mengelompokkan bagian-bagian program berdasarkan tanggung jawabnya.
Contohnya pada aplikasi e-commerce:
Application
│
├── User
│ ├── name
│ ├── email
│ └── login()
│
├── Product
│ ├── name
│ ├── price
│ └── display()
│
├── Cart
│ ├── items
│ └── add_product()
│
└── Order
├── order_number
└── checkout()
Setiap class memiliki data dan perilaku yang berkaitan dengan tanggung jawabnya.
Encapsulation Bukan Sekadar Membuat Data Private
Perlu diperhatikan bahwa enkapsulasi tidak hanya berarti membuat attribute menjadi private.
Dalam konteks dasar OOP, inti enkapsulasi adalah menggabungkan data dan perilaku yang berkaitan ke dalam satu unit.
Konsep seperti public, protected, private, getter, dan setter merupakan pembahasan lanjutan mengenai bagaimana akses terhadap data tersebut dikontrol.
Jadi, jangan menganggap:
Encapsulation = Private Attribute
Secara konsep yang lebih luas:
Encapsulation
=
Data
+
Behavior
+
Organisasi
+
Kontrol Akses
Hubungan Encapsulation dengan Object
Object yang dibuat dari sebuah class membawa struktur yang telah didefinisikan oleh class tersebut.
Misalnya:
player1 = PlayerCharacter("Andrei", 100)
Object player1 memiliki:
player1
│
├── name
├── age
└── shout()
Object tersebut menjadi satu unit yang memiliki data dan perilaku.
Manfaat Encapsulation
Enkapsulasi memberikan beberapa manfaat dalam pengembangan program.
1. Organisasi Kode
Data dan perilaku yang berkaitan dikelompokkan dalam satu class.
2. Keterbacaan
Struktur program menjadi lebih mudah dipahami karena setiap class memiliki tanggung jawab tertentu.
3. Maintainability
Program lebih mudah diperbaiki dan dikembangkan karena komponen program terorganisir.
4. Reusability
Satu class dapat digunakan untuk membuat banyak object.
5. Pemodelan Sistem
Konsep dunia nyata dapat direpresentasikan menjadi object dalam program.
6. Kontrol Akses
Pada pembahasan OOP yang lebih lanjut, enkapsulasi dapat digunakan untuk mengontrol bagaimana data diakses dan dimodifikasi.
Contoh Sederhana
Berikut contoh sederhana penerapan enkapsulasi:
class PlayerCharacter:
def __init__(self, name, age):
self.name = name
self.age = age
def shout(self):
return f"My name is {self.name}"
def introduce(self):
return f"My name is {self.name} and I am {self.age} years old"
Kemudian:
player1 = PlayerCharacter("Andrei", 100)
print(player1.name)
print(player1.age)
print(player1.shout())
print(player1.introduce())
Output:
Andrei
100
My name is Andrei
My name is Andrei and I am 100 years old
Data dan method yang berkaitan dengan player berada dalam satu class.
Gambaran Konsep
Secara sederhana, enkapsulasi dapat digambarkan seperti berikut:
Class
│
┌────────┴────────┐
│ │
Data Behavior
│ │
┌────┴────┐ ┌───┴────┐
│ │ │ │
name age shout() speak()
│ │
└────────┬────────┘
↓
Object
Class menggabungkan data dan perilaku yang berkaitan sehingga object dapat digunakan sebagai satu unit.
Kesimpulan
Encapsulation adalah konsep OOP yang menggabungkan data dan perilaku yang berkaitan ke dalam satu class.
Contohnya:
class PlayerCharacter:
def __init__(self, name, age):
self.name = name
self.age = age
def shout(self):
return f"My name is {self.name}"
Pada class tersebut:
namedanagemerupakan data atau attribute.shout()merupakan perilaku atau method.- Semuanya berada dalam satu class
PlayerCharacter.
Ketika object dibuat:
player1 = PlayerCharacter("Andrei", 100)
object tersebut memiliki data dan perilaku yang berasal dari class.
Dengan enkapsulasi, program menjadi lebih terorganisir, mudah dibaca, mudah dipelihara, dan lebih mudah dikembangkan.
Setelah memahami enkapsulasi sebagai konsep penggabungan data dan perilaku, pembelajaran selanjutnya dapat dilanjutkan ke konsep abstraction, yaitu bagaimana menyederhanakan penggunaan object dengan menyembunyikan detail implementasi yang tidak perlu diketahui oleh pengguna.