Back to IF3210 Pengembangan Aplikasi Piranti Bergerak

Dart Language Fundamentals - Types, Variables, and Functions

Questions/Cues

  • Apa perbedaan antara var, final, dan const dalam deklarasi variabel?
  • Bagaimana Dart mendukung dua mode kompilasi (JIT dan AOT)?
  • Mengapa tipe dasar seperti int dan String dianggap sebagai objek di Dart?
  • Apa kegunaan named parameters dan kapan menggunakan kata kunci required?
  • Bagaimana Dart menangani multiple return values dan anonymous functions?

Reference Points

  • IF3210 Pengembangan Aplikasi Piranti Bergerak (Slides 13a: 3-21)

Evolusi dan Fitur Utama Dart

Dart adalah bahasa pemrograman yang dikembangkan oleh Google, pertama kali dirilis sebagai Dart 1.0 pada November 2013 sebagai alternatif JavaScript untuk web. Evolusinya berlanjut ke Dart 2.0 (Agustus 2018) yang memperkenalkan strong typing, null safety, dan dukungan penuh untuk Flutter, kemudian mencapai Dart 3.0 (Mei 2023) di mana null safety menjadi perilaku bawaan tanpa bisa dinonaktifkan.

Dart dirancang sebagai bahasa platform-independent dengan sejumlah fitur unggulan: dukungan garbage collection untuk manajemen memori otomatis, fungsi sebagai first-class citizens (dapat disimpan dalam variabel dan diteruskan sebagai argumen), sound null safety yang menjamin variabel tidak bisa bernilai null kecuali dideklarasikan eksplisit, OOP penuh dengan enkapsulasi/pewarisan/polimorfisme, pemrograman asinkron via async/await dan Isolates, serta FFI (Foreign Function Interface) untuk berinteraksi dengan kode native C.

Mode Kompilasi Dart: JIT dan AOT

Dart mendukung dua mode kompilasi yang melayani kebutuhan berbeda:

flowchart TD
    A["Kode Dart"] --> B{"Mode?"}
    B -->|"Development"| C["JIT</br>(Just-In-Time)"]
    B -->|"Production"| D["AOT</br>(Ahead-Of-Time)"]
    C --> E["Dart VM</br>(bytecode dieksekusi</br>langsung)"]
    D --> F["Native Code</br>(binary spesifik</br>platform)"]
    E --> G["Hot Reload</br>(perubahan kode</br>langsung terlihat)"]
    F --> H["Performa Tinggi</br>(startup cepat,</br>tanpa VM overhead)"]

JIT (Just-In-Time) digunakan saat pengembangan: kode dikompilasi saat dijalankan oleh Dart VM, memungkinkan fitur hot reload yang sangat produktif — perubahan kode langsung terlihat tanpa restart aplikasi. AOT (Ahead-Of-Time) digunakan untuk produksi: kode dikompilasi penuh ke native code sebelum dijalankan, menghasilkan performa startup yang cepat dan konsumsi memori yang lebih efisien.

Variabel: var, final, dan const

Dart menyediakan tiga cara utama mendeklarasikan variabel, masing-masing dengan semantik yang berbeda:

  • var — variabel biasa dengan type inference; tipe disimpulkan dari nilai awal dan tidak bisa berubah, tetapi nilainya bisa diubah kapan saja. Contoh: var name = 'Dart'; membuat variabel bertipe String.
  • final — variabel yang hanya bisa diassign satu kali (single assignment). Nilai dievaluasi saat runtime. Setelah diassign, variabel tidak bisa menunjuk ke objek lain, tetapi isi objek tersebut masih bisa berubah.
  • const — konstanta compile-time: nilai harus diketahui saat kompilasi. Tidak hanya referensinya yang tetap, tetapi seluruh objek bersifat deeply immutable dan di-canonicalize (hanya satu salinan di memori untuk nilai yang sama).

Tipe Bawaan Dart

Dart memperlakukan semua nilai sebagai objek, termasuk tipe primitif. Tipe-tipe dasar meliputi:

