같은 분기와 반복을 다른 문법으로 다시 써 보고, 메서드로 나누고, 실무 데이터와 빈 값에 적용합니다. "이 문제엔 어떤 제어문이 자연스러운가"를 고르는 감각을 기르는 것이 목적입니다.
점수를 등급으로 바꾸는 코드를 두 가지로 씁니다. 경계가 10점 단위처럼 규칙적이면 score / 10으로 나눠 switch에 넣을 수 있어 짧아집니다. 경계가 85점, 72점처럼 불규칙하면 if-else가 맞습니다.
public class GradeSwitch {
static String byIf(int score) {
if (score >= 90) return "A";
else if (score >= 80) return "B";
else if (score >= 70) return "C";
else return "F";
}
static String bySwitch(int score) {
return switch (score / 10) { // 95 → 9, 100 → 10
case 10, 9 -> "A";
case 8 -> "B";
case 7 -> "C";
default -> "F";
};
}
public static void main(String[] args) {
int[] scores = {100, 95, 80, 71, 69};
for (int s : scores) {
System.out.println(s + ": " + byIf(s) + " " + bySwitch(s));
}
// 출력: 100: A A
// 출력: 95: A A
// 출력: 80: B B
// 출력: 71: C C
// 출력: 69: F F
}
}같은 합계를 인덱스 for, 향상된 for, 그리고 나중에 배울 스트림으로 씁니다. 인덱스가 필요 없으면 향상된 for가 가장 읽기 쉽고, "조건에 맞는 것만 골라 합산" 같은 요구가 붙으면 스트림이 한 줄로 끝납니다. 지금은 "이런 문법도 있다" 정도만 알아 두면 됩니다.
import java.util.Arrays;
public class SumThreeWays {
public static void main(String[] args) {
int[] amounts = {12_000, 35_000, 8_000, 50_000};
int sum1 = 0;
for (int i = 0; i < amounts.length; i++) sum1 += amounts[i]; // 인덱스 for
int sum2 = 0;
for (int a : amounts) sum2 += a; // 향상된 for
int sum3 = Arrays.stream(amounts).sum(); // 스트림
System.out.println(sum1 + " " + sum2 + " " + sum3); // 출력: 105000 105000 105000
// 조건이 붙으면: 1만원 초과 주문만 합계
int big = 0;
for (int a : amounts) if (a > 10_000) big += a;
int bigStream = Arrays.stream(amounts).filter(a -> a > 10_000).sum();
System.out.println(big + " " + bigStream); // 출력: 97000 97000
}
}반복 횟수를 코드에 박아 두지 않고 매개변수로 받으면 같은 메서드를 여러 조건에 재사용할 수 있습니다. 범위가 비어 있으면(from > to) 반복문 본문이 한 번도 실행되지 않는다는 점도 확인하세요.
public class TimesTable {
static void printTable(int dan, int upTo) {
for (int i = 1; i <= upTo; i++) {
System.out.println(dan + " x " + i + " = " + dan * i);
}
}
static int countMultiples(int from, int to, int divisor) {
int n = 0;
for (int i = from; i <= to; i++) {
if (i % divisor == 0) n++;
}
return n;
}
public static void main(String[] args) {
printTable(7, 3);
// 출력: 7 x 1 = 7
// 출력: 7 x 2 = 14
// 출력: 7 x 3 = 21
System.out.println(countMultiples(1, 100, 7)); // 출력: 14
System.out.println(countMultiples(1, 0, 7)); // 출력: 0 (범위가 비면 반복 0회)
}
}확장자를 잘라 내 종류별로 분류합니다. lastIndexOf로 마지막 점을 찾고, 점이 없거나 맨 끝에 있으면 확장자가 없는 것으로 처리한 뒤 switch로 묶습니다. 대소문자가 섞여 들어오므로 toLowerCase로 통일하는 것이 실무 기본입니다.
public class FileClassifier {
static String kind(String fileName) {
int dot = fileName.lastIndexOf('.');
if (dot < 0 || dot == fileName.length() - 1) return "확장자 없음";
String ext = fileName.substring(dot + 1).toLowerCase();
return switch (ext) {
case "jpg", "png", "gif" -> "이미지";
case "csv", "xlsx" -> "표";
case "log", "txt" -> "텍스트";
default -> "기타(" + ext + ")";
};
}
public static void main(String[] args) {
String[] files = {"photo.JPG", "sales_2026.csv", "app.log", "archive.tar.gz", "README", "note."};
int text = 0;
for (String f : files) {
String k = kind(f);
if (k.equals("텍스트")) text++;
System.out.println(f + " → " + k);
}
System.out.println("텍스트 파일 수: " + text);
// 출력: photo.JPG → 이미지
// 출력: sales_2026.csv → 표
// 출력: app.log → 텍스트
// 출력: archive.tar.gz → 기타(gz)
// 출력: README → 확장자 없음
// 출력: note. → 확장자 없음
// 출력: 텍스트 파일 수: 1
}
}실수 7의 "switch에 null"을 JDK 21의 case null로 막고, 빈 배열에서 최댓값을 구할 때 Integer.MIN_VALUE 대신 첫 요소로 시작하는 방식을 씁니다. 빈 입력을 먼저 걸러 내면 반복문 안의 조건이 단순해집니다.
public class EdgeCases {
static String status(String code) {
return switch (code) {
case "PAID" -> "결제됨";
case "SHIPPED" -> "배송중";
case null -> "코드 없음"; // JDK 21: 이 분기가 없으면 NPE
default -> "알 수 없음[" + code + "]";
};
}
static String maxOf(int[] nums) {
if (nums == null || nums.length == 0) return "값 없음"; // 빈 입력을 먼저 처리
int max = nums[0]; // MIN_VALUE 대신 첫 요소로 시작
for (int i = 1; i < nums.length; i++) {
if (nums[i] > max) max = nums[i];
}
return String.valueOf(max);
}
public static void main(String[] args) {
System.out.println(status("PAID")); // 출력: 결제됨
System.out.println(status(null)); // 출력: 코드 없음
System.out.println(status("")); // 출력: 알 수 없음[]
System.out.println(maxOf(new int[]{-5, -2, -9})); // 출력: -2
System.out.println(maxOf(new int[0])); // 출력: 값 없음
System.out.println(maxOf(null)); // 출력: 값 없음
int loops = 0;
for (int i = 0; i < 0; i++) loops++; // 조건이 처음부터 거짓 → 0회
do { loops++; } while (false); // do-while은 최소 1회
System.out.println(loops); // 출력: 1
}
}