Masukkan Password
26 Kursus Kotlin Lengkap #25 - Nested Loops - Tutorial Kotlin untuk Pemula
Lesson ini membahas nested loops, yaitu loop di dalam loop. Ini salah satu konsep penting dalam pemrograman karena nanti akan sering dipakai untuk mengolah tabel, matriks, data 2 dimensi, pola, multiplication table, dan sebagainya.
Saya akan jelaskan dari konsep paling dasar dulu, lalu kita bedah kode dan alur eksekusinya.
1. Apa itu Nested Loop?
Nested loop = sebuah loop yang berada di dalam loop lainnya.
Contoh paling sederhana:
for (i in 1..3) {
for (j in 1..3) {
println("Hello")
}
}
Di sini ada dua loop:
for (i ...) ← outer loop
└── for (j ...) ← inner loop
Istilahnya:
- Outer loop = loop bagian luar
- Inner loop = loop bagian dalam
Jadi:
Setiap kali outer loop berjalan 1 kali, inner loop akan menjalankan seluruh putarannya sampai selesai.
Ini adalah inti nested loop.
2. Analogi Sederhana: Gedung dengan Lantai dan Kamar
Bayangkan ada gedung:
Lantai 1
├── Kamar 1
├── Kamar 2
├── Kamar 3
└── Kamar 4
Lantai 2
├── Kamar 1
├── Kamar 2
├── Kamar 3
└── Kamar 4
Lantai 3
├── Kamar 1
├── Kamar 2
├── Kamar 3
└── Kamar 4
Kita bisa menganggap:
outer loop = lantai
inner loop = kamar
Program melakukan:
Lantai 1
Kamar 1
Kamar 2
Kamar 3
Kamar 4
Lantai 2
Kamar 1
Kamar 2
Kamar 3
Kamar 4
Lantai 3
Kamar 1
Kamar 2
Kamar 3
Kamar 4
Jadi inner loop diulang dari awal setiap kali outer loop berpindah.
3. Hubungannya dengan Tabel
Video menggunakan contoh tabel 4 × 4.
Misalnya kita ingin menghasilkan:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
Perhatikan struktur tabel:
columns
1 2 3 4
─────────────
row 1 │ 1 2 3 4
row 2 │ 1 2 3 4
row 3 │ 1 2 3 4
row 4 │ 1 2 3 4
Ada dua dimensi:
- row = baris
- column = kolom
Karena ada dua dimensi, kita membutuhkan dua loop.
outer loop → rows
inner loop → columns
Ini alasan utama nested loop sering digunakan untuk tabel.
4. Struktur Nested Loop
Bentuk dasarnya:
for (row in 0..3) {
for (column in 0..3) {
// kode
}
}
Kita punya:
for (row in 0..3)
sebagai outer loop.
Kemudian:
for (column in 0..3)
sebagai inner loop.
Secara visual:
OUTER LOOP
for (row in 0..3) {
INNER LOOP
for (column in 0..3) {
...
}
}
5. Kenapa 0..3 menghasilkan 4 nilai?
Ingat materi range sebelumnya.
0..3
adalah closed range, sehingga 3 ikut dimasukkan.
Hasilnya:
0
1
2
3
Ada 4 nilai.
Jadi:
for (row in 0..3)
akan memiliki 4 iterasi:
row = 0
row = 1
row = 2
row = 3
Begitu juga:
for (column in 0..3)
memiliki:
column = 0
column = 1
column = 2
column = 3
6. Kenapa 4 × 4 menghasilkan 16 kali?
Ini sangat penting.
Outer loop:
4 kali
Inner loop:
4 kali untuk setiap outer loop
Jadi total eksekusi kode di dalam inner loop:
4 × 4 = 16 kali
Misalnya:
for (row in 0..3) {
for (column in 0..3) {
println("*")
}
}
println("*") akan dieksekusi 16 kali.
Bukan 8 kali.
Bukan 4 kali.
Tetapi:
4 × 4 = 16
7. Cara Eksekusinya — Bagian Terpenting
Mari kita benar-benar ikuti programnya.
Kode:
for (row in 0..3) {
for (column in 0..3) {
print("*")
}
println()
}
Kita mulai:
row = 0
Karena row = 0, masuk ke inner loop.
Inner loop menjalankan:
column = 0 → *
column = 1 → *
column = 2 → *
column = 3 → *
Hasil:
****
Setelah inner loop selesai:
println()
membuat pindah baris.
Sekarang:
row = 1
Inner loop dimulai lagi dari awal:
column = 0 → *
column = 1 → *
column = 2 → *
column = 3 → *
Hasil:
****
Lalu:
row = 2
inner loop lagi:
****
Kemudian:
row = 3
inner loop lagi:
****
Hasil akhirnya:
****
****
****
****
8. Gambaran Eksekusi Lengkap
Ini cara yang sangat bagus untuk memahami nested loop:
row = 0
column = 0
column = 1
column = 2
column = 3
row = 1
column = 0
column = 1
column = 2
column = 3
row = 2
column = 0
column = 1
column = 2
column = 3
row = 3
column = 0
column = 1
column = 2
column = 3
Perhatikan:
Setiap
rowhanya naik setelah inner loop selesai sepenuhnya.
Ini adalah konsep paling penting dari nested loop.
9. Kenapa Video Menggunakan print() dan println()?
Ini juga penting.
Kalau kita menggunakan:
println("*")
hasilnya:
*
*
*
*
*
...
Karena println() selalu pindah baris setelah mencetak.
Sedangkan:
print("*")
tidak pindah baris.
Misalnya:
print("*")
print("*")
print("*")
print("*")
hasilnya:
****
Jadi untuk membuat tabel:
for (row in 0..3) {
for (column in 0..3) {
print("*")
}
println()
}
Kita melakukan:
inner loop
↓
print * * * *
↓
println()
↓
pindah baris
10. Kenapa println() diletakkan di luar inner loop?
Perhatikan:
for (row in 0..3) {
for (column in 0..3) {
print("*")
}
println()
}
println() berada setelah inner loop.
Artinya:
Setelah semua kolom dalam satu row selesai dicetak, baru pindah ke baris berikutnya.
Kalau kita salah menaruhnya:
for (row in 0..3) {
for (column in 0..3) {
print("*")
println()
}
}
hasilnya akan menjadi:
*
*
*
*
*
*
*
*
...
Karena setiap kolom langsung membuat baris baru.
Jadi posisi println() sangat penting.
11. Sekarang Mengganti * dengan column
Video kemudian mengganti:
print("*")
menjadi:
print(column)
Kode:
for (row in 0..3) {
for (column in 0..3) {
print(column)
}
println()
}
Hasil:
0123
0123
0123
0123
Kenapa?
Karena setiap row menjalankan inner loop:
column = 0
column = 1
column = 2
column = 3
Sehingga:
0123
Dan proses itu diulang 4 kali.
12. Kalau ingin mulai dari 1?
Kita bisa mengubah range:
for (row in 1..4) {
for (column in 1..4) {
print(column)
}
println()
}
Hasil:
1234
1234
1234
1234
Nah, ini lebih mirip tabel yang dimaksud video.
13. Tapi row belum digunakan
Perhatikan:
for (row in 1..4) {
for (column in 1..4) {
print(column)
}
println()
}
Kita memiliki row, tetapi tidak menggunakannya di dalam body.
row hanya berfungsi sebagai pengontrol:
“Berapa kali saya harus membuat baris?”
Sedangkan column menentukan:
“Apa yang saya cetak di setiap baris?”
Ini pembagian tugas yang sangat bagus:
row → menentukan berapa banyak BARIS
column → menentukan isi KOLOM
14. Contoh yang Lebih Menarik
Kalau kita ingin mencetak koordinat:
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
(3,1) (3,2) (3,3)
kita bisa:
for (row in 1..3) {
for (column in 1..3) {
print("($row,$column) ")
}
println()
}
Hasil:
(1,1) (1,2) (1,3)
(2,1) (2,2) (2,3)
(3,1) (3,2) (3,3)
Sekarang row dan column sama-sama digunakan.
15. Ini sebenarnya seperti koordinat X dan Y
Nested loop sangat mudah dipahami kalau dikaitkan dengan koordinat.
Misalnya:
column
1 2 3
┌───┬───┬───┐
row 1 │ │ │ │
├───┼───┼───┤
row 2 │ │ │ │
├───┼───┼───┤
row 3 │ │ │ │
└───┴───┴───┘
Outer loop:
for (row in 1..3)
bergerak dari atas ke bawah.
Inner loop:
for (column in 1..3)
bergerak dari kiri ke kanan.
Jadi:
row = arah vertikal
column = arah horizontal
Ini nanti sangat berguna ketika belajar array 2D / matrix.
16. Nested Loop Tidak Harus for
Nested loop juga bisa dibuat menggunakan while.
Contoh:
var row = 1
while (row <= 3) {
var column = 1
while (column <= 3) {
print("*")
column++
}
println()
row++
}
Hasil:
***
***
***
Jadi konsep:
loop di dalam loop
tidak terbatas pada for.
Bisa:
for → for
while → while
for → while
while → for
Misalnya:
for (row in 1..3) {
var column = 1
while (column <= 3) {
print("*")
column++
}
println()
}
Tetap merupakan nested loop.
17. Nested Loop dan Multiplication Table
Inilah alasan lesson berikutnya akan membuat multiplication table.
Misalnya kita ingin:
1 × 1 = 1
1 × 2 = 2
1 × 3 = 3
...
2 × 1 = 2
2 × 2 = 4
2 × 3 = 6
...
Kita bisa menggunakan:
for (row in 1..10) {
for (column in 1..10) {
println(row * column)
}
}
Konsepnya:
row = angka pertama
column = angka kedua
Sehingga:
row = 2
column = 3
2 * 3
↓
6
Nested loop sangat cocok untuk masalah seperti ini.
18. Berapa kali multiplication table 10 × 10 dijalankan?
Outer loop:
1..10
→ 10 kali.
Inner loop:
1..10
→ 10 kali setiap outer loop.
Total:
10 × 10 = 100
Jadi operasi di dalam inner loop dilakukan 100 kali.
19. Nested Loop Bisa Menjadi Banyak Level
Secara teori kita bahkan bisa membuat:
for (i in 1..3) {
for (j in 1..3) {
for (k in 1..3) {
println("$i $j $k")
}
}
}
Ini menjadi:
outer
└── middle
└── inner
Tetapi untuk sekarang cukup kuasai dua level dulu:
outer loop
↓
inner loop
Karena kalau terlalu banyak nested loop, kode bisa menjadi sulit dibaca dan dipelihara.
20. Hubungan dengan Materi Sebelumnya
Coba kita sambungkan semua materi yang sudah kamu pelajari.
Sebelumnya:
if
Digunakan untuk memilih:
kalau kondisi true → lakukan A
kalau false → lakukan B
while
Digunakan untuk mengulang:
selama kondisi true → ulangi
for
Digunakan untuk melakukan iterasi terhadap range:
1..10
repeat
Digunakan ketika kita hanya ingin mengulang sejumlah tertentu:
repeat(10)
Sekarang nested loop
Digunakan ketika kita membutuhkan lebih dari satu dimensi/pengulangan:
loop
└── loop
Contohnya:
baris
└── kolom
21. Cara Berpikir Ketika Melihat Nested Loop
Kalau kamu melihat:
for (row in 1..4) {
for (column in 1..4) {
print(column)
}
println()
}
Jangan langsung melihat semuanya sebagai satu kode besar.
Pecah:
Pertama
for (row in 1..4)
Tanyakan:
“Ada berapa row?”
Jawab:
4 row
Kedua
for (column in 1..4)
Tanyakan:
“Dalam setiap row, ada berapa column?”
Jawab:
4 column
Ketiga
print(column)
Tanyakan:
“Apa yang dicetak?”
Jawab:
1 2 3 4
Keempat
println()
Tanyakan:
“Kapan pindah baris?”
Jawab:
Setelah semua column selesai.
Maka hasilnya:
1234
1234
1234
1234
22. Kesalahan yang Sering Terjadi
Kesalahan 1 — Mengira inner loop hanya berjalan sekali
Misalnya:
for (row in 1..4) {
for (column in 1..4) {
println("$row $column")
}
}
Inner loop bukan hanya berjalan sekali untuk setiap row.
Inner loop berjalan 4 kali.
Total:
4 × 4 = 16
Kesalahan 2 — Mengira row dan column berubah bersamaan
Bukan:
row = 1, column = 1
row = 2, column = 2
row = 3, column = 3
Melainkan:
row = 1
column = 1
column = 2
column = 3
column = 4
row = 2
column = 1
column = 2
column = 3
column = 4
Jadi inner loop menyelesaikan semua iterasinya terlebih dahulu.
23. Satu Diagram yang Perlu Kamu Ingat
Bayangkan nested loop seperti ini:
OUTER LOOP
│
├── INNER LOOP
│ ├── 1
│ ├── 2
│ ├── 3
│ └── 4
│
├── INNER LOOP
│ ├── 1
│ ├── 2
│ ├── 3
│ └── 4
│
├── INNER LOOP
│ ├── 1
│ ├── 2
│ ├── 3
│ └── 4
│
└── INNER LOOP
├── 1
├── 2
├── 3
└── 4
Atau secara sederhana:
row 1 → column 1,2,3,4
row 2 → column 1,2,3,4
row 3 → column 1,2,3,4
row 4 → column 1,2,3,4
24. Koreksi Beberapa Bagian Subtitle
Ada beberapa bagian subtitle yang perlu diluruskan.
❌ “index Kotlin starts from zero”
Tidak tepat jika dianggap sebagai aturan universal.
Kotlin tidak selalu memulai index dari 0. Kita sendiri yang menentukan range:
for (i in 1..4)
bisa dimulai dari 1.
Memang, banyak struktur data/programming convention menggunakan zero-based indexing, misalnya List:
list[0]
adalah elemen pertama.
Tetapi for range sendiri bebas:
for (i in 1..4)
valid.
❌ “increment would be by one”
Lebih tepat:
Kalau kita menulis:
for (i in 1..10)
nilai i bergerak dengan step default 1.
1 → 2 → 3 → 4 ...
Tetapi kita bisa mengubahnya:
for (i in 1..10 step 2)
menjadi:
1 → 3 → 5 → 7 → 9
❌ 0..3 disebut “empat rows” tanpa menjelaskan kenapa
Yang perlu kamu pahami:
0..3
menghasilkan:
0, 1, 2, 3
karena .. adalah closed range.
Jadi ada 4 nilai.
25. Ringkasan Lesson
Konsep utama:
| Konsep | Arti |
|---|---|
| Nested loop | Loop di dalam loop |
| Outer loop | Loop bagian luar |
| Inner loop | Loop bagian dalam |
row | Biasanya mewakili baris |
column | Biasanya mewakili kolom |
print() | Cetak tanpa pindah baris |
println() | Cetak lalu pindah baris |
0..3 | 0, 1, 2, 3 |
| 4 × 4 nested loop | Body inner loop berjalan 16 kali |
Contoh paling penting:
for (row in 1..4) {
for (column in 1..4) {
print(column)
}
println()
}
Hasil:
1234
1234
1234
1234
Cara membacanya:
Untuk setiap row dari 1 sampai 4, jalankan column dari 1 sampai 4. Setelah semua column selesai, pindah ke baris berikutnya.
Dan mental model paling penting dari lesson ini adalah:
OUTER LOOP
↓
satu putaran
↓
INNER LOOP menjalankan SEMUA putarannya
↓
inner selesai
↓
OUTER LOOP lanjut ke putaran berikutnya
↓
INNER LOOP mulai lagi dari awal
Kalau kamu sudah benar-benar memahami pola “setiap 1 putaran outer → inner menyelesaikan seluruh putaran”, maka konsep nested loop sudah mulai aman. Ini akan menjadi fondasi yang sangat penting ketika nanti masuk ke multiplication table, array/list, matrix, dan algoritma pencarian/pengolahan data 2 dimensi.