Sejauh ini program kita berjalan lurus dari atas ke bawah. Pada pertemuan ini kita belajar instruksi kondisional, yaitu cara membuat program mengambil keputusan dan menjalankan alur yang berbeda sesuai kondisi, mulai dari if-else hingga switch expression dan pattern matching pada Java modern.

Pendahuluan

Tujuan Pembelajaran

Setelah pertemuan ini, kamu diharapkan mampu:

  • Menggunakan if, else if, dan else untuk percabangan.
  • Menggabungkan kondisi dengan operator logika dan membuat nested if.
  • Menggunakan operator ternary untuk kondisi sederhana.
  • Menggunakan switch klasik dan switch expression (Java 14+).
  • Mengenal pattern matching pada instanceof dan switch (Java 21).
  • Memvalidasi input pengguna sebelum diproses.

Alokasi Waktu Pertemuan Ini

Sesi Topik Durasi
Materi 1 Review & konsep percabangan 10 menit
Materi 2 if, else if, else 20 menit
Materi 3 Nested if & kombinasi kondisi 10 menit
Materi 4 Operator ternary 5 menit
Materi 5 switch klasik 10 menit
Materi 6 switch expression & yield 20 menit
Materi 7 Pattern matching (instanceof & switch) 15 menit
Materi 8 Validasi input dengan hasNextInt() 10 menit
Materi 9 Studi kasus: kalkulator menu 20 menit
Total Materi 2 jam
Latihan Latihan Mandiri 1 jam
Total 3 jam

Review Singkat

  • Operator perbandingan (==, !=, >, <, >=, <=) menghasilkan boolean.
  • Operator logika: && (AND), || (OR), ! (NOT).
  • String dibandingkan dengan .equals(), bukan ==.

Konsep Percabangan

Percabangan membuat program memilih jalur eksekusi berdasarkan sebuah kondisi bernilai boolean. Bayangkan sebuah persimpangan: jika kondisi true ikuti jalur A, jika tidak ikuti jalur B.

1
2
3
4
5
6
7
       ┌─────────────┐
│ Kondisi ? │
└──────┬──────┘
true │ false
┌──────────┴──────────┐
▼ ▼
Jalur A Jalur B

Pernyataan if, else if, else

if

1
2
3
4
5
int nilai = 80;

if (nilai >= 75) {
System.out.println("Selamat, kamu lulus!");
}

if - else

1
2
3
4
5
6
7
int nilai = 60;

if (nilai >= 75) {
System.out.println("Lulus");
} else {
System.out.println("Tidak lulus");
}

if - else if - else

Digunakan jika ada lebih dari dua kemungkinan. Java memeriksa dari atas ke bawah dan hanya menjalankan blok pertama yang kondisinya true.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
public static void main(String[] args) {
int nilai = 82;
String grade;

if (nilai >= 85) {
grade = "A";
} else if (nilai >= 70) {
grade = "B";
} else if (nilai >= 55) {
grade = "C";
} else if (nilai >= 40) {
grade = "D";
} else {
grade = "E";
}

System.out.println("Nilai " + nilai + " mendapat grade " + grade); // grade B
}
}

Urutan kondisi sangat penting. Jika nilai >= 40 ditulis paling atas, nilai 95 akan terhenti di grade D.

Kesalahan Umum pada if

Kesalahan Contoh Dampak
Memakai = bukan == if (x = 5) Compile error (int tidak dapat menjadi boolean)
Titik koma setelah if if (x > 5); Blok setelahnya selalu dijalankan
Tanpa kurung kurawal if (x > 5) a(); b(); b() selalu dijalankan
Membandingkan String dengan == if (kata == "ya") Hasil tidak dapat diandalkan

Saran: selalu gunakan kurung kurawal { } meskipun hanya satu baris, agar kode aman saat dikembangkan.

Nested if dan Kombinasi Kondisi

Nested if adalah if di dalam if. Namun, kondisi yang saling terkait sering dapat disederhanakan dengan operator logika.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int umur = 20;
boolean punyaTiket = true;

