0% menganggap dokumen ini bermanfaat (0 suara)
76 tayangan43 halaman

Pengenalan OOP

Diunggah oleh

eptspsekolah
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
76 tayangan43 halaman

Pengenalan OOP

Diunggah oleh

eptspsekolah
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 43

Saat mengembangkan sebuah perangkat lunak, tentu kita harus

mengetahui terlebih dahulu paradigma dalam dunia


pemrograman. Mungkin kita sudah pernah mendengar beberapa
paradigma seperti imperative, object-oriented, procedural,
dan functional. Paradigma pemrograman itu apa sih? Paradigma
pemrograman adalah gaya atau cara kita menulis program. Pada
Modul ini kita akan membahas mengenai paradigma OOP (object-
oriented programming.)

Nah, sebelum membahas mengenai paradigma OOP, sebaiknya


kita juga harus tahu mengenai hubungan antara prinsip S.O.L.I.D
ini di dalam konsep OOP. Jadi prinsip S.O.L.I.D ini merupakan
panduan bagi kita saat kita akan mengembangkan sebuah sistem
dengan pendekatan OOP. Jika kita mengikuti prinsip-prinsip ini
kita dapat membuat sebuah sistem yang mudah kita gunakan
dan kembangkan kembali, kokoh, dan tidak rapuh. Pada modul
ini kita akan mempelajari apa itu OOP dan pilar-pilar utama
dalam pendekatan OOP seperti encapsulation, abstraction,
inheritance, dan polymorphism yang akan kita bahas pada modul
berikutnya.

Pada pemrograman dengan menggunakan pendekatan OOP kita


akan menemui beberapa istilah atau pembahasan seperti Class,
Attribute dan Function. Perlu kita ingat, bahwa setiap bahasa
pemrograman memiliki istilah-istilah tersendiri . Makna-makna
istilah tersebut hampir sama atau bisa sangat berbeda. Seperti
contohnya, properti atau atribut yang memiliki makna yang sama
meskipun tersendiri namanya berbeda. Biasanya programmer
lebih sering menggunakan atribut untuk istilah yang berkaitan
dengan hal yang mengarah ke mekanisme atau proses yang
dilakukan oleh objek dan menggunakan istilah property untuk
mendeskripsikan karakteristik dari sebuah objek.

Mengapa Object Oriented Programming? OOP (Object Oriented


Programming) masih merupakan salah satu paradigma atau
teknik pemrograman yang populer dalam pengembangan
aplikasi. Dengan paradigma OOP kita dapat dengan mudah
memvisualisasikan kode karena OOP sendiri mirip dengan
skenario kehidupan nyata. Dalam penerapan OOP kita
menggabungkan kumpulan-kumpulan fungsi atau atribut yang
memiliki kesamaan dalam sebuah unit yang kita sebut sebagai
objek.

Class merupakan sebuah blueprint yang dapat dikembangkan


untuk membuat sebuah objek. Blueprint ini merupakan sebuah
template yang di dalamnya menjelaskan seperti apa perilaku dari
objek itu (berupa properti ataupun function).

Visualisasi di atas mencontohkan gambaran umum dari konsep


OOP, di mana terdapat sebuah blueprint Kucing, atribut yang
dimiliki Kucing, dan kemampuan yang dapat dilakukan oleh
Kucing. Dalam paradigma Object-Oriented Programming (OOP),
class merupakan sebuah blueprint yang dapat dikembangkan
untuk membuat sebuah objek. Blueprint ini merupakan sebuah
template yang di dalamnya menjelaskan seperti apa perilaku dari
objek itu (berupa properti ataupun function). Dalam dunia
pemrograman khususnya dalam paradigma OOP, kita sering
membuat banyak objek dengan jenis yang sama. Dengan
membuat blueprint ini kita dapat mengurangi duplikasi kode
dalam membuat objek yang serupa.

Class

Seperti yang telah dijelaskan dalam pembahasan objek, class


merupakan sebuah blueprint. Di dalam class ini kita
mendefinisikan sesuatu yang merupakan atribut ataupun
behaviour.

Kucing
- String color + playing()

- Double height + sleep()

- Double length + eat()

- Double weight + puring()


Pada contoh sebuah class Kucing atributnya berupa warna,
tinggi, lebar, dan berat. Sedangkan untuk behaviour-nya bisa
bermain, tidur, makan, bersuara dsb.

 Kotlin
 Java
 Swift
 JavaScript
 Dart
 Python

1. data class Kucing(


2. var color: String = "",
3. var height: Double = 0.0,
4. var length: Double = 0.0,
5. var weight: Double = 0.0
6. )

Mari kita coba membuat beberapa instance dari class Kucing ini.
Pada dasarnya Instance dan Object adalah hal yang sama.
Karena ketika membahas sebuah objek, kita tahu bahwa sebuah
object adalah instance dari sebuah class yang kita buat, atau
singkatnya adalah objek yang merupakan hasil realisasi dari
sebuah blueprint. Object yang terbentuk dari sebuah class akan
memiliki hak akses terhadap keseluruhan isi class. Eits masih
bingung? Mari kita lihat contoh membuat instance pada potongan
kode di bawah.

 Kotlin
 Java
 Swift
 JavaScript
 Dart

1. fun main() {
2. val persian = Kucing()
3. persian.color = "Putih"
4. persian.height = 24.0
5. persian.length = 46.0
6. persian.weight = 2.0
7. val bengal = Kucing("Coklat", 22.0, 39.0, 2.3)
8. val anggora = Kucing("Abu-abu", 25.0, 41.0, 2.4)
9. }

Cukup mudah kan? Kita dapat mengulangi contoh kode tadi


dengan parameter yang berbeda untuk membuat instance
lainnya.

Property

Property (atau disebut juga dengan atribut) adalah data yang


