Fungsi adalah blok kode yang diberi nama dan dapat dipanggil berulang kali dari bagian lain dalam program. Topik ini membahas cara mendeklarasikan fungsi di Kotlin, aturan penulisan parameter dan tipe kembalian, serta tipe Unit yang menandai fungsi tanpa nilai kembalian. Setiap contoh program disertai perintah kompilasi dan keluaran nyata dari compiler.
Anatomi deklarasi fungsi#
Sebuah fungsi diawali kata kunci fun, diikuti nama, daftar parameter di dalam tanda kurung, dan tipe kembalian yang ditulis setelah tanda titik dua. Nama fungsi mengikuti gaya camelCase, yaitu huruf pertama kecil dan setiap kata berikutnya diawali huruf kapital. Konvensi penulisan Kotlin menyarankan nama fungsi berupa kata kerja atau frasa kata kerja, misalnya hitungLuas atau cetakJudul. Deklarasi berikut memuat seluruh unsur tersebut.
// nama fungsi, parameter bertipe, lalu tipe kembalian
fun luas(panjang: Int, lebar: Int): Int {
return panjang * lebar
}Pada deklarasi di atas, luas adalah nama fungsi, sedangkan panjang dan lebar adalah parameter bertipe Int. Tipe Int setelah tanda titik dua menyatakan tipe kembalian, yaitu tipe nilai yang dikirim oleh fungsi melalui pernyataan return. Setiap parameter wajib menyebutkan tipenya, dan tipe tersebut tidak boleh dihilangkan. Nilai yang dikirim pada saat pemanggilan disebut argumen, sehingga pada luas(12, 5) nilai 12 dan 5 adalah argumen untuk parameter panjang dan lebar. Fungsi dapat dideklarasikan di dalam kelas maupun di luar kelas, dan keduanya memakai bentuk deklarasi yang sama.
Tipe kembalian eksplisit#
Fungsi yang isinya berupa blok, yaitu rangkaian pernyataan di antara tanda kurung kurawal, wajib menuliskan tipe kembaliannya secara eksplisit. Compiler Kotlin tidak menebak tipe kembalian untuk fungsi berisi blok karena alur kendalinya dapat bercabang, sehingga tipenya tidak selalu jelas. Program berikut mendeklarasikan tiga fungsi, dua di antaranya mengirim nilai Int dan satu lagi bertipe Unit.
fun luas(panjang: Int, lebar: Int): Int {
return panjang * lebar
}
fun keliling(panjang: Int, lebar: Int): Int {
return 2 * (panjang + lebar)
}
fun sapa(nama: String): Unit {
println("Halo, $nama!")
}
fun main() {
println("Luas persegi panjang: ${luas(12, 5)}")
println("Keliling persegi panjang: ${keliling(12, 5)}")
sapa("Dewi")
}# compiler Kotlin dan pustaka standar yang dipakai jalur ini
export PATH=/home/kal/my-project/tools/kotlinc/bin:/home/kal/my-project/tools/jdk-merged/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
# kompilasi berkas main.kt menjadi out.jar, lalu jalankan programnya
kotlinc main.kt -d out.jar && java -cp "out.jar:$STDLIB" MainKtLuas persegi panjang: 60
Keliling persegi panjang: 34
Halo, Dewi!Pernyataan return panjang * lebar mengirim hasil perkalian ke pemanggil, dan nilai itu dicetak lewat pemanggilan luas(12, 5) di dalam main. Nama MainKt pada baris perintah berasal dari nama berkas main.kt, karena compiler membentuk kelas bernama sesuai berkas untuk menampung fungsi-fungsi di dalamnya. Penyisipan $nama pada teks sapaan memanfaatkan string template, yaitu fitur penyisipan nilai ke dalam string.
Tipe Unit#
Tipe Unit menandai fungsi yang tidak mengirim nilai apa pun ke pemanggil. Tipe ini berisi tepat satu nilai, yaitu objek Unit itu sendiri, sehingga tidak ada informasi yang dibawa keluar dari fungsi. Fungsi sapa pada program sebelumnya menuliskan Unit secara eksplisit, sedangkan penulisan itu sebenarnya opsional karena compiler menambahkan Unit secara otomatis pada fungsi yang tidak menyebutkan tipe kembaliannya. Dua deklarasi berikut memiliki makna yang sama.
fun sapa(nama: String): Unit {
println("Halo, $nama!")
}
// Unit dihilangkan: maknanya sama dengan deklarasi di atas
fun sapaLagi(nama: String) {
println("Halo lagi, $nama!")
}Di dalam fungsi bertipe Unit, pernyataan return boleh ditulis tanpa nilai untuk menghentikan alur lebih awal, misalnya pada percabangan yang memeriksa kondisi tidak sah. Apabila seluruh tubuh fungsi selesai dieksekusi tanpa menyentuh return, fungsi tersebut otomatis mengembalikan nilai Unit. Dengan demikian, fungsi tanpa nilai kembalian tetap memiliki tipe kembalian yang pasti, dan hanya cara penulisannya yang bebas.
Kesalahan umum#
Kesalahan yang sering terjadi adalah mengirim nilai dari fungsi yang tidak menuliskan tipe kembaliannya. Tanpa tipe kembalian, compiler menganggap fungsi tersebut bertipe Unit, sehingga pernyataan return yang membawa nilai bertabrakan dengan harapan compiler. Berkas berikut sengaja memuat kesalahan tersebut.
fun luasRuangan(panjang: Int, lebar: Int) {
return panjang * lebar
}# kompilasi berkas salah.kt untuk melihat pesan error dari compiler
kotlinc salah.kt -d salah.jarsalah.kt:2:12: error: return type mismatch: expected 'Unit', actual 'Int'.
return panjang * lebar
^^^^^^^^^^^^^^^Pesan error return type mismatch: expected 'Unit', actual 'Int' menyatakan bahwa compiler menuntut nilai Unit, sedangkan fungsi mengirim nilai Int. Perbaikannya adalah menambahkan tipe kembalian : Int pada deklarasi fungsi tersebut. Bagian awal pesan menunjuk berkas, baris, dan kolom lokasi kesalahannya, sehingga bagian yang perlu disunting mudah ditemukan.
Ringkasan#
- Fungsi dideklarasikan dengan kata kunci
fun, parameter wajib bertipe, dan tipe kembalian ditulis setelah tanda titik dua. - Fungsi dengan isi blok wajib menuliskan tipe kembalian secara eksplisit, sedangkan inferensi hanya berlaku untuk bentuk satu ekspresi.
- Tipe
Unitmenandai fungsi tanpa nilai kembalian, berisi satu nilai tunggal, dan boleh dihilangkan dari deklarasi. - Pesan error compiler menyebut berkas, baris, dan kolom, sehingga lokasi kesalahan mudah ditemukan.
Referensi#
- Functions — Kotlin Documentation — Deklarasi fungsi, parameter, tipe kembalian, dan tipe Unit pada dokumentasi resmi Kotlin.
- Coding conventions — Kotlin Documentation — Konvensi penamaan fungsi dan gaya deklarasi yang disarankan.
- Command-line compiler — Kotlin Documentation — Cara mengompilasi dan menjalankan program Kotlin dengan kotlinc dari terminal.