Semua program yang telah kita tulis sejauh ini mengikuti gaya prosedural: data disimpan di variabel atau struct, lalu function memproses data tersebut dari luar. Pola ini sehat untuk analisis data satu arah, tetapi rapuh ketika program membesar: siapa pun yang memegang struct boleh menulis field saldo dengan nilai sembarangan, dan setiap function baru harus mengingat sendiri seluruh aturan bisnis. Object-Oriented Programming (OOP) menyatukan data dan perilaku menjadi satu wadah bernama class, lalu menjaga aturannya dari dalam. Cakupan chapter ini:

  • masalah kode prosedural ketika data dan fungsi terpisah
  • tiga pilar OOP: encapsulation, inheritance, polymorphism
  • terminologi class, object, property, method
  • kapan OOP tepat dipakai di MATLAB dan kapan fungsi saja sudah cukup

Ketika Kode Prosedural Mulai Kewalahan #

Aturannya: dalam gaya prosedural, struct menyimpan data dan function memproses data — keduanya tidak terikat secara formal. Mekanisme di balik layar: field dari sebuah struct sepenuhnya publik; setiap assignment rekening.saldo = ... langsung menulis nilai ke memori tanpa satu pemeriksaan pun. Aturan bisnis seperti “saldo tidak boleh negatif” hanya hidup di kepala programmer dan di komentar kode. Mari kita lihat betapa mudahnya aturan tersebut dilanggar:

matlab
% gaya prosedural: data dan aturannya terpisah
rekening.pemilik = 'Budi';
rekening.saldo = 1000000;

% aturan "saldo tidak boleh negatif" tidak dijaga siapa pun
rekening.saldo = rekening.saldo - 2000000;
fprintf('%s | saldo Rp%.2f\n', rekening.pemilik, rekening.saldo);

Output yang Dihasilkan:

text
Budi | saldo Rp-1000000.00

Mari kita bedah baris-baris kode di atas:

  1. Baris 2-3 (rekening.pemilik = ...): struct rekening tercipta secara otomatis saat field pertama diisi — tanpa deklarasi, tanpa aturan.
  2. Baris 6 (rekening.saldo = rekening.saldo - 2000000): assignment langsung menimpa nilai lama; penarikan melebihi saldo lolos tanpa galat.
  3. Baris 7 (fprintf(...)): laporan menampilkan saldo negatif — data yang tidak valid mengalir diam-diam sampai ke output.

Gambar berikut membandingkan kedua gaya: pada gaya prosedural, banyak pihak menulis ke data yang sama tanpa pengawal; pada gaya OOP, data hanya bisa diubah lewat method milik class itu sendiri.

Pada diagram atas, garis putus-putus dari “kode luar” ke struct adalah sumber bug: tidak ada satu titik pun yang bisa kita periksa untuk menegakkan aturan. Pada diagram bawah, garis dari kode luar hanya menuju method — satu-satunya pintu masuk perubahan data.

Tiga Pilar: Encapsulation, Inheritance, Polymorphism #

OOP bukan satu teknik tunggal, melainkan tiga pilar yang bekerja sama. Tabel berikut merangkum ketiganya beserta wujud konkretnya di MATLAB:

PilarPertanyaan kunciWujud di MATLABDibahas di
EncapsulationBagaimana data dilindungi?property + method dalam satu classdef, validasi di constructor dan accessorProperties, Access Control
InheritanceBagaimana class berbagi perilaku?classdef Anak < Induk — class anak mewarisi property dan methodInheritance
PolymorphismBagaimana satu panggilan punya banyak perilaku?method dengan nama sama berperilaku beda sesuai class objekPolymorphism

Encapsulation adalah pilar yang paling langsung terasa: data saldo dan fungsi penyetoran tinggal dalam satu class, dan class menolak nilai yang melanggar aturan. Inheritance memungkinkan kita membuat RekeningPremium yang mewarisi seluruh perilaku RekeningBank tanpa menulis ulang. Polymorphism membuat loop for k = 1:n, akun(k).setor(100), end tetap benar meskipun akun berisi campuran beberapa jenis rekening.

Terminologi: Class, Object, Property, Method #

Empat istilah ini menjadi kosakata tetap sepanjang section. Class sering dianalogikan sebagai cetakan kue dan object sebagai kue hasil cetakan; batas analoginya: hasil cetakan kue identik satu sama lain, sedangkan setiap object membawa data miliknya sendiri.

IstilahArtiPadanan prosedural
classdefinisi: nama, data, dan perilaku yang sama untuk semua instancedefinisi struct + kumpulan function terkait
object / instancevariabel hidup hasil pembuatan dari classvariabel struct
propertyslot data milik satu objectfield pada struct
methodfunction milik class, dipanggil lewat objectfunction biasa yang menerima struct sebagai argumen