terdapat dalam sebuah class. Sebuah class tentu memiliki
property dan mempresentasikan karakteristik dari class tersebut.
Masing - masing class memiliki property yang berbeda. Contoh
sebelumnya pada class Kucing, property yang dimiliki berupa
color, height, length dan weight.

 Kotlin
 Java
 Swift
 JavaScript
 Dart
 Python

1. class Kucing (
2. private var color: String,
3. private var height: Double,
4. var length: Double,
5. var weight: Double
6. )

Pada potongan kode di atas, kita dapat melihat property yang


ada pada sebuah class. Umumnya, setiap property memiliki
struktur dasar seperti terdapat modifier, tipe data, nama
konstanta dan nilai.

Function

Function atau fungsi merupakan sebuah prosedur yang memiliki


keterkaitan dengan pesan dan objek. Ketika kita memanggil
sebuah fungsi maka sebuah mini-program akan dijalankan.
Fungsi sendiri bisa diartikan sebagai cara sederhana untuk
mengatur program buatan kita. Contoh, hewan memiliki
beberapa behavior atau fungsi yang dapat ia lakukan seperti
makan, berjalan, atau berkomunikasi dengan hewan lainnya.

 Kotlin
 Java
 Swift
 JavaScript
 Dart
 Python

1. class Kucing (
2. var color: String,
3. var height: Double,
4. var length: Double,
5. var weight: Double
6. ) {
7.
8. fun purring() {
9. println("Meow ..")
10. }
11.
12. fun eat() {
13. weight = weight + 1
14. }
15.}

Okay, jika kita perhatikan, sebuah fungsi dapat membuat object


tersebut untuk menampilkan teks “Meow ..” atau dalam kasus ini
membuat kucing bersuara. Sebuah fungsi juga dapat mengubah
nilai dari salah satu property seperti pada contoh yaitu weight
ketika kucing tersebut makan. Oleh karena itu sebuah fungsi
dapat menjadi salah satu akses untuk memodifikasi property
yang dimiliki oleh objek.
Di modul sebelumnya kita sudah mengetahui apa itu OOP dalam
pemrograman. Di modul ini kita akan lanjut mempelajari hal yang
tidak kalah penting. Apa itu?

Kebayang nggak bagaimana perusahaan sebesar Google


mengatur ratusan bahkan ribuan karyawannya? Dalam hal ini
tentunya Google punya serangkaian aturan dan kebijakan yang
tepat agar mencapai tujuan dan output. Selaras dengan hal
tersebut, ketika kita mengembangkan sebuah perangkat lunak,
pastinya kita akan memiliki jumlah sistem yang banyak. Maka
dari itu kita wajib menerapkan sebuah aturan dan kebijakan
dalam pengembangan tersebut guna menghindari kompleksitas.

Untuk mencapainya, terdapat beberapa teknik yang


dikelompokkan menjadi beberapa pilar yang bisa kita gunakan, di
antaranya:

 Inheritance
 Encapsulation
 Abstraction
 Polymorphism
Sebenarnya, secara tidak langsung kita telah menerapkannya
ketika kita mengembangkan sebuah perangkat lunak. Namun jika
kita ditanya tentang masalah teknis dari beberapa pilar tersebut,
kadang sulit bagi kita untuk menjelaskannya.

Nah, di modul ini kita akan sama-sama belajar beberapa pilar di


atas seperti apa, bagaimana, dan kapan menerapkan pilar OOP
dalam pengembangan perangkat lunak.

Kita mulai dengan membahas Inheritance atau yang akan kita


sering dengar dengan istilah pewarisan. Dalam object oriented
programming, inheritance merupakan salah satu konsep penting.
Kenapa? Karena kita bisa meminimalisir penulisan berulang pada
fungsi, properti, dan variable.

Kok bisa? Inheritance memungkinkan kita untuk mendefinisikan


sebuah class (induk) ke class baru (anak) dan memberi kita
kesempatan untuk menggunakan member dari class yang
diwariskan tersebut. Inheritance dapat didefinisikan juga sebagai
proses di mana suatu objek memperoleh sifat dan perilaku dari
objek lainnya.

Ketika ingin membuat class dengan fungsi yang sudah tersedia


pada class lain, kita tidak perlu lagi menulis ulang kode tersebut
di dalam class yang kita buat. Cukup dengan mewarisi class
tersebut maka kita bisa langsung mengaksesnya.

 Kotlin

 Java

 Swift
 JavaScript

 Dart

 Python

1. class SuperClass { }

2.

3. class SubClass extends SuperClass { }

Saat menggunakan inheritance, kita dapat dengan mudah


menggunakan kembali, menyesuaikan dan memelihara kode
yang sudah dibuat. Keren kan? Kita jadi bisa lebih cepat dan lebih
efisien dalam menuliskan kode. Waktu pengembangan suatu
program jadi ringkas!

Dalam penerapan inheritance, kita akan sering mendengar


beberapa istilah berikut:

 SuperClass
Sebuah class yang fitur-fiturnya akan diwariskan. Kelas
seperti ini biasa dikenal juga dengan istilah Induk, Base,
atau Parent Class.
 SubClass
Anak/Children class yang akan mewarisi member milik
Super Class. Namun, class ini tetap dapat memiliki
membernya sendiri selain yang diwarisi dari SuperClass-
nya.
Jenis-jenis inheritance (pewarisan)
Jika kita ingin menerapkan inheritance, terdapat beberapa cara
yang bisa kita gunakan. Mari kita bahas satu per satu.

Single Inheritance

Yang pertama adalah cara terumum yang mana class yang


dibuat hanya mewarisi satu class. Contohnya adalah seperti
berikut:
 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class Animal {

2. walk() {

3. console.log(`${this.constructor.name} walk!`);

4. }

5. }

6.

7. class Cat extends Animal {

8. walk() {

9. console.log(`${this.constructor.name} walked!`);

10. }

11.}

Multilevel Inheritance

