Komputer unggul bukan karena pintar menghitung sekali, melainkan karena sanggup mengulang pekerjaan yang sama berjuta kali tanpa lelah. Perulangan (loop) adalah struktur kontrol yang memanfaatkan kekuatan itu, dan for adalah bentuk yang paling sering dipakai ketika jumlah pengulangan sudah diketahui polanya: hitung 1 sampai 5, proses tahun 1 sampai 5, turunkan 10 sampai 1. Kekuatan for terletak pada header satu baris yang memuat tiga bagian sekaligus — inisialisasi, kondisi kelanjutan, dan update — sehingga seluruh “mesin kemajuan” loop terbaca sekali pandang. Chapter ini membedah anatomi tersebut, variasi-variasinya, lalu pola akumulator yang menjadi resep mayoritas perulangan numerik.

Anatomi Header for #

Bentuk umum for dan mesin di baliknya:

java Bentuk umum for
for (init; kondisi; update) {
    // badan loop
}

Siklus eksekusinya ketat urutannya: (1) init dieksekusi sekali di awal; (2) kondisi dievaluasi — bila false, seluruh loop dilewati dan badan tidak pernah berjalan; (3) badan loop dieksekusi; (4) update dieksekusi; (5) alur kembali ke langkah (2) dan seterusnya hingga kondisi bernilai false. Contoh berikut mencetak tabel pangkat dengan format rapi:

public class TabelKuadrat {
    public static void main(String[] args) {
        System.out.println("n    n^2   n^3");
        System.out.println("----------------");

        for (int n = 1; n <= 5; n++) {
            System.out.printf("%-5d%-6d%d%n", n, n * n, n * n * n);
        }
    }
}

Output yang Dihasilkan:

text
n    n^2   n^3
----------------
1    1     1
2    4     8
3    9     27
4    16    64
5    25    125

Mari kita telusuri siklus lengkapnya pada iterasi pertama:

  1. Baris 6 (int n = 1): bagian init — variabel n dideklarasikan dan diisi 1, dieksekusi tepat satu kali sebelum iterasi pertama.
  2. Baris 6 (n <= 5): kondisi — 1 <= 5 bernilai true, badan loop berjalan dan mencetak baris 1 1 1 dengan lebar kolom dari format %-5d (rata kiri, lebar 5) dan %-6d.
  3. Baris 6 (n++): update — n naik menjadi 2, dilakukan setelah badan selesai, lalu kondisi diuji ulang.
  4. Iterasi berikutnya: urutan (kondisi → badan → update) berputar hingga n bernilai 6; saat itu 6 <= 5 bernilai false, loop berakhir, dan eksekusi melanjutkan ke statement setelah kurung kurawal.
  5. Scope n: karena dideklarasikan di header, n hanya hidup di dalam loop — mencoba membaca n setelah loop berakhir ditolak compiler (aturan scope yang sudah kita bahas pada Section Variabel dan Tipe Data).

Variasi Tanpa Init dan Update Ganda #

Tiga bagian header bersifat lentur: init boleh kosong bila variabel sudah ada, update boleh memuat beberapa perubahan sekaligus dipisah koma, dan langkah boleh melompat mundur. Program berikut memperagakan ketiganya:

java VariasiFor.java
public class VariasiFor {
    public static void main(String[] args) {
        int naik = 1;
        int turun;

        // Init kosong (naik sudah ada), update ganda dipisah koma
        for (turun = 5; naik <= 5; naik++, turun--) {
            System.out.println("naik = " + naik + ", turun = " + turun);
        }
        System.out.println("Setelah loop: naik = " + naik + ", turun = " + turun);

        // Langkah melompat: mundur 3 setiap iterasi
        for (int detik = 10; detik >= 1; detik -= 3) {
            System.out.println("detik = " + detik);
        }
    }
}

Output yang Dihasilkan:

text
naik = 1, turun = 5
naik = 2, turun = 4
naik = 3, turun = 3
naik = 4, turun = 2
naik = 5, turun = 1
Setelah loop: naik = 6, turun = 0
detik = 10
detik = 7
detik = 4
detik = 1

