Tipe bawaan

Tipe int, double, String, dan bool beserta perilakunya tanpa kejutan.

Daftar isi

Program Dart menyusun seluruh datanya dari tipe bawaan (built-in type), dan empat tipe yang sering digunakan adalah int untuk bilangan bulat, double untuk bilangan pecahan, String untuk rangkaian karakter, serta bool untuk nilai benar atau salah. Topik ini membahas perilaku keempatnya satu per satu, termasuk tipe num sebagai supertipe (supertype) yang menjadi induk int dan double. Setelah membaca topik ini, perilaku pembagian bilangan, penyusunan string, dan aturan ketat kondisi bool dapat diantisipasi tanpa kejutan.

int dan double#

Tipe int menampung bilangan tanpa bagian pecahan, sedangkan double menampung bilangan dengan pecahan sesuai standar IEEE 754 berukuran 64 bit. Pada platform native, int menampung nilai dari -2⁶³ sampai 2⁶³ - 1, sedangkan pada web nilai int diwakili sebagai angka JavaScript sehingga rentangnya menjadi -2⁵³ sampai 2⁵³ - 1. Kedua tipe ini merupakan turunan dari num, sehingga operator dasar seperti penjumlahan dan pembagian tersedia pada keduanya.

Literal dengan tanda titik desimal menghasilkan double, sedangkan literal tanpa titik menghasilkan int. Sebuah literal bulat yang ditulis pada konteks double pun dianggap sebagai nilai desimal, sehingga deklarasi double suhu = 30 sah dan bernilai 30.0. Perilaku yang sering mengejutkan pemula adalah pembagian, karena operator / selalu menghasilkan double meskipun kedua operannya bilangan bulat, sebagaimana ditunjukkan contoh berikut.

dart Contoh: pembagian dengan / selalu menghasilkan double
void main() {
  var sisaKue = 7 / 2;
  print(sisaKue);
  print(sisaKue.runtimeType);
}
text Keluaran
3.5
double

Ekspresi 7 / 2 menghasilkan 3.5 dengan tipe double, bukan 3. Apabila pembagian bulat yang membuang sisa memang diinginkan, Dart menyediakan operator khusus ~/ yang dibahas pada topik operator. Pemisahan dua operator ini membuat pembagian selalu dapat diprediksi, karena hasilnya tidak pernah berubah tergantung pada tipe operannya.

num sebagai supertipe#

Tipe num adalah supertipe (supertype), yaitu tipe yang menampung seluruh nilai dari tipe turunannya, pada kasus ini int dan double. Sebuah variabel bertipe num boleh diisi bilangan bulat pada satu baris dan bilangan pecahan pada baris berikutnya tanpa ditolak analyzer. Tipe ini juga menyediakan metode umum seperti abs(), ceil(), dan floor(), sedangkan operator khusus bilangan bulat seperti pergeseran bit hanya tersedia pada int. Contoh berikut memanfaatkan sifat fleksibel tersebut.

dart Contoh: num menampung int dan double
void main() {
  num pengukuran = 24;
  print('Pengukuran pertama: $pengukuran');

  pengukuran = 24.5; // masih sah, karena num menampung int dan double
  print('Pengukuran kedua: $pengukuran');
}
text Keluaran
Pengukuran pertama: 24
Pengukuran kedua: 24.5

Variabel pengukuran menampung 24 lalu 24.5 tanpa perubahan deklarasi. Fleksibilitas ini berguna pada kode yang bekerja dengan bilangan secara umum, misalnya membaca hasil pengukuran sensor yang kadang bulat dan kadang pecahan. Tipe num juga lazim digunakan sebagai tipe kembali fungsi yang boleh menghasilkan keduanya, misalnya penguraian teks menjadi angka. Meski begitu, num tidak menggantikan ketegasan tipe, karena analyzer kehilangan informasi apakah nilai sebenarnya bulat atau pecahan. Gunakan num hanya bila kedua bentuk memang sah, dan gunakan int atau double apabila satu bentuk sudah pasti.

String#

Tipe String menyimpan rangkaian karakter dan ditulis dalam tanda kutip tunggal atau ganda. Secara internal, string Dart menyimpan rangkaian unit kode UTF-16 (UTF-16 code unit). Cara menyusun string dari nilai lain yang cukup mudah dibaca adalah interpolasi (string interpolation), yaitu menyisipkan ekspresi ke dalam string dengan tanda dolar. Ekspresi sederhana ditulis $namaVariabel, sedangkan ekspresi yang lebih kompleks dikelilingi kurung kurawal seperti ${sapaan.length}. Alternatif lainnya adalah penggabungan dengan operator +, tetapi interpolasi biasanya lebih ringkas.

Contoh berikut menyusun sapaan dari dua variabel, menghitung panjangnya, lalu mengubah seluruh hurufnya menjadi kapital.

dart Contoh: interpolasi dan penggabungan String
void main() {
  var namaDepan = 'Ali';
  var namaBelakang = 'Pratama';
  var sapaan = '$namaDepan $namaBelakang';

  print(sapaan);
  print('Jumlah karakter: ${sapaan.length}');
  print(sapaan.toUpperCase());
}
text Keluaran
Ali Pratama
Jumlah karakter: 11
ALI PRATAMA

Properti length menghitung jumlah karakter dalam string, yaitu 11 untuk Ali Pratama. Metode toUpperCase() mengembalikan string baru berhuruf kapital tanpa mengubah string aslinya, karena string pada Dart bersifat tidak dapat diubah (immutable), artinya setiap operasi menghasilkan string baru. Sifat ini membuat string aman digunakan sebagai nilai const maupun final.

