본문 바로가기
Language & Tool/Java

☕Java 제어문 총정리 (+ 레이블)

by 박수무당벌레 2026. 6. 8.

🔗 메모

🔗 구현체관련(Iterable)

 

1. 조건문 (Conditional Statements)

주어진 조건식의 결과(true/false)에 따라 실행할 코드 블록을 결정함.

① if / else if / else 문

가장 대표적인 조건문으로, 조건식이 true일 때 실행된다 (참과 거짓에 따라 분기)

  • 조건의 개수에 따라 단일 if문, if-else문, 다중 조건문으로 나뉘고 사슬처럼 이어 붙여 사용한다.
  • 참이 되는 조건을 만나면 해당 코드를 실행한 뒤, 전체 if 문을 빠져나기 때문에 조건문을 짤 때는 조건의 범위가 더 좁고 엄격한 것(조건이 까다로운 것)부터 위쪽에 배치해야 함
  • 논리 연산자(&&, ||, !)를 사용해 복잡한 조건도 한줄로 표현 가능
int score = 85;

if (score >= 90) {
    System.out.println("A 학점");
} else if (score >= 80) {
    System.out.println("B 학점"); // score가 85이므로 이 블록이 실행됨
} else {
    System.out.println("C 학점 이하");
}
💡if-else 구조가 간단할땐 삼항 연산자(...? true : false)를 사용한다

② switch 문

비교의 기준이 되는 변수나 연산식의 값에 따라 실행할 경로를 선택.(값의 결과에 따라 여러 선택지 중 하나로 분기) if문보다 가독성이 좋을 때가 많으며, Java 최신 버전에서는 -> (화살표 표현식)을 사용한 Switch Expression도 지원

  • expression으로 byte, short, char, int, enum, String, Character/Byte/Short/Integer(래퍼) 지원. (double은 안됨)
  • break 만날때까지 아래쪽 코드가 연달아 실행됨
  • default는 매칭되는 case가 하나도 없을 때 실행됨 (break 생략 가능)
int ranking = 2;

switch (ranking) {
    case 1 -> System.out.println("금메달");
    case 2 -> System.out.println("은메달"); // 실행됨
    case 3 -> System.out.println("동메달");
    
    // 💡고의로 break를 생략하는 경우도 있다.
    case 4:
    case 5:
    	System.out.println("특선");
        break;
        
    default -> System.out.println("참가상");
}

2. 반복문 (Loop Statements)

특정 조건이 참인 동안, 또는 지정된 횟수만큼 코드 블록을 반복해서 실행한다.

① for 문

반복 횟수가 명확할 때 주로 사용. '초기화식; 조건식; 증감식' 구조를 가짐

  • 루프 변수가 기존(외부) 변수를 사용하는게 아닌 for문 스코프 안에서 선언되었을때, 외부에서 사용 불가
// 0부터 4까지 5번 반복
for (int i = 0; i < 5; i++) {
    System.out.println("i의 값: " + i);
}

② 향상된 for 문 (Enhanced for loop)

배열이나 Iterable 인터페이스를 구현한 컬렉션(List 등)의 모든 요소를 처음부터 끝까지 순회할 때 사용 가능

String[] fruits = {"사과", "바나나", "체리"};

for (String fruit : fruits) {
    System.out.println(fruit);
}

// ⚠️ Java 1.5 이전의 컬렉션 순회 방식
List list = new ArrayList();
// ... 데이터 추가 ...

for (Iterator i = list.iterator(); i.hasNext(); ) {
    String str = (String) i.next(); // 매번 다운캐스팅도 필요했음
    System.out.println(str);
}
💡배열은 어떻게 지원할까?
자바 컴파일러가 컴파일 시점에 배열 버전의 향상된 for문을 '인덱스 기반 for문'으로 바이트코드로 변환한다.(Syntactic Sugar)
Collection: 내부적으로 Iterator를 호출하여 hasNext()와 next() 방식으로 작동

③ while 문

조건식이 true인 동안 무한히 반복. 반복 횟수가 비고정적일 때 주로 사용한다

int count = 0;

