Bayangkan ketika kita ditugaskan untuk mencetak beberapa baris teks yang sama ke dalam konsol seperti berikut:

  1. Hello World

  2. Hello World

  3. Hello World

  4. Hello World

  5. Hello World


Kita pasti langsung terpikir akan menulis programnya seperti berikut:

  1. fun main() {

  2.     println("Hello World")

  3.     println("Hello World")

  4.     println("Hello World")

  5.     println("Hello World")

  6.     println("Hello World")

  7. }


Think! Bagaimana jika teks yang harus ditampilkan berjumlah banyak? Tentu kita tidak mungkin menuliskan fungsi println() sesuai dengan jumlah yang kita ingin tampilkan. 
Nah, untuk mengatasinya kita bisa menggunakan perulangan. Perulangan adalah proses perulangan blok yang sama tanpa henti sampai kondisi yang diberikan tidak terpenuhi atau bernilai false
Perulangan terdiri dari WhileDo While dan For Loop. Modul ini akan membahas While dan Do While. Sementara For Loop akan dibahas terpisah pada modul berikutnya.

While

Untuk menggunakan While, kita membutuhkan kata kunci while, lanjut ke kondisi di dalam tanda kurung, dan diakhiri oleh blok body dari while itu sendiri. Berikut adalah contoh dari penggunaan While:

  1. fun main() {

  2.     var counter = 1

  3.     while (counter <= 7){

  4.         println("Hello, World!")

  5.         counter++

  6.     }

  7. }

  8. /*

  9.    output :

  10.        Hello, World!

  11.        Hello, World!

  12.        Hello, World!

  13.        Hello, World!

  14.        Hello, World!

  15.        Hello, World!

  16.        Hello, World!

  17. */


Perhatikan kondisi dari While di atas, jika nilai dari variabel counter kurang dari sama dengan maka kondisi tersebut sudah tak terpenuhi dan proses perulangan akan dihentikan.
While bersifat Entry Controlled Loop. Artinya, kondisi yang diberikan akan dievaluasi terlebih dahulu. Jika kondisi tersebut terpenuhi maka proses perulangan akan dijalankan.
Jika kondisi yang diberikan tidak terpenuhi sejak awal maka proses perulangan tidak akan dijalankan. Untuk mengujinya Anda bisa menulis dan menjalankan kode berikut:

  1. fun main() {

  2.     var counter = 8

  3.     while (counter <= 7){

  4.         println("Hello, World!")

  5.         counter++

  6.     }

  7. }


Dengan While kita tidak perlu menuliskan fungsi println() secara berulang untuk mencetak teks ke dalam konsol seperti contoh kasus di awal.

Do While

Selain menggunakan While, kita juga bisa menggunakan Do While untuk melakukan perulangan seperti berikut:

  1. fun main() {

  2.     var counter = 1

  3.     do {

  4.         println("Hello, World!")

  5.         counter++

  6.     } while (counter <= 7)

  7. }

  8.  

  9. /*

  10.    output:

  11.        Hello, World!

  12.        Hello, World!

  13.        Hello, World!

  14.        Hello, World!

  15.        Hello, World!

  16.        Hello, World!

  17.        Hello, World!

  18. */


Berbeda dengan While, Do While bersifat Exit Controlled Loop di mana proses perulangan akan langsung dijalankan di awal. Jika telah selesai, barulah kondisi yang diberikan akan dievaluasi.

Saat menggunakan While dan Do While perhatikan infinite loop, yaitu kondisi di mana proses perulangan berlangsung terus menerus sampai aplikasi menjadi crash. Contoh dari infinite loop adalah seperti berikut:

  1. fun main() {

  2.     var value = 'A'

  3.     do {

  4.         print(value)

  5.     } while (value <= 'Z')

  6. }


Infinite loop terjadi jika kondisi yang diberikan selamanya terpenuhi atau bernilai true.
While dan Do While sendiri tidak dapat digunakan untuk melakukan perulangan pada rentan angka. Untuk melakukannya kita bisa menggunakan For Loop yang akan kita pelajari pada modul selanjutnya

