Kamp Pelatihan Kotlin untuk Programer 2: Dasar-dasar Kotlin

Codelab ini adalah bagian dari kursus Bootcamp Kotlin untuk Programer. Anda akan mendapatkan manfaat maksimal dari kursus ini jika Anda mengerjakan codelab secara berurutan. Anda mungkin dapat membaca cepat beberapa bagian, bergantung pada pengetahuan Anda. Kursus ini ditujukan bagi programer yang menguasai bahasa berorientasi objek, dan ingin mempelajari Kotlin.

Pengantar

Dalam codelab ini, Anda mempelajari dasar-dasar bahasa pemrograman Kotlin: jenis data, operator, variabel, struktur kontrol, dan variabel nullable versus non-nullable. Kursus ini ditujukan bagi programer yang menguasai bahasa berorientasi objek, dan ingin mempelajari Kotlin.

Daripada membuat aplikasi sampel tunggal, pelajaran dalam kursus ini didesain untuk membangun pengetahuan Anda, tetapi bersifat semi-mandiri, sehingga Anda dapat membaca cepat bagian yang sudah Anda pahami. Untuk menyatukannya, banyak contoh menggunakan tema akuarium. Dan jika Anda ingin melihat cerita lengkap akuarium, lihat kursus Udacity Kotlin Bootcamp for Programmers.

Yang harus sudah Anda ketahui

  • Cara membuat project di IntelliJ IDEA
  • Cara membuka dan menjalankan kode dalam REPL (Read-Eval-Print Loop) Kotlin di IntelliJ IDEA (Tools > Kotlin > Kotlin REPL)

Yang akan Anda pelajari

  • Cara menggunakan jenis data, operator, dan variabel Kotlin
  • Cara menggunakan boolean dan kondisi
  • Perbedaan antara variabel nullable dan non-nullable
  • Cara kerja array, daftar, dan loop di Kotlin

Yang akan Anda lakukan

  • Bekerja sama dengan REPL Kotlin untuk mempelajari dasar-dasar Kotlin

Dalam tugas ini, Anda akan mempelajari operator dan jenis dalam bahasa pemrograman Kotlin.

Langkah 1: Jelajahi operator numerik

  1. Buka IntelliJ IDEA, jika belum dibuka.
  2. Untuk membuka REPL Kotlin, pilih Tools > Kotlin > Kotlin REPL.

Seperti bahasa lainnya, Kotlin menggunakan +, -, *, dan / untuk plus, minus, waktu, dan pembagian. Kotlin juga mendukung berbagai jenis angka, seperti Int, Long, Double, dan Float.

  1. Masukkan ekspresi berikut di REPL. Untuk melihat hasilnya, tekan Control+Enter (Command+Enter di Mac) setelahnya.
1+1
⇒ res8: kotlin.Int = 2

53-3
⇒ res9: kotlin.Int = 50

50/10
⇒ res10: kotlin.Int = 5

1.0/2.0
⇒ res11: kotlin.Double = 0.5

2.0*3.5
⇒ res12: kotlin.Double = 7.0

Perhatikan bahwa hasil operasi menyimpan jenis operand, sehingga 1/2 = 0, tapi 1.0/2.0 = 0.5.

  1. Coba beberapa ekspresi dengan kombinasi bilangan bulat dan desimal yang berbeda.
6*50
⇒ res13: kotlin.Int = 300

6.0*50.0
⇒ res14: kotlin.Double = 300.0

6.0*50
⇒ res15: kotlin.Double = 300.0
  1. Panggil beberapa metode pada nomor. Kotlin menyimpan angka sebagai primitif, tetapi memungkinkan Anda memanggil metode pada angka seolah-olah itu adalah objek.
2.times(3)
⇒ res5: kotlin.Int = 6

3.5.plus(4)
⇒ res8: kotlin.Double = 7.5

2.4.div(2)
⇒ res9: kotlin.Double = 1.2

Langkah 2: Berlatih menggunakan jenis