Lanjut dengan multilevel inheritance. Cara ini mengacu pada


mekanisme OOP, di mana SubClass dapat mewarisi SuperClass
yang di mana merupakan sebuah SubClass dari SuperClass lain.
Contohnya seperti kode di bawah ini:
 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class Animal {

2. walk() {

3. console.log(`${this.constructor.name} walk!`);

4. }

5. }

6.

7. class Carnivore extends Animal {

8. eat() {

9. console.log(`${this.constructor.name} eat!`)

10. }

11.}

12.

13.class Cat extends Carnivore { }

Multiple Inheritance
Sama seperti sebelumnya, multiple inheritance mengacu pada
konsep OOP di mana sebuah class dapat mewarisi lebih dari satu
SuperClass. Namun perlu diketahui bahwa beberapa bahasa
pemrograman seperti Java tidak mendukungnya secara penuh,
dengan alasan suatu SubClass harus bisa mengatur
ketergantungan dari 2 (dua) SuperClass-nya.

Tapi jika ingin menerapkannya, kita dapat memanfaatkan


interfaces seperti berikut:

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. let oviparMixins = Base => class extends Base { };

2.

3. let viviparMixins = Base => class extends Base { };

4.

5. class Ovovivipar { }

6.

7. class Snake extends oviparMixins(viviparMixins(Ovovivipar)) { }

Multiple inheritance sendiri sangat jarang digunakan dalam


pengembangan perangkat lunak karena sering menyebabkan
permasalahan, terutama pada hirarki class yang berpotensi
menyebabkan terjadinya kompleksitas tinggi. Worst case
scenario-nya, permasalahan ini malah menghambat
pengembangan.
Hierarchical Inheritance

Sama seperti penerapan inheritance pada umumnya, jenis ini


merupakan sebuah SuperClass yang diwarisi oleh beberapa
SubClass. Misalnya seperti berikut:

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class Animal {

2. walk() {

3. console.log(`${this.constructor.name} walk!`);

4. }

5. }

6.

7. class Carnivore extends Animal {

8. eat() {

9. console.log(`${this.constructor.name} eat!`);

10. }

11.}

12.

13.class Cat extends Carnivore { }


14.

15.class Lion extends Carnivore { }

16.

17.class Dog extends Carnivore { }

Hybrid Inheritance

Terakhir, jenis inheritance yang merupakan kombinasi dari


beberapa inheritance yang sudah dibahas sebelumnya. Jika kita
melihat bagan di atas, sudah pasti kita membutuhkan interfaces
jika ingin menerapkannya apalagi saat menggunakan bahasa
pemrograman seperti Java.

Setelah selesai dengan Inheritance, mari kita lanjut membahas


pilar kedua yaitu Encapsulation. Encapsulation merupakan proses
di mana sebuah penanganan data ditempatkan di dalam wadah
tunggal yang disebut sebagai class. Saat menggunakan
encapsulation, data dapat diisolasi dan tidak dapat diakses
langsung dari luar. Dengan begini, kita cukup menggunakan data
tersebut tanpa harus tahu bagaimana proses yang terjadi sampai
data tersebut bisa digunakan.
Dalam dunia nyata, encapsulation bisa digambarkan seperti
smartphone. Saat menggunakan smartphone kita tidak perlu
tahu bagaimana proses yang berjalan di belakang, seperti
menampilkan sesuatu pada layar, menyediakan jaringan seluler,
dan lain sebagainya. Kita cukup menggunakannya sebagaimana
mestinya sebuah telepon genggam. Seperti itulah encapsulation
bekerja.

Menggunakan Encapsulation

Seperti apa encapsulation itu? Berikut adalah contoh penerapan


kode sederhananya:

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class DataRepository {

2. constructor() {

3. this._data = [];

4. }

5.

6. setData() {

7. const response = /* tons of logical code to retrieve data */

8. this._data = response.data;

9. }

10.
11. get data() {

12. return this._data;

13. }

14.}

Dari contoh kode di atas, apa alasan kita untuk menggunakan


encapsulation? Karena kita akan lebih leluasa dalam melakukan
perubahan nilai tanpa harus mengakses propertinya secara
langsung, cukup gunakan fungsi setter yang tersedia.

Selain itu, kode yang berada di dalam aplikasi diringkas


berdasarkan bagiannya sehingga dapat dengan mudah diubah
tanpa mempengaruhi bagian lainnya. Kode yang sudah
dienkapsulasi tersebut dapat digunakan kembali di seluruh
bagian aplikasi.

Yang perlu diketahui, encapsulation bukan menyembunyikan


sebuah data. Tetapi, encapsulation yang menyebabkan data
tersebut tersembunyi.

Kita lanjut. Seperti judulnya, kita akan membahas tentang apa itu
abstraction. Abstraction adalah mekanisme saat proses dalam
sebuah objek disembunyikan. Object tersebut hanya akan
menyediakan apa yang benar-benar perlu digunakan..

Definisi di atas terlihat mirip seperti Encapsulation. Lantas di


mana bedanya?

 Saat menerapkan abstraction, kita cukup fokus pada apa


yang dilakukan suatu objek tanpa harus tahu bagaimana itu
dilakukan. Sedangkan encapsulation adalah bagaimana ia
menyembunyikan mekanisme suatu objek ketika melakukan
sesuatu.
 Jika Encapsulation menyembunyikan data dengan
menyediakan getter setter untuk mengaksesnya, maka
abstraction menyembunyikan sebuah implementasi dengan
memanfaatkan abstract class, interface, dan lain
sebagainya.

Abstraction Layer

Abstraction layer atau abstraction level merupakan mekanisme


yang memisahkan 2 (dua) kompleksitas sebuah sistem. Dalam
proses komputasi, abstraction layer atau level merupakan cara
menyembunyikan detail implementasi yang kompleks dari
serangkaian fungsionalitas tertentu dengan tujuan agar dapat
memisahkan masalah seperti interoperabilitas.

