Skip to main content

Label

Label adalah sebuah penanda yang dapat digunakan untuk memberikan nama pada sebuah expression atau blok kode tertentu.

Label sangat berguna ketika kita ingin mengontrol alur program menggunakan:

  • break
  • continue
  • return

Dengan label, kita dapat menentukan blok kode mana yang ingin dihentikan atau dilanjutkan.

Membuat Label

Sintaks label di Kotlin menggunakan nama label yang diikuti karakter @.

Contoh:

loop@ for (i in 1..10) {
println(i)
}

Pada contoh tersebut:

loop@

adalah label yang diberikan kepada for loop.

Nama label dapat dibuat sesuai kebutuhan.

Contoh:

loopI@
loopJ@
outerLoop@
innerLoop@

Label pada Nested Loop

Label sangat berguna ketika kita memiliki nested loop, yaitu loop di dalam loop.

Contoh:

loopI@ for (i in 1..10) {
loopJ@ for (j in 1..10) {
println("$i x $j = ${i * j}")
}
}

Pada contoh tersebut terdapat dua label:

loopI@

untuk loop bagian luar.

Dan:

loopJ@

untuk loop bagian dalam.

Strukturnya:

loopI@
└── loopJ@

Dengan label tersebut, kita dapat menentukan loop mana yang ingin dihentikan atau dilanjutkan.

Label dengan break

break digunakan untuk menghentikan perulangan.

Tanpa label, break akan menghentikan loop tempat break tersebut berada.

Contoh:

for (i in 1..10) {
for (j in 1..10) {
if (i > 5) {
break
}

println("$i x $j = ${i * j}")
}
}

Pada contoh tersebut, break hanya menghentikan loop bagian dalam.

break dengan Label

Dengan label, kita dapat menentukan loop mana yang ingin dihentikan.

Contoh:

fun labelBreak() {

loopI@ for (i in 1..10) {

loopJ@ for (j in 1..10) {

if (i > 5) {
break@loopI
}

println("$i x $j = ${i * j}")
}
}
}

Perhatikan:

break@loopI

Artinya break akan menghentikan loop yang memiliki label:

loopI@

Bukan hanya loop bagian dalam.

Cara Kerja break@loopI

Pada contoh:

loopI@ for (i in 1..10) {

loopJ@ for (j in 1..10) {

if (i > 5) {
break@loopI
}

println("$i x $j = ${i * j}")
}
}

Ketika:

i > 5

bernilai true, program menjalankan:

break@loopI

Sehingga loop loopI langsung dihentikan.

Dengan kata lain:

loopI@

└── loopJ@

└── break@loopI

break akan keluar langsung dari loopI.

Contoh Output labelBreak()

fun labelBreak() {

loopI@ for (i in 1..10) {

loopJ@ for (j in 1..10) {

if (i > 5) {
break@loopI
}

println("$i x $j = ${i * j}")
}
}
}

Output:

1 x 1 = 1
1 x 2 = 2
...
5 x 10 = 50

Ketika i menjadi 6, kondisi:

i > 5

terpenuhi sehingga:

break@loopI

menghentikan loop luar.

Label dengan continue

continue digunakan untuk melewati iterasi saat ini dan melanjutkan ke iterasi berikutnya.

Contoh:

fun labelContinue() {

loopI@ for (i in 1..10) {

loopJ@ for (j in 1..10) {

if (j == 5) {
continue@loopI
}

println("$i x $j = ${i * j}")
}
}
}

Perhatikan:

continue@loopI

Artinya program akan melanjutkan ke iterasi berikutnya dari loop yang memiliki label:

loopI@

Perbedaan break dan continue

break:

break@loopI

menghentikan loop yang dituju.

Sedangkan:

continue@loopI

melewati iterasi saat ini dan melanjutkan ke iterasi berikutnya dari loop yang dituju.

Secara sederhana:

break

keluar dari loop

continue

lanjut ke iterasi berikutnya

Cara Kerja continue@loopI

Pada contoh:

loopI@ for (i in 1..10) {

loopJ@ for (j in 1..10) {

if (j == 5) {
continue@loopI
}

println("$i x $j = ${i * j}")
}
}

Ketika:

j == 5

bernilai true, program menjalankan:

continue@loopI

Artinya program tidak melanjutkan loopJ untuk nilai berikutnya.

Program langsung melanjutkan ke iterasi berikutnya pada:

loopI@

Label pada Lambda

Label juga dapat digunakan pada lambda.

