Membuat dan menggunakan fungsi di Kotlin

1. Sebelum memulai

Dalam codelab sebelumnya, Anda melihat program sederhana yang mencetak Hello, world!. Dalam program yang telah Anda tulis sejauh ini, Anda telah melihat dua fungsi:

  • Fungsi main(), yang diperlukan dalam setiap program Kotlin. Ini adalah titik entri, atau titik awal program.
  • Fungsi println(), yang Anda panggil dari main() untuk menghasilkan teks.

Dalam codelab ini, Anda akan mempelajari fungsi lebih lanjut.

Fungsi memungkinkan Anda membagi kode menjadi bagian-bagian yang dapat digunakan kembali, bukan menyertakan semuanya di main(). Fungsi adalah elemen penyusun penting aplikasi Android dan mempelajari cara menentukan serta menggunakannya adalah langkah utama dalam perjalanan Anda untuk menjadi developer Android.

Prasyarat

  • Pengetahuan tentang dasar-dasar pemrograman Kotlin, termasuk variabel, serta fungsi println() dan main()

Yang akan Anda pelajari

  • Cara menentukan dan memanggil fungsi Anda sendiri.
  • Cara menampilkan nilai dari fungsi yang dapat Anda simpan di variabel.
  • Cara menentukan dan memanggil fungsi dengan beberapa parameter.
  • Cara memanggil fungsi dengan argumen yang dinamai.
  • Cara menetapkan nilai default untuk parameter fungsi.

Yang akan Anda butuhkan

  • Browser web dengan akses ke Kotlin Playground

2. Menentukan dan memanggil fungsi

Sebelum mempelajari fungsi secara mendalam, mari kita tinjau beberapa terminologi dasar.

  • Mendeklarasikan (atau menentukan) fungsi menggunakan kata kunci fun dan menyertakan kode dalam tanda kurung kurawal yang berisi petunjuk yang diperlukan untuk mengeksekusi tugas.
  • Memanggil fungsi menyebabkan semua kode yang terdapat dalam fungsi tersebut dieksekusi.

Sejauh ini, Anda telah menulis semua kode dalam fungsi main(). Fungsi main() tidak benar-benar dipanggil di mana pun dalam kode Anda; compiler Kotlin menggunakannya sebagai titik awal. Fungsi main() hanya dimaksudkan untuk menyertakan kode lain yang ingin Anda eksekusi, seperti panggilan ke fungsi println().

Fungsi println() adalah bagian dari bahasa Kotlin. Namun, Anda dapat menentukan fungsi Anda sendiri. Tindakan ini memungkinkan kode Anda digunakan kembali jika Anda perlu memanggilnya lebih dari sekali. Contohnya program berikut.

fun main() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}

Fungsi main() terdiri dari dua pernyataan println()—satu untuk mengucapkan selamat ulang tahun kepada Rover, dan satu lagi yang menyatakan usia Rover.

Meskipun Kotlin memungkinkan Anda untuk menempatkan semua kode dalam fungsi main(), Anda mungkin tidak selalu menginginkan hal tersebut. Misalnya, jika Anda juga ingin program Anda menyertakan ucapan Tahun Baru, fungsi utamanya juga harus menyertakan panggilan tersebut ke println(). Atau mungkin Anda ingin mengucapkan kepada Rover beberapa kali. Anda cukup menyalin dan menempelkan kode, atau membuat fungsi terpisah untuk ucapan selamat ulang tahun. Anda akan melakukan opsi yang kedua. Membuat fungsi terpisah untuk tugas tertentu memiliki sejumlah manfaat.

  • Kode yang dapat digunakan kembali: Daripada menyalin dan menempelkan kode yang perlu digunakan lebih dari sekali, Anda cukup memanggil fungsi di mana saja saat diperlukan.
  • Keterbacaan: Memastikan fungsi melakukan satu dan hanya satu tugas tertentu yang membantu developer dan rekan satu tim, serta Anda di masa mendatang untuk mengetahui dengan pasti apa yang dilakukan oleh sebuah kode.

Sintaksis untuk menentukan fungsi ditampilkan dalam diagram berikut.

Sintaksis untuk menentukan fungsi

Definisi fungsi dimulai dengan kata kunci fun, diikuti dengan nama fungsi, kumpulan tanda kurung buka dan tutup, serta kumpulan kurung kurawal buka dan tutup. Kode yang ada dalam tanda kurung kurawal adalah kode yang akan berjalan saat fungsi dipanggil.