Kotlin tidak secara implisit mengonversi antar jenis angka, sehingga Anda tidak dapat menetapkan nilai singkat langsung ke variabel panjang, atau Byte ke Int. Hal ini karena konversi angka implisit merupakan sumber error umum dalam program. Anda dapat menetapkan nilai jenis yang berbeda kapan saja dengan mentransmisikan.

  1. Untuk melihat beberapa transmisi yang memungkinkan, tentukan variabel jenis Int di REPL.
val i: Int = 6
  1. Buat variabel baru, lalu masukkan nama variabel yang ditunjukkan di atas, diikuti dengan .to.
val b1 = i.to

IntelliJ IDEA menampilkan daftar kemungkinan penyelesaian. Pelengkapan otomatis ini berfungsi untuk variabel dan objek dari jenis apa pun.

  1. Pilih toByte() dari daftar, lalu cetak variabel.
val b1 = i.toByte()
println(b1)
⇒ 6
  1. Menetapkan nilai Byte ke variabel dari jenis yang berbeda.
val b2: Byte = 1 // OK, literals are checked statically
println(b2)
⇒ 1

val i1: Int = b2
⇒ error: type mismatch: inferred type is Byte but Int was expected

val i2: String = b2
⇒ error: type mismatch: inferred type is Byte but String was expected

val i3: Double = b2
⇒ error: type mismatch: inferred type is Byte but Double was expected
  1. Untuk tugas yang menampilkan error, coba transmisikan.
val i4: Int = b2.toInt() // OK!
println(i4)
⇒ 1

val i5: String = b2.toString()
println(i5)
⇒ 1

val i6: Double = b2.toDouble()
println(i6)
⇒ 1.0
  1. Agar konstanta numerik yang panjang lebih mudah dibaca, Kotlin memungkinkan Anda menempatkan garis bawah dalam angka, yang sebaiknya Anda lakukan. Coba masukkan konstanta numerik yang berbeda.
val oneMillion = 1_000_000
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

Langkah 3: Pelajari nilai jenis variabel

Kotlin mendukung dua jenis variabel: dapat diubah dan tidak dapat diubah. Dengan val, Anda dapat menetapkan nilai satu kali. Jika mencoba menetapkan sesuatu lagi, Anda akan menerima error. Dengan var, Anda dapat menetapkan nilai, lalu mengubah nilai tersebut nanti dalam program.

  1. Tentukan variabel menggunakan val dan var, lalu tetapkan nilai baru ke variabel tersebut.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
⇒ error: val cannot be reassigned

Anda dapat menetapkan nilai baru pada fish, lalu menetapkan nilai baru tersebut karena ditetapkan dengan var. Mencoba untuk menetapkan nilai baru ke aquarium akan memberikan error karena hal tersebut didefinisikan dengan val.

Jenis yang Anda simpan di variabel ditentukan saat compiler dapat mengetahuinya dari konteks. Jika diinginkan, Anda dapat selalu menentukan jenis variabel secara eksplisit, menggunakan notasi titik dua.

  1. Menentukan beberapa variabel dan menentukan jenis secara eksplisit.
var fish: Int = 12
var lakes: Double = 2.5

Setelah jenis ditetapkan oleh Anda atau compiler, Anda tidak dapat mengubah jenis, atau Anda akan mendapat pesan error.

Langkah 4: Pelajari string

String di Kotlin berfungsi seperti string di bahasa pemrograman lain dengan menggunakan " untuk string, ' untuk karakter tunggal, dan Anda dapat menggabungkan string dengan operator +. Anda dapat membuat template string dengan menggabungkannya dengan nilai; nama $variable diganti dengan teks yang mewakili nilai. Nilai ini disebut variable interpolation.

  1. Buat template string.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
⇒ res20: kotlin.String = I have 5 fish and 12 plants
  1. Buat template string dengan ekspresi di dalamnya. Seperti pada bahasa lain, nilai dapat menjadi hasil dari ekspresi. Gunakan tanda kurung kurawal {} untuk menentukan ekspresi.
"I have ${numberOfFish + numberOfPlants} fish and plants"
⇒ res21: kotlin.String = I have 17 fish and plants

