Tipe Dasar

Int, Double, Boolean, dan String beserta aturan tanpa pelebaran tipe implisit.

Daftar isi

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.

kotlin nilai.kt
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")
}
bash
# kompilasi nilai.kt dengan pustaka standar tersemat
kotlinc nilai.kt -include-runtime -d nilai.jar
# jalankan program
java -jar nilai.jar
text Keluaran
Jumlah baris: 24
Rata-rata: 82.5
Lulus: true
Nama: Ali

Tabel berikut merangkum isi dan contoh pemakaian keempat tipe tersebut.

TipeIsiContoh pemakaian
Intbilangan bulat 32-bitjumlah baris, indeks, tahun
Doublebilangan pecahan 64-bit standar IEEE 754rata-rata, berat, suhu
Booleannilai kebenaran true atau falsestatus lulus, status aktif
Stringrangkaian karakter dalam tanda kutipnama, 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.

kotlin batas.kt
fun main() {
    println(Int.MAX_VALUE)
    println(Int.MIN_VALUE)
    println(Int.MAX_VALUE + 1)
}
bash
# kompilasi batas.kt dengan pustaka standar tersemat
kotlinc batas.kt -include-runtime -d batas.jar
# jalankan program
java -jar batas.jar
text Keluaran
2147483647
-2147483648
-2147483648

Konstanta 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.

kotlin konversi.kt
fun main() {
    val jumlah: Int = 10
    val total: Double = jumlah.toDouble()
    println("Jumlah: $jumlah")
    println("Total: $total")
    println("Kembali ke Int: ${total.toInt()}")
}
bash
# kompilasi konversi.kt dengan pustaka standar tersemat
kotlinc konversi.kt -include-runtime -d konversi.jar
# jalankan program
java -jar konversi.jar
text Keluaran
Jumlah: 10
Total: 10.0
Kembali ke Int: 10

Pemanggilan 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.

kotlin melebar.kt
fun main() {
    val d: Double = 1
    println(d)
}
bash
# kompilasi gagal karena Int tidak melebar menjadi Double secara otomatis
kotlinc melebar.kt -d melebar.jar
text Keluaran
melebar.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#

  • Int menyimpan bilangan bulat 32-bit dengan batas Int.MAX_VALUE, dan operasi yang melewati batasnya meluap tanpa pesan, sehingga Long dipilih bila datanya bisa tumbuh.
  • Double menyimpan pecahan 64-bit, Boolean menyimpan true atau false, dan String menyimpan teks.
  • Konversi antartipe numerik selalu eksplisit melalui fungsi seperti toDouble() dan toInt(), dan konversi ke Int memotong bagian pecahannya.
  • Kotlin tidak melakukan pelebaran tipe implisit, sehingga pengisian Double dengan nilai Int langsung ditolak compiler pada waktu kompilasi.

Referensi#