Class & Object Dasar
Konsep OOP: class sebagai cetakan, object sebagai hasil cetakan.
Class: cetakan untuk objek
Sejauh ini datamu tercerai-berai: nama, umur, nilai sebagai variabel lepas. Tapi di dunia nyata, data berkelompok: seorang siswa punya nama DAN umur DAN nilai. Class adalah cetakan (blueprint) yang mengelompokkan data dan perilaku menjadi satu kesatuan bernama objek.
Analogi: class itu seperti cetakan kue. Cetakannya satu (class Kue), tapi bisa menghasilkan banyak kue (objek) dengan isi berbeda. Tiap kue punya rasa sendiri, tapi bentuknya mengikuti cetakan.
Kenapa OOP ada?
Tiga masalah yang dipecahkan:
- Data berkelompok. Tanpa class, fungsi butuh 5 parameter lepas. Dengan class, cukup satu objek
Siswa. - Perilaku menempel pada data. Method
siswa.lulus()lebih natural daripada fungsi lepascekLulus(nama, nilai). - Model dunia nyata. Aplikasi adalah simulasi dunia: pengguna, produk, transaksi. Class memetakan konsep itu langsung ke kode.
Class pertama
class Siswa {
// Field: data yang dimiliki setiap objek
String nama = '';
int umur = 0;
double nilai = 0.0;
// Method: perilaku yang bisa dilakukan objek
void perkenalkan() {
print('Halo, aku $nama, umur $umur tahun.');
}
bool isLulus() {
return nilai >= 70;
}
}
void main() {
// Membuat objek (instansiasi)
var budi = Siswa();
budi.nama = 'Budi';
budi.umur = 17;
budi.nilai = 85;
var ani = Siswa();
ani.nama = 'Ani';
ani.umur = 16;
ani.nilai = 60;
budi.perkenalkan(); // Halo, aku Budi, umur 17 tahun.
print('Budi lulus? ${budi.isLulus()}'); // true
print('Ani lulus? ${ani.isLulus()}'); // false
}Bedah konsepnya:
- Class
Siswa: cetakannya, ditulis sekali. - Field: variabel milik class (
nama,umur,nilai). Tiap objek punya salinannya sendiri. - Method: fungsi milik class, dipanggil lewat objek dengan titik (
budi.perkenalkan()). - Objek/instance: hasil cetakan (
budi,ani), masing-masing punya data sendiri.
Contoh kedua, class tanpa method pun berguna sebagai wadah data:
class Koordinat {
double x = 0.0;
double y = 0.0;
}
void main() {
var titik = Koordinat();
titik.x = 3.5;
titik.y = -2.0;
print('Titik di (${titik.x}, ${titik.y})');
}Kesalahan umum
1. Lupa membuat objek, langsung pakai class
// SALAH
class Siswa {
String nama = '';
}
void main() {
// print(Siswa.nama); // ERROR: nama milik objek, bukan class
}// BENAR
void main() {
var s = Siswa();
s.nama = 'Budi';
print(s.nama);
}2. Field non-nullable tanpa nilai awal
// SALAH: field String wajib diisi (null safety!)
// class Siswa {
// String nama; // ERROR: harus diinisialisasi
// }// BENAR: beri nilai awal, atau isi lewat constructor (modul berikutnya)
class Siswa {
String nama = '';
}Ini null safety beraksi di OOP: Dart menolak field yang mungkin null tanpa penanganan.
3. Semua objek berbagi data karena salah paham
void main() {
var a = Siswa();
var b = Siswa();
a.nama = 'Budi';
print(b.nama); // '' (kosong), BUKAN 'Budi'
}Tiap Siswa() adalah objek independen dengan field-nya sendiri. Mengubah a tidak memengaruhi b. (Pengecualian: static field, topik lanjutan.)
Kesimpulan
Class = cetakan, objek = hasil cetakan, field = data, method = perilaku. Pola dasarnya: definisikan class sekali, buat banyak objek dengan NamaClass(), akses anggotanya dengan titik.
Catatan teknis: Nama class di Dart memakai UpperCamelCase (
Siswa, bukansiswa). Ini konvensi resmi yang diperiksa oleh linter; mengikutinya membuat kodemu terlihat profesional.
Tantangan
Class Buku
Buat class Buku dengan field judul, penulis, tahun, dan method info() yang mencetak "judul oleh penulis (tahun)". Buat 2 object berbeda.
// TODO: class Buku
void main() {
// TODO: 2 object + panggil info()
}