Dalam tugas ini, Anda akan mempelajari boolean dan memeriksa kondisi dalam bahasa pemrograman Kotlin. Seperti bahasa lain, Kotlin memiliki boolean dan operator boolean seperti kurang dari, sama dengan, lebih besar dari, dan seterusnya (<, ==, >, !=, <=, >=).

  1. Tulis pernyataan if/else.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
    println("Good ratio!") 
} else {
    println("Unhealthy ratio")
}
⇒ Good ratio!
  1. Coba rentang dalam pernyataan if. Di Kotlin, Anda juga dapat menguji kondisi menggunakan rentang.
val fish = 50
if (fish in 1..100) {
    println(fish)
}
⇒ 50
  1. Tulis if dengan beberapa kasus. Untuk kondisi yang lebih rumit, gunakan logis dan && dan logis atau ||. Seperti pada bahasa lain, Anda dapat memiliki beberapa kasus dengan menggunakan else if.
if (numberOfFish == 0) {
    println("Empty tank")
} else if (numberOfFish < 40) {
    println("Got fish!")
} else {
    println("That's a lot of fish!")
}
⇒ That's a lot of fish!
  1. Coba pernyataan when. Ada cara yang lebih baik untuk menulis rangkaian pernyataan if/else if/else tersebut di Kotlin, menggunakan pernyataan when, yang merupakan pernyataan switch dalam bahasa lain. Kondisi di pernyataan when juga dapat menggunakan rentang.
when (numberOfFish) {
    0  -> println("Empty tank")
    in 1..39 -> println("Got fish!")
    else -> println("That's a lot of fish!")
}
⇒ That's a lot of fish!

Dalam tugas ini, Anda mempelajari variabel nullable versus non-nullable. Error pemrograman yang melibatkan null telah menjadi sumber bug yang tidak terhitung. Kotlin berusaha mengurangi bug dengan mengenalkan variabel non-nullable.

Langkah 1: Pelajari nullability

Secara default, variabel tidak boleh null.

  1. Deklarasikan Int dan tetapkan null ke dalamnya.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
  1. Gunakan operator tanda tanya, ?, setelah jenis untuk menunjukkan bahwa variabel dapat null. Deklarasikan Int? dan tetapkan null ke dalamnya.
var marbles: Int? = null

Jika Anda memiliki jenis data yang kompleks, seperti daftar:

  • Anda dapat mengizinkan elemen daftar menjadi null.
  • Anda dapat mengizinkan daftar menjadi null, tapi jika tidak null, elemennya tidak boleh menjadi null.
  • Anda dapat mengizinkan daftar atau elemen menjadi null.

Daftar dan beberapa jenis data kompleks lainnya dibahas dalam tugas berikutnya.

Langkah 2: Pelajari tentang dan ?: operator

Anda dapat menguji null dengan operator ?, sehingga Anda tidak perlu repot menulis banyak pernyataan if/else.

  1. Tulis beberapa kode dengan cara yang lebih lama untuk memeriksa apakah variabel fishFoodTreats bukan null. Kemudian turunkan variabel tersebut.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
    fishFoodTreats = fishFoodTreats.dec()
}
  1. Sekarang lihat cara penulisan Kotlin, menggunakan operator ?.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
  1. Anda juga dapat merangkai pengujian null dengan operator ?:. Lihat contoh berikut:
fishFoodTreats = fishFoodTreats?.dec() ?: 0

Cara pintas untuk "jika fishFoodTreats bukan null, mengurangi dan menggunakannya; jika tidak, gunakan nilai setelah ?: yang 0." Jika fishFoodTreats bernilai null, evaluasi akan dihentikan, dan metode dec() tidak dipanggil.

Poin tentang pointer null

Jika Anda sangat menyukai NullPointerExceptions, Kotlin akan membiarkan Anda tetap menyimpannya. Operator pernyataan not-null, !! (double-bang), mengonversi nilai apa pun menjadi jenis non-null dan melempar pengecualian jika nilainya null.

val len = s!!.length   // throws NullPointerException if s is null

Dalam tugas ini, Anda akan mempelajari array dan daftar, serta mempelajari berbagai cara untuk membuat loop dalam bahasa pemrograman Kotlin.

Langkah 1: Buat daftar

Daftar adalah jenis dasar dalam Kotlin, dan serupa dengan daftar dalam bahasa lain.

  1. Deklarasikan daftar menggunakan listOf, lalu cetak daftar tersebut. Daftar ini tidak dapat diubah.
