OOP (Object Oriented Programming) — Konsep, 4 Pilar, dan Contoh Lengkap untuk Programmer Pemula

📋 Daftar Isi

OOP (Object Oriented Programming) — Konsep, 4 Pilar, dan Contoh Lengkap untuk Programmer Pemula

“Kalau fungsi itu kayak mesin di pabrik, OOP itu kayak satu pabrik utuh — punya berbagai mesin, karyawan, aturan, dan semuanya bekerja bareng-bareng buat ngeluarin produk. Objek-objek ini saling komunikasi dan punya tugas masing-masing.”

Daftar Isi

Apa Itu OOP?

Object Oriented Programming (OOP) atau Pemrograman Berorientasi Objek adalah paradigma pemrograman yang mengorganisir kode di sekitar objek — bukan di sekitar fungsi atau logika prosedural.

Dalam OOP, setiap objek punya:

  • Atribut (properties) — data atau ciri-ciri yang dimiliki objek
  • Method (behaviors) — aksi atau perilaku yang bisa dilakukan objek

Bayangkan kamu ingin ngebuat program buat restoran. Tanpa OOP, kamu harus nulis:

nama_pelanggan = "Budi"
pesanan_pelanggan = ["Nasi Goreng", "Es Teh"]
total_harga = 25000

Itu belasan variabel yang berserakan. Dengan OOP, kamu buat satu cetakan bernama Pelanggan:

class Pelanggan:
    def __init__(self, nama, pesanan):
        self.nama = nama
        self.pesanan = pesanan
        self.total = 0
    
    def tambah_pesanan(self, item, harga):
        self.pesanan.append(item)
        self.total += harga

Satu class bisa bikin banyak object — Budi, Siti, Andi — masing-masing dengan data dan perilaku mereka sendiri.

Mengapa OOP Dibutuhkan?

Sebelum OOP populer, programmer nulis kode secara procedural — semua fungsi dan data bercampur jadi satu. Ini masalah besar saat proyek mulai besar:

MasalahProceduralOOP
OrganisasiData dan fungsi terpisahData + fungsi menyatu dalam objek
ReusabilityCopy-paste kodeBisa buat ulang class berkali-kali
MaintenanceGanti satu fungsi berdampak ke mana-manaEnkapsulasi — perubahan terisolasi
KolaborasiSulit dibagi antar developerClass jadi kontrak yang jelas
Real-world mappingCode nggak mencerminkan dunia nyataObjek mirip entitas nyata

OOP adalah jawaban atas kompleksitas. Semakin besar aplikasi, semakin kamu butuh struktur yang jelas.

Keterkaitan: Konsep ini adalah evolusi dari yang kita bahas di Fungsi dalam Programming. Kalau fungsi adalah blok bangunan, OOP adalah cara menyusun blok-blok itu jadi struktur yang lebih besar dan terorganisir.

Class vs Object — Cetakan vs Hasilnya

Ini konsep paling fundamental di OOP. Sering bikin bingung, padahal sederhana:

  • Class = cetakan (template / blueprint)
  • Object = hasil cetakan (instance)
IstilahAnalogiCoding
ClassCetakan kueclass Mobil:
ObjectKue jadimobilku = Mobil()
AtributWarna, ukuran kuemobilku.warna = "merah"
MethodCara memanggangmobilku.maju()

Contoh class mobil:

class Mobil:
    def __init__(self, merk, warna):
        self.merk = merk
        self.warna = warna
        self.kecepatan = 0
    
    def gas(self, tambah):
        self.kecepatan += tambah
    
    def rem(self):
        self.kecepatan = 0

# Bikin 2 object dari class yang sama
mobil_andi = Mobil("Toyota", "Hitam")
mobil_budi = Mobil("Honda", "Putih")

mobil_andi.gas(20)
print(mobil_andi.kecepatan)  # 20
print(mobil_budi.kecepatan)  # 0 — beda object, beda data

Satu class, banyak object. Masing-masing object punya data sendiri-sendiri.

Empat Pilar OOP

1. Encapsulation (Enkapsulasi)

Enkapsulasi adalah prinsip menyembunyikan data internal suatu object dan hanya membuka akses melalui method tertentu. Ini mencegah data diubah sembarangan dari luar.