Contoh abstraction di dunia nyata bisa kita lihat ketika ingin


mengendarai mobil. Kita hanya perlu menekan pedal gas jika
ingin mobil berjalan tanpa harus tau apa yang telah terjadi ketika
pedal gas tersebut ditekan. Ini berlaku juga ketika kita ingin
melakukan pengereman.

Mekanisme seperti di atas menghindarkan kita dari sebuah


kompleksitas sistem. Bisa dibayangkan saat ingin menjalankan
mobil, kita harus tahu dulu tahu proses panjang yang harus kita
lakukan sebelum menginjak pedal gas agar mobil tersebut dapat
berjalan.
Abstraction dalam OOP

Objek dalam bahasa pemrograman dengan paradigma OOP


menyediakan sebuah abstraction yang tentunya digunakan untuk
menyembunyikan mekanisme internal. Seperti contoh di atas,
kita hanya perlu tahu fungsi apa saja yang tersedia untuk
memicu sebuah proses tertentu. Sebaliknya, kita tak perlu
paham bagaimana proses dan tindakan apa yang harus
dilakukan untuk mendapatkan hasil yang sesuai harapan.

Terakhir yang tidak kalah penting, setelah Abstraction, kita akan


mempelajari apa itu Polymorphism.
Polymorphism merupakan kemampuan objek, variabel, atau
fungsi yang dapat memiliki berbagai bentuk. Secara umum
polymorphism dalam OOP terjadi ketika suatu SuperClass
direferensikan ke dalam SubClass. Alhasil kita dapat
mengembangkan sebuah program secara umum, bukan spesifik.

Polymorphism dapat digambarkan seperti seorang yang


menguasai dan mampu berbicara dalam beberapa bahasa. Nah
di sini, seseorang yang bertindak sebagai obyek dan kemampuan
dia berbicara merupakan sebuah Polymorphism. Contoh lainnya
adalah smartphone. Selain sebagai alat komunikasi, smartphone
yang bertindak sebagai objek dapat digunakan sebagai kamera,
pemutar musik dan radio.

Nah pada dasarnya, Polymorphism terbagi atas dua. Yaitu:

Compile time polymorphism

Compile time polymorphism adalah sebuah proses di mana


sebuah method atau fungsi dipanggil saat kompilasi. Ini dapat
terjadi karena sebuah konsep bernama method overloading.
Method overloading merupakan kondisi di mana kita bisa
membuat 2 (dua) atau lebih fungsi yang memiliki jumlah, tipe,
atau urutan parameter yang berbeda di dalam sebuah class.

Contoh penerapannya terbagi atas 2 (dua) yang didasari atas


pengertian method overloading itu sendiri. Pertama adalah
parameter type dengan contoh kode seperti di bawah ini:

 Kotlin

 Java

 Swift

1. class Arithmetic {

2. public int add(int valueA, int valueB) {

3. return valueA + valueB;


4. }

5.

6. public long add(long valueA, long valueB) {

7. return valueA + valueB;

8. }

9.

10. public long add(int valueA, long valueB) {

11. return valueA + valueB;

12. }

13.

14. public long add(long valueA, int valueB) {

15. return valueA + valueB;

16. }

17.}

Method overloading di atas dibedakan atas tipe argumen yang


menjadi parameter dari fungsi tersebut. Bagaimana pemanggilan
dari beberapa fungsi di atas ditentukan? Kuncinya ada pada
argumen yang disematkan ketika fungsi tersebut digunakan di
dalam program. Argumen tersebut mendasari berjalannya proses
kompilasi.

 Kotlin

 Java

 Swift

1. class Arithmetic {

2. public int add(int valueA, int valueB) {

3. return valueA + valueB;


4. }

5.

6. public long add(long valueA, long valueB) {

7. return valueA + valueB;

8. }

9.

10. public long add(int valueA, long valueB) {

11. return valueA + valueB;

12. }

13.

14. public long add(long valueA, int valueB) {

15. return valueA + valueB;

16. }

17.}

18.

19.class Add extends Arithmetic{

20. @Override

21. public int add(int valueA, int valueB) {

22. System.out.println("Calculate!");

23. return super.add(valueA, valueB);

24. }

25.}

Runtime Polymorphism

Berbeda dengan compile time polymorphism yang memanggil


fungsi ketika proses kompilasi, runtime polymorphism adalah
proses di mana sebuah fungsi dipanggil pada saat runtime.
Contoh dari runtime polymorphism adalah method overriding,
yaitu sebuah kelas yang memiliki fungsi dengan nama sama
dengan fungsi yang di dalam kelas induknya.

Sederhananya, method overriding adalah sebuah fitur pada


sebuah bahasa pemrograman yang memungkinan sub class
mewarisi sebuah implementasi yang spesifik dari sebuah fungsi
yang ada pada kelas induknya (parent class). Implementasi pada
sub class akan menimpa atau mengganti implementasi pada
parent class.

Lantas kenapa method overriding dipanggil saat runtime?


Jawabannya, ketika proses kompilasi berlangsung, kompiler tidak
tahu fungsi mana yang dipanggil. Apakah yang berada pada sub
class atau parent class-nya? Keduanya punya nama yang sama.
Sehingga, JVM (Java Virtual Machine)-lah yang akan berperan
menentukan fungsi mana yang akan dipanggil ketika runtime.

Cara menerapkan method overriding pun sederhana. Cukup


seperti contoh kode berikut:

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class Animal {

2. walk() {

3. console.log(`${this.constructor.name} walk!`);

4. }
5. }

6.

7. class Cat extends Animal {

8. walk() {

9. super.walk();

10. console.log(`Yeay! ${this.constructor.name} walked!`);

11. }

12.}

13.

14.const main = () => {

15. const cat = new Cat();

16. cat.walk()

17.};

18.

19.main();
Rangkuman