Ketika mempelajari sebuah bahasa pemrograman, kita selalu dihadapkan dengan istilah expressions dan statement. Ini adalah 2 (dua) istilah yang kadang salah dipahami. 

Expression pada Kotlin terdiri dari variabel, operator dan sesuatu yang mengevaluasi ke dalam nilai tunggal.
Contoh dari expression pada Kotlin adalah penggunaan If. Karena If dapat mengembalikan nilai yang bisa kita simpan ke dalam sebuah variabel.

  1. val openOffice = 7

  2. val now = 8

  3. val office = if (now > openOffice) "Office already open" else "office close"


Pada kode di atas, If akan mengembalikan nilai kedalam variabel office.
Perlu Anda ketahui bahwa di dalam sebuah expression bisa terdapat sebuah expression lagi. Contohnya seperti berikut:

  1. fun main() {

  2.     sum(1 , 1 * 4)

  3. }

  4.  

  5. fun sum(value1: Int, value2: Int) = value1 + value2


Pada kode diatas 1 * 4 merupakan sebuah expression yang ada pada pemanggilan fungsi sum() alias fungsi yang mengembalikan nilai. Setiap fungsi selalu mengembalikan nilai. Alhasil, pemanggilan sebuah fungsi merupakan sebuah expression.
Sedangkan contoh dari statement adalah inisialisasi sebuah variabel seperti berikut:

  1. fun main() {

  2.     val value1 = 10

  3.     val value2 = 10

  4.  

  5.     sum(value1, value2)

  6. }

  7.  

  8. fun sum(value1: Int, value2: Int) = value1 + value2


Pada kode di atas deklarasi variabel value1 dan value2 merupakan sebuah statement. Sedangkan pemanggilan fungsi sum seperti yang dijelaskan di atas, merupakan sebuah expression

Untuk menentukan statement atau expression kita menggunakan If Expression.  Selain itu kita juga bisa gunakan  When Expression,  yakni mekanisme yang memungkinkan nilai dari sebuah variabel/expression, mampu mengubah alur program.


Contoh sederhana dalam penggunaan when expression adalah seperti berikut:

  1. fun main() {

  2.     val value = 7

  3.  

  4.     when(value){

  5.         6 -> println("value is 6")

  6.         7 -> println("value is 7")

  7.         8 -> println("value is 8")

  8.     }

  9. }

  10.  

  11. /*

  12.    output: value is 7

  13. */


when akan mencocokan semua argumen yang berada di setiap branch secara berurutan sampai salah satu kondisi terpenuhi. Di dalam when kita juga bisa menambahkan branch else seperti berikut:

  1. fun main() {

  2.     val value = 20

  3.  

  4.     when(value){

  5.         6 -> println("value is 6")

  6.         7 -> println("value is 7")

  7.         8 -> println("value is 8")

  8.         else -> println("value cannot be reached")

  9.     }

  10. }

  11.  

  12. /*

  13.    output: value cannot be reached

  14. */


else akan dievaluasi jika tiada satupun kondisi yang terpenuhi pada branch sebelumnya. Sama halnya seperti if expression, when expression dapat mengembalikan nilai dan dapat disimpan di dalam sebuah variabel seperti berikut:

  1. fun main() {

  2.     val value = 7

  3.     val stringOfValue = when (value) {

  4.         6 -> "value is 6"

  5.         7 -> "value is 7"

  6.         8 -> "value is 8"

  7.         else -> "value cannot be reached"

  8.     }

  9.  

  10.     println(stringOfValue)

  11. }

  12.  

  13. /*

  14.    output : value is 7

  15. */


