Masukkan Password
13 Kursus Kotlin Lengkap #12 - Tipe Any, Unit & Nothing - Tutorial Kotlin untuk Pemula
Di bagian ini kamu diperkenalkan dengan 3 tipe khusus di Kotlin:
AnyUnitNothing
Ketiganya memang tidak terlalu sering ditulis secara eksplisit oleh pemula, tetapi penting untuk dipahami karena nanti kamu bisa menemukannya di function, generic, exception, collection, dan library Kotlin.
1. Gambaran besarnya dulu
Kalau sebelumnya kita sudah belajar:
Int→ angka bulatDouble→ angka desimalString→ teksBoolean→true/falseChar→ satu karakterPair→ dua nilaiTriple→ tiga nilai
Sekarang kita bertemu dengan tipe yang sifatnya lebih khusus:
| Tipe | Gampangnya | Fungsi utama |
|---|---|---|
Any | “bisa berupa hampir tipe apa saja” | Tipe paling umum |
Unit | “tidak mengembalikan hasil yang berguna” | Return type function yang tidak menghasilkan nilai |
Nothing | “tidak pernah menghasilkan nilai karena tidak selesai” | Function yang tidak pernah selesai/selalu melempar exception |
Mental model sederhananya:
Any
↓
"Nilainya bisa macam-macam"
Unit
↓
"Function selesai, tapi tidak mengembalikan nilai"
Nothing
↓
"Function tidak pernah selesai secara normal"
Sekarang kita bahas satu per satu.
2. Any — tipe yang sangat umum
Apa itu Any?
Any bisa kita anggap sebagai tipe dasar yang dapat menampung nilai dari berbagai tipe non-null.
Contohnya:
val number: Any = 42
val name: Any = "Andi"
val active: Any = true
val decimal: Any = 3.14
Semuanya valid.
Kenapa?
Karena:
42 → Int
"Andi" → String
true → Boolean
3.14 → Double
Tetapi semuanya juga bisa diperlakukan sebagai Any.
Jadi:
val number: Any = 42
artinya:
“Saya punya sebuah nilai yang saya perlakukan sebagai
Any, dan nilai tersebut kebetulan sekarang adalahInt.”
3. Any bukan berarti tipe datanya benar-benar hilang
Ini penting.
Misalnya:
val number: Any = 42
Nilai 42 sebenarnya tetap merupakan sebuah Int.
Any hanya menentukan bagaimana kita memperlakukan/mengakses nilai tersebut melalui variabelnya.
Bayangkan seperti kotak.
┌─────────────────┐
│ Any │
│ │
│ 42 │
└─────────────────┘
Di dalam kotak terdapat Int.
Kalau:
val name: Any = "Andi"
maka:
┌─────────────────┐
│ Any │
│ │
│ "Andi" │
└─────────────────┘
Isinya String.
4. Kenapa subtitle mengatakan “mother of all types”?
Subtitle menggunakan istilah:
“Any is the mother of all other types”
Ini adalah analogi, bukan istilah teknis resmi.
Lebih tepatnya:
Anyadalah supertype paling umum untuk semua tipe Kotlin yang non-null.
Contohnya:
val a: Any = 10
val b: Any = "Hello"
val c: Any = true
val d: Any = 10.5
Semua bisa menjadi Any.
Tetapi ada satu hal penting:
Any berbeda dengan Any?
Any
tidak menerima null.
Sedangkan:
Any?
boleh menerima null.
Contoh:
val a: Any = "Hello"
valid.
Tetapi:
val b: Any = null
❌ tidak valid.
Kalau:
val b: Any? = null
✅ valid.
Jadi lebih tepat:
Any
└── semua tipe non-null
Any?
└── termasuk null
5. Contoh penggunaan Any
Misalnya:
val number: Any = 42
val text: Any = "Hello"
Kita bisa melihat:
println(number)
println(text)
Hasil:
42
Hello
Tetapi ada konsekuensi.
Karena number dideklarasikan sebagai Any, Kotlin tidak menganggap variabel itu sebagai Int ketika kita mengaksesnya.
Misalnya kita punya:
val number: Any = 42
Kita tidak bisa begitu saja memperlakukannya sebagai Int dalam semua konteks.
Biasanya kita perlu melakukan pengecekan atau casting.
Contohnya nanti kita akan belajar:
if (number is Int) {
println(number + 10)
}
Untuk sekarang belum perlu terlalu mendalami is dan casting. Yang penting pahami:
Anymemberikan fleksibilitas, tetapi mengurangi informasi tipe spesifik yang bisa langsung digunakan.
6. Apakah kita sering menulis Any seperti ini?
Misalnya:
val number: Any = 42
Biasanya tidak perlu kalau kita sudah tahu tipenya.
Lebih baik:
val number = 42
Kotlin otomatis mengetahui:
number → Int
Ini disebut type inference.
Jadi:
val number: Any = 42
biasanya kurang ideal jika kita memang tahu bahwa nilainya adalah Int.
Lebih jelas:
val number = 42
Karena Kotlin langsung mengetahui tipenya.
7. Kapan Any berguna?
Any berguna ketika kita memang ingin menerima berbagai jenis tipe.
Misalnya sebuah function nantinya bisa menerima:
String
Int
Boolean
Double
Kita bisa menggunakan:
Any
Contoh sederhana:
fun printValue(value: Any) {
println(value)
}
Kemudian:
printValue(100)
printValue("Hello")
printValue(true)
Semuanya bisa diterima.
Jadi Any lebih berguna ketika kita memang membutuhkan fleksibilitas, bukan sebagai pengganti semua tipe.
8. Unit — function yang tidak mengembalikan nilai
Sekarang bagian kedua:
Unit
Ini sedikit berbeda dari Any.
Kalau Any berkaitan dengan jenis nilai, Unit berkaitan erat dengan return value sebuah function.
Misalnya:
fun sayHello() {
println("Hello")
}
Function tersebut melakukan sesuatu:
sayHello()
↓
print "Hello"
Tetapi function tersebut tidak mengembalikan nilai kepada pemanggilnya.
Jadi return type-nya adalah:
Unit
9. Unit bisa ditulis secara eksplisit
Kita bisa menulis:
fun sayHello(): Unit {
println("Hello")
}
Tetapi biasanya tidak perlu.
Cukup:
fun sayHello() {
println("Hello")
}
Kotlin otomatis memahami bahwa return type-nya adalah:
Unit
Jadi kedua kode tersebut pada dasarnya memiliki maksud yang sama:
fun sayHello() {
println("Hello")
}
dan:
fun sayHello(): Unit {
println("Hello")
}
10. Unit bukan berarti function tidak melakukan apa-apa
Ini kesalahan yang sering terjadi.
Unit bukan berarti function kosong atau tidak melakukan pekerjaan.
Contohnya:
fun greet() {
println("Hello, Andi!")
}
Function ini melakukan pekerjaan:
greet()
↓
menampilkan "Hello, Andi!"
↓
selesai
Tetapi tidak mengembalikan data.
Itulah Unit.
11. Bedakan println() dengan return
Ini sangat penting.
Lihat:
fun calculate() {
val result = 2 + 5
println(result)
}
Function tersebut mencetak:
7
Tetapi apakah function mengembalikan 7?
Tidak.
Dia hanya mencetak 7.
Bandingkan dengan:
fun calculate(): Int {
val result = 2 + 5
return result
}
Sekarang function benar-benar mengembalikan 7.
Jadi:
println(result)
= tampilkan ke layar
sedangkan:
return result
= kirim nilai kembali kepada pemanggil function.
12. Analogi Unit
Bayangkan kamu meminta teman:
“Tolong cetakkan dokumen ini.”
Temanmu:
mengerjakan → mencetak dokumen → selesai
Dia tidak memberikan “hasil data” kembali kepadamu.
Itu seperti:
Unit
Sedangkan kalau kamu bilang:
“Hitungkan 10 + 20 dan berikan hasilnya kepadaku.”
Temanmu mengembalikan:
30
Itu bukan Unit, melainkan:
Int
13. Contoh function yang mengembalikan Int
fun add(a: Int, b: Int): Int {
return a + b
}
Pemanggilan:
val result = add(2, 5)
println(result)
Hasil:
7
Di sini:
add()
↓
menghasilkan Int
↓
7
Sedangkan:
fun printResult() {
println("7")
}
menghasilkan:
printResult()
↓
mencetak 7
↓
Unit
14. Unit dibandingkan dengan void di Java
Subtitle mengatakan:
Unit is equal to void in Java.
Untuk level dasar, boleh dipahami sebagai padanan konsep:
Kotlin Java
--------------------------------
Unit void
Tetapi secara teknis, Unit bukan sekadar copy-paste dari void.
Unit adalah sebuah tipe di Kotlin dan memiliki satu nilai yaitu Unit.
Untuk sekarang cukup ingat:
Kalau function Kotlin tidak mengembalikan nilai yang berguna, return type-nya biasanya
Unit.
15. Nothing — bagian yang paling unik
Sekarang:
Nothing
Ini lebih menarik.
Nothing digunakan untuk menunjukkan bahwa:
Function atau expression tersebut tidak pernah menghasilkan nilai secara normal.
Ada dua kasus utama:
Kasus 1 — function tidak pernah selesai
Misalnya infinite loop:
fun doNothing(): Nothing {
while (true) {
}
}
Function ini akan terus berada di:
while (true)
Karena:
true
selalu true.
Maka:
doNothing()
↓
while(true)
↓
while(true)
↓
while(true)
↓
selamanya...
Function tidak pernah mencapai akhir secara normal.
16. Nothing juga digunakan untuk exception
Ini justru contoh Nothing yang sangat penting dalam Kotlin.
Misalnya:
fun fail(): Nothing {
throw Exception("Something went wrong")
}
Function tersebut tidak mengembalikan String, Int, atau nilai lainnya.
Dia langsung:
throw exception
↓
function berhenti secara abnormal
Jadi function tidak pernah berhasil menghasilkan nilai.
17. Bedakan Unit dan Nothing
Ini sangat penting karena keduanya sama-sama kelihatannya “tidak mengembalikan nilai”.
Unit
Function:
berjalan
↓
selesai normal
↓
tidak menghasilkan nilai
Contoh:
fun sayHello() {
println("Hello")
}
Nothing
Function:
berjalan
↓
tidak pernah selesai normal
Contoh:
fun infiniteLoop(): Nothing {
while (true) {
}
}
atau:
fun crash(): Nothing {
throw Exception("Error")
}
Perbandingannya:
Unit | Nothing | |
|---|---|---|
| Function selesai normal? | ✅ Ya | ❌ Tidak |
| Menghasilkan nilai? | Tidak ada nilai berguna | Tidak pernah menghasilkan nilai |
| Contoh | println() | throw Exception() |
| Infinite loop? | ❌ | ✅ |
| Exception yang dilempar? | ❌ bukan ciri utamanya | ✅ |
Mental model:
Unit
"Sudah selesai, tapi tidak ada hasil untuk dikembalikan."
Nothing
"Belum pernah sampai pada titik mengembalikan hasil."
18. Kenapa Nothing bisa berguna?
Selain untuk menunjukkan infinite loop atau exception, Nothing membantu Kotlin memahami alur program.
Contohnya nanti kamu akan sering menemukan:
fun error(message: String): Nothing {
throw IllegalArgumentException(message)
}
Kemudian:
fun getName(name: String?): String {
if (name == null) {
error("Name tidak boleh null")
}
return name
}
Kotlin tahu bahwa:
error(...)
tidak akan pernah kembali secara normal.
Karena return type-nya:
Nothing
Jadi program setelah error() tidak perlu dianggap sebagai jalur yang benar-benar menghasilkan nilai dari function tersebut.
Konsep ini nanti akan lebih mudah dipahami ketika kamu sudah belajar:
ifwhen- null safety
- exception
- control flow
Jadi tidak perlu menghafalkan mekanismenya sekarang.
19. Hubungan Any, Unit, dan Nothing
Sekarang kita gabungkan.
Any
Berhubungan dengan nilai yang bisa memiliki banyak tipe.
val value: Any = "Hello"
atau:
val value: Any = 123
Unit
Berhubungan dengan function yang selesai tetapi tidak mengembalikan nilai.
fun sayHello() {
println("Hello")
}
Secara konsep:
fun sayHello(): Unit
Nothing
Berhubungan dengan sesuatu yang tidak pernah menghasilkan nilai secara normal.
fun crash(): Nothing {
throw Exception()
}
atau:
fun forever(): Nothing {
while (true) {}
}
20. Diagram sederhana
Bayangkan function sebagai mesin:
FUNCTION
│
┌─────────┼──────────┐
│ │ │
▼ ▼ ▼
Int Unit Nothing
│ │ │
▼ ▼ ▼
menghasilkan selesai tidak pernah
nilai normal menghasilkan nilai
Contoh:
fun getAge(): Int {
return 20
}
→ menghasilkan 20.
fun sayHello() {
println("Hello")
}
→ selesai normal → Unit.
fun crash(): Nothing {
throw Exception()
}
→ tidak pernah menghasilkan nilai → Nothing.
21. Ada satu bagian subtitle yang perlu diluruskan
Subtitle mengatakan tentang Any:
“every type in Kotlin whether integer or string is also considered as any”
Ini hampir benar tetapi kurang lengkap.
Lebih tepat:
Semua tipe Kotlin non-null memiliki
Anysebagai supertype.
Karena:
Any
berbeda dengan:
Any?
Any sendiri tidak dapat menampung null.
Subtitle juga mengatakan Any seperti Java Object
Ini cukup membantu untuk pemahaman awal, tetapi jangan dianggap identik 100%.
Secara sederhana:
Kotlin Any ≈ Java Object
Tetapi Kotlin memiliki sistem tipe yang berbeda, terutama terkait:
- nullability
- primitive types
- type system Kotlin
Jadi anggap sebagai analogi, bukan persamaan sempurna.
22. Ada juga kesalahan istilah “type interface”
Beberapa kali subtitle mengatakan:
“type interface”
Yang benar adalah:
type inference
Artinya Kotlin dapat menebak tipe data secara otomatis.
Contoh:
val age = 20
Kita tidak menulis:
val age: Int = 20
tetapi Kotlin mengetahui:
age → Int
Begitu juga:
val name = "Andi"
Kotlin mengetahui:
name → String
23. Jangan tertukar dengan null
Karena nanti kamu akan belajar null safety, ini penting untuk mulai dikenalkan.
Perhatikan:
val a: Any = "Hello"
Valid.
val b: Any? = null
Valid.
Tetapi:
val c: Any = null
❌ Tidak valid.
Jadi:
Any → tidak boleh null
Any? → boleh null
Tanda ? nanti akan menjadi sangat penting dalam Kotlin.
24. Contoh program lengkap
Coba lihat semuanya sekaligus:
fun main() {
// Any
val value1: Any = 42
val value2: Any = "Hello"
println(value1)
println(value2)
// Unit
sayHello()
}
fun sayHello() {
println("Hello, Kotlin!")
}
Hasil:
42
Hello
Hello, Kotlin!
Di sini:
val value1: Any = 42
→ Any
Sedangkan:
fun sayHello()
→ secara implisit return type-nya Unit.
25. Contoh Nothing
Jangan langsung menjalankan contoh infinite loop ini kalau belum tahu cara menghentikan program:
fun forever(): Nothing {
while (true) {
}
}
Karena function tersebut memang akan terus berjalan.
Contoh yang lebih mudah dipahami adalah exception:
fun fail(): Nothing {
throw Exception("Terjadi kesalahan!")
}
Kalau:
fun main() {
fail()
}
program akan melempar exception dan berhenti.
26. Ringkasan super sederhana
Kalau nanti kamu lupa semuanya, ingat tiga kalimat ini:
Any
“Nilainya bisa berasal dari berbagai tipe.”
val value: Any = 10
val text: Any = "Hello"
Unit
“Function selesai secara normal, tetapi tidak mengembalikan nilai yang berguna.”
fun printHello() {
println("Hello")
}
Secara konsep:
fun printHello(): Unit
Nothing
“Tidak akan pernah menghasilkan nilai secara normal.”
fun fail(): Nothing {
throw Exception()
}
atau:
fun forever(): Nothing {
while (true) {}
}
27. Hubungkan dengan yang sudah kamu pelajari
Sampai titik ini, gambaran tipe-tipe yang sudah kamu pelajari kira-kira:
Tipe data dasar
│
├── Int
├── Long
├── Float
├── Double
├── Short
├── Byte
├── Char
├── Boolean
├── String
│
├── Pair
└── Triple
Tipe khusus
│
├── Any
├── Unit
└── Nothing
Yang paling penting untuk sekarang bukan menghafalkan semuanya, tetapi memahami perbedaan konsepnya:
Int / String / Boolean
↓
"Data saya tipenya apa?"
Any
↓
"Saya ingin tipe yang sangat umum."
Unit
↓
"Function saya selesai, tetapi tidak mengembalikan hasil."
Nothing
↓
"Function saya tidak akan menghasilkan nilai secara normal."
Inti pelajaran hari ini
Any= tipe umumUnit= selesai tanpa hasil nilaiNothing= tidak pernah menghasilkan nilai secara normal
Untuk tahap belajarmu sekarang, Unit kemungkinan akan paling sering kamu temui saat belajar function, sedangkan Nothing akan terasa jauh lebih masuk akal ketika nanti masuk ke exception dan control flow.