Pemrograman · Bahasa pemrograman
Tutorial Kotlin untuk pemula
Jawaban singkat
Kotlin adalah bahasa modern bertipe statis dari JetBrains yang berjalan di JVM dan menjadi bahasa pilihan untuk pengembangan Android. Bahasa ini ringkas, sepenuhnya interoperable dengan Java, dan sistem tipenya mencegah sebagian besar error null pointer saat kompilasi. Halaman ini membahas setup, variabel, null safety, alur kontrol, fungsi, koleksi, class, coroutine, dan penanganan error lengkap dengan contoh yang bisa dijalankan.
Apa itu Kotlin dan untuk apa digunakan
Kotlin adalah bahasa pemrograman serbaguna bertipe statis yang dibuat oleh JetBrains. Kotlin berjalan di Java Virtual Machine (JVM), dan juga bisa dikompilasi ke JavaScript, WebAssembly, dan kode mesin native. Kotlin sepenuhnya interoperable dengan Java: file Kotlin bisa memanggil library Java apa pun, dan kode Java bisa memanggil Kotlin.
Sejak 2019 Google merekomendasikan Kotlin sebagai bahasa utama untuk aplikasi Android, sehingga sebagian besar kode Android baru ditulis dengan Kotlin. Kotlin juga umum dipakai di sisi server dengan framework seperti Spring Boot dan Ktor, dan Kotlin Multiplatform memungkinkan tim berbagi logika bisnis antara Android, iOS, desktop, dan web.
Instal Kotlin dan jalankan Hello, world
Cara termudah untuk memulai adalah IntelliJ IDEA atau Android Studio, yang sudah menyertakan Kotlin. Untuk command line, instal compiler (misalnya lewat SDKMAN! atau Homebrew) dan Java runtime (JDK). Program Kotlin dimulai dari fungsi main tingkat atas; tidak perlu class.
// hello.kt
fun main() {
println("Hello, world!")
}kotlinc hello.kt -include-runtime -d hello.jar
java -jar hello.jar
# Hello, world!Build tool seperti Gradle (dengan Kotlin DSL) adalah pilihan normal untuk proyek sungguhan. Anda juga bisa mencoba kode tanpa menginstal apa pun di Kotlin Playground online.
Variabel dan tipe dasar
Deklarasikan variabel read-only dengan val dan variabel yang bisa diubah dengan var. Compiler menebak tipenya, tetapi Anda bisa menuliskannya setelah titik dua. Utamakan val: kode jadi lebih mudah dipahami.
val name = "Ada" // String, cannot be reassigned
var count: Int = 0 // explicit type, can change
count += 1
val pi = 3.14159 // Double
val big = 9_000_000_000L // Long
println("$name has $count item(s), pi is ${"%.2f".format(pi)}")
// Ada has 1 item(s), pi is 3.14| Tipe | Contoh | Catatan |
|---|---|---|
Int | 42 | bilangan bulat bertanda 32-bit |
Long | 42L | bilangan bulat bertanda 64-bit |
Double | 3.14 | bilangan floating point 64-bit |
Boolean | true | true atau false |
Char | 'k' | satu karakter |
String | "text" | immutable; mendukung template $name |
Kotlin tidak punya pelebaran angka implisit: Int tidak otomatis dikonversi menjadi Long. Panggil toLong(), toDouble(), atau toString() secara eksplisit.
Null safety
Null safety adalah fitur andalan Kotlin. Tipe biasa seperti String tidak pernah bisa berisi null. Untuk mengizinkan null, tambahkan ?, seperti String?, dan compiler akan memaksa Anda menangani kasus null sebelum nilainya dipakai.
fun greet(name: String?) {
// println(name.length) // compile error: name may be null
println(name?.length) // safe call: prints null if name is null
val len = name?.length ?: 0 // Elvis operator: default value
if (name != null) {
println(name.uppercase()) // smart cast: name is String here
}
println("length = $len")
}
fun main() {
greet("kotlin") // 6, KOTLIN, length = 6
greet(null) // null, length = 0
}Alur kontrol: if, when, dan loop
Di Kotlin if dan when adalah ekspresi, sehingga keduanya mengembalikan nilai. when menggantikan pernyataan switch di Java dan C, dan bisa mencocokkan nilai, rentang, dan tipe.
val score = 82
val grade = if (score >= 50) "pass" else "fail"
val letter = when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
else -> "F"
}
println("$grade $letter") // pass B
for (i in 1..3) print("$i ") // 1 2 3
println()
for (i in 10 downTo 0 step 5) print("$i ") // 10 5 0
println()
var n = 3
while (n > 0) { print(n); n-- } // 321
println()1..3 adalah rentang tertutup yang menyertakan kedua ujungnya; 0 until 3 (atau 0..<3) tidak menyertakan ujung akhir, dan ini biasanya yang Anda inginkan untuk indeks.
Fungsi dan lambda
Fungsi dideklarasikan dengan fun. Parameter bisa punya nilai default, pemanggil bisa memakai named argument, dan fungsi yang bodinya satu ekspresi bisa memakai =.
fun area(width: Double, height: Double = 1.0): Double = width * height
fun main() {
println(area(3.0, 2.0)) // 6.0
println(area(width = 4.0)) // 4.0 (default height)
val square = { x: Int -> x * x } // a lambda stored in a variable
println(square(5)) // 25
val nums = listOf(1, 2, 3, 4, 5)
val evensSquared = nums.filter { it % 2 == 0 }.map { it * it }
println(evensSquared) // [4, 16]
}Jika lambda punya satu parameter, Anda bisa merujuknya sebagai it. Jika argumen terakhir sebuah fungsi adalah lambda, lambda itu boleh diletakkan di luar tanda kurung, itulah sebabnya filter { ... } terbaca seperti blok bawaan.
Koleksi dan data class
Standard library memisahkan koleksi read-only dan mutable: listOf, setOf, dan mapOf membuat koleksi read-only, sedangkan mutableListOf, mutableSetOf, dan mutableMapOf bisa diubah.
val fruits = mutableListOf("apple", "banana")
fruits.add("cherry")
val ages = mapOf("Ann" to 31, "Bo" to 25)
println(fruits.size) // 3
println(ages["Ann"]) // 31
println(ages["Zed"]) // null (map lookups are nullable)
data class User(val name: String, val age: Int)
val u = User("Ann", 31)
val older = u.copy(age = 32)
println(u) // User(name=Ann, age=31)
println(u == User("Ann", 31)) // true (structural equality)
val (n, a) = older // destructuring
println("$n $a") // Ann 32data class otomatis mendapatkan equals, hashCode, toString, copy, dan destructuring. == di Kotlin membandingkan isi (memanggil equals); === membandingkan referensi.
Class, extension function, dan coroutine
Class bersifat final secara default; tandai class dengan open agar bisa diwarisi. Extension function menambahkan method ke tipe yang sudah ada tanpa mengubahnya, dan class sealed memodelkan himpunan kasus tertutup yang bisa diperiksa when secara menyeluruh.
fun String.shout(): String = uppercase() + "!"
sealed class Shape
data class Circle(val r: Double) : Shape()
data class Rect(val w: Double, val h: Double) : Shape()
fun area(s: Shape): Double = when (s) {
is Circle -> Math.PI * s.r * s.r
is Rect -> s.w * s.h
} // no else needed: the compiler knows all cases
fun main() {
println("hi".shout()) // HI!
println(area(Rect(2.0, 3.0))) // 6.0
}Untuk kode asinkron dan konkuren, Kotlin memakai coroutine dari library kotlinx.coroutines. Fungsi suspend bisa berhenti sejenak tanpa memblokir thread, dan builder seperti launch dan async memulai coroutine di dalam sebuah scope. Beginilah aplikasi Android melakukan panggilan jaringan di luar main thread.
Penanganan error
Kotlin punya try, catch, dan finally seperti Java, tetapi semua exception bersifat unchecked: Anda tidak pernah dipaksa mendeklarasikan atau menangkapnya. try juga merupakan ekspresi. Untuk kegagalan yang bisa diperkirakan, standard library menyediakan runCatching dan Result, dan fungsi seperti toIntOrNull() mengembalikan null alih-alih melempar exception.
fun parse(s: String): Int = try {
s.toInt()
} catch (e: NumberFormatException) {
-1
}
fun main() {
println(parse("42")) // 42
println(parse("x")) // -1
println("7".toIntOrNull()) // 7
println("seven".toIntOrNull()) // null
val r = runCatching { "abc".toInt() }
println(r.isFailure) // true
}Program lengkap kecil: frekuensi kata
Program ini menghitung seberapa sering tiap kata muncul dalam teks dan mencetak tiga teratas. Program ini memakai extension string, fungsi koleksi, dan data class.
data class WordCount(val word: String, val count: Int)
fun topWords(text: String, n: Int): List<WordCount> =
text.lowercase()
.split(Regex("[^a-z']+"))
.filter { it.isNotBlank() }
.groupingBy { it }
.eachCount()
.map { (w, c) -> WordCount(w, c) }
.sortedWith(compareByDescending<WordCount> { it.count }.thenBy { it.word })
.take(n)
fun main() {
val text = "The cat and the dog. The dog sat, and the cat ran."
for ((word, count) in topWords(text, 3)) {
println("$word: $count")
}
}
// the: 4
// and: 2
// cat: 2Langkah selanjutnya
- Dokumentasi resmi Kotlin di kotlinlang.org, mulai dari Basic syntax dan Kotlin tour.
- Kotlin Koans, kumpulan latihan kecil yang berjalan di browser.
- Panduan Android Developers untuk Kotlin di Android, atau panduan Ktor dan Spring untuk Kotlin di sisi server.
- Panduan kotlinx.coroutines ketika Anda butuh kode asinkron.
FAQ
Apakah Kotlin lebih baik daripada Java?
Kotlin lebih ringkas dan menambahkan null safety, data class, dan coroutine, tetapi berjalan di JVM yang sama dan memakai library yang sama. Banyak tim memakai kedua bahasa dalam satu proyek, jadi pilihannya soal gaya dan produktivitas, bukan kemampuan.
Apakah saya perlu belajar Java sebelum Kotlin?
Tidak. Anda bisa belajar Kotlin sebagai bahasa JVM pertama. Mengenal sedikit Java membantu saat membaca kode Android lama atau dokumentasi library Java.
Apa perbedaan val dan var?
val mendeklarasikan referensi read-only yang tidak bisa diberi nilai ulang setelah inisialisasi, sedangkan var mendeklarasikan referensi yang bisa. val yang menunjuk ke list mutable tetap bisa diubah isinya.
Apakah Kotlin bisa dipakai untuk aplikasi iOS?
Bisa, lewat Kotlin Multiplatform yang mengompilasi kode Kotlin bersama menjadi kode native untuk iOS. Antarmuka pengguna sering kali tetap ditulis dengan Swift, meskipun Compose Multiplatform juga dapat berbagi kode UI.
Apa fungsi operator ?: di Kotlin?
Itu adalah operator Elvis: a ?: b mengembalikan a jika tidak null, dan jika tidak mengembalikan b. Operator ini sering dipadukan dengan safe call, seperti name?.length ?: 0.