Kotlin mengelompokkan setiap nilai ke dalam tipe, dan tipe menentukan operasi yang sah atas nilai tersebut, ukuran memorinya, serta fungsi yang tersedia padanya. Empat tipe yang paling sering digunakan adalah Int, Double, Boolean, dan String. Topik ini membahas sifat masing-masing tipe, konversi yang selalu eksplisit, serta aturan tanpa pelebaran tipe implisit yang membedakan Kotlin dari Java.
Tipe numerik, Boolean, dan String#
Buat berkas nilai.kt berikut, yang masing-masing mendeklarasikan satu nilai untuk keempat tipe tersebut.
fun main() {
val jumlahBaris: Int = 24
val rataRata: Double = 82.5
val lulus: Boolean = true
val nama: String = "Ali"
println("Jumlah baris: $jumlahBaris")
println("Rata-rata: $rataRata")
println("Lulus: $lulus")
println("Nama: $nama")
}# kompilasi nilai.kt dengan pustaka standar tersemat
kotlinc nilai.kt -include-runtime -d nilai.jar
# jalankan program
java -jar nilai.jarJumlah baris: 24
Rata-rata: 82.5
Lulus: true
Nama: AliTabel berikut merangkum isi dan contoh pemakaian keempat tipe tersebut.
| Tipe | Isi | Contoh pemakaian |
|---|---|---|
Int | bilangan bulat 32-bit | jumlah baris, indeks, tahun |
Double | bilangan pecahan 64-bit standar IEEE 754 | rata-rata, berat, suhu |
Boolean | nilai kebenaran true atau false | status lulus, status aktif |
String | rangkaian karakter dalam tanda kutip | nama, kalimat, laporan |
Int dipakai untuk hitungan yang tidak memiliki pecahan, sedangkan Double menampung nilai dengan titik desimal. Boolean hanya memiliki dua kemungkinan nilai dan menjadi dasar percabangan. String menyimpan teks dan menyediakan banyak fungsi pembantu seperti uppercase() dan length.
Batas nilai Int dan luapan#
Tipe Int menampung bilangan bulat 32-bit, dan batas atas serta batas bawahnya dapat dilihat langsung dari program. Buat berkas batas.kt berikut.
fun main() {
println(Int.MAX_VALUE)
println(Int.MIN_VALUE)
println(Int.MAX_VALUE + 1)
}# kompilasi batas.kt dengan pustaka standar tersemat
kotlinc batas.kt -include-runtime -d batas.jar
# jalankan program
java -jar batas.jar2147483647
-2147483648
-2147483648Konstanta Int.MAX_VALUE bernilai 2147483647 dan Int.MIN_VALUE bernilai -2147483648, sesuai dengan rentang bilangan bulat 32-bit bertanda. Baris ketiga memperlihatkan kejadian yang perlu diwaspadai, yaitu penambahan satu pada batas atas justru menghasilkan -2147483648. Peristiwa ini disebut luapan (overflow) karena hasil operasi melompat ke sisi lain rentang tanpa pesan apa pun.
Untuk rentang yang lebih luas, Kotlin menyediakan tipe Long berukuran 64-bit dengan penulisan literal diakhiri huruf L, misalnya 2147483648L. Pilihan tipe yang sesuai dengan rentang data sejak awal menghindarkan perbaikan besar pada saat nilai yang disimpan ternyata tumbuh melewati batas.
Konversi tipe yang eksplisit#
Konversi antartipe numerik pada Kotlin selalu berupa pemanggilan fungsi, misalnya toDouble() dan toInt(). Buat berkas konversi.kt berikut.
fun main() {
val jumlah: Int = 10
val total: Double = jumlah.toDouble()
println("Jumlah: $jumlah")
println("Total: $total")
println("Kembali ke Int: ${total.toInt()}")
}# kompilasi konversi.kt dengan pustaka standar tersemat
kotlinc konversi.kt -include-runtime -d konversi.jar
# jalankan program
java -jar konversi.jarJumlah: 10
Total: 10.0
Kembali ke Int: 10Pemanggilan jumlah.toDouble() menghasilkan 10.0, yaitu nilai yang sama tetapi bertipe Double. Pemanggilan total.toInt() mengembalikannya menjadi 10. Fungsi konversi ditulis dengan jelas di setiap titik perubahan tipe, sehingga pembaca program selalu melihat di mana nilai berpindah dari satu tipe ke tipe lainnya.
Keluarga fungsi konversinya seragam untuk seluruh tipe numerik, yaitu toDouble(), toInt(), dan toLong() pada setiap tipe, serta toString() yang mengubah angka menjadi String. Penulisan yang seragam ini membuat konversi mudah dicari di dalam kode, karena cukup dicari dengan nama fungsinya. Semua konversi dijalankan pada saat program berjalan, dan hasilnya mengikuti aturan tipe tujuan, termasuk pemotongan bagian pecahan pada toInt().
Tidak ada pelebaran tipe implisit#
Java otomatis melebarkan Int menjadi Double ketika keduanya bercampur, sedangkan Kotlin menolak konversi semacam itu dan mengharuskan niatnya ditulis. Berkas melebar.kt berikut mencoba mengisi Double dengan bilangan bulat langsung.
fun main() {
val d: Double = 1
println(d)
}# kompilasi gagal karena Int tidak melebar menjadi Double secara otomatis
kotlinc melebar.kt -d melebar.jarmelebar.kt:2:21: error: initializer type mismatch: expected 'Double', actual 'Int'.
val d: Double = 1
^Pesan error initializer type mismatch: expected 'Double', actual 'Int' menyatakan bahwa penginisialisasi bertipe Int tidak sesuai dengan tipe yang dijanjikan. Perbaikannya adalah konversi eksplisit, yaitu val d: Double = 1.toDouble(), atau penulisan literal pecahan 1.0 yang memang bertipe Double. Aturan ini berlaku dua arah, sehingga Double juga tidak menyempit menjadi Int secara otomatis.
Penolakan dini semacam ini mencegah kekeliruan yang dalam Java sering lewat tanpa terlihat, misalnya pembagian yang berpindah dari bilangan bulat ke pecahan tanpa sengaja. Konversi yang ditulis eksplisit juga mempermudah penelusuran, karena setiap perubahan tipe terdokumentasi di tempat kejadiannya. Kompilator kemudian cukup memegang satu aturan tunggal, yaitu tidak ada perpindahan tipe numerik yang terjadi diam-diam.
Ringkasan#
Intmenyimpan bilangan bulat 32-bit dengan batasInt.MAX_VALUE, dan operasi yang melewati batasnya meluap tanpa pesan, sehinggaLongdipilih bila datanya bisa tumbuh.Doublemenyimpan pecahan 64-bit,Booleanmenyimpantrueataufalse, danStringmenyimpan teks.- Konversi antartipe numerik selalu eksplisit melalui fungsi seperti
toDouble()dantoInt(), dan konversi keIntmemotong bagian pecahannya. - Kotlin tidak melakukan pelebaran tipe implisit, sehingga pengisian
Doubledengan nilaiIntlangsung ditolak compiler pada waktu kompilasi.
Referensi#
- Basic types — Kotlin Documentation — Dokumentasi resmi tipe dasar Kotlin beserta aturan konversi antartipe numerik.