Di Python, data “private” ditandai dengan underscore (_ atau __):

class RekeningBank:
    def __init__(self, pemilik, saldo_awal):
        self.pemilik = pemilik
        self.__saldo = saldo_awal  # private
    
    def lihat_saldo(self):
        return f"Rp {self.__saldo:,}"
    
    def transfer(self, jumlah, tujuan):
        if jumlah > self.__saldo:
            return "Saldo tidak cukup!"
        self.__saldo -= jumlah
        tujuan.__saldo += jumlah  # ⚠️ ini cuma contoh
        return f"Transfer Rp {jumlah:,} berhasil"
    
    def setor(self, jumlah):
        self.__saldo += jumlah

rek = RekeningBank("Budi", 1000000)
print(rek.lihat_saldo())  # Rp 1,000,000
# rek.__saldo = 999999999  # ❌ ERROR! AttributeError

Manfaat: Data tidak bisa diubah sembarangan dari luar. Kalau mau ubah saldo, harus lewat method setor() atau transfer() yang udah ada validasinya.

2. Inheritance (Pewarisan)

Inheritance memungkinkan sebuah class mewarisi atribut dan method dari class lain. Ini mengurangi duplikasi kode dan menciptakan hierarki.

class Hewan:
    def __init__(self, nama):
        self.nama = nama
    
    def bersuara(self):
        return "..."

class Kucing(Hewan):  # Kucing mewarisi Hewan
    def bersuara(self):
        return "Meow!"
    
    def goyang_ekor(self):
        return "Ekor bergoyang..."

class Anjing(Hewan):  # Anjing mewarisi Hewan
    def bersuara(self):
        return "Guk guk!"
    
    def jilat(self):
        return "Jilat-jilat..."

kucing = Kucing("Milo")
anjing = Anjing("Doggy")

print(kucing.nama)      # Milo — diwarisi dari Hewan
print(kucing.bersuara())  # Meow! — override
print(anjing.bersuara())  # Guk guk! — override
IstilahArti
Parent class / SuperclassClass yang mewariskan (Hewan)
Child class / SubclassClass yang mewarisi (Kucing, Anjing)
OverrideChild class ganti method dari parent
super()Panggil method parent dari child

3. Polymorphism (Polimorfisme)

Polymorphism berarti “banyak bentuk”. Method yang sama bisa berperilaku berbeda tergantung object yang memanggilnya.

def sound_check(hewan):
    print(f"{hewan.nama} bersuara: {hewan.bersuara()}")

kucing = Kucing("Milo")
anjing = Anjing("Doggy")

sound_check(kucing)  # Milo bersuara: Meow!
sound_check(anjing)  # Doggy bersuara: Guk guk!

Fungsi sound_check nggak peduli objectnya Kucing atau Anjing — yang penting punya method bersuara(). Ini namanya duck typing: “If it walks like a duck and quacks like a duck, it’s a duck.”

Polymorphism juga bekerja lewat inheritance (method override) dan interface (dalam bahasa yang mendukung seperti Java).

4. Abstraction (Abstraksi)

Abstraksi menyembunyikan detail implementasi dan cuma menampilkan fungsionalitas esensial. Ini bikin kode lebih simpel dipakai — kamu nggak perlu tahu gimana cara kerjanya di dalam.

from abc import ABC, abstractmethod

class Kendaraan(ABC):  # Abstract class
    @abstractmethod
    def mulai(self):
        pass
    
    @abstractmethod
    def berhenti(self):
        pass

class Mobil(Kendaraan):
    def mulai(self):
        return "Mesin dinyalakan, gigi 1..."
    
    def berhenti(self):
        return "Rem diinjak, mesin mati"

class Sepeda(Kendaraan):
    def mulai(self):
        return "Kayuh pedal..."
    
    def berhenti(self):
        return "Rem tangan ditarik..."

Perbedaan Abstraction vs Encapsulation:

AspectEncapsulationAbstraction
FokusMenyembunyikan dataMenyembunyikan implementasi
CaranyaPrivate/public accessAbstract class / interface
TujuannyaMelindungi dataMenyederhanakan penggunaan
Contoh__saldo di RekeningBankMethod mulai() tanpa detail mesin