// Nested if
if (punyaTiket) {
if (umur >= 17) {
System.out.println("Silakan masuk");
} else {
System.out.println("Khusus 17 tahun ke atas");
}
} else {
System.out.println("Beli tiket dahulu");
}

// Versi lebih ringkas dengan &&
if (punyaTiket && umur >= 17) {
System.out.println("Silakan masuk");
}

Contoh lain, menentukan tahun kabisat: tahun kabisat jika habis dibagi 4 tetapi tidak habis dibagi 100, atau habis dibagi 400.

1
2
3
int tahun = 2028;
boolean kabisat = (tahun % 4 == 0 && tahun % 100 != 0) || tahun % 400 == 0;
System.out.println(tahun + (kabisat ? " adalah tahun kabisat" : " bukan tahun kabisat"));

Operator Ternary

Bentuk singkat dari if-else yang menghasilkan nilai:

1
kondisi ? nilaiJikaTrue : nilaiJikaFalse
1
2
3
int nilai = 78;
String status = (nilai >= 75) ? "Lulus" : "Tidak Lulus";
int maksimal = (a > b) ? a : b;

Gunakan hanya untuk kondisi sederhana. Ternary yang bersarang berlapis-lapis sulit dibaca, gunakan if-else if sebagai gantinya.

switch Klasik

switch cocok ketika sebuah variabel dibandingkan dengan banyak nilai tetap.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int hari = 3;

switch (hari) {
case 1:
System.out.println("Senin");
break;
case 2:
System.out.println("Selasa");
break;
case 3:
System.out.println("Rabu");
break;
default:
System.out.println("Hari lainnya");
}

Hal penting pada switch klasik:

  • break wajib ditulis di akhir tiap case. Jika lupa, program akan fall-through (lanjut menjalankan case berikutnya).
  • default dijalankan jika tidak ada case yang cocok.
  • Tipe yang didukung: byte, short, char, int, String, dan enum (serta tipe lain melalui pattern matching).
1
2
3
4
5
6
7
8
9
10
11
12
int hari = 2;
switch (hari) {
case 1:
System.out.println("A");
case 2:
System.out.println("B"); // dicetak
case 3:
System.out.println("C"); // ikut dicetak karena tidak ada break
break;
default:
System.out.println("D");
}

switch Expression (Java 14+)

Java modern menyediakan switch dengan sintaks panah -> yang lebih ringkas, tanpa fall-through, dan dapat menghasilkan nilai.

1
2
3
4
5
6
7
8
9
int bulan = 2;

String namaBulan = switch (bulan) {
case 1 -> "Januari";
case 2 -> "Februari";
case 3 -> "Maret";
default -> "Bulan lainnya";
};
System.out.println(namaBulan);

Beberapa nilai dalam satu case dipisah koma:

1
2
3
4
5
6
int hariDalamBulan = switch (bulan) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> 28;
default -> throw new IllegalArgumentException("Bulan tidak valid: " + bulan);
};

Jika satu case butuh beberapa baris kode, gunakan blok dan yield untuk mengembalikan nilai:

1
2
3
4
5
6
7
8
9
10
11
12
int nilai = 88;

String grade = switch (nilai / 10) {
case 10, 9 -> "A";
case 8 -> {
String keterangan = "B";
yield keterangan;
}
case 7 -> "C";
case 6 -> "D";
default -> "E";
};

switch sebagai pernyataan (bukan ekspresi) juga bisa memakai panah, misalnya untuk menjalankan aksi:

1
2
3
4
5
6
7
String perintah = "stop";

switch (perintah) {
case "start" -> System.out.println("Memulai...");
case "stop" -> System.out.println("Berhenti.");
default -> System.out.println("Perintah tidak dikenal");
}

Perbandingan:

switch klasik switch expression
Sintaks case x: + break case x ->
Fall-through Ya (rawan lupa break) Tidak
Menghasilkan nilai Tidak Ya
Wajib mencakup semua kemungkinan Tidak Ya (perlu default atau semua kasus enum)

Untuk program baru, utamakan switch expression.

Pattern Matching (Java 21)