Anda akan membuat fungsi baru untuk memindahkan dua pernyataan println() dari fungsi main().

  1. Di browser Anda, buka Kotlin Playground dan ganti konten dengan kode berikut.
fun main() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}
  1. Setelah fungsi main(), tentukan fungsi baru bernama birthdayGreeting(). Fungsi ini dideklarasikan dengan sintaksis yang sama dengan fungsi main().
fun main() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}

fun birthdayGreeting() {

}
  1. Pindahkan dua pernyataan println() dari main() ke dalam tanda kurung kurawal fungsi birthdayGreeting().
fun main() {

}

fun birthdayGreeting() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}
  1. Di fungsi main(), panggil fungsi birthdayGreeting(). Kode yang sudah selesai akan terlihat seperti berikut:
fun main() {
    birthdayGreeting()
}

fun birthdayGreeting() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}
  1. Jalankan kode. Anda akan melihat output berikut:
Happy Birthday, Rover!
You are now 5 years old!

3. Menampilkan nilai dari fungsi

Pada aplikasi yang lebih kompleks, fungsi melakukan lebih banyak hal dari sekadar mencetak teks.

Fungsi Kotlin juga dapat menghasilkan data yang disebut nilai yang ditampilkan yang disimpan dalam variabel dan dapat digunakan di tempat lain dalam kode Anda.

Saat menentukan fungsi, Anda dapat menentukan jenis data dari nilai yang ingin ditampilkan. Jenis nilai yang ditampilkan ditentukan dengan menempatkan titik dua (:) setelah tanda kurung, satu spasi kosong, lalu nama jenis (Int, String, dll.). Kemudian, satu spasi ditempatkan di antara jenis nilai yang ditampilkan dan kurung kurawal buka. Dalam isi fungsi, setelah semua pernyataan, Anda menggunakan pernyataan return untuk menentukan nilai yang Anda inginkan agar ditampilkan oleh fungsi. Pernyataan return terdiri dari kata kunci return diikuti dengan nilai, seperti variabel, yang Anda inginkan agar ditampilkan oleh fungsi sebagai output.

Sintaksis untuk mendeklarasikan fungsi dengan jenis nilai yang ditampilkan adalah sebagai berikut.

Sintaksis untuk mendeklarasikan fungsi dengan jenis nilai yang ditampilkan

Jenis Unit

Secara default, jika Anda tidak menentukan jenis nilai yang ditampilkan, jenis nilai yang ditampilkan default adalah Unit. Unit berarti fungsi tidak menampilkan nilai. Unit setara untuk membatalkan jenis nilai yang ditampilkan dalam bahasa lain (void di Java dan C; Void/tuple kosong () di Swift; None di Python, dll.). Setiap fungsi yang tidak menampilkan nilai, secara implisit akan menampilkan Unit. Anda dapat mengamatinya dengan memodifikasi kode untuk menampilkan Unit.

  1. Pada deklarasi fungsi untuk birthdayGreeting(), tambahkan titik dua setelah tanda kurung tutup dan tentukan jenis nilai yang ditampilkan sebagai Unit.
fun main() {
    birthdayGreeting()
}

fun birthdayGreeting(): Unit {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}
  1. Jalankan kode dan amati jika semuanya masih berfungsi.
Happy Birthday, Rover!
You are now 5 years old!

Menentukan jenis nilai yang ditampilkan Unit di Kotlin bersifat opsional. Untuk fungsi yang tidak menampilkan apa pun, atau menampilkan Unit, Anda tidak memerlukan pernyataan return.

Menampilkan String dari birthdayGreeting()

Untuk menunjukkan bagaimana fungsi dapat menampilkan nilai, Anda akan memodifikasi fungsi birthdayGreeting() untuk menampilkan string, bukan hanya mencetak hasilnya.

  1. Ganti jenis nilai yang ditampilkan Unit dengan String.
fun birthdayGreeting(): String {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}
  1. Jalankan kode. Anda akan mendapatkan pesan error. Jika Anda mendeklarasikan jenis nilai yang ditampilkan untuk suatu fungsi (mis., String), fungsi tersebut harus menyertakan pernyataan return.
A 'return' expression required in a function with a block body ('{...}')
  1. Anda hanya dapat menampilkan satu string dari fungsi, bukan dua. Ganti pernyataan println() dengan dua variabel, nameGreeting dan ageGreeting, menggunakan kata kunci val. Karena Anda menghapus panggilan ke println() dari birthdayGreeting(), memanggil birthdayGreeting() tidak akan mencetak apa pun.
