Masukkan Password
51 6.0 What is Object Oriented Programming in Dart | Learn OOP in Dart | OOP Tutorials | Dart Course
Sekarang kita masuk ke Chapter 6: Object-Oriented Programming (OOP). Ini memang salah satu bagian paling penting dalam Dart, karena nanti konsep class dan object akan menjadi dasar ketika kamu belajar membuat aplikasi yang lebih besar, termasuk Flutter.
Caption ini baru membahas pengantar OOP, jadi jangan khawatir kalau beberapa istilah seperti encapsulation, inheritance, polymorphism, dan abstraction masih terasa asing. Di sini kita fokus memahami apa itu OOP, class, object, attribute, method, dan nullable/late terlebih dahulu.
1. Apa itu OOP?
OOP adalah singkatan dari:
Object-Oriented Programming
Dalam bahasa Indonesia:
Pemrograman Berorientasi Objek
OOP adalah sebuah cara atau paradigma dalam membuat program dengan menggunakan object (objek) dan hubungan/interaksi antar-object tersebut.
Bahasa pemrograman yang mendukung konsep OOP antara lain:
- Dart
- Java
- C++
- Python
- dan banyak lainnya.
2. Kenapa kita membutuhkan OOP?
Bayangkan kita ingin membuat program untuk menyimpan data seseorang.
Data seseorang misalnya:
Nama : Budi
Umur : 20
Tinggi : 170 cm
Kalau menggunakan cara sederhana, kita mungkin membuat:
String name = 'Budi';
int age = 20;
double height = 170;
Tidak ada masalah kalau hanya satu orang.
Tapi bagaimana kalau ada 100 orang?
Kita bisa berakhir dengan banyak variable:
String name1;
int age1;
double height1;
String name2;
int age2;
double height2;
String name3;
int age3;
double height3;
Dan seterusnya.
Program menjadi sulit dikelola.
OOP memberikan cara untuk mengelompokkan data dan perilaku yang berhubungan menjadi satu kesatuan.
Misalnya:
PERSON
│
┌────────┼────────┐
↓ ↓ ↓
name age height
+
┌────────┼────────┐
↓ ↓ ↓
walk talk convertHeight
Jadi data dan operasi yang berhubungan dengan Person dikumpulkan dalam satu tempat.
Tempat tersebut disebut class.
3. Apa itu Class?
Class bisa kita bayangkan sebagai cetakan / blueprint / template.
Misalnya kita mempunyai cetakan rumah.
Cetakan rumah bukan rumah yang sebenarnya.
Cetakan hanya menjelaskan:
Rumah mempunyai:
- warna
- jumlah kamar
- luas
Rumah bisa:
- buka pintu
- tutup pintu
Begitu juga dengan Person.
Kita bisa membuat:
class Person {
String name;
int age;
double height;
}
Class Person adalah blueprint untuk object Person.
4. Class bukan object
Ini penting sekali.
Misalnya:
class Person {
String name;
int age;
double height;
}
Person adalah class.
Belum ada orang tertentu di sini.
Class hanya mendefinisikan:
“Kalau nanti ada object Person, dia mempunyai
name,age, danheight.”
Baru ketika kita membuat:
Person obj = Person();
kita membuat object dari class Person.
5. Analogi cetakan kue
Bayangkan kamu mempunyai cetakan kue berbentuk:
🍪 cetakan kue
Dari satu cetakan kamu bisa membuat:
🍪 kue 1
🍪 kue 2
🍪 kue 3
🍪 kue 4
Cetakannya sama.
Tetapi setiap kue adalah benda yang berbeda.
Dalam OOP:
CLASS
↓
blueprint/cetakan
↓
┌───────────────┐
│ Person │
└───────────────┘
│
├──→ Object 1
├──→ Object 2
└──→ Object 3
Jadi:
Class = cetakan
Object = hasil yang dibuat dari cetakan
6. Membuat Class di Dart
Sintaks dasar:
class Person {
}
Kata:
class
adalah keyword Dart untuk membuat class.
Kemudian:
Person
adalah nama class.
Biasanya nama class di Dart menggunakan PascalCase, yaitu huruf pertama setiap kata menggunakan huruf kapital.
Contoh:
class Person {}
class BankAccount {}
class Student {}
class Car {}
Lebih baik:
class BankAccount {}
daripada:
class bankaccount {}
7. Attribute / Field
Sekarang kita masukkan data ke dalam class:
class Person {
String name;
int age;
double height;
}
Di sini kita mempunyai tiga variable:
String name;
int age;
double height;
Variable yang berada di dalam class biasanya disebut:
- field
- property
- atau attribute
Dalam konteks pembelajaran OOP, ketiganya sering digunakan untuk menjelaskan data yang dimiliki object.
Jadi:
Person
│
├── name
├── age
└── height
8. Apa maksud String, int, dan double?
Seperti yang sudah kamu pelajari sebelumnya:
String name;
berarti name menyimpan teks.
int age;
berarti age menyimpan bilangan bulat.
double height;
berarti height menyimpan bilangan desimal.
Misalnya:
name = 'Budi';
age = 20;
height = 170.5;
9. Kenapa muncul error?
Nah, di bagian ini caption mulai membahas hal yang sangat penting dalam Dart: non-nullable variable.
Misalnya:
class Person {
String name;
int age;
double height;
}
Dart akan mengeluh karena field tersebut belum diinisialisasi.
Kenapa?
Karena Dart menganggap:
String name;
berarti:
nameharus selalu mempunyai nilai String yang valid.
Tidak boleh:
name = null;
Begitu juga:
int age;
tidak boleh mempunyai nilai null.
10. Apa itu null?
null secara sederhana berarti:
tidak mempunyai nilai.
Contoh:
String? name;
Artinya:
name bisa berisi String
ATAU
name bisa berisi null
Misalnya:
name = 'Budi';
boleh.
Dan:
name = null;
juga boleh.
11. Nullable dengan tanda ?
Kalau kita ingin membuat variable boleh bernilai null:
String? name;
Perhatikan tanda:
?
Jadi:
String
berarti tidak boleh null.
Sedangkan:
String?
berarti boleh null.
Contoh:
class Person {
String? name;
int? age;
double? height;
}
Sekarang field-field tersebut boleh belum memiliki nilai.
12. Cara kedua: late
Selain nullable, ada cara lain yang disebut instruktur:
late
Misalnya:
class Person {
late String name;
late int age;
late double height;
}
late berarti kira-kira:
“Dart, percaya saya. Variable ini memang belum saya isi sekarang, tetapi saya akan mengisinya sebelum digunakan.”
Jadi kita memberi tahu Dart:
Sekarang belum ada nilai.
Tapi nanti saya akan memberikan nilai.
13. Kenapa late berbeda dengan ??
Ini penting.
Nullable
String? name;
Artinya:
nameboleh memiliki nilai ataunull.
Contoh:
name = null;
valid.
late
late String name;
Artinya:
nametidak bolehnull, tetapi nilainya akan diberikan nanti.
Misalnya:
name = 'Budi';
valid.
Tapi kalau kita mencoba membaca:
print(name);
sebelum memberikan nilai, Dart akan menghasilkan error runtime (LateInitializationError).
Jadi late bukan berarti “boleh kosong selamanya”.
14. Kenapa class membutuhkan late atau nullable?
Karena field di dalam class memiliki aturan initialization.
Contohnya:
class Person {
String name;
int age;
}
Dart bertanya:
“Ketika object
Persondibuat, nilainamedanageapa?”
Kita belum memberikannya.
Karena String dan int secara default tidak boleh null, Dart menolak kode tersebut.
Ada beberapa solusi.
Solusi 1 — Nullable
class Person {
String? name;
int? age;
}
Solusi 2 — late
class Person {
late String name;
late int age;
}
Solusi 3 — Berikan nilai awal
Misalnya:
class Person {
String name = '';
int age = 0;
double height = 0;
}
Solusi 4 — Constructor
Ini justru merupakan cara yang sangat umum dalam OOP:
class Person {
String name;
int age;
double height;
Person(this.name, this.age, this.height);
}
Nah, constructor akan kita pelajari lebih lanjut di materi berikutnya.
15. Membuat Object
Setelah mempunyai:
class Person {
late String name;
late int age;
late double height;
}
kita bisa membuat object:
Person obj = Person();
Mari kita pecah:
Person
adalah tipe datanya.
obj
adalah nama variable/object.
Person()
membuat object baru dari class Person.
Jadi:
Person obj = Person();
│ │ │
│ │ └── membuat object
│ └────────── nama object
└──────────────── tipe
16. Object itu apa?
Object adalah instance dari sebuah class.
Kalimat ini sangat penting:
Object adalah instance yang dibuat berdasarkan class.
Misalnya:
Person obj = Person();
obj adalah object/instance dari class Person.
17. Mengakses attribute menggunakan .
Setelah memiliki object:
Person obj = Person();
kita bisa mengakses field menggunakan operator:
.
Contoh:
obj.name = 'Budi';
Artinya:
Masukkan
"Budi"ke fieldnamemilik objectobj.
Kemudian:
obj.age = 20;
dan:
obj.height = 170.5;
Sekarang object kita mempunyai:
obj
│
├── name → Budi
├── age → 20
└── height → 170.5
18. Membaca attribute
Kita juga bisa mengambil nilainya:
print(obj.name);
Output:
Budi
Misalnya:
print(obj.age);
Output:
20
Jadi tanda titik . digunakan untuk mengakses sesuatu yang dimiliki object.
19. Object kedua
Nah, bagian ini adalah salah satu konsep paling penting dari OOP.
Kita bisa membuat object kedua:
Person obj2 = Person();
Sekarang:
Person class
│
├── obj
│
└── obj2
obj dan obj2 dibuat dari class yang sama.
Tetapi keduanya adalah object yang berbeda.
20. Contoh dua object
Misalnya:
Person obj = Person();
Person obj2 = Person();
obj.name = 'Budi';
obj2.name = 'Ali';
Sekarang:
obj
└── name → Budi
obj2
└── name → Ali
Kalau:
print(obj.name);
hasilnya:
Budi
Sedangkan:
print(obj2.name);
hasilnya:
Ali
21. Kenapa bisa berbeda padahal class-nya sama?
Karena class adalah blueprint, sedangkan setiap object mempunyai data/state sendiri.
Bayangkan class:
PERSON
adalah formulir kosong:
Name: ______
Age: ______
Height: _____
Kita membuat dua orang:
Object 1
Name: Budi
Age: 20
Object 2
Name: Ali
Age: 25
Cetakannya sama.
Tetapi isi masing-masing object berbeda.
22. obj dan obj2 bukan hal yang sama
Walaupun:
Person obj = Person();
Person obj2 = Person();
keduanya bertipe:
Person
mereka bukan object yang sama.
Kita bisa mengatakan:
obj → Person
obj2 → Person
Tipe mereka sama:
Person
tetapi instance-nya berbeda.
23. Class sebagai custom data type
Instruktur mengatakan sesuatu yang sangat penting:
Personbisa dianggap sebagai data type yang kita buat sendiri.
Sebelumnya kamu sudah mengenal:
String
int
double
bool
Sekarang kita membuat:
class Person {
...
}
Maka kita mempunyai tipe:
Person
Jadi:
Person obj = Person();
sama konsepnya seperti:
String name = 'Budi';
Bedanya:
String
adalah tipe bawaan Dart.
Sedangkan:
Person
adalah custom type yang kita buat sendiri.
24. Perbandingan sederhana
| Tipe | Contoh |
|---|---|
String | 'Budi' |
int | 20 |
double | 170.5 |
bool | true |
Person | Person() |
Jadi Person dapat digunakan seperti tipe data lainnya:
Person person1 = Person();
Person person2 = Person();
25. Bagaimana dengan Behavior / Method?
OOP tidak hanya menyimpan data.
Object juga bisa mempunyai behavior (perilaku).
Misalnya Person:
Attributes:
- name
- age
- height
Behavior:
- walk()
- talk()
- convertHeight()
Dalam Dart, behavior biasanya dibuat menggunakan method.
Contoh:
class Person {
late String name;
late int age;
late double height;
void sayHello() {
print('Hello, my name is $name');
}
}
Sekarang:
Person obj = Person();
obj.name = 'Budi';
obj.sayHello();
Output:
Hello, my name is Budi
Perhatikan:
obj.sayHello();
Kita menggunakan object untuk memanggil method miliknya.
26. Attribute vs Method
Ini harus jelas.
Attribute / Field
Menyimpan data:
String name;
int age;
double height;
Method
Melakukan aksi/perilaku:
void walk() {
print('Walking...');
}
Jadi:
CLASS
│
├── DATA
│ ├── name
│ ├── age
│ └── height
│
└── BEHAVIOR
├── walk()
├── talk()
└── sayHello()
27. Contoh sesuai kasus instruktur: mengubah meter ke centimeter
Instruktur memberikan contoh bahwa kita bisa membuat behavior untuk mengubah tinggi dari meter ke centimeter.
Misalnya:
class Person {
late String name;
late double height;
double heightInCentimeters() {
return height * 100;
}
}
Kemudian:
void main() {
Person person = Person();
person.name = 'Budi';
person.height = 1.7;
print(person.heightInCentimeters());
}
Hasil:
170
Di sini:
height
adalah attribute.
Sedangkan:
heightInCentimeters()
adalah behavior/method.
28. Contoh lengkap sederhana
Kalau semua konsep digabung:
class Person {
late String name;
late int age;
late double height;
void sayHello() {
print('Hello, my name is $name');
}
double heightInCentimeters() {
return height * 100;
}
}
void main() {
Person person1 = Person();
person1.name = 'Budi';
person1.age = 20;
person1.height = 1.7;
print(person1.name);
print(person1.age);
print(person1.height);
person1.sayHello();
print(person1.heightInCentimeters());
}
Perhatikan pembagiannya:
class Person
│
├── name ← attribute
├── age ← attribute
├── height ← attribute
│
├── sayHello() ← method
└── heightInCentimeters() ← method
Kemudian:
Person
↓
person1
↓
object
29. Kenapa OOP sangat berguna?
Misalnya kita membuat aplikasi bank.
Tanpa konsep OOP, kita mungkin mempunyai banyak variable:
accountName
accountNumber
balance
...
Lalu ada function:
deposit()
withdraw()
transfer()
Dengan OOP, kita bisa mengelompokkannya:
BankAccount
│
├── accountNumber
├── accountName
├── balance
│
├── deposit()
├── withdraw()
└── transfer()
Kemudian kita bisa membuat:
account1
account2
account3
...
Semua berasal dari class yang sama.
30. Enam konsep OOP yang disebut di akhir
Instruktur menyebutkan:
1. Class
2. Object
3. Encapsulation
4. Inheritance
5. Polymorphism
6. Abstraction
Jangan khawatir kalau belum mengerti semuanya.
Untuk sekarang, cukup kenali gambaran umumnya.
1. Class
Blueprint/cetakan.
class Person {}
2. Object
Instance yang dibuat dari class.
Person person = Person();
3. Encapsulation
Mengatur bagaimana data dan behavior di dalam object dapat diakses/digunakan.
4. Inheritance
Class dapat mewarisi fitur dari class lain.
Contoh konsep:
Animal
↑
│
Dog
Dog dapat mewarisi karakteristik tertentu dari Animal.
5. Polymorphism
Satu interface/konsep yang sama dapat memiliki perilaku berbeda tergantung object-nya.
6. Abstraction
Menyembunyikan detail implementasi yang tidak perlu diketahui pengguna dan menampilkan bagian penting saja.
Enam konsep ini nanti akan dibahas satu per satu.
31. Hal terpenting dari materi ini
Kalau kamu baru pertama kali belajar OOP, jangan mencoba menghafal semua istilah.
Pastikan empat hal ini benar-benar kamu pahami:
A. Class
Blueprint/cetakan.
class Person {
...
}
B. Object
Benda/instance yang dibuat berdasarkan class.
Person person = Person();
C. Attribute
Data yang dimiliki object.
person.name
person.age
person.height
D. Method
Perilaku/aksi yang bisa dilakukan object.
person.sayHello();
32. Gambaran akhirnya
Coba simpan gambaran ini di kepala:
CLASS
┌─────────┐
│ Person │
├─────────┤
│ name │
│ age │
│ height │
├─────────┤
│ walk() │
│ talk() │
└─────────┘
│
┌─────────┴─────────┐
↓ ↓
OBJECT 1 OBJECT 2
person1 person2
│ │
name = Budi name = Ali
age = 20 age = 25
height = 1.7 height = 1.8
Class-nya satu, tetapi object-nya bisa banyak.
Dan masing-masing object mempunyai data/state sendiri.
🧠 Ringkasan super penting
OOP
│
├── Class
│ └── blueprint/cetakan
│
├── Object
│ └── instance dari class
│
├── Attribute/Field
│ └── data yang dimiliki object
│
└── Method
└── behavior/aksi object
Contoh paling sederhananya:
class Person {
late String name;
late int age;
void sayHello() {
print('Hello, $name');
}
}
void main() {
Person person = Person();
person.name = 'Budi';
person.age = 20;
print(person.name);
print(person.age);
person.sayHello();
}
Cara membacanya:
Saya membuat blueprint bernama
Person. Person memilikinamedanage, serta bisa melakukansayHello(). Kemudian saya membuat objectpersondari blueprint tersebut, mengisi datanya, dan memanggil behavior-nya.
Itulah inti dasar Object-Oriented Programming yang sedang diperkenalkan di materi ini. Setelah konsep ini benar-benar masuk, materi berikutnya tentang class, object, constructor, encapsulation, inheritance, polymorphism, dan abstraction akan jauh lebih mudah dipahami.
coba buatkan script konten youtube tema diatas dengan konsep video coding2go yang naratif dan deskriptif yang mudah dipahami