Program Pertama

Menulis fungsi main dan println, lalu menjalankan skrip dan berkas Kotlin.

Daftar isi

Program Kotlin paling sederhana hanya terdiri atas satu fungsi main dan satu pemanggilan println. Topik ini menuntun pembuatan program tersebut mulai dari berkas kosong sampai berjalan di terminal, baik dalam bentuk berkas .kt yang dikompilasi terlebih dahulu maupun skrip .kts yang dijalankan langsung. Seluruh perintah kompilasi dan eksekusi pada topik ini dijalankan nyata, dan keluarannya ditampilkan sebagaimana adanya.

Fungsi main dan println#

Titik masuk program Kotlin adalah fungsi main. Kata kunci fun mendeklarasikan fungsi, nama fungsi ditulis setelahnya, dan isi fungsi berada di antara kurung kurawal. Program mulai dijalankan dari baris pertama di dalam main dan berakhir ketika baris terakhirnya selesai dieksekusi.

Buat berkas main.kt dengan isi berikut, lalu simpan di direktori kerja.

kotlin main.kt
fun main() {
    println("Halo, Kotlin!")
    println("Program pertama berjalan.")
}

Baris println("Halo, Kotlin!") memanggil println, yaitu fungsi library standar yang mencetak argumennya lalu memindahkan keluaran ke baris berikutnya. Pasangannya, print, mencetak tanpa memindahkan baris sehingga teks berikutnya menyambung pada baris yang sama. Teks yang dicetak ditulis dalam string, yakni rangkaian karakter yang diapit tanda kutip ganda. Berbeda dengan Java, fungsi main pada Kotlin tidak wajib berada di dalam kelas dan boleh ditulis sebagai fungsi tingkat atas.

Perbedaan println dan print baru terasa ketika keduanya dicampur pada satu program. Buat berkas cetak.kt berikut untuk mengamatinya.

kotlin cetak.kt
fun main() {
    print("Kotlin ")
    print("ringkas")
    println()
    println("Dua baris hasil dari lima pemanggilan cetak")
}
bash
# kompilasi cetak.kt dengan pustaka standar tersemat
kotlinc cetak.kt -include-runtime -d cetak.jar
# jalankan program
java -jar cetak.jar
text Keluaran
Kotlin ringkas
Dua baris hasil dari lima pemanggilan cetak

Dua pemanggilan print pertama menyambung menjadi satu baris berisi Kotlin ringkas karena tidak ada pemindah baris di antaranya. Pemanggilan println() tanpa argumen hanya memindahkan keluaran ke baris berikutnya, sehingga kalimat terakhirnya tercetak terpisah. Dari sini terlihat bahwa pemindahan baris adalah bagian dari keluaran yang harus dikelola, bukan sesuatu yang selalu otomatis.

Mengompilasi dan menjalankan program#

Kompilasi dilakukan oleh compiler resmi bernama kotlinc. Perintah ini menerjemahkan berkas .kt menjadi bytecode JVM, yaitu instruksi yang dapat dijalankan oleh runtime Java. Hasil kompilasi dikemas ke dalam berkas JAR melalui opsi -d.

Jalankan dua perintah berikut dari direktori yang sama dengan main.kt.

bash
# kompilasi main.kt dengan pustaka standar tersemat
kotlinc main.kt -include-runtime -d program.jar
# jalankan program hasil kompilasi
java -jar program.jar
text Keluaran
Halo, Kotlin!
Program pertama berjalan.

Opsi -d program.jar menentukan nama berkas JAR keluaran. Bytecode di dalamnya tetap membutuhkan library standar Kotlin (kotlin-stdlib) saat berjalan, sehingga opsi -include-runtime disertakan untuk menyematkan pustaka tersebut ke dalam JAR. Dengan sematan itu, java -jar program.jar berjalan berdiri sendiri tanpa penyiapan tambahan. Nama kelas hasil kompilasi juga terbentuk otomatis dari nama berkas, yaitu MainKt dari main.kt, karena JVM mengharuskan kode berada di dalam kelas.