fun birthdayGreeting(): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
}
  1. Dengan menggunakan sintaksis pemformatan string yang Anda pelajari di codelab sebelumnya, tambahkan pernyataan return untuk menampilkan string dari fungsi yang terdiri dari kedua ucapan.

Untuk memformat ucapan pada baris terpisah, Anda juga perlu menggunakan karakter escape \n. Ini sama seperti karakter escape \" yang Anda pelajari di codelab sebelumnya. Karakter \n diganti untuk newline sehingga kedua ucapan tersebut masing-masing berada di baris yang terpisah.

fun birthdayGreeting(): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}
  1. Di main(), karena birthdayGreeting() menampilkan nilai, Anda dapat menyimpan hasilnya dalam variabel string. Deklarasikan variabel greeting menggunakan val untuk menyimpan hasil pemanggilan birthdayGreeting().
fun main() {
    val greeting = birthdayGreeting()
}
  1. Di main(), panggil println() untuk mencetak string greeting. Fungsi main() kini akan terlihat seperti berikut.
fun main() {
    val greeting = birthdayGreeting()
    println(greeting)
}
  1. Jalankan kode Anda, lalu amati bahwa hasilnya sama seperti sebelumnya. Dengan menampilkan nilai, Anda dapat menyimpan hasilnya dalam variabel. Namun, menurut Anda, apa yang terjadi jika Anda memanggil fungsi birthdayGreeting() di dalam fungsi println()?
Happy Birthday, Rover!
You are now 5 years old!
  1. Hapus variabel, lalu teruskan hasil pemanggilan fungsi birthdayGreeting() ke dalam fungsi println():
fun main() {
    println(birthdayGreeting())
}
  1. Jalankan kode Anda dan amati outputnya. Nilai yang ditampilkan pemanggilan birthdayGreeting() diteruskan langsung ke println().
Happy Birthday, Rover!
You are now 5 years old!

4. Menambahkan parameter ke fungsi birthdayGreeting()

Seperti yang Anda lihat, saat memanggil println(), Anda dapat menyertakan string dalam tanda kurung atau meneruskan nilai ke fungsi. Anda dapat melakukan hal yang sama dengan fungsi birthdayGreeting(). Namun, Anda harus menambahkan parameter terlebih dahulu ke birthdayGreeting().

Parameter menentukan nama variabel dan jenis data yang dapat Anda teruskan ke fungsi sebagai data yang akan diakses di dalam fungsi. Parameter dideklarasikan dalam tanda kurung setelah nama fungsi.

Sintaksis untuk mendeklarasikan fungsi dengan parameter dan jenis nilai yang ditampilkan

Setiap parameter terdiri dari nama variabel dan jenis data, yang dipisahkan dengan titik dua dan spasi. Beberapa parameter dipisahkan oleh koma.

Saat ini, fungsi birthdayGreeting() hanya dapat digunakan untuk memberikan ucapan kepada Rover. Anda akan menambahkan parameter ke fungsi birthdayGreeting() agar dapat memberikan ucapan ke nama apa pun yang diteruskan ke fungsi.

  1. Dalam tanda kurung fungsi birthdayGreeting(), tambahkan parameter name dari jenis String, menggunakan sintaksis name: String.
fun birthdayGreeting(name: String): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}

Parameter yang ditentukan pada langkah sebelumnya berfungsi seperti variabel yang dideklarasikan dengan kata kunci val. Nilainya dapat digunakan di mana saja dalam fungsi birthdayGreeting(). Pada codelab sebelumnya, Anda telah mempelajari cara memasukkan nilai variabel ke dalam string.

  1. Ganti Rover di string nameGreeting dengan simbol $ diikuti dengan parameter name.
fun birthdayGreeting(name: String): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}
  1. Jalankan kode Anda dan amati errornya. Setelah mendeklarasikan parameter name, Anda harus meneruskan String saat memanggil birthdayGreeting(). Saat memanggil fungsi yang menggunakan parameter, Anda meneruskan argumen ke fungsi tersebut. Argumen adalah nilai yang Anda teruskan, seperti "Rover".
No value passed for parameter 'name'
  1. Teruskan "Rover" ke dalam panggilan birthdayGreeting() di main().