Pada modul awal ini, kita telah mengenal dasar-dasar sebelum


melangkah ke modul selanjutnya, yaitu tentang Object Oriented
Programming. Mari kita ulas sejenak apa saja yang telah
dipelajari pada rangkuman ini :

 Paradigma pemrograman adalah gaya atau cara dalam


menulis suatu program menggunakan bahasa pemrograman
tertentu.
 OOP (Object Oriented Programming) adalah salah satu
paradigma atau teknik pemrograman yang populer dalam
pengembangan aplikasi. Dengan paradigma tersebut, kita
dapat dengan mudah memvisualisasikan kode karena OOP
sendiri mirip dengan skenario kehidupan nyata.
 Dalam penerapannya, OOP menggabungkan kumpulan
fungsi atau atribut yang memiliki kesamaan dalam sebuah
unit yang kita sebut sebagai objek.
 Class, merupakan sebuah blueprint yang dapat
dikembangkan untuk membuat sebuah objek. Di dalam
class bisa terdapat beberapa attribut ataupun behaviour.
 Property, adalah data yang ada dalam sebuah class yang
merepresentasikan karakteristik dari sebuah class. Setiap
property memiliki struktur dasar, diantaranya adalah
modifier, tipe data, nama konstanta dan nilai.
 Function, sebuah prosedur yang memiliki keterkaitan
dengan pesan dan objek.
 Ada 4 pilar dalam OOP, yaitu Inheritance, Encapsulation,
Abstraction, dan Polymorphism.
 Inheritance, mekanisme pewarisan sifat yang dilakukan dari
sebuah kelas (induk) ke class baru (anak), di mana
beberapa fungsi maupun property yang ada pada induk
kelas akan bisa diakses oleh kelas baru tersebut.

 Ada beberapa istilah dalam inheritance, yaitu superclass


dan subclass. Superclass adalah class yang fitur-fiturnya
akan diwariskan. Sedangkan subclass adalah class baru
yang akan mewarisi member milik superclass.
 Inheritance di kenal ada beberapa jenis, yaitu :

o Single Inheritance, class yang dibuat hanya mewarisi


satu class saja.
o Multiple Inheritance, class yang mewarisi lebih dari
satu superclass
o Hierarchical Inheritance, sebuah superclass yang
diwarisi oleh beberapa subclass.
o Hybrid Inheritance, kombinasi dari beberapa
inheritance.
 Encapsulation, adalah proses di mana penanganan data
diisolasi dan ditempatkan di dalam sebuah class. Data yang
terisolasi tidak dapat diakses langsung dari luar.
 Abstraction, adalah mekanisme saat proses dalam sebuah
objek disembunyikan dan hanya akan menyediakan apa
yang benar-benar perlu digunakan.
 Polymorphism, merupakan kemampuan objek, variabel,
atau fungsi yang dapat memiliki berbagai bentuk.
Polymorphism terbagi menjadi 2 yaitu:

o Compile Time Polymorphism, adalah sebuah proses di


mana sebuah method atau fungsi dipanggil saat
kompilasi. Contoh dari ini adalah konsep overloading.
o Runtime Polymorphism, adalah proses di mana sebuah
fungsi dipanggil pada saat runtime. Contohnya adalah
konsep overriding.
Pada modul sebelumnya kita telah belajar mengenal 4 pilar dari
OOP (Object Oriented Programming)
yaitu inheritance, encapsulation, abstraction, dan polymorphism .
Pada modul ini kita akan belajar mengenai hubungan antar objek
agar kita dapat menuliskan kode dengan mudah, bersih, dan bisa
digunakan kembali (reusable).

Kenapa penting memahami hubungan antara objek di OOP? Jika


paham, kita dapat lebih mudah memahami dan mengurangi
kompleksitas sistem yang akan kita kembangkan.

Hubungan antar objek merupakan hal yang sangat mendasar di


dalam pemrograman berorientasi objek. Hubungan antar objek
juga mendefinisikan bagaimana objek-objek tersebut akan
berinteraksi atau berkolaborasi satu sama lainnya. Dalam
hubungan antar objek terdapat 3 kategori:

 Association : memiliki hubungan “has-a” yang menyatakan


bahwa sebuah kelas memiliki hubungan dengan kelas
lainnya.
 Dependency : hubungan ini memiliki arti bahwa sebuah
kelas memiliki ketergantungan terhadap kelas lain.
 Generalization : memiliki hubungan “is-a” dari kelas yang
spesifik ke kelas yang lebih umum.
Association

Asosiasi didefinisikan sebagai hubungan yang terstruktur, yang


secara konsep memiliki arti bahwa dua komponen saling
terhubung satu sama lain. Jika dilihat pada gambar di atas,
hubungan asosiasi digambarkan dengan garis tidak putus-putus
dan tidak memiliki anak panah pada kedua ujungnya. Apa pasal?
Jawabannya, setiap objek memiliki siklus hidupnya sendiri dan
tidak memiliki “ownership” antara kedua objek tersebut. Semisal
kasus gambar di atas berupa hubungan antara kelas User dan
Seller. Dilihat dari kardinalitasnya, satu User dapat membeli
barang dari berbagai Seller. Apabila class Seller dihilangkan,
class User masih bisa digunakan karena hubungan antara kedua
class tersebut lepas alias tidak saling memiliki.

Kardinalitas

Hubungan asosiasi sendiri memiliki hubungan one-to-one, one-to-


many, many-to-one, dan many-to-many atau yang biasa disebut
sebagai kardinalitas. Kardinalitas adalah hubungan maksimum
yang terjadi dari himpunan entitas yang satu ke himpunan
entitas yang lain, demikian sebaliknya. Mari kita lihat bagaimana
setiap kardinalitas pada hubungan asosiasi.