Pattern matching memungkinkan kita memeriksa tipe sebuah objek sekaligus mengambil nilainya. Pembahasan ini sebagai gambaran Java modern (method dibahas lebih lengkap pada Pertemuan 6).

Pattern Matching untuk instanceof

1
2
3
4
5
Object data = "Java 25";

if (data instanceof String teks && !teks.isBlank()) {
System.out.println("Panjang teks: " + teks.length());
}

Variabel teks otomatis tersedia tanpa perlu casting manual.

Pattern Matching pada switch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main {
static String deskripsi(Object o) {
return switch (o) {
case null -> "Tidak ada nilai";
case Integer i when i > 100 -> "Bilangan besar: " + i;
case Integer i -> "Bilangan: " + i;
case String s -> "Teks dengan " + s.length() + " karakter";
default -> "Tipe lain: " + o;
};
}

public static void main(String[] args) {
System.out.println(deskripsi(250));
System.out.println(deskripsi(7));
System.out.println(deskripsi("Halo"));
System.out.println(deskripsi(3.14));
System.out.println(deskripsi(null));
}
}

Output:

1
2
3
4
5
Bilangan besar: 250
Bilangan: 7
Teks dengan 4 karakter
Tipe lain: 3.14
Tidak ada nilai

Kata kunci when menambahkan syarat tambahan (guard) pada sebuah pola. Urutan case penting: pola yang lebih spesifik harus ditulis lebih dulu.

Validasi Input dengan Scanner

Jika pengguna mengetik huruf saat program meminta angka, nextInt() akan melempar InputMismatchException. Gunakan hasNextInt() untuk memeriksa input sebelum membacanya.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);

System.out.print("Masukkan nilai (0-100): ");

if (!input.hasNextInt()) {
System.out.println("Input harus berupa bilangan bulat!");
} else {
int nilai = input.nextInt();

if (nilai < 0 || nilai > 100) {
System.out.println("Nilai harus berada di antara 0 dan 100.");
} else {
System.out.println(nilai >= 75 ? "Lulus" : "Tidak lulus");
}
}

input.close();
}
}

Method validasi lain: hasNextDouble(), hasNextLine(), dan hasNext(). Pada pertemuan berikutnya, validasi ini akan dipadukan dengan perulangan agar program terus meminta input hingga benar.

Studi Kasus: Kalkulator Menu

Program kalkulator yang memilih operasi dengan switch expression dan memvalidasi pembagian dengan nol.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Locale;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
input.useLocale(Locale.US);

System.out.print("Bilangan pertama : ");
double a = input.nextDouble();
System.out.print("Operator (+ - * / %): ");
char op = input.next().charAt(0);
System.out.print("Bilangan kedua : ");
double b = input.nextDouble();

if ((op == '/' || op == '%') && b == 0) {
System.out.println("Error: tidak boleh membagi dengan nol.");
} else {
double hasil = switch (op) {
case '+' -> a + b;
case '-' -> a - b;
case '*' -> a * b;
case '/' -> a / b;
case '%' -> a % b;
default -> Double.NaN;
};

if (Double.isNaN(hasil)) {
System.out.println("Operator tidak dikenal: " + op);
} else {
System.out.printf("%.2f %c %.2f = %.2f%n", a, op, b, hasil);
}
}

input.close();
}
}

Poin yang perlu diperhatikan:

  • input.next().charAt(0) mengambil karakter pertama dari kata yang diketik.
  • Double.NaN (Not a Number) digunakan sebagai penanda “tidak ada hasil”, dicek dengan Double.isNaN().
  • switch dipakai sebagai ekspresi sehingga hasilnya langsung disimpan ke variabel hasil.

Ringkasan

Kebutuhan Gunakan
Satu kondisi, dua jalur if - else
Banyak kondisi berurutan / rentang nilai if - else if - else
Memilih nilai sederhana Operator ternary ? :
Banyak nilai tetap (menu, hari, bulan) switch expression ->
Memeriksa tipe objek instanceof / switch pattern matching
Mencegah error input hasNextInt() / hasNextDouble()

