공공부하자개발 · 영어 학습 노트
자바
초급자바의 뼈대0/8 완료
  • 00개발 환경과 첫 프로그램
  • 01변수, 데이터 타입, 형변환
  • 02연산자와 제어문
  • 031차원 · 2차원 배열
  • 04클래스, 객체, 생성자, 오버로딩
  • 05접근 제어자와 캡슐화
  • 06메서드 활용 패턴 (초급)
  • 07enum, 패키지와 import, static 과 final
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 초급 › 02 / 8

연산자와 제어문

섹션 7진행 0 / 8
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

4. 응용 변형 예제

같은 분기와 반복을 다른 문법으로 다시 써 보고, 메서드로 나누고, 실무 데이터와 빈 값에 적용합니다. "이 문제엔 어떤 제어문이 자연스러운가"를 고르는 감각을 기르는 것이 목적입니다.

변형 1: if-else 사다리 → switch 표현식

점수를 등급으로 바꾸는 코드를 두 가지로 씁니다. 경계가 10점 단위처럼 규칙적이면 score / 10으로 나눠 switch에 넣을 수 있어 짧아집니다. 경계가 85점, 72점처럼 불규칙하면 if-else가 맞습니다.

java
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
    }
}

변형 2: 합계 세 가지 — for, 향상된 for, 스트림 맛보기

같은 합계를 인덱스 for, 향상된 for, 그리고 나중에 배울 스트림으로 씁니다. 인덱스가 필요 없으면 향상된 for가 가장 읽기 쉽고, "조건에 맞는 것만 골라 합산" 같은 요구가 붙으면 스트림이 한 줄로 끝납니다. 지금은 "이런 문법도 있다" 정도만 알아 두면 됩니다.

java
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
    }
}

변형 3: 반복 범위를 매개변수로 받기 — 구구단과 배수 세기

반복 횟수를 코드에 박아 두지 않고 매개변수로 받으면 같은 메서드를 여러 조건에 재사용할 수 있습니다. 범위가 비어 있으면(from > to) 반복문 본문이 한 번도 실행되지 않는다는 점도 확인하세요.

java
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회)
    }
}

변형 4: 파일명 분류 — 실무 데이터에 switch 적용

확장자를 잘라 내 종류별로 분류합니다. lastIndexOf로 마지막 점을 찾고, 점이 없거나 맨 끝에 있으면 확장자가 없는 것으로 처리한 뒤 switch로 묶습니다. 대소문자가 섞여 들어오므로 toLowerCase로 통일하는 것이 실무 기본입니다.

java
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
    }
}

변형 5: 엣지 케이스 — null, 빈 배열, 0회 반복

실수 7의 "switch에 null"을 JDK 21의 case null로 막고, 빈 배열에서 최댓값을 구할 때 Integer.MIN_VALUE 대신 첫 요소로 시작하는 방식을 씁니다. 빈 입력을 먼저 걸러 내면 반복문 안의 조건이 단순해집니다.

java
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
    }
}
응용 변형 예제
  • 변형 1: if-else 사다리 → switch 표현식
  • 변형 2: 합계 세 가지 — for, 향상된 for, 스트림 맛보기
  • 변형 3: 반복 범위를 매개변수로 받기 — 구구단과 배수 세기
  • 변형 4: 파일명 분류 — 실무 데이터에 switch 적용
  • 변형 5: 엣지 케이스 — null, 빈 배열, 0회 반복
이전 섹션3 코드 예제4 / 7다음 섹션5 자주 하는 실수 (Tip)