else adalah hal wajib jika kita menggunakan when expression untuk mengembalikan nilai. Bagaimana jika kita melewatkannya? Akan tampil eror berikut:
'when' expression must be exhaustive, add necessary 'else' branch
Jika kita memiliki dua atau lebih baris kode yang akan kita jalankan di setiap branch, kita bisa memindahkannya ke dalam curly braces seperti berikut:

  1. fun main() {

  2.     val value = 7

  3.     val stringOfValue = when (value) {

  4.         6 -> {

  5.             println("Six")

  6.             "value is 6"

  7.         }

  8.         7 -> {

  9.             println("Seven")

  10.             "value is 7"

  11.         }

  12.         8 -> {

  13.             println("Eight")

  14.             "value is 8"

  15.         }

  16.         else -> {

  17.             println("undefined")

  18.             "value cannot be reached"

  19.         }

  20.     }

  21.  

  22.     println(stringOfValue)

  23. }

  24.  

  25. /*

  26.    output : value is 7

  27.  

  28. */


when juga memungkinkan kita untuk memeriksa instance dengan tipe tertentu dari sebuah objek menggunakan is atau !is. Contohnya seperti berikut:

  1. fun main() {

  2.     val anyType : Any = 100L

  3.     when(anyType){

  4.         is Long -> println("the value has a Long type")

  5.         is String -> println("the value has a String type")

  6.         else -> println("undefined")

  7.     }

  8. }

  9.  

  10. /*

  11.    output : the value has a Long type

  12. */


Selain itu, when expression juga bisa kita gunakan untuk memeriksa nilai yang terdapat pada sebuah Range atau Collection. Range sendiri merupakan salah satu tipe data yang unik di mana kita dapat menentukan nilai awal dan nilai akhir. Range dan Collection akan dibahas terpisah pada modul berikutnya. 
Berikut adalah contoh saat kita hendak mengecek apakah sebuah nilai ada di dalam sebuah Range atau tidak.

  1. fun main() {

  2.     val value =  27

  3.     val ranges = 10..50

  4.  

  5.     when(value){

  6.         in ranges -> println("value is in the range")

  7.         !in ranges -> println("value is outside the range")

  8.         else -> println("value undefined")

  9.     }

  10. }

  11.  

  12. /*

  13.    output : value is in the range

  14. */


Branch pertama pada contoh kode di atas akan memeriksa apakah nilai dari value terdapat di cakupan nilai ranges. Kemudian untuk branch kedua akan memeriksa apakah nilai dari value tidak terdapat pada nilai yang dicakup oleh ranges. Sedangkan branch else akan mengevaluasi jika dua kondisi sebelumnya tidak terpenuhi.
Sejak Kotlin 1.3, kita dapat menangkap subjek dari when expression di dalam sebuah variabel. Contohnya seperti berikut:

  1. fun main() {

  2.     val registerNumber = when(val regis = getRegisterNumber()){

  3.         in 1..50 -> 50 * regis

  4.         in 51..100 -> 100 * regis

  5.         else -> regis

  6.     }

  7. }

  8.  

  9. fun getRegisterNumber() = Random.nextInt(100)


Perhatikan. Cakupan variabel yang dapat ditangkap, terbatas di dalam body when expression.
Jika kita melihat penjelasan dan contoh penggunaan dari when expression di atas, ia memiliki kesamaan dengan if expression. Lantas disituasi seperti apa kita menggunakannya? if expression sebaiknya digunakan ketika kondisi yang diberikan tidak lebih dari 2 (dua) dan kondisi yang diberikan tidak terlalu rumit.

  1. val anyType : Any = 100L

  2. if (anyType is Long){

  3.     println("the value has a Long type")

  4. } else {

  5.     println("the value is not Long type")

  6. }


Berbeda dengan when expression, ia bisa digunakan ketika kondisi yang diberikan lebih dari 2 (dua). 

  1. val anyType: Any = 100L

  2. when (anyType) {

  3.     is Long -> println("the value has a Long type")

  4.     is Int -> println("the value has a Int type")

  5.     is Double -> println("the value has a Double type")

  6.     else -> println("undefined")

  7. }