One-to-one relationship
Hubungan satu ke satu terjadi ketika satu objek A memiliki
referensi dari satu objek B. Sebaliknya, satu objek B memiliki
referensi dengan satu dari objek A. Sebagai contoh, kelas User
hanya memiliki satu data diri dan tidak lebih. Berikut ini
gambarannya.

One-to-many relationship
Hubungan satu ke banyak ini diartikan dengan hubungan antara
dua objek A dan B di mana objek A terhubung dengan lebih dari
satu objek B, tetapi anggota dari objek B hanya terhubung
dengan satu anggota A. Sebagai contoh, seorang pembeli dapat
memiliki atau memesan minimal satu hingga beberapa pesanan.
Semisal, class User dapat memiliki hubungan one-to-many
terhadap class Order. Jika digambarkan akan menjadi seperti
berikut:

Many-to-many relationship
Hubungan banyak ke banyak merupakan hubungan antara dua
buah objek A dan B, di mana setiap anggota dari objek A maupun
B memiliki hubungan lebih dari satu objek A dan B. Sebagai
contoh, seorang pengguna dapat membeli beberapa barang,
tetapi satu buah barang juga dapat dibeli oleh beberapa
pengguna. Jika class User memiliki hubungan many-to-many
terhadap class Product maka hubungan antar class tersebut
dapat diilustrasikan seperti berikut:

Bagus, kita sudah tahu beberapa jenis kardinalitas dalam


hubungan asosiasi. Tetapi bagaimana penerapannya dalam
sebuah kode? Biar lebih mudah memahaminya mari kita lihat
pada skenario dibawah ini.

Seorang pengguna memiliki hubungan one-to-many terhadap


penjual. Pada contoh di bawah sebuah pengguna dapat membeli
barang dari satu atau beberapa penjual. Oleh karena itu, pada
class pengguna kita dapat menambahkan variabel daftar penjual
sebagai tanda bahwa kedua kelas ini memiliki hubungan one-to-
many.

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class Seller {

2. constructor(id, name) {

3. this._id = id;

4. this._name = name;

5. }

6. }

7.

8. class User {

9. constructor(id, name, sellers) {

10. this._id = id;

11. this._name = name;

12. this._sellers = sellers;

13. }

14.}

Dalam hubungan asosiasi antara dua objek, terdapat dua bentuk


relasi yaitu, agregasi dan komposisi. Apa bedanya? Kedua bentuk
hubungan asosiasi ini dibedakan berdasarkan aturan khusus
yang berlaku pada bentuk hubungan tersebut. Jangan bingung,
yuk kita lihat satu per satu penjelasan bentuk hubungan asosiasi
ini.

Aggregation

Bentuk hubungan pertama dari asosiasi adalah agregasi yang


digambarkan dengan dengan garis yang tidak putus-putus
dengan ujung simbol diamond putih yang mengarah pada class
yang memiliki. Meskipun sama-sama berupa hubungan yang
“memiliki,” perbedaan dengan bentuk hubungan komposisi
adalah bentuk hubungan ini tidak terikat, yang berarti setiap
class dapat berdiri sendiri. Seperti contoh pada gambar di atas,
meskipun kelas Shop dihancurkan, class Seller masih dapat
digunakan. Tapi tidak sebaliknya. Jika class Seller tidak ada,
maka class Shop sudah tidak relevan lagi untuk digunakan. Mari
kita lihat contoh kode untuk bentuk hubungan agregasi sebagai
berikut:

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class Shop {

2. constructor(id, name) {

3. this._id = id;

4. this._name = name;
5. }

6.

7. set seller(value) {

8. this._seller = value;

9. }

10.

11. get seller() {

12. return this._seller;

13. }

14.}

15.

16.class Seller {

17. constructor(id, name) {

18. this._id = id;

19. this._name = name;

20. }

21.}

Jika diperhatikan, kedua kelas dapat dibuat secara independen


tanpa harus terdapat class lain saat pembuatannya.

Composition

Bentuk hubungan kedua yaitu komposisi, sebuah hubungan


dapat dikatakan komposisi jika sebuah kelas “memiliki” class
lainnya. Aturan yang berlaku untuk hubungan ini adalah ketika
kelas yang “memiliki” class lainnya dihancurkan maka class yang
“dimiliki” oleh kelas tersebut akan hancur juga atau tidak dapat
digunakan. Untuk lebih mudah memahaminya mari kita
contohkan lewat kasus seperti gambar di atas.

Sebuah class User memiliki bentuk hubungan komposisi dengan


class Address yang ditandai dengan adanya anak panah dengan
ujung diamond hitam penuh, yang mengarah pada class yang
“memiliki” objek tersebut. Ketika class User hancur, maka class
Address yang memiliki hubungan dengan class User tersebut
akan ikut hancur dan tidak bisa digunakan lagi. Agar lebih jelas
lagi, mari kita lihat penerapan kodenya dalam kelas-kelas di
bawah ini.

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class User {

2. constructor(id, name, address) {

3. this._id = id;

4. this._name = name;

5. this._address = address;

6. }

7. }

8.

9. class Address {
10. constructor(id, location) {

11. this._id = id;

12. this._location = location;

13. }

14.}

15.

16.const main = () => {

17. ...

18. const user = new User('1234', 'Khrisna', new Address('123', 'Bandung'));

19.};

20.

21.main();

Perhatikan kode pada fungsi main() di atas, ketika kita membuat


sebuah objek dari class User maka kita juga membuat sebuah
objek baru dari class Address. Apabila objek user kita hapus,
maka objek class address akan terhapus juga. Begitulah ilustrasi
dari bentuk hubungan komposisi.

Bentuk hubungan komposisi lebih kuat dibandingkan dengan


