Teks adalah tipe data paling sering kita olah dalam program aplikasi. Di Kotlin, tipe String merepresentasikan deretan karakter yang bersifat immutable. Sintaks literal String mendukung string template — penyisipan variabel dan ekspresi langsung di dalam literal — yang membuat kode lebih ringkas daripada menggunakan konkatenasi +. Pada chapter ini kita akan membedah deklarasi String, pengindeksan, string template, serta multiline raw string untuk teks panjang.

Deklarasi String #

Literal String ditulis di antara tanda kutip ganda:

kotlin Deklarasi String
val nama: String = "Budi"
val sapaan = "Halo, dunia!"        // inferensi: String
val kosong: String = ""
val panjang: String = "Kotlin itu ringkas dan aman"

String bersifat immutable — setelah dibuat, isi tidak dapat diubah. Method seperti uppercase() atau replace() mengembalikan String baru tanpa memodifikasi yang asli.

Pengindeksan dan length #

Setiap karakter String dapat diakses melalui indeks via [] atau via method .get():

kotlin Indeks dan length
val nama = "Budi"
val panjang = nama.length           // 4
val hurufPertama = nama[0]          // 'B'
val hurufTerakhir = nama[nama.length - 1]  // 'i'

for (i in nama.indices) {
    println("nama[$i] = ${nama[i]}")
}

Mengakses indeks di luar rentang memunculkan StringIndexOutOfBoundsException.

String template #

Kotlin mempermudah penyisipan variabel dan ekspresi ke dalam String melalui template:

  • $nama — sisipkan nilai variabel.
  • ${ekspresi} — sisipkan hasil ekspresi kompleks.
kotlin String template
val nama = "Budi"
val a = 5
val b = 7

println("Halo, $nama!")               // Halo, Budi!
println("Hasil $a + $b = ${a + b}")   // Hasil 5 + 7 = 12
println("Daftar: ${listOf("Budi", "Siti")}")

Untuk menyisipkan tanda $ literal (bukan template), gunakan escape \$:

kotlin Escape dolar
val harga = "Simbol \$ bukan template"  // Simbol $ bukan template

Multiline raw string #

Kotlin mendukung raw string dengan tiga tanda kutip ganda """...""". Raw string memperbolehkan teks multi-baris tanpa escape \n, dan tidak memerlukan escape tanda kutip ganda di dalamnya:

kotlin Raw string
val alamat = """
    Jl. Merdeka No. 17
    Kota Bandung
    Kode Pos 40123
"""

Karena raw string menyimpan indentasi apa adanya, kita biasanya memakai trimMargin() atau trimIndent() untuk membersihkan spasi berlebih.

  • .trimMargin(marginPrefix) — menghapus spasi sebelum tanda | (default) di setiap baris.
  • .trimIndent() — menghapus indentasi minimum umum dari semua baris.

Demonstrasi String #

Berikut program lengkap yang memperlihatkan berbagai fitur String:

kotlin
fun main() {
    val nama: String = "Budi"
    val sapaan = "Halo, $nama!"
    println(sapaan)

    val panjang = nama.length
    println("Panjang nama: $panjang karakter")

    val hurufPertama = nama[0]
    println("Huruf pertama: $hurufPertama")

    for (i in nama.indices) {
        println("nama[$i] = ${nama[i]}")
    }

    println()
    val a = 5
    val b = 7
    println("Hasil $a + $b = ${a + b}")

    val daftar = listOf("Budi", "Siti", "Dewi")
    println("Daftar: ${daftar.joinToString()}")

    println()
    val berbahaya = "Simbol \$ bukan template"
    println(berbahaya)

    println()
    val alamat = """
        |Jl. Merdeka No. 17
        |Kota Bandung
        |Kode Pos 40123
    """.trimMargin()
    println("Alamat:")
    println(alamat)

    println()
    val sql = """
        SELECT id, nama, umur
        FROM pengguna
        WHERE umur > $a
        ORDER BY nama ASC
    """.trimIndent()
    println("Query SQL:")
    println(sql)

    println()
    val teksPanjang = """
        |Teks multi-baris
        |dengan tanda kutip "ganda" di dalamnya.
    """.trimMargin()
    println(teksPanjang)

    println()
    println("Apakah nama kosong? ${nama.isEmpty()}")
    println("Nama kapital: ${nama.uppercase()}")
    println("Nama replace: ${nama.replace('u', 'o')}")
}