fun main() {
    println(birthdayGreeting("Rover"))
}
  1. Jalankan kode Anda dan amati outputnya. Nama Rover berasal dari parameter name.
Happy Birthday, Rover!
You are now 5 years old!
  1. Karena birthdayGreeting() mengambil parameter, Anda dapat memanggilnya dengan nama selain Rover. Tambahkan panggilan lain ke birthdayGreeting() di dalam panggilan ke println(), yang meneruskan argumen "Rex".
println(birthdayGreeting("Rover"))
println(birthdayGreeting("Rex"))
  1. Jalankan lagi kode, lalu amati bahwa outputnya berbeda berdasarkan argumen yang diteruskan ke birthdayGreeting().
Happy Birthday, Rover!
You are now 5 years old!
Happy Birthday, Rex!
You are now 5 years old!

5. Fungsi dengan beberapa parameter

Sebelumnya, Anda telah menambahkan parameter untuk mengubah ucapan berdasarkan nama. Namun, Anda juga dapat menentukan lebih dari satu parameter untuk sebuah fungsi, bahkan parameter dari berbagai jenis data. Di bagian ini, Anda akan mengubah ucapan agar ucapan tersebut juga berubah berdasarkan usia anjing.

Fungsi dengan beberapa parameter

Definisi parameter dipisahkan dengan koma. Demikian pula, saat Anda memanggil fungsi dengan beberapa parameter, Anda juga memisahkan argumen yang diteruskan dengan koma. Mari kita lihat bagaimana penerapannya.

  1. Setelah parameter name, tambahkan parameter age jenis Int, ke fungsi birthdayGreeting(). Deklarasi fungsi baru harus memiliki dua parameter, name dan age, dipisahkan dengan koma:
fun birthdayGreeting(name: String, age: Int): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}
  1. String ucapan baru harus menggunakan parameter age. Perbarui fungsi birthdayGreeting() untuk menggunakan nilai parameter age di string ageGreeting.
fun birthdayGreeting(name: String, age: Int): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now $age years old!"
    return "$nameGreeting\n$ageGreeting"
}
  1. Jalankan fungsi, lalu perhatikan error dalam output:
No value passed for parameter 'age'
No value passed for parameter 'age'
  1. Ubah kedua panggilan menjadi fungsi birthdayGreeting() di main() untuk meneruskan usia yang berbeda bagi setiap anjing. Teruskan 5 untuk usia Rover dan 2 untuk usia Rex.
fun main() {
    println(birthdayGreeting("Rover", 5))
    println(birthdayGreeting("Rex", 2))
}
  1. Jalankan kode. Setelah Anda meneruskan nilai untuk kedua parameter, output harus mencerminkan nama dan usia setiap anjing saat Anda memanggil fungsi.
Happy Birthday, Rover!
You are now 5 years old!
Happy Birthday, Rex!
You are now 2 years old!

Tanda Tangan Fungsi

Sejauh ini Anda telah melihat cara menentukan nama fungsi, input (parameter), dan output. Nama fungsi dengan inputnya (parameter) secara kolektif dikenal sebagai tanda tangan fungsi. Tanda tangan fungsi terdiri dari segala sesuatu sebelum jenis nilai yang ditampilkan dan ditunjukkan dalam cuplikan kode berikut.

fun birthdayGreeting(name: String, age: Int)

Parameter yang dipisahkan koma terkadang disebut daftar parameter.

Anda akan sering melihat istilah ini di dokumentasi untuk kode yang ditulis oleh developer lain. Tanda tangan fungsi memberi tahu Anda nama fungsi dan jenis data yang dapat diteruskan.

Anda telah mempelajari banyak sintaksis baru seputar penetapan fungsi. Lihat diagram berikut untuk mengetahui ringkasan sintaksis fungsi.

Diagram ringkasan sintaksis fungsi

6. Argumen yang dinamai

Pada contoh sebelumnya, Anda tidak perlu menentukan nama parameter, name atau age, saat Anda memanggil fungsi. Namun, Anda dapat melakukannya jika menginginkannya. Misalnya, Anda dapat memanggil fungsi dengan banyak parameter atau ingin meneruskan argumen dalam urutan yang berbeda, seperti menempatkan parameter age sebelum parameter name. Saat Anda menyertakan nama parameter saat memanggil fungsi, hal ini disebut argumen bernama. Coba gunakan argumen yang dinamai dengan fungsi birthdayGreeting().

  1. Ubah panggilan untuk Rex agar menggunakan argumen yang dinamai seperti yang ditunjukkan dalam cuplikan kode ini. Anda dapat melakukannya dengan menyertakan nama parameter yang diikuti dengan tanda sama dengan, lalu nilainya (mis. name = "Rex").