Dua detail penting tersembunyi di keluarannya. Pertama, naik dan turun masih terbaca setelah loop berakhir — keduanya dideklarasikan di luar header (di badan method), sehingga nilai terakhirnya (6 dan 0) tetap hidup; inilah alasan memilih mendeklarasikan variabel di header atau di luar: header menjaga scope sekecil mungkin, luar memungkinkan hasil loop dipakai sesudahnya. Kedua, loop kedua memakai update detik -= 3 — hitungan mundur 10, 7, 4, 1 — menegaskan bahwa update tidak harus ++ satu-satu; kondisi detik >= 1 dievaluasi sebelum setiap iterasi sehingga nilai 1 lolos dan nilai -2 (hasil update berikutnya) menghentikan loop.

Akumulator di Dalam Loop #

Pola paling produktif dari for adalah akumulator: variabel di luar loop yang “menampung” hasil kerja setiap iterasi. Simulasi bunga majemuk berikut menumpuk pertumbuhan saldo 5% per tahun:

java HitungBunga.java
public class HitungBunga {
    public static void main(String[] args) {
        double saldo = 1_000_000;

        for (int tahun = 1; tahun <= 5; tahun++) {
            saldo = saldo * 1.05;   // bunga majemuk 5% per tahun
            System.out.printf("Akhir tahun %d: Rp%,.0f%n", tahun, saldo);
        }
    }
}

Output yang Dihasilkan:

text
Akhir tahun 1: Rp1,050,000
Akhir tahun 2: Rp1,102,500
Akhir tahun 3: Rp1,157,625
Akhir tahun 4: Rp1,215,506
Akhir tahun 5: Rp1,276,282

Baris saldo = saldo * 1.05; membaca nilai saldo saat ini, mengalikannya dengan 1.05, lalu menulis hasilnya kembali ke saldo — lima iterasi menghasilkan komposisi bunga berlapis hingga Rp1.276.282 (format %,.0f menambahkan pemisah ribuan dan membulatkan ke bilangan bulat terdekat). Pola yang sama berlaku untuk menjumlahkan total belanja, mencari nilai terbesar, atau menghitung rata-rata: satu variabel penampung di luar, satu statement pembaruan di dalam badan loop.

Header for memang kencang untuk hitungan berindeks, namun kebiasaan i dari 0 hingga panjang array punya bentuk yang lebih aman lagi ketika tujuannya sekadar menjelajahi seluruh elemen. Chapter berikutnya memperkenalkan enhanced for loop — perulangan khusus array dan collection yang membuang indeks sepenuhnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

HitungBunga.java

Unduh berkas
java
public class HitungBunga {
    public static void main(String[] args) {
        double saldo = 1_000_000;

        for (int tahun = 1; tahun <= 5; tahun++) {
            saldo = saldo * 1.05;   // bunga majemuk 5% per tahun
            System.out.printf("Akhir tahun %d: Rp%,.0f%n", tahun, saldo);
        }
    }
}

TabelKuadrat.java

Unduh berkas
java
public class TabelKuadrat {
    public static void main(String[] args) {
        System.out.println("n    n^2   n^3");
        System.out.println("----------------");

        for (int n = 1; n <= 5; n++) {
            System.out.printf("%-5d%-6d%d%n", n, n * n, n * n * n);
        }
    }
}

VariasiFor.java

Unduh berkas
java
public class VariasiFor {
    public static void main(String[] args) {
        int naik = 1;
        int turun;

        // Init kosong (naik sudah ada), update ganda dipisah koma
        for (turun = 5; naik <= 5; naik++, turun--) {
            System.out.println("naik = " + naik + ", turun = " + turun);
        }
        System.out.println("Setelah loop: naik = " + naik + ", turun = " + turun);

        // Langkah melompat: mundur 3 setiap iterasi
        for (int detik = 10; detik >= 1; detik -= 3) {
            System.out.println("detik = " + detik);
        }
    }
}