TipeKeteranganContoh
boolNilai benar/salah, immutabletrue, false
intBilangan bulat42, -7
doubleBilangan desimal3.14
numSupertype dari int dan doublenum x = 1;
StringTeks Unicode, immutable'Halo', "Dunia"
ListKoleksi terurut (array)[1, 2, 3]
SetKoleksi unik tak terurut{1, 2, 3}
MapPasangan kunci-nilai{'a': 1}
FunctionFungsi sebagai objek() => print('hi')

Karena bool, int, double, dan String bersifat immutable, setiap operasi seperti penggabungan string atau aritmatika menghasilkan objek baru, bukan memodifikasi yang lama. Meski demikian, tipe-tipe ini tetap memiliki methods dan dapat diperlakukan layaknya objek biasa.

Manajemen Memori dan Garbage Collection

Dart menggunakan garbage collection (GC) untuk manajemen memori otomatis. Objek dialokasikan di heap dan GC secara periodik menelusuri referensi aktif — objek yang tidak lagi dapat dijangkau dari referensi manapun (unreachable) akan dibebaskan memorinya. Pengembang tidak perlu memanggil free() atau delete() secara manual. Pemahaman ini penting untuk menghindari memory leak: selama ada referensi aktif ke suatu objek (misalnya callback yang tersimpan), GC tidak akan membebaskannya.

Fungsi: Parameter, Default, dan Named

Fungsi di Dart mendukung berbagai pola parameter:

  • Parameter posisional wajib: dideklarasikan langsung dalam tanda kurung.
  • Parameter posisional opsional: dibungkus [], dapat diberi nilai default.
  • Named parameters: dibungkus {}, dipanggil dengan nama eksplisit. Gunakan kata kunci required untuk mewajibkannya.

Dart juga mendukung generics pada fungsi, memungkinkan fungsi bekerja dengan berbagai tipe secara type-safe. Contoh: T first<T>(List<T> list) => list[0];.

Multiple return values dicapai menggunakan records — tipe literal (Type1, Type2). Contoh: (String, int) getInfo() => ('Dart', 3);. Nilai dikembalikan sebagai tuple dan bisa didestrukturisasi: var (lang, version) = getInfo();.

Arrow function => adalah sintaks ringkas untuk fungsi satu ekspresi: int kuadrat(int x) => x * x; setara dengan fungsi berblok yang mengembalikan x * x.

Anonymous Functions dan Closures

Anonymous function (lambda) adalah fungsi tanpa nama yang sering digunakan sebagai argumen. Contoh umum: list.forEach((item) { print(item); }); atau dengan map: list.map((x) => x * 2).toList().

Closure adalah fungsi yang menangkap variabel dari lexical scope di mana ia didefinisikan — bukan dari scope pemanggil. Dart menangani bad closure in loops dengan benar: setiap iterasi loop for mendapatkan salinan variabel i-nya sendiri, sehingga closure yang dibuat di dalam loop masing-masing menangkap nilai i yang berbeda. Perilaku ini berbeda dari JavaScript (pre-let) yang sering menyebabkan bug di mana semua closure berbagi referensi variabel yang sama.

Summary

Dart berevolusi dari alternatif JavaScript (2013) menjadi bahasa modern dengan sound null safety bawaan (2023), mendukung JIT untuk hot reload saat development dan AOT untuk native code performa tinggi di produksi. Deklarasi variabel memiliki tiga tingkat: var (mutable dengan type inference), final (single assignment, dievaluasi runtime), dan const (compile-time constant, deeply immutable). Semua tipe dasar (bool, int, String, dll.) adalah objek immutable yang dikelola oleh garbage collector. Fungsi mendukung named parameters dengan required, multiple return values via records (Type1, Type2), dan arrow functions =>. Anonymous functions dan closures memungkinkan gaya pemrograman fungsional, dengan Dart secara aman menangkap salinan variabel loop untuk menghindari bug bad closure.