Hal ini berguna ketika kita ingin melakukan return dari lambda tertentu.

Contoh:

fun test(
name: String,
operation: (String) -> Unit
): Unit = operation(name)

Function test() menerima:

operation: (String) -> Unit

Artinya operation adalah function yang:

  • Menerima satu parameter String.
  • Tidak mengembalikan nilai sehingga menggunakan Unit.

Return pada Lambda

Contoh:

test("") test@{
if (it == "") {
return@test
} else {
println("Ucup")
}
}

Pada contoh tersebut terdapat label:

test@

Label tersebut diberikan pada lambda.

Kemudian:

return@test

digunakan untuk keluar dari lambda tersebut.

Mengapa Menggunakan return@test?

Perhatikan:

test("") test@{
if (it == "") {
return@test
} else {
println("Ucup")
}
}

Jika:

it == ""

bernilai true, maka:

return@test

akan menghentikan eksekusi lambda.

Kode:

println("Ucup")

tidak dijalankan.

Contoh Return to Label

Function:

fun test(
name: String,
operation: (String) -> Unit
): Unit = operation(name)

Kemudian dipanggil:

test("") test@{
if (it == "") {
return@test
} else {
println("Ucup")
}
}

Karena argument yang diberikan adalah:

""

maka kondisi:

it == ""

bernilai true.

Program menjalankan:

return@test

Sehingga lambda langsung selesai.

Return Label dengan Nilai

Label juga dapat digunakan pada lambda yang mengembalikan nilai.

Contoh:

val result = test@{
return@test "Hello"
}

Pada contoh tersebut:

return@test

mengembalikan nilai "Hello" ke lambda yang memiliki label test@.

Contoh Program Lengkap

Berikut contoh penggunaan label dengan break, continue, dan return.

fun labelBreak() {

loopI@ for (i in 1..10) {

loopJ@ for (j in 1..10) {

if (i > 5) {
break@loopI
}

println("$i x $j = ${i * j}")
}
}
}

fun labelContinue() {

loopI@ for (i in 1..10) {

loopJ@ for (j in 1..10) {

if (j == 5) {
continue@loopI
}

println("$i x $j = ${i * j}")
}
}
}

fun test(
name: String,
operation: (String) -> Unit
): Unit = operation(name)

fun main() {

labelBreak()

labelContinue()

test("") test@{

if (it == "") {
return@test
} else {
println("Ucup")
}
}
}

Jenis Penggunaan Label

Label dapat digunakan untuk beberapa kebutuhan.

Label dengan break

break@loopI

Digunakan untuk menghentikan loop yang memiliki label loopI.

Label dengan continue

continue@loopI

Digunakan untuk melanjutkan ke iterasi berikutnya dari loop loopI.

Label dengan return

return@test

Digunakan untuk melakukan return dari scope yang memiliki label test.

Kapan Menggunakan Label?

Label paling sering berguna ketika kita bekerja dengan:

  • Nested loop.
  • break pada loop bertingkat.
  • continue pada loop bertingkat.
  • Lambda.
  • Higher-Order Function.
  • Return dari lambda tertentu.

Contoh yang umum:

outer@ for (i in 1..10) {
inner@ for (j in 1..10) {

if (j == 5) {
break@outer
}

println("$i $j")
}
}

Gunakan Label dengan Bijak

Label memang memberikan kontrol yang lebih fleksibel terhadap alur program, tetapi terlalu banyak menggunakan label dapat membuat kode lebih sulit dibaca.

Contoh:

outer@ for (...) {
middle@ for (...) {
inner@ for (...) {
if (...) {
break@outer
}
}
}
}

Pada nested loop yang sangat kompleks, penggunaan label dapat membuat alur program sulit diikuti.

Karena itu, gunakan label ketika memang membantu membuat kode lebih jelas.

Kesimpulan

Label adalah penanda yang dapat digunakan untuk menentukan target dari break, continue, atau return.

Sintaks dasar label:

namaLabel@

Contoh:

loopI@ for (i in 1..10) {
// ...
}

Untuk break:

break@loopI

Untuk continue:

continue@loopI

Untuk return pada lambda:

test("") test@{
return@test
}

Dengan label, kita dapat menentukan secara spesifik blok kode mana yang ingin dihentikan atau dilanjutkan.

tip

Label memberikan kontrol terhadap alur program, terutama pada nested loop dan lambda. Gunakan label dengan bijak agar kode tetap mudah dibaca dan dipahami.