while (count < 3) {
    System.out.println("count: " + count);
    count++; // 증감식이 없으면 무한 루프에 빠지므로 주의!
}

④ do-while 문

while문과 비슷하지만, 조건을 검사하기 전에 무조건 한 번은 코드를 실행한다는 차이점이 있다

int num = 10;

do {
    System.out.println("조건이 거짓이어도 최초 1회는 실행됩니다.");
} while (num < 5);

3. 분기문 (Jump Statements)

반복문 안에서 흐름을 강제로 바꾸는 역할을 한다.

  • break: 자신이 포함된 가장 가까운 반복문을 즉시 탈출
  • continue: 반복문의 나머지 부분을 건너뛰고 다음 반복(증감식 또는 조건식 검사)으로 넘어감
💡return: 반복문 내부뿐만 아니라 메서드 어디서든 사용 가능. 현재 실행 중인 메서드 자체를 종료하고, 이 메서드를 호출했던 원래 위치로 흐름을 복귀시킴

4. 레이블 (Label, 라벨)

기본적으로 break나 continue는 자신을 감싸고 있는 가장 가까운 반복문 하나에만 영향을 주지만, 레이블을 사용하면 중첩 반복문(다중 루프)에서 원하는 바깥쪽 반복문을 한 번에 탈출하거나 건너뛸 수 있음.

  • 반복문, 일반 코드 블록, switch문 바로 위에 레이블 이름을 붙여 "레이블이름 : 타겟_문장(Statement);" 형태로 사용
    • 즉, break를 통해 흐름을 끊고 탈출할 수 있는 모든 문장 블록에 작동(반복문은 전체 탈출)
  •  continue는 반복문에서만 사용 가능
  • 선언문 앞에는 붙일 수 없음 (제어 흐름을 가지는 일반 명령문이 아님)
  • 다른 메서드의 레이블로 점프 불가
레이블이름:
for ( ... ) {
    for ( ... ) {
        if (조건) {
            break 레이블이름; // 지정한 바깥쪽 반복문을 통째로 탈출
        }
    }
}
💡레이블 쪽으로 흐름이 점프한다?
아님. 실제로는 레이블이 붙어 있는 코드 블록 자체를 통째로 끝내버리고(종료), 그 블록의 맨 마지막 중괄호(}) 뒤로 빠져나감 (제어 흐름 지정된(종료된) statement 바로 다음 statement로 이동한다)
⚠️사용시 주의사항
가독성 이슈 (Goto와 비슷): 레이블문은 goto문과 유사한 흐름을 만들기 때문에, 코드가 복잡해지면 프로그램의 실행 흐름을 추적하기 어려워짐
대안 권장: 실제로 쓰는 것보다, 중첩 루프 구간을 별도의 메서드로 분리한 뒤 return문으로 빠져나오는 방식을 권장
더보기

💡실제 코드 예시

 

1) break와 사용

조건을 만족하는 순간, Outer로 지정된 바깥쪽 반복문까지 통째로 종료됨

Outer:
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        if (i == 2 && j == 2) {
            break Outer; // Outer 루프를 즉시 완전히 탈출!
        }
        System.out.println("i: " + i + ", j: " + j);
    }
}
/*
출력 결과:
i: 1, j: 1
i: 1, j: 2
i: 1, j: 3
i: 2, j: 1
(i가 2이고 j가 2가 되는 순간 프로그램이 완전히 종료됨)
*/

 

2) continue와 사용

안쪽 루프에서 조건이 맞았을 때 바깥쪽 루프의 다음 회차(증감식)로 바로 점프시킬 수도 있다

MyLoop:
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        if (j == 2) {
            continue MyLoop; // j가 2가 되면, 안쪽 루프를 버리고 바깥쪽 i의 다음 회차로 점프!
        }
        System.out.println("i: " + i + ", j: " + j);
    }
}
/*
출력 결과:
i: 1, j: 1  (j가 2가 되자마자 i=2로 점프)
i: 2, j: 1  (j가 2가 되자마자 i=3으로 점프)
i: 3, j: 1
*/