val school = listOf("mackerel", "trout", "halibut")
println(school)
⇒ [mackerel, trout, halibut]
  1. Deklarasikan daftar yang dapat diubah menggunakan mutableListOf. Menghapus item.
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true

Metode remove() menampilkan true jika berhasil menghapus item yang diteruskan.

Langkah 2: Buat array

Seperti bahasa lain, Kotlin memiliki array. Tidak seperti daftar di Kotlin, yang memiliki versi yang dapat dan tidak dapat diubah, tidak ada versi Array yang dapat diubah. Saat Anda membuat array, ukuran telah diperbaiki. Anda tidak dapat menambah atau menghapus elemen, kecuali menyalin ke array baru.

Aturan tentang menggunakan val dan var sama dengan array seperti pada daftar.

  1. Deklarasikan array string menggunakan arrayOf. Gunakan utilitas array java.util.Arrays.toString() untuk mencetaknya.
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
⇒ [shark, salmon, minnow]
  1. Array yang dideklarasikan dengan arrayOf tidak memiliki jenis yang terkait dengan elemen, sehingga Anda dapat mencampur jenis, yang akan sangat membantu. Mendeklarasikan array dengan jenis berbeda.
val mix = arrayOf("fish", 2)
  1. Anda juga dapat mendeklarasikan array dengan satu jenis untuk semua elemen. Deklarasikan array bilangan bulat menggunakan intArrayOf(). Terdapat builder yang sesuai, atau fungsi pembuat instance, untuk array jenis lain.
val numbers = intArrayOf(1,2,3)
  1. Gabungkan dua array dengan operator +.
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])
=> 3
  1. Cobalah berbagai kombinasi array dan daftar bertingkat. Seperti dalam bahasa lain, Anda dapat menyarangkan array dan daftar. Yaitu, saat Anda menempatkan array dalam sebuah array, Anda memiliki sebuah array—bukan array yang diratakan dari isi kedua array. Elemen array juga dapat berupa daftar, dan elemen daftar dapat berupa array.
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)
⇒ [[I@89178b4, [Atlantic, Pacific], salmon]

Elemen pertama, numbers, adalah Array. Jika Anda tidak menggunakan utilitas array untuk mencetaknya, Kotlin akan mencetak alamat, bukan konten array.

  1. Salah satu fitur yang menarik dari Kotlin adalah Anda dapat menginisialisasi array dengan kode, bukannya menginisialisasinya ke 0. Coba contoh ini:
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))
⇒ [0, 2, 4, 6, 8]

Kode inisialisasi berada di antara tanda kurung kurawal, {}. Dalam kode, it merujuk pada indeks array, yang dimulai dengan 0.

Langkah 3: Buat loop

Sekarang setelah Anda memiliki daftar dan array, loop melalui elemen bekerja seperti yang Anda harapkan.

  1. Buat array. Gunakan loop for untuk melakukan iterasi melalui array dan mencetak elemen.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
    print(element + " ")
}
⇒ shark salmon minnow
  1. Di Kotlin, Anda dapat membuat loop melalui elemen dan indeks pada waktu yang bersamaan. Coba contoh ini:
for ((index, element) in school.withIndex()) {
    println("Item at $index is $element\n")
}
⇒ Item at 0 is shark
Item at 1 is salmon
Item at 2 is minnow
  1. Coba ukuran dan rentang langkah yang berbeda. Anda dapat menentukan rentang angka atau karakter, secara alfabetis. Dan seperti dalam bahasa lain, Anda tidak perlu melangkah maju dengan 1. Anda dapat melangkah mundur menggunakan downTo.
for (i in 1..5) print(i)
⇒ 12345

for (i in 5 downTo 1) print(i)
⇒ 54321

for (i in 3..6 step 2) print(i)
⇒ 35

for (i in 'd'..'g') print (i)
⇒ defg
  1. Cobalah beberapa loop. Seperti bahasa lain, Kotlin memiliki loop while, loop do...while, serta operator ++ dan --. Kotlin juga memiliki repeat loop.