Output yang Dihasilkan:

text
Halo, Budi!
Panjang nama: 4 karakter
Huruf pertama: B
nama[0] = B
nama[1] = u
nama[2] = d
nama[3] = i

Hasil 5 + 7 = 12
Daftar: Budi, Siti, Dewi

Simbol $ bukan template

Alamat:
Jl. Merdeka No. 17
Kota Bandung
Kode Pos 40123

Query SQL:
SELECT id, nama, umur
FROM pengguna
WHERE umur > 5
ORDER BY nama ASC

Teks multi-baris
dengan tanda kutip "ganda" di dalamnya.

Apakah nama kosong? false
Nama kapital: BUDI
Nama replace: Bodi

Mari kita amati baris-baris penting pada kode di atas:

  1. Baris 2-3 (val sapaan = "Halo, $nama!") — $nama otomatis disisipkan dengan nilai variabel nama. Tidak perlu operator +.
  2. Baris 5 (nama.length) — property length mengembalikan jumlah karakter (Int).
  3. Baris 8 (nama[0]) — pengindeksan via [] mengembalikan Char pertama.
  4. Baris 11-13 (for (i in nama.indices)) — indices mengembalikan IntRange 0..length-1 untuk iterasi aman.
  5. Baris 17 ("Hasil $a + $b = ${a + b}") — $a dan $b menyisipkan variabel; ${a + b} mengevaluasi ekspresi aritmatika.
  6. Baris 20 (daftar.joinToString()) — ${...} dapat berisi pemanggilan method apapun yang mengembalikan nilai toString()-able.
  7. Baris 24 ("Simbol \$ bukan template") — escape \$ menyisipkan tanda dolar literal.
  8. Baris 28-33 ("""...""" + .trimMargin()) — raw string multi-baris; | adalah penanda margin default. .trimMargin() menghapus spasi sebelum | dan | itu sendiri.
  9. Baris 36-43 ("""...""" + .trimIndent()) — raw string tanpa penanda margin; .trimIndent() menghapus indentasi minimum yang sama di semua baris. Cocok untuk query SQL atau teks berstruktur.
  10. Baris 47-50 (nama.isEmpty(), nama.uppercase(), nama.replace('u', 'o')) — method utilitas String. Semua mengembalikan String baru karena String immutable.

Method umum String #

Beberapa method yang sering dipakai:

MethodKeteranganContoh
.lengthJumlah karakter"halo".length → 4
.isEmpty() / .isNotEmpty()Apakah kosong"".isEmpty() → true
.uppercase() / .lowercase()Konversi huruf besar/kecil"halo".uppercase() → HALO
.replace(old, new)Ganti karakter/String"halo".replace('a', 'o') → holo
.substring(start, end)Iris String"halo".substring(1, 3) → al
.split(delim)Pisah jadi List"a,b,c".split(",") → [a, b, c]
.trim()Hapus spasi awal/akhir" halo ".trim() → halo
.startsWith(prefix)Apakah diawali prefix"halo".startsWith("ha") → true
.contains(sub)Apakah mengandung sub"halo".contains("al") → true

Referensi Lanjutan #

  • Strings — dokumentasi resmi tipe String Kotlin mencakup template string, raw string, dan operasi umum

Penguasaan String dan template-nya mempermudah penulisan kode yang jelas dan ringkas. Berikutnya, kita akan melihat tipe integer khusus yang tidak pernah negatif — UByte, UShort, UInt, ULong — pada chapter Unsigned Integer Types.