Latihan

Kerjakan latihan berikut untuk mengetes pemahamanmu. Total durasi latihan adalah 60 menit.

No Latihan Estimasi
1 Positif, Negatif, Nol & Ganjil Genap 10 menit
2 Penentuan Kelulusan & Grade 10 menit
3 Nama Hari & Jumlah Hari dalam Bulan 10 menit
4 Tahun Kabisat & Zodiak/Kategori Umur 10 menit
5 Tarif Ongkir / Tiket dengan Diskon 10 menit
6 Mini Project: ATM Sederhana 10 menit
Total 60 menit

Latihan 1: Positif, Negatif, Nol & Ganjil Genap (estimasi 10 menit)

Buat program yang meminta sebuah bilangan bulat, lalu menampilkan:

  1. Apakah bilangan tersebut positif, negatif, atau nol.
  2. Apakah bilangan tersebut ganjil atau genap (jika bukan nol).
  3. Jika bilangan habis dibagi 3 dan 5, tampilkan "FizzBuzz"; jika hanya habis dibagi 3 tampilkan "Fizz"; jika hanya habis dibagi 5 tampilkan "Buzz".

Latihan 2: Penentuan Kelulusan & Grade (estimasi 10 menit)

Buat program yang meminta nilai tugas, nilai UTS, dan nilai UAS.

  1. Nilai akhir = 30% tugas + 30% UTS + 40% UAS.
  2. Validasi: setiap nilai harus berada pada rentang 0-100, jika tidak tampilkan pesan error.
  3. Tentukan grade dengan if - else if: A (>= 85), B (>= 70), C (>= 55), D (>= 40), E (< 40).
  4. Mahasiswa dinyatakan lulus jika grade minimal C dan nilai UAS minimal 50.

Latihan 3: Nama Hari & Jumlah Hari dalam Bulan (estimasi 10 menit)

Gunakan switch expression:

  1. Input angka 1-7, tampilkan nama hari (1 = Senin … 7 = Minggu), dan keterangan "Hari Kerja" atau "Akhir Pekan".
  2. Input bulan (1-12) dan tahun, tampilkan jumlah hari pada bulan tersebut (perhatikan tahun kabisat untuk Februari).

Latihan 4: Kategori Umur & Tahun Kabisat (estimasi 10 menit)

  1. Input umur, lalu tampilkan kategori: Balita (0-5), Anak-anak (6-12), Remaja (13-17), Dewasa (18-59), Lansia (60 ke atas). Umur negatif dinyatakan tidak valid.
  2. Input tahun, tentukan apakah tahun tersebut kabisat menggunakan satu ekspresi boolean.

Latihan 5: Tiket dengan Diskon (estimasi 10 menit)

Sebuah bioskop menetapkan harga tiket Rp 50.000 dengan aturan:

  • Hari Senin-Kamis: diskon 20%. Jumat-Minggu: harga normal.
  • Pelajar (input y/n) mendapat tambahan diskon Rp 5.000.
  • Anak di bawah 5 tahun gratis.

Buat program yang meminta hari (1-7), umur, dan status pelajar, lalu menampilkan harga yang harus dibayar. Gunakan kombinasi switch expression dan if.

Latihan 6: Mini Project ATM Sederhana (estimasi 10 menit)

Simulasikan sebuah ATM dengan saldo awal Rp 1.000.000. Tampilkan menu:

1
2
3
4
1. Cek saldo
2. Tarik tunai
3. Setor tunai
4. Keluar

Ketentuan:

  • Gunakan switch expression untuk memilih menu.
  • Tarik tunai hanya berhasil jika saldo mencukupi dan nominal kelipatan 50.000.
  • Setor tunai minimal Rp 10.000.
  • Validasi input menggunakan hasNextInt().
  • Untuk pertemuan ini program cukup menjalankan satu kali pilihan. Pada pertemuan berikutnya kita akan mengulang menu dengan perulangan.

Tantangan tambahan: tulis ulang Latihan 2 menggunakan switch expression dengan nilai / 10 sebagai selector.