var bubbles = 0
while (bubbles < 50) {
    bubbles++
}
println("$bubbles bubbles in the water\n")

do {
    bubbles--
} while (bubbles > 50)
println("$bubbles bubbles in the water\n")

repeat(2) {
     println("A fish is swimming")
}
⇒ 50 bubbles in the water
49 bubbles in the water
A fish is swimmingA fish is swimming

Kotlin sangat mirip dengan bahasa lain dalam hal dasar-dasar seperti operator, daftar, dan loop, tetapi ada beberapa perbedaan penting.

Fitur berikut mungkin berbeda dengan Kotlin yang biasa Anda gunakan dalam bahasa lain:

  • Jenis Kotlin tidak dapat dikonversi secara implisit—gunakan transmisi.
  • Variabel yang dideklarasikan dengan val hanya dapat ditetapkan sekali.
  • Variabel Kotlin tidak nullable secara default. Menggunakan ? untuk membuat variabel nullable.
  • Dengan Kotlin, Anda dapat membuat loop melalui indeks dan elemen array secara bersamaan dalam loop for.

Konstruksi pemrograman Kotlin berikut mirip dengan yang menggunakan bahasa lain:

  • Array dan daftar dapat memiliki satu atau beberapa jenis campuran.
  • Array dan daftar dapat disarangkan.
  • Anda dapat membuat loop dengan for, while, do/while, dan repeat.
  • Pernyataan when adalah versi Kotlin dari pernyataan switch, tetapi when lebih fleksibel.

Dokumentasi Kotlin

Jika Anda menginginkan informasi lebih lanjut tentang setiap topik dalam kursus ini, atau jika mengalami kesulitan, https://kotlinlang.org adalah langkah awal yang terbaik.

Tutorial Kotlin

Situs https://try.kotlinlang.org menyertakan berbagai tutorial yang disebut Kotlin Koans, penafsir berbasis web, dan kumpulan lengkap dokumentasi referensi dengan contoh.

Kursus Udacity

Untuk melihat kursus Udacity tentang topik ini, lihat Bootcamp Kotlin untuk Pemrogram

IntelliJ IDEA

Dokumentasi untuk IntelliJ IDEA dapat ditemukan di situs JetBrains.

Bagian ini mencantumkan kemungkinan tugas pekerjaan rumah untuk siswa yang mengerjakan codelab ini sebagai bagian dari kursus yang dipimpin oleh instruktur. Terserah instruktur untuk melakukan hal berikut:

  • Tugaskan pekerjaan rumah jika diperlukan.
  • Berkomunikasi dengan siswa cara mengirimkan tugas pekerjaan rumah.
  • Beri nilai tugas pekerjaan rumah.

Instruktur dapat menggunakan saran ini sesedikit atau sebanyak yang mereka inginkan, dan harus bebas memberikan pekerjaan rumah lain yang dirasa sesuai.

Jika Anda mengerjakan codelab ini sendiri, silakan gunakan tugas pekerjaan rumah ini untuk menguji pengetahuan Anda.

Jawab pertanyaan berikut

Pertanyaan 1

Manakah dari pernyataan berikut yang mendeklarasikan daftar string yang tidak dapat diubah?

val school = arrayOf("shark", "salmon", "minnow")

var school = arrayOf("shark", "salmon", "minnow")

val school = listOf("shark", "salmon", "minnow")

val school = mutableListOf("shark", "salmon", "minnow")

Pertanyaan 2

Apa yang akan menjadi output dari kode berikut?
for (i in 3..8 step 2) print(i)

▢ 345678

▢ 468

▢ 38

▢ 357

Pertanyaan 3

Apa tujuan dari tanda tanya dalam kode ini?
var rocks: Int? = 3

▢ Jenis variabel rocks tidak diperbaiki.

▢ Variabel rocks dapat disetel ke null.

▢ Variabel rocks tidak dapat disetel ke null.

▢ Variabel rocks tidak boleh langsung diinisialisasi.

Lanjutkan ke pelajaran berikutnya: 3. Fungsi

Untuk ringkasan kursus, termasuk link ke codelab lainnya, lihat "Kotlin Bootcamp for Programmers: Selamat datang di kursus."