Indonesia, 22 Agustus 2021
Bagian 1: Pengenalan
OOP adalah singkatan dari Object Oriented Programming, sebuah paradigma / cara / pendekatan pemrograman untuk membuat sebuah program / aplikasi. OOP secara garis besar mempunyai 2 hal kunci, yaitu:
Class dan Object.
Definisi Class
Contoh: Ada class bernama Mobil (representasi dari entitas Mobil), maka di dalamnya terdapat properti seperti: merk, tipe, tahunPembuatan, noMesin.
Dan mempunyai sifat / karakteristik dari mobil tersebut dengan method seperti: getMerk() - untuk mengetahui merknya, getTipe() - untuk tau tipenya, getNoMesin( ) - untuk bisa tau no mesinnya
Kira-kira definisi classnya seperti ini:
class Car {
String merk;
String tipe;
int tahunPembuatan;
String noMesin;
public String getMerk() {
return merk;
}
public String getTipe() {
return tipe;
}
public int getTahunPembuatan() {
return tahunPembuatan;
}
public String getNoMesin() {
return noMesin;
}
}
Definisi Object
Nah setelah kita definisikan class Car tadi, kita tentu ingin memakainya kan? Kita ingin menggunakannya untuk ditampilkan atau diotak-atik oleh kita sehingga menjadi informasi yang kita inginkan.
Nah, cara menggunakan hal-hal yang tadi kita definiskan di dalam class Car adalah dengan membuat object dari class Car tersebut. Secara umum caranya dengan memakai kata kunci “new”.
Contoh:
new Car();
Setelah membuat object, kita bisa menampung object tersebut di dalam sebuah variabel reference agar bisa digunakan di banyak tempat. Pertanyaannya, apa itu variabel reference?
Definisi Variable Reference
Ingat ya, Variabel Reference bukan sebuah object!
Variabel reference sama seperti variabel pada umumnya: Tempat buat menampung nilai, hanya saja nilainya sebuah object!
Contoh variabel reference:
class Car {
String merk;
String tipe;
int tahunPembuatan;
String noMesin;
public String getMerk() {
return merk;
}
public String getTipe() {
return tipe;
}
public int getTahunPembuatan() {
return tahunPembuatan;
}
public String getNoMesin() {
return noMesin;
}
}
public static void main() {
Car car;
}
car di sini adalah sebuah variabel reference, variabel yang tipe datanya adalah class Car.
Kenapa tipe datanya sebuah class? Karena nantinya mau diisi object dari class Car.
Jadinya seperti ini:
class Car {
String merk;
String tipe;
int tahunPembuatan;
String noMesin;
public String getMerk() {
return merk;
}
public String getTipe() {
return tipe;
}
public int getTahunPembuatan() {
return tahunPembuatan;
}
public String getNoMesin() {
return noMesin;
}
}
public static void main() {
Car car = new Car();
}
Lalu, apakah kita sudah bisa menggunakan hal-hal yang kita definisikan di dalam class? Yup, sudah! Nah akhirnya sekarang kita bisa nih bikin data berupa wujud nyata dari class Car. Karna kan kita gatau nih wujud nyata dari Car nih apa? Car itu masih belum spesifik soalnya, makanya sebuah object bisa dibuat dengan sangat banyak mewakili wujud nyata dari classnya.
Contoh:
Mau bikin data mobil bernama avanza. Caranya adalah:
class Car {
String merk;
String tipe;
int tahunPembuatan;
String noMesin;
public String getMerk() {
return merk;
}
public String getTipe() {
return tipe;
}
public int getTahunPembuatan() {
return tahunPembuatan;
}
public String getNoMesin() {
return noMesin;
}
}
public static void main() {
Car car = new Car();
car.merk = "Toyota";
car.tipe = "Avanza";
car.tahunPembuatan = 2020;
car.noMesin = "MHD0000SNK12345";
}
Sekarang object dari Car sudah berisi data-data yang kita set seperti di atas. Lalu tentu kita mau pakai dong data-data yang tadi untuk diaplikasi kita? Tinggal panggil saja method untuk mengambil nilai-nilai yang tadi kita set, dan tampilkan di console dengan cara diprint. Caranya adalah:
class Car {
String merk;
String tipe;
int tahunPembuatan;
String noMesin;
public String getMerk() {
return merk;
}
public String getTipe() {
return tipe;
}
public int getTahunPembuatan() {
return tahunPembuatan;
}
public String getNoMesin() {
return noMesin;
}
}
public static void main() {
Car car = new Car();
car.merk = "Toyota";
car.tipe = "Avanza";
car.tahunPembuatan = 2020;
car.noMesin = "MHD0000SNK12345";
System.out.println("Merk: " + car.getMerk());
System.out.println("Tipe: " + car.getTipe());
System.out.println("Tahun pembutan: " + car.getTahunPembuatan());
System.out.println("No mesin: " + car.getNoMesin());
}
Hasilnya seperti ini:
Bagian 2: Method
Method adalah function yang ada di dalam sebuah class. Bagi yang belum tau function, singkatnya function adalah sekumpulan instruksi yang ditampung di dalam 1 wadah, agar nantinya instruksi-instruksi tersebut bisa kita reuse / digunakan kembali tanpa harus menulis ulang.
class Car {
String merk;
String tipe;
int tahunPembuatan;
String noMesin;
// INI ADALAH METHOD
public String getMerk() {
return merk;
}
// INI ADALAH METHOD
public String getTipe() {
return tipe;
}
// INI ADALAH METHOD
public int getTahunPembuatan() {
return tahunPembuatan;
}
// INI ADALAH METHOD
public String getNoMesin() {
return noMesin;
}
}
Bagian 3: Attribute
Attribute adalah hal-hal yang berkaitan dengan class tersebut, contoh:
class Car {
String merk; // INI ADALAH ATTRIBUTE
String tipe; // INI ADALAH ATTRIBUTE
int tahunPembuatan; // INI ADALAH ATTRIBUTE
String noMesin; // INI ADALAH ATTRIBUTE
public String getMerk() {
return merk;
}
public String getTipe() {
return tipe;
}
public int getTahunPembuatan() {
return tahunPembuatan;
}
public String getNoMesin() {
return noMesin;
}
}
Bagian 4: Prinsip Utama OOP (4 main principles of OOP)
Apa itu prinsip utama OOP? Jadi gunanya ada prinsip / asas / dasar utama dari sebuah OOP ini adalah untuk membuat code tersebut menjadi bisa lebih terstruktur dalam paradigma OOP, sehingga kita tau pemetaan data yang diimplementasikan ke dalam code.
Encapsulation
Prinsip ini digunakan agar sebuah class atau attribute (umumnya sih untuk attribute) bisa ditentukan sejauh mana bisa diakses, bisa saja sebuah attribute hanya bisa diakses dari dalam class yang mempunyai attribut tersebut, atau bisa juga diakses dari luar class terkait.
Jadi hal ini seperti tombol yang bisa mengubah sebuah status code tersebut bisa diakses atau tidak. Berikut rinciannya:
Public
Sebuah state yang menandakan bahwa class / attribut / function / interface akan bisa diakses darimana pun, baik dari luar class, dari package yang sama atau luar package.Protected
Sebuah state yang menandakan bahwa class / attribut / function / interface akan bisa diakses luar class akan tetapi class tersebut meskipun berbeda packagePrivate
Sebuah state yang menandakan bahwa class / attribut / function / interface tidak bisa diakses darimana pun, kecuali dari file itu sendiriDefault
Di Java jika kita tidak mendeklarasi encapsulasinya, maka akan menjadi default dan kita di tahap ini maka class / attribut / function / interface akan bisa diakses luar class akan tetapi class tersebut tapi harus di dalam 1 packageAbstraction
Dalam pembuatan class, seringkali seorang programmer akan membuat class tersebut lebih di atasnya "Blueprint" alias abstrak, abstrak adalah hal yang belum jelas, padahal dianggap "blueprint" sendiri bisa dibilang belum jelas, tapi ketika masuk ke kondisi abstrak maka ini hirarki yang lebih tinggi lagi.
Alasannya adalah ketika kita sedang memetakan data ke dalam sebuah class, ada data yang kita inginkan untuk ditempatkan di paling atas secara hirarki, dan nanti class-class di bawahnya (red: blueprint yang di bawahnya) akan mengerut kepada abstract class ini.
Contoh:
public abstract class Vehicle { public String getMerk() { return merk; } public String getTipe() { return tipe; } public int getTahunPembuatan() { return tahunPembuatan; } public String getNoMesin() { return noMesin; } } public class Car extends Vehicle { public String getMerk() { //super DIGUNAKAN UNTUK MEMANGGIL METHOD getMerk() DI CLASS Vehicle super.getMerk() } public String getTipe() {} public int getTahunPembuatan() {} public String getNoMesin() {} public String getTires() { // METHOD INI YANG ORIGINAL DIPUNYAI class Car, kenapa? // KARENA TIDAK SEMUA KENDARAAN PUNYA BAN } }
Di atas adalah sebuah contoh abstraction, bisa dilihat bahwa "the top of class hierarchy" adalah class Vehicle, yang dimana itu sangat abstract, "kendaraan" banyak bentuknya, bisa mobil, bisa pesawat, bisa kereta, akan tetapi setiap kendaraan punya behaviour yang sama: Bisa ada merk, bisa ada tipe kendaraan, bisa ada tahun pembuatan, bisa ada no mesin.
Jadi kesimpulannya abstract class digunakan untuk membuat sebuah class yang behaviour class tersebut otomatis akan diturunkan ke child classnya.
Inheritance
Inheritance adalah sebuah konsep "pewarisan" dalam artian kita setiap class bisa mempunyai 1 parent class, gunanya untuk apa? Dalam kondisi tertentu kita cenderung ingin membuat class yang dimana statusnya akan menjadi parent karena kita ingin lebih banyak membuat blueprint tapi behaviour ataupun attribute tidak perlu mendefinisikan ulang.
Contoh:
public class Suv extends Car { } public class TransportApp { public String getMerk() { Suv suv = new Suv(); System.out.println(suv.getMerk()); } }
Di atas adalah contoh inheritance, dengan menambahkan keyword "extends Car" menandakan class Suv tersebut adalah child dari class Car, oleh karenanya ketika kita membuat object dari class Suv, maka kita bisa langsung otomatis menggunakan method getMerk() yang dimana itu didefinisikan di class Vehicle, kenapa bisa? Padahal kita tidak extends ke class Vehicle.
Jawabannya adalah karena class Suv merupakan child class Car maka otomatis mewariskan juga method-method yang ada di abstract class Vehicle.
Polymorphism
Secara harfiah artinya "Perubahan Bentuk" akan tetapi penjelasan dalam code dalam kasus sebelumnya adalah seperti ini:
public class Suv extends Car {
}
public class TransportApp {
public String getMerk() {
Vehicle suv = new Suv();
System.out.println(suv.getMerk());
}
}
Sudah terlihat bedanya? Ya, betul sekali. Variable reference suv yang tadinya mempunyai tipe Suv menjadi Vehicle, inilah yang disebut perubahan bentuk. Dikarenakan variable suv diisi oleh object Suv, yang notabene adalah turunan dari class Vehicle maka secara variable reference bisa disematkan langsung ke dalam class Vehicle atau bisa juga ke class Car.
Bagian 5: Kesimpulan
OOP digunakan untuk membuat pembuatan program menjadi lebih luas, kenapa lebih luas? Begini, semakin canggih program semakin banyak data dari berbagai macam hal yang akan dia kelola, dan tentu hal-hal itu ada di dunia nyata yang kita harus menyimpan semua itu ke dalam sebuah ruang lingkup digital.
Nah, hal-hal yang di dunia nyata ini kita sebut dengan entitas (bagi yang udah belajar database seharusnya udah ga asing dengan istilah ini). Saya sengaja memakai istilah entitas agar lebih mudah dipahami oleh pelajar dalam memahami konsep OOP terutama Class dan Object.
Entitas-entitas ini ketika ingin diolah datanya ke dalam sebuah program maka harus dipeta-petakan agar kita dengan mudah tau nih apa yang harus kita lakukan pada setiap Entitas. Contoh ya, aplikasi rumah sakit / SIM-RS (Sistem Informasi Manajemen Rumah Sakit).
Di SIM-RS ada banyak entitas seperti Dokter, Perawat, Pasien, Obat, bahkan rumah sakitnya sendiri bisa jadi sebuah entitas. Nah entitas-entitas tadi dipetakan menjadi class-class yang nantinya akan dibuatkan object-object yang diperlukan untuk program kita.
Dengan object-object tadi kita definsikan data kongkritnya sedimikian rupa seperti nama dokternya siapa, no induk dokternya brp, no telpnya brp, alamatnya dimana dll. Yang juga akan diimplementasikan dengan cara yang sama di entitas-entitas lainnya sesuai karakteristik mereka.
Lalu object-object akan digunakan sesuai kebutuhan alur program kita. Dan, OOP ini ada banyak pengembangannya yang pastinya akan lebih seru lagi belajarnya.
Semoga Anda selalu bersemangat dalam belajar, dan jangan lupa untuk mengajarkannya!