bool dan kondisi yang tegas#

Tipe bool hanya memiliki dua nilai, yaitu true dan false. Tipe ini menjadi tipe wajib untuk kondisi pernyataan if dan perulangan, karena Dart tidak melakukan konversi otomatis antar tipe. Angka 0, string kosong, dan nilai lain tidak pernah dianggap benar atau salah secara tersirat. Aturan ini menghilangkan kebingungan yang lazim pada bahasa lain, yaitu nilai mana yang dianggap benar secara tersirat, karena satu-satunya nilai yang benar adalah true dan satu-satunya yang salah adalah false. Tipe ini juga menjadi tipe kembali dari perbandingan, sehingga ekspresi seperti suhu > 28 langsung dapat digunakan sebagai kondisi tanpa konversi.

Contoh berikut menggunakan variabel bool sebagai kondisi layanan antrean loket.

dart Contoh: kondisi if wajib bool
void main() {
  var antreanKosong = true;

  if (antreanKosong) {
    print('Loket langsung melayani');
  } else {
    print('Masih ada antrean');
  }
}
text Keluaran
Loket langsung melayani

Ketegasan Dart terhadap tipe kondisi dapat dilihat pada blok berikut. Variabel bertipe int diletakkan langsung pada kondisi if, dan analyzer menolaknya sebelum program dijalankan.

bash
# buat berkas yang memakai int sebagai kondisi, lalu jalankan dart analyze
rm -rf /tmp/uji/tipe-bawaan-bool && mkdir -p /tmp/uji/tipe-bawaan-bool
cat > /tmp/uji/tipe-bawaan-bool/kondisi_int.dart <<'EOF'
void main() {
  var jumlahAntrean = 3;
  if (jumlahAntrean) {
    print('Ada antrean');
  }
}
EOF
cd /tmp/uji/tipe-bawaan-bool && dart analyze
text Keluaran
Analyzing tipe-bawaan-bool...

  error - kondisi_int.dart:3:7 - Conditions must have a static type of 'bool'. Try changing the condition. - non_bool_condition

1 issue found.

Pesan error menyatakan aturannya secara langsung, yaitu kondisi wajib bertipe bool. Perbandingan eksplisit seperti jumlahAntrean > 0 menghasilkan bool dan menjadi perbaikannya. Ketegasan ini sejalan dengan sifat pemeriksaan statis yang dianut Dart sejak deklarasi variabel.

Empat tipe dalam satu program#

Keempat tipe biasanya tampil bersama dalam satu program kecil. Contoh berikut mencatat pembacaan sensor suhu dalam bentuk log sederhana, dengan jumlah pembacaan bertipe int, suhu bertipe double, nama sensor bertipe String, dan status sensor bertipe bool.

Setiap deklarasi pada contoh menggunakan anotasi eksplisit karena program ini berfungsi sebagai contoh pembelajaran tipe, sedangkan program nyata bebas memilih var untuk deklarasi yang tipenya jelas dari nilai awalnya. Nama variabel dipilih sesuai isinya, misalnya jumlahPembacaan untuk hitungan dan suhuTerakhir untuk pengukuran paling akhir, sehingga membaca deklarasinya sudah memberi gambaran isinya. Komentar di samping setiap deklarasi menegaskan peran tiap tipe tanpa perlu membuka dokumentasi.

dart tipe-bawaan.dart
// Log pembacaan sensor suhu sederhana.
// Menampilkan empat tipe bawaan dalam satu program.
void main() {
  int jumlahPembacaan = 12;                  // bilangan bulat
  double suhuTerakhir = 27.5;                // bilangan pecahan
  String namaSensor = 'Sensor Ruang Server'; // rangkaian karakter
  bool sensorAktif = true;                   // benar atau salah

  print('$namaSensor aktif: $sensorAktif');
  print('Pembacaan tercatat: $jumlahPembacaan');
  print('Suhu terakhir: $suhuTerakhir derajat Celsius');

  int suhuPagi = 26;
  double suhuSiang = 29.5;
  double rataRata = (suhuPagi + suhuSiang) / 2;
  print('Rata-rata suhu: $rataRata');
}
text Keluaran
Sensor Ruang Server aktif: true
Pembacaan tercatat: 12
Suhu terakhir: 27.5 derajat Celsius
Rata-rata suhu: 27.75

Baris terakhir menghitung rata-rata dari suhu pagi dan siang. Penjumlahan int dengan double menghasilkan double, sehingga pembagiannya menghasilkan 27.75 tanpa konversi tambahan. Apabila laporan memang menuntut bilangan bulat, pembagian bulat atau pembulatan eksplisit dapat dipilih sesuai kebutuhannya. Pola campuran tipe seperti ini sering muncul pada program nyata, dan aturan tipe Dart menanganinya secara konsisten.

Ringkasan#

  • int dan double adalah turunan num, operator / selalu menghasilkan double, dan pembagian bulat menggunakan ~/.
  • num menampung nilai int dan double sekaligus pada satu variabel, dengan pengorbanan sedikit informasi tipe.
  • String menyimpan rangkaian karakter, bersifat tidak dapat diubah, dan disusun dengan interpolasi.
  • bool hanya berupa true atau false, dan setiap kondisi wajib bertipe bool.

Referensi#