Menyusun teks dinamis dengan konkatenasi + cepat menjadi berantakan ketika variabel dan ekspresi bertambah. Kotlin menyelesaikan masalah ini dengan string template, fitur bawaan yang memungkinkan kita menyisipkan variabel dan ekspresi langsung di dalam literal string. Pada chapter ini kita akan membedah tiga bentuk template — $var, ${expr}, dan template bersarang — serta melihat bagaimana template bekerja di multiline raw string. Pemahaman ini membuat kode pencetakan teks menjadi jauh lebih ringkas dan mudah dibaca dibanding String.format di Java.
Template Variabel: $var #
Bentuk paling sederhana adalah $ diikuti nama variabel. Kotlin akan mengganti $nama dengan representasi string dari nilai variabel tersebut. Cara ini bekerja untuk semua tipe, karena Kotlin memanggil toString() di balik layar.
val nama = "Siti"
val umur = 28
println("Nama saya $nama, umur $umur tahun")
// Nama saya Siti, umur 28 tahunTemplate $var hanya bisa membaca identifier tunggal. Jika kita menulis "$namaSaya", kompilator akan mencari variabel bernama namaSaya, bukan nama. Untuk memisahkan nama variabel dari karakter berikutnya, gunakan kurung kurawal ${nama}.
Template Ekspresi: ${expr} #
Untuk menyisipkan hasil ekspresi apa pun — bukan sekadar nama variabel — kita gunakan ${expr}. Ekspresi di dalam kurung kurawal bisa berupa operasi aritmetika, panggilan method, akses properti, atau bahkan pemanggilan function lain.
val nama = "Siti"
val umur = 28
println("Panjang nama: ${nama.length}")
println("Tahun depan: ${umur + 1}")
println("Nama besar: ${nama.uppercase()}")Ekspresi di dalam ${...} dievaluasi saat string dibuat, dan hasilnya dikonversi menjadi string melalui toString(). Karena itu kita bisa menulis ekspresi kompleks seperti ${daftar.size} atau ${perhitungan() ?: 0} dengan aman.
Template Bersarang dan Karakter $ #
Kadang kita perlu menyisipkan string yang juga memuat template, misalnya membangun output JSON dari variabel. Kotlin mendukung template bersarang: ekspresi ${expr} bisa berisi literal string yang juga mengandung template. Untuk menyertakan karakter $ literal (bukan template), gunakan \$ pada string biasa atau ${'$'} pada raw string.
val nama = "Siti"
val json = "{\"nama\": \"$nama\"}" // butuh escape \"
println(json)Pada raw string (yang menggunakan """), escape seperti \" tidak dikenali sehingga ${'"'} menjadi cara untuk menyisipkan tanda kutip. Kita akan membahas raw string lebih lanjut pada chapter Multiline Strings.
Perbandingan dengan String.format Java #
Java mengharuskan kita menggunakan String.format("%s berusia %d", nama, umur) dengan placeholder terpisah dari argumen. Pendekatan ini rentan kesalahan: tipe placeholder harus cocok dengan tipe argumen, urutan argumen harus sama dengan urutan placeholder, dan kesalahan posisi baru terdeteksi saat runtime. String template Kotlin menghilangkan masalah ini karena variabel atau ekspresi langsung tertulis di posisi penyisipan.
| Aspek | String.format Java | String Template Kotlin |
|---|---|---|
| Penulisan placeholder | %s, %d, %f | $var, ${expr} |
| Pengecekan tipe | Runtime | Kompilasi |
| Urutan argumen | Harus cocok | Tidak relevan |
| Ekspresi kompleks | Tidak didukung langsung | Didukung via ${} |
| Format numerik | Ya, sangat kaya | Terbatas, gunakan String.format jika perlu |
Untuk pemformatan numerik yang sangat spesifik (lebar kolom, presisi desimal, pemisah ribuan), String.format tetap menjadi pilihan. Kita bisa menggabungkan keduanya: String.format di dalam ${}.
Template di Multiline Raw String #
Template bekerja juga di dalam raw string """...""". Inilah keunggulan utama Kotlin untuk menyusun teks panjang seperti JSON, SQL, atau template email: variabel bisa langsung disisipkan tanpa konkatenasi yang berisiko typo.
val nama = "Siti"
val umur = 28
val json = """
{
"nama": "$nama",
"umur": $umur
}
""".trimIndent()
println(json)Perhatikan bahwa nilai numerik umur tidak perlu diberi tanda kutip — template akan menghasilkan 28 langsung di posisi penyisipan.
Contoh Lengkap dan Outputnya #
File template.kt berikut mempraktikkan seluruh bentuk template:
fun main() {
val nama = "Siti"
val umur = 28
val tinggi = 1.68
println("Nama saya $nama")
println("Umur saya $umur tahun")
println("Tinggi badan $tinggi meter")
println("Panjang nama: ${nama.length}")
println("Huruf depan: ${nama[0]}")
println("Tahun depan: ${umur + 1}")
val daftar = listOf("Apel", "Mangga", "Pisang")
println("Buah kesukaan: ${daftar.size} jenis, yang pertama ${daftar[0]}")
println("Nama dalam huruf besar: ${nama.uppercase()}")
println("$nama berusia $umur tahun")
val kalimat = "${nama.uppercase()} tinggi ${tinggi * 100} cm"
println(kalimat)
val harga = 15_000
val jumlah = 3
println("Total: Rp${harga * jumlah}")
val json = """
{
"nama": "$nama",
"umur": $umur
}
""".trimIndent()
println(json)
}Output yang Dihasilkan:
Nama saya Siti
Umur saya 28 tahun
Tinggi badan 1.68 meter
Panjang nama: 4
Huruf depan: S
Tahun depan: 29
Buah kesukaan: 3 jenis, yang pertama Apel
Nama dalam huruf besar: SITI
Siti berusia 28 tahun
SITI tinggi 168.0 cm
Total: Rp45000
{
"nama": "Siti",
"umur": 28
}Mari kita telaah bagian penting dari kode di atas. Baris println("Nama saya $nama") menggunakan template variabel sederhana. Baris println("Panjang nama: ${nama.length}") memakai template ekspresi untuk memanggil properti length. Ekspresi tinggi * 100 di dalam ${} menghasilkan 168.0 karena perkalian Double dengan Int menghasilkan Double. Baris println("Total: Rp${harga * jumlah}") menunjukkan template yang menggabungkan literal Rp dengan ekspresi aritmetika harga * jumlah. Terakhir, blok raw string """...""" bersama trimIndent() menghasilkan JSON yang rapi dengan variabel tersisip di tempat yang tepat.
Referensi Lanjutan #
- Strings
— bagian string template
$vardan${expr}pada panduan resmi
Penutup #
Dengan template, penyusunan teks dinamis menjadi ringkas dan aman. Selanjutnya, kita perlu mengenal katalog method standar pada String — mulai dari toUpperCase, substring, hingga split dan replace — yang menjadi alat sehari-hari dalam mengolah teks. Materi tersebut menjadi fokus chapter String Methods.