agregasi. Kita dapat melihat gambar di atas bahwa hubungan
komposisi adalah bentuk hubungan terkuat dari ketiganya dan
agregasi merupakan hubungan yang lebih umum lagi. Kedua
bentuk hubungan ini merupakan bentuk hubungan antar objek
yaitu asosiasi, hubungan asosiasi dapat dikatakan komposisi jika
hubungan tersebut adalah hubungan “memiliki” dan dapat
dikatakan hubungan agregasi jika terdapat objek yang
“menggunakan” objek lainnya.
Hubungan dependensi diartikan sebagai hubungan antara dua
buah class, di mana satu class memiliki ketergantungan dengan
class lainnya tetapi class lainnya tidak/mungkin memiliki
ketergantungan terhadap class pertama tadi. Jadi apa pun
perubahan yang terjadi pada class pertama dapat mempengaruhi
fungsi class yang memiliki ketergantungan pada class tersebut.

Hubungan dependensi terjadi apabila, sebuah fungsi pada class A


membutuhkan class B sebagai parameter, fungsi pada class A
memiliki nilai kembalian berupa class B, dan class A
menggunakan class B tetapi class B bukan merupakan sebuah
atribut. Kok mirip seperti hubungan asosiasi? Sebenarnya
hubungan asosiasi sudah pasti memiliki hubungan dependensi.
Hubungan asosiasi dapat menjadi hubungan dependensi jika
kelas yang dibutuhkan bukan merupakan atribut dari class yang
membutuhkannya.

Jika digambarkan, hubungan dependensi dapat dilihat seperti


berikut:

Hubungan dependensi digambarkan dengan garis putus-putus


yang memiliki anak panah, di mana arah anak panah
menunjukkan dependensinya. Pada gambar di atas kita dapat
melihat bahwa kelas ShopService memiliki hubungan dengan
kelas Product, tetapi kelas ShopService tidak memiliki atribut
berupa kelas Product. Mari kita lihat contoh penerapan kodenya
di bawah ini.

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. class ShopService {

2. ...

3. changeProductPrice(price, product) {

4. product.changePrice(price);

5. }

6. }
7.

