김영한의 자바 입문 강의 내용을 정리한 글이다.
반복문이 필요한 이유
1을 세 번 더하는 코드를 작성한다고 하자.
3번은 직접 작성할 수 있다. 그런데 100번이라면? 같은 블록을 100번 복사해야 한다. 요구사항이 바뀌어 200번으로 늘어나면 다시 100줄을 추가해야 한다. 반복문은 이 문제를 해결하기 위해 존재한다. 자바는 세 가지 반복문을 제공한다.
| 반복문 | 조건 검사 시점 | 특징 |
|---|---|---|
while | 실행 전 (pre-test) | 조건이 처음부터 거짓이면 한 번도 실행하지 않는다 |
do-while | 실행 후 (post-test) | 조건에 관계없이 최소 한 번은 반드시 실행한다 |
for | 실행 전 (pre-test) | 초기화·조건·증감식을 한 줄에 모아 관리한다 |
while문
기본 구조
조건식이 true인 동안 코드 블록을 반복 실행한다. 조건식이 false가 되는 순간 반복문을 빠져나간다. 조건식이 처음부터 false라면 코드 블록은 한 번도 실행되지 않는다.
실행 흐름
count < 3 조건으로 1을 세 번 더하는 예시를 단계별로 추적하면 다음과 같다.
| 반복 | count (진입 시) | 조건 count < 3 | count (블록 실행 후) |
|---|---|---|---|
| 1회 | 0 | true | 1 |
| 2회 | 1 | true | 2 |
| 3회 | 2 | true | 3 |
| 종료 | 3 | false | — |
출력:
변수로 반복 횟수 유연하게 제어하기
하드코딩된 3 대신 변수를 사용하면 코드 한 곳만 바꿔서 반복 범위를 조정할 수 있다.
endNum = 10으로 변경하면 1부터 10까지 누적 합산으로 즉시 전환된다. 나머지 코드는 건드릴 필요가 없다. 변경 사항이 발생했을 때 수정해야 하는 부분이 적을수록 좋은 코드라는 원칙이 여기서 드러난다.
do-while문
기본 구조
while과 구조가 반대다. 코드 블록을 먼저 실행하고, 그 후에 조건식을 검사한다. 결과적으로 조건에 관계없이 최소 한 번은 실행된다.
while과의 차이 — 시각적 비교
언제 사용하는가
코드 블록을 반드시 한 번은 실행해야 할 때 사용한다. 대표적인 실무 패턴은 사용자 입력 검증이다. 입력을 받기 전에 검증할 수는 없다. 일단 한 번 입력을 받고 그 값이 유효한지 판단해야 하므로 do-while이 자연스럽다.
break와 continue
break와 continue는 반복문의 흐름을 직접 제어한다. while, do-while, for 모두에서 사용할 수 있다.
break — 반복문 즉시 종료
break를 만나는 순간 반복문 전체를 빠져나간다. 이후 코드는 실행되지 않는다.
활용 예시 — 합계가 10을 처음 초과하는 시점 찾기:
while (true)는 조건이 항상 참이므로 무한 반복된다. break가 있기 때문에 특정 조건에서 빠져나올 수 있다. 종료 시점이 루프 시작 전에 결정되지 않고 내부 로직에 의해 결정될 때 이 패턴을 사용한다.
continue — 나머지 코드를 건너뛰고 다음 반복으로
continue를 만나면 블록의 나머지 코드를 건너뛰고 바로 조건식 검사로 돌아간다. 반복문 자체는 종료되지 않는다.
활용 예시 — 1부터 5까지 출력하되 3은 건너뛰기:
i == 3일 때 continue를 실행하면 System.out.println(i) 줄이 실행되지 않고 다시 조건식(i <= 5)으로 이동한다.
continue사용 시 주의사항:i++를continue앞에 반드시 실행해야 한다.i++없이continue를 실행하면i가 영원히3인 채로 조건식으로 돌아가 무한 루프가 된다.
break와 continue 흐름 비교
for문
기본 구조
for문은 while로도 동일하게 구현할 수 있다. 차이는 구조화 방식에 있다. 반복 횟수와 관련된 초기화, 조건, 증감을 한 줄에 모아 두어 코드를 한눈에 파악하기 쉽다.
실행 순서
for (int i = 1; i <= 10; i++)를 예로 들면:
int i = 1— i를 1로 초기화한다. 딱 한 번만 실행된다.i <= 10— 조건 검사. 참이면 블록을 실행한다.- 블록 내 코드를 실행한다.
i++— i를 1 증가시킨다.- 2번으로 돌아간다.
for vs while 비교
같은 문제를 두 방식으로 풀어 보자.
while에서는 i 선언, 조건, 증감이 코드 전체에 분산되어 있다. for에서는 이 세 가지가 for (...) 괄호 안에 집약되어 있다. 또한 for문의 i는 블록 스코프에 제한된다. while의 i는 반복문 밖에서도 접근 가능하여 실수로 변경될 여지가 있다.
for문 — 초기식·조건식·증감식 생략
세 요소는 모두 선택이다. 단, 구분하는 세미콜론(;)은 유지해야 한다.
for문에서 break 사용
증가 변수 i가 for문 헤더에 선언되어 있어 어떤 값이 반복 카운터인지 while 버전보다 명확하게 드러난다.
for vs while — 언제 무엇을 쓸 것인가
이 둘은 기술적으로 서로 변환 가능하다. 선택 기준은 가독성과 의도의 명확성이다.
| 상황 | 권장 |
|---|---|
| 반복 횟수가 명확하게 정해진 경우 (1부터 n까지) | for |
| 카운터 변수가 루프 블록 안에서만 필요한 경우 | for |
| 종료 시점을 미리 알 수 없는 경우 | while |
| 루프 내부 조건에 따라 반복이 계속될지 결정되는 경우 | while |
| 최소 한 번은 반드시 실행해야 하는 경우 | do-while |
| for | while | |
|---|---|---|
| 장점 | 초기화·조건·증감식이 한 줄에 집약되어 루프 구조를 즉시 파악할 수 있다. 카운터 변수의 스코프가 블록 안으로 제한된다. | 루프 내부에서 조건이 변경되는 경우에 유연하다. 종료 시점을 알 수 없는 복잡한 시나리오에 적합하다. |
| 단점 | 조건이 루프 내부에서 복잡하게 변경되는 경우 관리하기 어렵다. | 초기화·조건·증감이 분산되어 있어 카운터 변수를 놓치기 쉽다. 카운터 변수가 루프 밖에서도 접근 가능하다. |
중첩 반복문
반복문 안에 반복문을 넣을 수 있다. for, while 모두 중첩 가능하며 혼합도 된다.
출력:
외부 루프가 1회 실행될 때 내부 루프가 3회 실행된다. 외부 2회 × 내부 3회 = 총 6번의 내부 코드가 수행된다. 이 O(n²) 특성 때문에 중첩 반복문은 입력 크기가 커질수록 실행 시간이 급격히 증가한다.
중첩 구조 시각화
중첩 반복문 활용 — 구구단
중첩 반복문 활용 — 피라미드
System.out.println()은 출력 후 줄바꿈을 하지만 System.out.print()는 줄바꿈 없이 이어서 출력한다. 이 차이를 활용하면 피라미드를 만들 수 있다.
출력:
외부 루프 i가 현재 행 번호를 나타내고, 내부 루프 j가 그 행에서 출력할 * 개수를 결정한다. j <= i라는 조건 덕분에 각 행은 행 번호만큼 *를 출력한다.
레이블이 있는 break와 continue
일반 break와 continue는 자신이 속한 가장 안쪽 반복문에만 영향을 준다. 중첩 반복문에서 외부 반복문까지 한 번에 빠져나가려면 레이블(label)을 사용한다.
출력:
break outer가 실행되는 순간 내부 루프뿐 아니라 outer: 레이블이 붙은 외부 루프까지 종료된다. 2차원 배열 탐색처럼 원하는 값을 찾는 즉시 모든 반복을 중단해야 하는 상황에서 유용하다.
레이블을 남용하면 흐름을 추적하기 어려워지므로 꼭 필요한 경우에만 사용한다. 실무에서는 레이블 대신 별도 메서드로 추출하고
return을 사용하는 방식을 더 선호한다.
향상된 for문 (for-each)
자바 5부터 배열이나 컬렉션을 순회할 때 더 간결한 문법을 제공한다. 이 강의에서는 다루지 않지만, 배열을 학습하고 나면 자주 접하게 되므로 형태를 미리 알아두면 좋다.
for (타입 변수명 : 배열_또는_컬렉션)으로 읽는다. 인덱스를 직접 다루지 않아 실수가 줄고 가독성이 높다. 배열의 인덱스가 필요하거나 역방향으로 순회해야 하는 경우에는 기존 for문을 사용한다.
무한 루프와 주의사항
반복 조건이 절대 false가 되지 않으면 프로그램이 종료되지 않는 무한 루프가 된다. 의도적인 무한 루프는 while (true) 또는 for (;;)로 표현하고, 내부에 종료 조건과 break를 함께 작성한다.
의도하지 않은 무한 루프의 가장 흔한 원인은 카운터 변수 업데이트 누락이다.
for문은 증감식이 헤더에 명시적으로 드러나 있어 이런 실수를 줄이는 데 도움이 된다.
'Study > Java' 카테고리의 다른 글
| [Java] 훈련 (입출력 등) (0) | 2026.04.04 |
|---|---|
| [Java] 스코프, 형변환 (0) | 2026.04.04 |
| [Java] 조건문 (0) | 2026.04.04 |
| [Java] 연산자 (0) | 2026.04.04 |
| [Java] 변수 (1) | 2026.04.03 |