println(birthdayGreeting(name = "Rex", age = 2))
  1. Jalankan kode, lalu amati bahwa output tidak berubah:
Happy Birthday, Rover!
You are now 5 years old!
Happy Birthday, Rex!
You are now 2 years old!
  1. Urutkan ulang argumen yang dinamai. Misalnya, tempatkan argumen yang dinamai age sebelum argumen yang dinamai name.
println(birthdayGreeting(age = 2, name = "Rex"))
  1. Jalankan kode dan amati bahwa output tetap sama. Meskipun Anda mengubah urutan argumen, nilai yang sama diteruskan untuk parameter yang sama.
Happy Birthday, Rover!
You are now 5 years old!
Happy Birthday, Rex!
You are now 2 years old!

7. Argumen default

Parameter fungsi juga dapat menentukan argumen default. Mungkin Rover adalah anjing favorit Anda, atau Anda mengharapkan fungsi dipanggil dengan argumen tertentu dalam sebagian besar kasus. Saat memanggil fungsi, Anda dapat memilih untuk menghilangkan argumen yang memiliki default, dalam hal ini, default digunakan.

Untuk menambahkan argumen default, tambahkan operator penetapan (=) setelah jenis data untuk parameter dan tetapkan sama dengan nilai. Ubah kode untuk menggunakan argumen default.

  1. Di fungsi birthdayGreeting(), tetapkan parameter name ke nilai default "Rover".
fun birthdayGreeting(name: String = "Rover", age: Int): String {
    return "Happy Birthday, $name! You are now $age years old!"
}
  1. Pada panggilan pertama ke birthdayGreeting() untuk Rover di main(), setel argumen bernama age ke 5. Karena parameter age ditentukan setelah name, Anda perlu menggunakan argumen yang dinamai age. Tanpa argumen yang dinamai, Kotlin mengasumsikan urutan argumen adalah urutan yang sama dengan parameter yang ditentukan. Argumen yang dinamai digunakan untuk memastikan Kotlin mengharapkan Int untuk parameter age.
println(birthdayGreeting(age = 5))
println(birthdayGreeting("Rex", 2))
  1. Jalankan kode. Panggilan pertama ke fungsi birthdayGreeting() akan mencetak "Rover" sebagai nama karena Anda tidak pernah menentukan namanya. Panggilan kedua ke birthdayGreeting() masih menggunakan nilai Rex, yang Anda teruskan untuk name.
Happy Birthday, Rover! You are now 5 years old!
Happy Birthday, Rex! You are now 2 years old!
  1. Hapus nama dari panggilan kedua ke fungsi birthdayGreeting(). Sekali lagi, karena name dihilangkan, Anda perlu menggunakan argumen bernama untuk usia.
println(birthdayGreeting(age = 5))
println(birthdayGreeting(age = 2))
  1. Jalankan kode, lalu amati bahwa sekarang kedua panggilan untuk birthdayGreeting() mencetak "Rover" sebagai nama karena tidak ada argumen nama yang diteruskan.
Happy Birthday, Rover! You are now 5 years old!
Happy Birthday, Rover! You are now 2 years old!

8. Kesimpulan

Selamat! Anda telah mempelajari cara menentukan dan memanggil fungsi di Kotlin.

Ringkasan

  • Fungsi ditetapkan dengan kata kunci fun dan berisi bagian kode yang dapat digunakan kembali.
  • Fungsi membantu membuat program yang lebih besar menjadi lebih mudah dikelola dan mencegah pengulangan kode yang tidak perlu.
  • Fungsi dapat menampilkan nilai yang dapat Anda simpan dalam variabel untuk digunakan di lain waktu.
  • Fungsi dapat menggunakan parameter, yaitu variabel yang tersedia di dalam isi fungsi.
  • Argumen adalah nilai yang Anda teruskan saat memanggil fungsi.
  • Anda dapat memberi nama argumen saat memanggil fungsi. Saat menggunakan argumen yang dinamai, Anda dapat menyusun ulang argumen tanpa memengaruhi output.
  • Anda dapat menentukan argumen default yang memungkinkan Anda menghilangkan argumen saat memanggil fungsi.