8. class Product {

9. constructor(id, name, price) {

10. this._id = id;

11. this._name = name;

12. this._price = price;

13. }

14.

15. ...

Kita pasti pernah mendengar kata seperti SuperClass, SubClass,


dan inheritance ketika kita membuat sebuah aplikasi atau sistem
dengan menggunakan pendekatan berorientasi objek. Konsep ini
sangat penting ketika kita berhadapan dengan pemrograman
berorientasi objek seperti java atau kotlin. Mengapa? Karena
tentu lebih mudah bagi kita untuk menirukan objek-objek yang
ada di dunia nyata ke dalam sistem yang akan kita kembangkan.

Generalization

Dalam hubungan generalisasi terjadi proses memisahkan


karakteristik dari dua atau lebih class dan menggabungkannya
jadi satu class yang lebih umum atau biasa kita sebut
SuperClass. Karakteristik ini bisa seperti atribut, hubungan
asosiasi, atau fungsi pada beberapa class. Pada gambar di atas
kita dapat melihat bahwa class Product merupakan SuperClass
dari beberapa class lainnya. Sebabnya, class HealthProduct,
ElectricProduct, dan ConsumeableProduct memiliki beberapa
kesamaan yang bisa berupa atribut ataupun fungsi dari class-
class tersebut dan dapat disatukan menjadi sebuah class yang
lebih umum yaitu class Product.

Specialization

Berbanding terbalik dengan generalisasi, hubungan spesialisasi


berarti membuat sebuah SubClass dari class yang sudah ada.
Bagaimana kita mengenali bahwa kita dapat membuat class baru
dari class yang sudah ada? Cara termudah adalah ketika atribut,
asosiasi atau fungsi pada sebuah class hanya mengarah pada
satu objek di class tersebut. Dengan ini kita dapat membuat
sebuah class tersendiri untuk objek tersebut.

Pada gambar di atas jika kita membuat sebuah class Product


yang memiliki beberapa atribut ataupun fungsi yang tidak
diperlukan oleh class lainnya, maka kita dapat memecah class
Product tersebut menjadi beberapa class lainnya. Misal, ketika
pada sistem yang kita kembangkan akan menjual produk seperti
baterai dan makanan ringan. Jika kita hanya membuat satu class
saja yaitu class Product maka akan terdapat atribut seperti
batteryCapacity yang tidak dibutuhkan oleh produk makanan
ringan.

class yang paling umum biasa kita sebut sebagai superclass.


Saat akan digambarkan ia terletak paling atas dari sebuah
diagram. class yang lebih spesifik atau biasa disebut sebagai
SubClass umumnya diletakkan pada bagian bawah dari
superclass-nya. Jika kita perhatikan contoh di atas, class Product
merupakan sebuah superclass dari beberapa SubClass di
bawahnya. Terdapat atribut yang ada pada class Product dan
dapat digunakan pada SubClass dari class Product tersebut atau
biasa disebut dengan shared element.

class SubClass memiliki beberapa atribut yang hanya dimiliki


oleh class tersebut dan tidak ada pada class SubClass yang
lainnya. Contoh, pada class ConsumableProduct terdapat atribut
expirationDate di mana class ElectronicProduct tidak
memilikinya. Mari kita lihat penerapan generalisasi dan
spesialisasi pada contoh kode di bawah ini.

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. abstract class Product(

2. private var id: String,

3. private var name: String,


4. private var price: String

5. )

6.

7. class ElectronicProduct(

8. private var id: String,

9. private var name: String,

10. private var price: String,

11. private var productionDate: String

12.) : Product(id, name, price)

13.

14.class ConsumableProduct(

15. private var id: String,

16. private var name: String,

17. private var price: String,

18. private var expirationDate: String

19.) : Product(id, name, price)

Pada contoh kode di atas, class Product memiliki beberapa


atribut umum yang ada pada sebuah produk. Sehingga, SubClass
ElectronicProduct dan ConsumableProduct akan memiliki atribut
turunan dari class Product dan class SubClass dapat memiliki
beberapa atribut spesifik yang dibutuhkan oleh class tersebut.
Hubungan realisasi atau implementasi adalah hubungan
abstraksi khusus antara dua kelas, satu mewakili interface yang
menjadi spesifikasinya (ProductService) dan yang lainnya
mewakili kelas implementasi yang menjadi realisasinya
(ProductServiceImpl). Realisasi dapat digunakan dalam
beberapa hal seperti untuk menyempurnakan sebuah kelas,
optimasi, transformasi, template, model sintesis, komposisi
kerangka kerja, dll. Jika melihat gambar di atas, hubungan
realisasi ditandai dengan garis putus-putus yang memiliki
simbol segitiga putih pada ujungnya yang mengarah pada kelas
yang direalisasikan (supplier).

Interface realization adalah hubungan realisasi khusus antara


classifier dan interface. Hubungan ini menandakan bahwa
classifier mengimplementasikan kontrak yang telah ditentukan
oleh kelas interface. Kelas classifier dapat mengimplementasikan
satu atau beberapa kelas interface. Classifier yang
mengimplementasikan interface mendukung serangkaian fitur
yang dimiliki oleh kelas interface. Selain mendukung fitur, kelas
classifier harus mematuhi batasan yang dimiliki oleh kelas
interface. Mari kita lihat implementasi pada kode berikut.

 Kotlin

 Java

 Swift

 JavaScript

 Dart

 Python

1. interface ProductService {
2. fun getProduct(id: String)

3. fun calculateProductPrice()

4. }

5.

6. class ProductServiceImpl() : ProductService{

7. override fun getProduct(id: String) {

8. // Implementation code

9. }

10. override fun calculateProductPrice() {

11. // Implementation code

12. }

13.}

Pada contoh kode diatas kelas ProductServiceImpl merupakan


kelas classifier yang mengimplementasikan kontrak dari kelas
interface-nya yaitu kelas ProductService.

Rangkuman

Pada modul ini, Anda sudah mempelajari beberapa hubungan


dalam OOP. Sebelum menuju ke modul selanjutnya, mari kita
mengingat-ingat point apa saja yang sudah dipelajari;

 Relations in OOP atau bisa disebut hubungan antar object


adalah hal yang mendasar dalam pemrograman berorientasi
objek. Hubungan tersebut mendefinisikan bagaimana objek-
objek tersebut akan berinteraksi atau berkolaborasi satu
sama lain.
 Ada 3 kategori dalam hubungan antar objek,
yaitu association, dependency, dan generalization.
 Association, didefinisikan sebagai hubungan yang
terstruktur, yang secara konsep memiliki arti bahwa dua
komponen saling terhubung satu sama lain.
 Hubungan dalam asosiasi disebut sebagai kardinalitas, yang
merupakan hubungan maksimum yang terjadi dari
himpunan entitas yang satu ke himpunan entitas yang lain,
atau sebaliknya. Ada beberapa tipe dalam kardinalitas,
yaitu:

o One-to-one relationship, hubungan yang terjadi ketika


satu objek A memiliki referensi dari satu objek B, atau
sebaliknya.
o One-to-many relationship, hubungan antara dua objek
A dan B di mana objek A terhubung dengan lebih dari
satu objek B, tetapi anggota dari objek B hanya
terhubung dengan satu anggota A.
o Many-to-many relationship, hubungan antara dua buah
objek A dan B, di mana setiap anggota dari objek A
maupun B memiliki hubungan lebih dari satu objek A
dan B.
 Dalam hubungan asosiasi antara 2 objek, terdapat 2 relasi
yaitu:

o Aggregation, hubungan yang tidak terikat, hanya


sekedar memiliki. Setiap class yang berhubungan
dapat berdiri sendiri jika salah satunya dihancurkan
atau tidak ada.
o Composition, hubungan yang saling terikat, yang
saling memiliki satu sama lain. Apabila salah satunya
dihancurkan, maka class yang terikat lainnya akan
hancur juga, atau tidak bisa digunakan lagi.
 Dependency, adalah hubungan antara dua buah class, di
mana satu class memiliki ketergantungan dengan class
lainnya tetapi class lainnya tidak/mungkin memiliki
ketergantungan terhadap class pertama.
 Generalization, adalah konsep pemisahan karakteristik dari
dua atau lebih class dan menggabungkannya menjadi satu
class yang lebih umum atau biasa disebut Superclass.
Berbanding terbalik dari generalisasi, specialization adalah
konsep membuat subclass dari class yang sudah ada.
 Realization, adalah hubungan abstraksi khusus antara dua
kelas, satu mewakili kelas yang direalisasikan (supplier) dan
yang lainnya mewakili kelas implementasinya (client)

Seringkali kita mendengar bahwa dalam mengembangkan


sebuah perangkat lunak, kita
membutuhkan architecture dan design. Lantas apakah makna
dari kedua kebutuhan tersebut?

Di dunia nyata, contohnya dalam membangun sebuah


rumah, architecture akan menentukan seperti apa bentuk dari
rumah yang akan dibangun, baik itu visual eksterior maupun
interior. Sedangkan design lebih mengarah pada hubungan antar
komponen-komponen yang berada di dalamnya. Design untuk
interior misalnya, adalah tentang estetika antara komponen di
dalam ruangan seperti pemilihan warna cat, perabotan dan lain
sebagainya.

Dalam pengembangan sebuah perangkat


lunak, architecture berada pada tingkat tertinggi atau yang
dikenal dengan istilah high-level, di mana definisinya merupakan
sebuah pola arsitektur yang menentukan bentuk dan struktur
keseluruhan perangkat lunak. Sedangkan desain memiliki posisi
di tingkat rendah atau istilahnya adalah low-level di
bawah architecture. Desain juga memiliki definisi yaitu
interkoneksi antara modul dan beberapa entitas perangkat lunak
seperti packages, components, dan classes.

Anda mungkin juga menyukai