Langkah kompilasi ini bukan sekadar formalitas, melainkan lapisan pemeriksaan pertama. Compiler menolak perintah yang salah tulis sebelum program sempat berjalan, misalnya printlnn dengan huruf berlebih, dan pesan errornya menyebut baris kejadianya. Kesalahan yang lolos dari lapisan ini jauh lebih mahal untuk dilacak ketika programnya sudah lebih panjang.

Fungsi main dengan argumen#

Baris perintah dapat mengirim argumen kepada program, dan argumen itu diterima fungsi main melalui parameter bertipe Array<String>. Buat berkas sapa.kt berikut.

kotlin sapa.kt
fun main(args: Array<String>) {
    println("Jumlah argumen: ${args.size}")
    println("Sapaan: Halo, ${args[0]}!")
}

Properti args.size menyatakan banyaknya argumen, sedangkan args[0] mengambil argumen pertama dengan indeks mulai dari nol. Bila program dijalankan tanpa satu pun argumen, args berukuran nol dan akses args[0] akan menghentikannya, sehingga indeks hanya boleh diakses setelah jumlahnya dipastikan. Tanda ${...} pada teks menyisipkan nilai ke dalam string dan dibahas lengkap pada topik string template.

Kompilasi berkas tersebut, lalu kirimkan dua argumen pada saat menjalankannya.

bash
# kompilasi sapa.kt menjadi berkas JAR berdiri sendiri
kotlinc sapa.kt -include-runtime -d sapa.jar
# jalankan dengan dua argumen
java -jar sapa.jar Citra Dewi
text Keluaran
Jumlah argumen: 2
Sapaan: Halo, Citra!

Nilai 2 sesuai dengan banyaknya argumen yang dikirim, dan Citra terbaca sebagai argumen pertama.

Skrip Kotlin tanpa kompilasi manual#

Selain berkas .kt, Kotlin mengenal skrip .kts yang berisi pernyataan langsung tanpa fungsi pembungkus. Skrip dijalankan dengan opsi -script, dan setiap pemanggilan mengompilasi lalu mengeksekusinya seketika. Buat berkas salam.kts berikut.

kotlin salam.kts
val nama = "Citra"
println("Halo, $nama dari skrip Kotlin!")
bash
# jalankan skrip tanpa langkah kompilasi terpisah
kotlinc -script salam.kts
text Keluaran
Halo, Citra dari skrip Kotlin!

Variabel val pada skrip dideklarasikan di tingkat atas tanpa fungsi, dan kompilator skrip menerima bentuk tersebut. Pernyataan dievaluasi berurutan dari atas ke bawah, sehingga nama harus dideklarasikan sebelum dipakai pada baris berikutnya. Skrip cocok untuk uji cepat dan utilitas kecil karena tidak memerlukan perintah kompilasi terpisah, sedangkan program utuh sebaiknya tetap dikompilasi agar hasilnya dapat digunakan ulang.

Kesalahan umum#

Kesalahan yang sering muncul pada program pertama adalah menjalankan berkas JAR yang dikompilasi tanpa -include-runtime. Perintah kompilasinya berhasil, tetapi program berhenti sebelum baris Kotlin pertama sempat dijalankan.

bash
# kompilasi TANPA pustaka standar tersemat
kotlinc sapa.kt -d sapa.jar
# eksekusi gagal karena pustaka standar tidak ditemukan
java -jar sapa.jar Citra
text Keluaran
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
	at SapaKt.main(sapa.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	... 1 more

Pesan NoClassDefFoundError menunjukkan bahwa bytecode memanggil kelas kotlin.jvm.internal.Intrinsics dari pustaka standar, tetapi pustaka itu tidak ditemukan di berkas JAR maupun di classpath. Solusinya ada pada contoh utama di atas, yaitu menyertakan -include-runtime pada waktu kompilasi.

Ringkasan#

  • Program Kotlin dimulai dari fungsi main, yang dapat ditulis tanpa parameter atau dengan parameter args bertipe Array<String>.
  • println mencetak satu baris teks, sedangkan print mencetak tanpa memindahkan baris.
  • kotlinc menerjemahkan berkas .kt menjadi bytecode JVM dalam berkas JAR, dan opsi -include-runtime menyematkan pustaka standar agar java -jar dapat menjalankannya berdiri sendiri.
  • Skrip .kts berisi pernyataan tingkat atas dan dijalankan langsung dengan perintah kotlinc -script.

Referensi#