Constructor dan Method

Constructor adalah method spesial yang otomatis dipanggil saat object dibuat. Di Python, constructor adalah __init__():

class Mahasiswa:
    # Constructor — dijalankan saat object baru dibuat
    def __init__(self, nama, nim, jurusan):
        self.nama = nama
        self.nim = nim
        self.jurusan = jurusan
        self.mata_kuliah = []
    
    def daftar_matkul(self, matkul):
        self.mata_kuliah.append(matkul)
        return f"{matkul} ditambahkan"
    
    def info(self):
        return f"{self.nama} ({self.nim}) - {self.jurusan}"

Contoh Lengkap di 3 Bahasa

Python

class Karyawan:
    def __init__(self, nama, gaji):
        self.nama = nama
        self.__gaji = gaji  # encapsulation
    
    def info(self):
        return f"{self.nama}: Rp{self.__gaji:,}"
    
    def naik_gaji(self, persen):
        self.__gaji += self.__gaji * persen / 100

class Manager(Karyawan):  # inheritance
    def __init__(self, nama, gaji, divisi):
        super().__init__(nama, gaji)
        self.divisi = divisi
        self.tim = []
    
    def info(self):  # polymorphism
        return f"Manager {self.nama} - {self.divisi}"

Java

// Class definition
class Karyawan {
    private String nama;        // encapsulation
    private double gaji;
    
    // Constructor
    public Karyawan(String nama, double gaji) {
        this.nama = nama;
        this.gaji = gaji;
    }
    
    public String info() {
        return nama + ": Rp" + gaji;
    }
}

// Inheritance
class Manager extends Karyawan {
    private String divisi;
    
    public Manager(String nama, double gaji, String divisi) {
        super(nama, gaji);
        this.divisi = divisi;
    }
    
    @Override
    public String info() {  // polymorphism
        return "Manager " + super.info() + " - " + divisi;
    }
}

JavaScript (ES6)

class Karyawan {
    #gaji;  // private field (ES6+)
    
    constructor(nama, gaji) {
        this.nama = nama;
        this.#gaji = gaji;
    }
    
    info() {
        return `${this.nama}: Rp${this.#gaji}`;
    }
}

class Manager extends Karyawan {
    constructor(nama, gaji, divisi) {
        super(nama, gaji);
        this.divisi = divisi;
    }
    
    info() {
        return `Manager ${this.nama} - ${this.divisi}`;
    }
}

Kapan Pakai OOP, Kapan Tidak?

OOP bukan satu-satunya paradigma. Kadang pendekatan lain lebih cocok:

SituasiPakai OOP?Kenapa?
Aplikasi besar dengan banyak entitas✅ YaStruktur jelas, mudah diperluas
Game development✅ YaKarakter, item, level = object alami
GUI / UI framework✅ YaTombol, form, window = object
Microservices / API⚠️ MungkinLebih cocok functional + modular
Script kecil (1 file)❌ TidakOverhead nggak sebanding
Data processing pipeline❌ TidakCukup pakai function saja
Sistem real-time / embedded❌ TidakPerformance overhead OOP tinggi

Catatan: Banyak proyek modern pake hybrid — OOP untuk struktur besar, functional untuk logika murni. Nggak harus milih salah satu. Kalau penasaran, baca juga artikel Functional Programming setelah ini (coming soon).

Kesimpulan

OOP adalah paradigma yang mengubah cara kita berpikir tentang kode — dari sekadar instruksi berurutan menjadi kumpulan objek yang saling berinteraksi. Empat pilarnya (encapsulation, inheritance, polymorphism, abstraction) bukan teori abstrak, tapi alat praktis yang bikin kode lebih terstruktur, mudah di-maintain, dan scalable.

AspekIntinya
Apa itu OOPParadigma programming berbasis objek — gabungan data + fungsi
Class vs ObjectClass = cetakan, Object = hasil cetakan
4 PilarEncapsulation, Inheritance, Polymorphism, Abstraction
Kapan dipakaiAplikasi besar, game, GUI, sistem kompleks
Kapan dihindariScript kecil, data pipeline, sistem real-time

💬 Komentar