Kapan Memakai OOP di MATLAB #

MATLAB bukan bahasa yang memaksa semua hal menjadi object seperti Java. Angka 5 tetap bertipe double, sort() tetap function biasa, dan skrip analisis data tetap sah tanpa satu classdef pun. OOP kita ambil ketika masalahnya memang berbentuk “banyak entitas serupa yang menyimpan state”:

SituasiSaran
GUI app (App Designer menghasilkan class)OOP
Simulasi banyak entitas: 200 robot, partikel, selOOP — satu object per entitas
State kompleks yang harus selalu konsisten (saldo, level air, posisi)OOP — encapsulation menjaga invariant
Analisis data satu arah: load → hitung → plot → simpanscript + function cukup
Utilitas kecil tanpa state (konversi satuan)function cukup

Class Pertama Kita: Titik #

Aturannya: sebuah class ditulis dalam berkas classdef ... end yang berisi blok properties (data) dan methods (perilaku). Mekanisme di balik layar: MATLAB mencari berkas bernama Titik.m saat ekspresi Titik(3, 4) dievaluasi, menjalankan constructor (method bernama Titik), lalu mengembalikan object yang siap dipakai. Berikut class Titik — satu titik pada bidang 2D:

matlab
classdef Titik
    %TITIK Titik pada bidang 2D (value class).
    properties
        x = 0
        y = 0
    end
    methods
        function obj = Titik(x, y)
            if nargin < 2
                y = 0;
            end
            if nargin < 1
                x = 0;
            end
            obj.x = x;
            obj.y = y;
        end
        function d = jarakKe(obj, lain)
            d = sqrt((obj.x - lain.x)^2 + (obj.y - lain.y)^2);
        end
        function tampilkan(obj)
            fprintf('Titik(%.2f, %.2f)\n', obj.x, obj.y);
        end
    end
end

Mari kita bedah baris-baris kode di atas:

  1. Baris 3-6 (properties ... end): dua property dideklarasikan dengan nilai default 0 — setiap object baru mulai dari titik asal.
  2. Baris 8 (function obj = Titik(x, y)): constructor — method bernama sama dengan class; input opsional berkat pemeriksaan nargin.
  3. Baris 15-16 (obj.x = x; obj.y = y;): data calon object diisi; variabel output bernama obj sesuai konvensi MATLAB.
  4. Baris 18-20 (jarakKe): method menerima obj sebagai argumen pertama sehingga bisa membaca obj.x dan membandingkannya dengan titik lain.
  5. Baris 21-23 (tampilkan): method tanpa nilai balik; tugasnya hanya menampilkan ke Command Window.

Skrip uji_Titik.m membuat object, memanggil method, dan memeriksa hasilnya:

matlab
% uji_Titik.m - menguji class Titik
a = Titik(3, 4);
b = Titik(0, 0);

a.tampilkan();
b.tampilkan();

fprintf('jarak a ke b            : %.4f\n', a.jarakKe(b));
fprintf('jarak (function style)  : %.4f\n', jarakKe(a, b));
fprintf('class dari a            : %s\n', class(a));
fprintf('a adalah object         : %d\n', isobject(a));

c = Titik();   % constructor tanpa input -> nilai default
fprintf('c (default)             : (%g, %g)\n', c.x, c.y);

Output yang Dihasilkan:

text
Titik(3.00, 4.00)
Titik(0.00, 0.00)
jarak a ke b            : 5.0000
jarak (function style)  : 5.0000
class dari a            : Titik
a adalah object         : 1
c (default)             : (0, 0)

Perhatikan dua baris jarak: pemanggilan a.jarakKe(b) dan jarakKe(a, b) menghasilkan nilai yang persis sama — dua gaya pemanggilan method yang akan kita bahas tuntas pada Chapter Membuat Class. Ketika object ditampilkan tanpa titik koma, MATLAB menampilkan ringkasan property-nya:

matlab
>> a = Titik(3, 4)
text
a =

  Titik with properties:

    x: 3
    y: 4

Ringkasan #

Kode prosedural memisahkan data dari fungsinya, sehingga aturan bisnis hanya dijaga oleh kebiasaan — assignment sembarang dapat merusak data secara diam-diam. OOP menyatukan keduanya dalam classdef: encapsulation menjaga data lewat validasi, inheritance memungkinkan class saling mewarisi perilaku, dan polymorphism membuat satu panggilan method berperilaku sesuai class objeknya. MATLAB bukan bahasa “semuanya object”: OOP kita pakai saat ada banyak entitas serupa atau state kompleks, sedangkan analisis data tetap nyaman dengan script dan function. Class Titik pada berkas Titik.m dan uji_Titik.m di bagian bawah halaman menjadi titik awal praktik kita.