dartoopclassMenengah4 mnt baca

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:

  1. Data berkelompok. Tanpa class, fungsi butuh 5 parameter lepas. Dengan class, cukup satu objek Siswa.
  2. Perilaku menempel pada data. Method siswa.lulus() lebih natural daripada fungsi lepas cekLulus(nama, nilai).
  3. Model dunia nyata. Aplikasi adalah simulasi dunia: pengguna, produk, transaksi. Class memetakan konsep itu langsung ke kode.

Class pertama

dart
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:

dart
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

dart
// SALAH
class Siswa {
  String nama = '';
}

void main() {
  // print(Siswa.nama); // ERROR: nama milik objek, bukan class
}
dart
// BENAR
void main() {
  var s = Siswa();
  s.nama = 'Budi';
  print(s.nama);
}

2. Field non-nullable tanpa nilai awal

dart
// SALAH: field String wajib diisi (null safety!)
// class Siswa {
//   String nama; // ERROR: harus diinisialisasi
// }
dart
// 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

dart
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, bukan siswa). 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.

text
// TODO: class Buku

void main() {
  // TODO: 2 object + panggil info()
}