Pemrograman Dart
Operator Aritmatika, Perbandingan, Logika, dan Type Test
Kuasai berbagai operator di Dart 3 mulai dari aritmatika (termasuk pembagian bulat ~/), relasional, logika, operator ternary, hingga pemeriksaan tipe data dengan is dan as.

Menyimpan data ke dalam variabel hanyalah langkah awal; sebuah program baru menjadi bermanfaat ketika mampu mengolah data tersebut—menghitung total harga, membandingkan apakah saldo mencukupi, menggabungkan beberapa syarat kelulusan sekaligus, hingga memeriksa tipe objek yang sedang diproses. Di Dart, semua aktivitas pengolahan ini dilakukan menggunakan operator yang dirangkai menjadi ekspresi (expression, potongan kode yang menghasilkan suatu nilai). Memahami karakteristik unik operator di Dart—seperti perbedaan pembagian biasa / dan pembagian bulat ~/—akan menghindarkan kita dari kesalahan perhitungan maupun ketidakcocokan tipe data.
Yang akan dipelajari
- Menggunakan operator aritmatika (
+,-,*,/,~/,%) serta operator increment/decrement dan penugasan gabungan (+=,-=). - Membandingkan nilai menggunakan operator relasional (
==,!=,<,>,<=,>=). - Menggabungkan kondisi kebenaran dengan operator logika (
&&,||,!) dan cara kerja evaluasi short-circuit. - Menulis ekspresi keputusan satu baris yang ringkas menggunakan operator ternary (
kondisi ? nilaiBenar : nilaiSalah). - Memeriksa dan mengonversi tipe data saat runtime dengan operator type test (
is,is!, danas).
Operator Aritmatika dan Pembagian Bulat (~/)
Operator aritmatika di Dart bekerja seperti matematika sehari-hari, namun ada satu hal penting yang sering mengejutkan pemula dari bahasa lain (seperti C, C++, atau Java): di Dart, operator pembagian biasa (/) selalu menghasilkan tipe double, meskipun kedua angkanya bertipe int dan habis dibagi!
Jika kita membutuhkan hasil pembagian berupa bilangan bulat (int) dengan membuang sisa desimalnya, Dart menyediakan operator khusus bernama pembagian bulat (truncating division) ~/.
| Operator | Arti | Contoh Ekspresi | Hasil & Tipe Data |
|---|---|---|---|
+ |
Penjumlahan | 10 + 3 |
13 (int) |
- |
Pengurangan | 10 - 3 |
7 (int) |
* |
Perkalian | 10 * 3 |
30 (int) |
/ |
Pembagian desimal | 10 / 2 atau 10 / 3 |
5.0 atau 3.3333333333333335 (double) |
~/ |
Pembagian bulat (tanpa desimal) | 10 ~/ 3 |
3 (int) |
% |
Modulo (sisa hasil bagi) | 10 % 3 |
1 (int) |
Pasangan operator ~/ dan % sangat berguna ketika kita ingin memecah satuan, misalnya mengubah total detik menjadi menit dan sisa detik, atau menghitung jumlah halaman dari total item:
void main() {
int totalDetik = 195;
// Pembagian biasa (/) menghasilkan double
double menitDesimal = totalDetik / 60;
// Pembagian bulat (~/) menghasilkan int, modulo (%) mengambil sisanya
int menitUtuh = totalDetik ~/ 60;
int sisaDetik = totalDetik % 60;
print('Total Detik : $totalDetik detik');
print('Menit Desimal : $menitDesimal menit');
print('Durasi Rapi : $menitUtuh menit $sisaDetik detik');
// Operator penugasan gabungan (compound assignment) & increment
int poin = 10;
poin += 5; // Sama dengan: poin = poin + 5 (menjadi 15)
poin *= 2; // Sama dengan: poin = poin * 2 (menjadi 30)
poin++; // Menambah 1 (menjadi 31)
print('Poin Akhir : $poin');
}
// Output:
// Total Detik : 195 detik
// Menit Desimal : 3.25 menit
// Durasi Rapi : 3 menit 15 detik
// Poin Akhir : 31
Catatan tentang
++varvsvar++: Jika berdiri sendiri dalam satu baris sepertipoin++;, keduanya identik. Namun jika disisipkan di tengah ekspresi lain,++poin(pre-increment) akan menambah nilai terlebih dahulu baru mengembalikan hasilnya, sedangkanpoin++(post-increment) mengembalikan nilai lama terlebih dahulu baru menambahkannya. Agar kode mudah dibaca, sebaiknya tulispoin++;ataupoin += 1;pada baris tersendiri.
Operator Perbandingan (Relasional) dan Logika
Operator perbandingan membandingkan dua nilai dan selalu menghasilkan nilai bool (true atau false):
==(sama dengan) dan!=(tidak sama dengan)>(lebih besar dari) dan<(lebih kecil dari)>=(lebih besar atau sama dengan) dan<=(lebih kecil atau sama dengan)
Menariknya, di Dart operator == membandingkan kesamaan isi nilai, bukan alamat memori, termasuk saat membandingkan dua String ('dart' == 'dart' bernilai true).
Untuk menggabungkan beberapa hasil perbandingan, kita menggunakan operator logika:
| Operator | Nama | Kapan menghasilkan true? |
|---|---|---|
&& |
Logika DAN (AND) | Hanya jika kondisi kiri DAN kanan keduanya bernilai true. |
|| |
Logika ATAU (OR) | Jika minimal salah satu kondisi (kiri atau kanan) bernilai true. |
! |
Logika INGKARAN (NOT) | Membalikkan nilai kebenaran (!true menjadi false, !false menjadi true). |
Dart menerapkan evaluasi short-circuit (hubung singkat) pada && dan ||:
- Pada
kondisiA && kondisiB, jikakondisiAsudah bernilaifalse, Dart tidak akan repot-repot mengevaluasikondisiBkarena hasil akhirnya pastifalse. - Pada
kondisiA || kondisiB, jikakondisiAsudah bernilaitrue, Dart langsung mengembalikantruetanpa memeriksakondisiB.
void main() {
int nilaiUjian = 82;
double persentaseKehadiran = 85.0;
bool punyaSuratDokter = false;
// Syarat lulus: nilai minimal 75 DAN (kehadiran minimal 80% ATAU punya surat dokter)
bool syaratNilai = nilaiUjian >= 75;
bool syaratHadir = (persentaseKehadiran >= 80.0) || punyaSuratDokter;
bool lulusMataKuliah = syaratNilai && syaratHadir;
print('Memenuhi syarat nilai : $syaratNilai');
print('Memenuhi syarat hadir : $syaratHadir');
print('Status Kelulusan : $lulusMataKuliah');
print('Perlu Mengulang? : ${!lulusMataKuliah}');
}
// Output:
// Memenuhi syarat nilai : true
// Memenuhi syarat hadir : true
// Status Kelulusan : true
// Perlu Mengulang? : false
Operator Ternary (kondisi ? a : b)
Sering kali kita ingin menentukan nilai sebuah variabel berdasarkan suatu kondisi sederhana. Alih-alih menulis blok if-else sepanjang 6 baris, kita dapat menggunakan operator ternary dengan pola:
kondisi ? nilaiJikaTrue : nilaiJikaFalse
void main() {
int totalBelanja = 120000;
int minimalGratisOngkir = 100000;
// Menggunakan operator ternary untuk menentukan ongkos kirim dan label status
int ongkir = (totalBelanja >= minimalGratisOngkir) ? 0 : 15000;
String labelPromo = (ongkir == 0) ? 'Gratis Ongkir' : 'Ongkir Reguler';
print('Total Belanja : Rp$totalBelanja');
print('Status Promo : $labelPromo (Rp$ongkir)');
print('Total Bayar : Rp${totalBelanja + ongkir}');
}
// Output:
// Total Belanja : Rp120000
// Status Promo : Gratis Ongkir (Rp0)
// Total Bayar : Rp120000
Gunakan operator ternary hanya untuk keputusan dua cabang yang pendek. Jika kondisinya bercabang tiga atau lebih, gunakan percabangan if-else atau switch yang akan kita pelajari pada materi berikutnya agar kode tidak sulit dibaca.
Operator Pemeriksaan Tipe (Type Test: is, is!, as)
Ketika bekerja dengan data dari sumber eksternal (seperti pembacaan JSON dari internet) atau variabel bertipe umum (Object / dynamic), kita perlu memeriksa tipe asli nilai yang disimpan di dalamnya:
| Operator | Kegunaan | Contoh |
|---|---|---|
is |
Menghasilkan true jika objek bertipe sesuai (termasuk tipe turunannya) |
data is String |
is! |
Menghasilkan true jika objek bukan dari tipe tersebut |
data is! int |
as |
Typecast: memaksa memperlakukan objek sebagai tipe tertentu | (data as String).toUpperCase() |
Sama seperti pemeriksaan != null pada materi sebelumnya, menggunakan if (data is String) akan memicu Smart Type Promotion di Dart! Artinya, di dalam blok if tersebut kita tidak perlu lagi melakukan casting manual dengan as.
void main() {
// Object adalah tipe induk dari semua tipe non-null di Dart
Object inputDariServer = '2026-10-25';
// Pemeriksaan tipe dengan 'is' memicu promosi tipe otomatis
if (inputDariServer is String) {
// inputDariServer otomatis dikenali sebagai String di sini
print('Input adalah teks dengan panjang ${inputDariServer.length} karakter.');
}
if (inputDariServer is! int) {
print('Input bukan berupa bilangan bulat (int).');
}
// Penggunaan 'as' ketika kita yakin tipe objeknya adalah num
Object nilaiMentah = 95.5;
num angkaValid = nilaiMentah as num;
print('Nilai setelah typecast: ${angkaValid + 4.5}');
}
// Output:
// Input adalah teks dengan panjang 10 karakter.
// Input bukan berupa bilangan bulat (int).
// Nilai setelah typecast: 100.0
Coba sendiri
Buka dartpad.dev dan salin contoh kode pembagian bulat atau type test di atas. Lakukan percobaan berikut:
- Buat variabel
int jumlahSiswa = 38;danint kapasitasBus = 15;. Coba hitung berapa bus yang terisi penuh (jumlahSiswa ~/ kapasitasBus) dan berapa siswa yang tersisa untuk bus terakhir (jumlahSiswa % kapasitasBus). - Pada contoh type test, ubah baris
Object nilaiMentah = 95.5;menjadiObject nilaiMentah = 'sembilan puluh';lalu jalankan program. Amati TypeError yang dilempar oleh operatorasketika tipe aslinya tidak cocok, lalu perbaiki menggunakan pemeriksaanif (nilaiMentah is num).
Kesalahan yang sering terjadi
| Kesalahan Pemula | Penyebab | Solusi yang Benar |
|---|---|---|
Menulis int hasil = 10 / 2; dan mendapat compile error |
Operator / di Dart selalu menghasilkan tipe double (5.0), sehingga tidak bisa disimpan ke dalam variabel int. |
Gunakan operator pembagian bulat int hasil = 10 ~/ 2; atau ubah tipe penerima menjadi double hasil = 10 / 2;. |
Tertukar antara = (satu sama dengan) dan == (dua sama dengan) |
Menulis if (status = true) ketika bermaksud membandingkan nilai. |
Gunakan = hanya untuk mengisi variabel (assignment), dan == untuk membandingkan kesamaan dua nilai. |
Menulis !(x is int) untuk memeriksa apakah variabel bukan bertipe int |
Belum terbiasa dengan operator bawaan Dart. | Gunakan operator x is! int yang jauh lebih ringkas dan tidak membingungkan urutan tanda kurung. |
Memakai operator as secara langsung tanpa memastikan tipe datanya terlebih dahulu |
Menganggap as akan mengubah (convert) '123' (String) menjadi 123 (int). |
Ingat bahwa as bukan pengonversi teks ke angka (untuk itu gunakan int.parse('123')), melainkan penegas tipe. Utamakan if (x is Tipe) daripada as. |
Kaitannya dengan Flutter / Dunia Nyata: Operator ternary (
kondisi ? WidgetA : WidgetB) adalah salah satu ekspresi yang paling sering Anda tulis di Flutter. Contohnya:isDarkMode ? Colors.black : Colors.whiteuntuk mengganti warna latar belakang tema gelap/terang, atauisLoading ? CircularProgressIndicator() : Text('Simpan Data')untuk menampilkan ikon berputar saat tombol ditekan. Selain itu, operatorisdipakai terus-menerus pada manajemen state (seperti BLoC/Riverpod) ketika memeriksaif (state is ProfileLoaded).
Latihan
Selesaikan tiga latihan berikut di DartPad untuk mengasah penguasaan operator di Dart:
- Latihan 1 (Konversi Koin Permainan): Seorang pemain mengumpulkan
1285koin perunggu. Aturan penukarannya adalah:1koin emas =100koin perunggu, dan1koin perak =10koin perunggu. Gunakan operator~/dan%untuk menghitung berapa koin emas, koin perak, dan sisa koin perunggu yang dimiliki pemain tersebut. - Latihan 2 (Seleksi Beasiswa dengan Logika & Ternary): Buatlah variabel
double ipk = 3.65;,int penghasilanOrtu = 3500000;, danbool juaraLombaNasional = false;. Syarat lolos beasiswa adalah: IPK minimal3.50DAN (penghasilanOrtumaksimal4000000ATAUjuaraLombaNasionalbernilaitrue). Simpan hasil evaluasinya ke dalambool lolosBeasiswa, lalu gunakan operator ternary untuk membuatString pengumumanyang berisi'Selamat, Anda Lolos Beasiswa'atau'Maaf, Belum Memenuhi Syarat'. - Latihan 3 (Pemeriksaan Tipe Data Sensor): Anda menerima tiga variabel bertipe
Object:Object sensorA = 28.4;,Object sensorB = 'ERROR_TIMEOUT';, danObject sensorC = 102;. PeriksasensorAdansensorBmenggunakan operatoris/is!: jika nilainya bertipenum(baikintmaupundouble), cetak nilai angka tersebut ditambah kalibrasi0.5; jika bertipeString, cetak peringatan'Sensor mengalami gangguan: ...'.
Kunci jawaban dan pembahasan
Latihan 1
void main() {
int totalPerunggu = 1285;
int koinEmas = totalPerunggu ~/ 100;
int sisaSetelahEmas = totalPerunggu % 100;
int koinPerak = sisaSetelahEmas ~/ 10;
int sisaPerunggu = sisaSetelahEmas % 10;
print('Total Koin Awal : $totalPerunggu perunggu');
print('Hasil Penukaran : $koinEmas Emas, $koinPerak Perak, $sisaPerunggu Perunggu');
}
// Output:
// Total Koin Awal : 1285 perunggu
// Hasil Penukaran : 12 Emas, 8 Perak, 5 Perunggu
Pembahasan: Pertama kita membagi bulat 1285 ~/ 100 dan mendapatkan 12 koin emas. Sisa bagi 1285 % 100 menghasilkan 85 koin perunggu. Selanjutnya, 85 ~/ 10 menghasilkan 8 koin perak, dan 85 % 10 menyisakan 5 koin perunggu.
Latihan 2
void main() {
double ipk = 3.65;
int penghasilanOrtu = 3500000;
bool juaraLombaNasional = false;
bool lolosBeasiswa = (ipk >= 3.50) &&
((penghasilanOrtu <= 4000000) || juaraLombaNasional);
String pengumuman = lolosBeasiswa
? 'Selamat, Anda Lolos Beasiswa'
: 'Maaf, Belum Memenuhi Syarat';
print('Status Lolos : $lolosBeasiswa');
print('Pengumuman : $pengumuman');
}
// Output:
// Status Lolos : true
// Pengumuman : Selamat, Anda Lolos Beasiswa
Pembahasan: Penggunaan tanda kurung memperjelas prioritas evaluasi logika. Karena ipk >= 3.50 bernilai true dan penghasilanOrtu <= 4000000 bernilai true, ekspresi (true || false) menghasilkan true, sehingga keseluruhan ekspresi && bernilai true. Operator ternary kemudian memilih teks pertama.
Latihan 3
void main() {
Object sensorA = 28.4;
Object sensorB = 'ERROR_TIMEOUT';
if (sensorA is num) {
// Promosi tipe otomatis menjadi num, sehingga bisa dijumlahkan dengan 0.5
print('Bacaan Sensor A (Terkalibrasi): ${sensorA + 0.5} °C');
}
if (sensorB is! num && sensorB is String) {
print('Peringatan Sensor B: Sensor mengalami gangguan ($sensorB)');
}
}
// Output:
// Bacaan Sensor A (Terkalibrasi): 28.9 °C
// Peringatan Sensor B: Sensor mengalami gangguan (ERROR_TIMEOUT)
Pembahasan: Memeriksa sensorA is num mencakup baik tipe int maupun double sekaligus karena num adalah induk dari keduanya. Berkat smart type promotion, di dalam blok if kita dapat langsung menulis sensorA + 0.5 tanpa perlu melakukan typecast (sensorA as num).
Diskusi (0)
Kami menyimpan nama (opsional), komentar, dan hash teknis (bukan alamat IP asli) untuk mencegah spam. Cookie fungsional dipakai agar Anda dapat mengedit atau menghapus komentar sendiri dari browser ini. Untuk permintaan penghapusan, gunakan halaman kontak.
Belum ada komentar. Mulai diskusinya.