반복문이란?
프로그램에서 같은 작업을 여러 번 반복해야 할 때가 많습니다. 반복문은 특정 코드 블록을 조건에 따라 반복 실행하는 제어문입니다.
"1부터 100까지 모두 더해라"라는 문제가 있다면, 100줄의 코드를 작성하는 대신 반복문을 사용하면 몇 줄로 해결할 수 있습니다.
반복문의 종류
Java에서 제공하는 반복문은 다음과 같습니다:
| 반복문 | 용도 |
|---|---|
for |
반복 횟수가 정해진 경우 |
while |
조건이 참인 동안 반복 |
do-while |
최소 1회 실행 후 조건 검사 |
for 문
for 문은 반복 횟수가 명확할 때 가장 많이 사용하는 반복문입니다.
기본 문법
for (초기화; 조건식; 증감식) {
// 반복 실행할 코드
}
실행 흐름
1. 초기화 (한 번만 실행)
↓
2. 조건식 검사 ──(false)──→ 반복문 종료
↓ (true)
3. 반복 코드 실행
↓
4. 증감식 실행
↓
2번으로 돌아감
기본 예제: 1부터 5까지 출력
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
// 출력:
// 1
// 2
// 3
// 4
// 5
실행 과정:
| 단계 | i 값 | 조건(i <= 5) | 출력 | i++ 후 |
|---|---|---|---|---|
| 1 | 1 | true | 1 | 2 |
| 2 | 2 | true | 2 | 3 |
| 3 | 3 | true | 3 | 4 |
| 4 | 4 | true | 4 | 5 |
| 5 | 5 | true | 5 | 6 |
| 6 | 6 | false | - | 종료 |
합계 계산
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("1부터 100까지의 합: " + sum);
// 출력: 1부터 100까지의 합: 5050
역순 반복
for (int i = 5; i >= 1; i--) {
System.out.println(i);
}
// 출력:
// 5
// 4
// 3
// 2
// 1
다양한 증감식
// 2씩 증가 (짝수 출력)
for (int i = 2; i <= 10; i += 2) {
System.out.print(i + " ");
}
// 출력: 2 4 6 8 10
// 3씩 증가
for (int i = 0; i < 15; i += 3) {
System.out.print(i + " ");
}
// 출력: 0 3 6 9 12
for 문 변형
// 초기화 생략
int i = 0;
for (; i < 5; i++) {
System.out.print(i + " ");
}
// 조건식 생략 (무한 루프 - break 필요)
for (int j = 0; ; j++) {
if (j >= 5) break;
System.out.print(j + " ");
}
// 증감식 생략
for (int k = 0; k < 5; ) {
System.out.print(k + " ");
k++;
}
for 문 내에서 선언한 변수(예: int i)는 for 문 블록 내에서만 사용 가능합니다. 반복문 밖에서 사용하려면 반복문 전에 선언해야 합니다.
while 문
while 문은 조건이 참인 동안 반복을 계속합니다. 반복 횟수가 정해지지 않은 경우에 유용합니다.
기본 문법
while (조건식) {
// 조건이 true인 동안 반복 실행
}
실행 흐름
1. 조건식 검사 ──(false)──→ 반복문 종료
↓ (true)
2. 반복 코드 실행
↓
1번으로 돌아감
기본 예제
int i = 1;
while (i <= 5) {
System.out.println(i);
i++;
}
// 출력:
// 1
// 2
// 3
// 4
// 5
for 문과 while 문 비교
for 문:
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
while 문:
int i = 1;
while (i <= 5) {
System.out.println(i);
i++;
}
• for 문: 반복 횟수가 명확할 때 (배열 순회, 정해진 횟수 반복)
• while 문: 조건에 따라 반복할 때 (파일 읽기, 사용자 입력 대기)
조건에 따른 반복
int number = 1234;
int digitCount = 0;
while (number > 0) {
number /= 10; // 10으로 나눠 자릿수 줄이기
digitCount++;
}
System.out.println("자릿수: " + digitCount);
// 출력: 자릿수: 4
합계 계산 (while 버전)
int sum = 0;
int i = 1;
while (i <= 100) {
sum += i;
i++;
}
System.out.println("합계: " + sum);
// 출력: 합계: 5050
do-while 문
do-while 문은 최소 1회 실행을 보장하는 반복문입니다. 조건 검사를 반복 코드 실행 후에 수행합니다.
기본 문법
do {
// 최소 1회 실행, 이후 조건이 true인 동안 반복
} while (조건식);
실행 흐름
1. 반복 코드 실행 (무조건 1회)
↓
2. 조건식 검사 ──(false)──→ 반복문 종료
↓ (true)
1번으로 돌아감
while 문과 do-while 문 비교
// while: 조건이 처음부터 false면 한 번도 실행 안 됨
int i = 10;
while (i < 5) {
System.out.println("while: " + i);
i++;
}
// 출력 없음
// do-while: 조건이 false여도 최소 1회 실행
int j = 10;
do {
System.out.println("do-while: " + j);
j++;
} while (j < 5);
// 출력: do-while: 10
do-while 기본 예제
int count = 1;
do {
System.out.println("반복 " + count);
count++;
} while (count <= 3);
// 출력:
// 반복 1
// 반복 2
// 반복 3
do-while 사용 케이스
메뉴 선택과 같이 최소 1회 실행이 필요한 경우에 유용합니다.
int choice;
do {
System.out.println("===== 메뉴 =====");
System.out.println("1. 시작");
System.out.println("2. 설정");
System.out.println("0. 종료");
System.out.print("선택: ");
choice = 0; // 실제로는 Scanner로 입력받음
switch (choice) {
case 1:
System.out.println("시작합니다.");
break;
case 2:
System.out.println("설정 화면입니다.");
break;
case 0:
System.out.println("종료합니다.");
break;
default:
System.out.println("잘못된 선택입니다.");
}
} while (choice != 0);
중첩 반복문
반복문 안에 또 다른 반복문을 넣을 수 있습니다. 이를 중첩 반복문이라고 합니다.
기본 구조
for (int i = 0; i < 외부횟수; i++) {
for (int j = 0; j < 내부횟수; j++) {
// 외부횟수 × 내부횟수 만큼 실행
}
}
구구단 출력
for (int dan = 2; dan <= 9; dan++) {
System.out.println("===== " + dan + "단 =====");
for (int i = 1; i <= 9; i++) {
System.out.println(dan + " × " + i + " = " + (dan * i));
}
System.out.println();
}
출력 (일부):
===== 2단 =====
2 × 1 = 2
2 × 2 = 4
...
2 × 9 = 18
===== 3단 =====
3 × 1 = 3
...
별 찍기: 직각 삼각형
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
출력:
*
**
***
****
*****
별 찍기: 역삼각형
for (int i = 5; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
출력:
*****
****
***
**
*
별 찍기: 피라미드
int height = 5;
for (int i = 1; i <= height; i++) {
// 공백 출력
for (int j = 1; j <= height - i; j++) {
System.out.print(" ");
}
// 별 출력
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("*");
}
System.out.println();
}
출력:
*
***
*****
*******
*********
외부 반복이 n번, 내부 반복이 m번이면 총 n × m번 실행됩니다. 중첩이 깊어지면 실행 횟수가 기하급수적으로 증가하므로 주의하세요.
break와 continue
break
break는 반복문을 즉시 종료합니다.
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // i가 5일 때 반복문 종료
}
System.out.print(i + " ");
}
// 출력: 1 2 3 4
continue
continue는 현재 반복을 건너뛰고 다음 반복으로 넘어갑니다.
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // i가 3일 때 건너뛰기
}
System.out.print(i + " ");
}
// 출력: 1 2 4 5
break vs continue 비교
System.out.println("=== break ===");
for (int i = 1; i <= 5; i++) {
if (i == 3) break;
System.out.print(i + " ");
}
// 출력: 1 2
System.out.println("\n=== continue ===");
for (int i = 1; i <= 5; i++) {
if (i == 3) continue;
System.out.print(i + " ");
}
// 출력: 1 2 4 5
특정 값 찾기 (break 활용)
int[] numbers = {10, 25, 30, 45, 50};
int target = 30;
boolean found = false;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == target) {
System.out.println(target + "을 인덱스 " + i + "에서 찾았습니다.");
found = true;
break;
}
}
if (!found) {
System.out.println(target + "을 찾지 못했습니다.");
}
// 출력: 30을 인덱스 2에서 찾았습니다.
홀수만 출력 (continue 활용)
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 짝수는 건너뛰기
}
System.out.print(i + " ");
}
// 출력: 1 3 5 7 9
레이블을 이용한 중첩 반복문 제어
중첩 반복문에서 외부 반복문을 제어하려면 레이블(label)을 사용합니다.
outer: // 레이블 선언
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
break outer; // 외부 반복문까지 종료
}
System.out.println("i=" + i + ", j=" + j);
}
}
출력:
i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
레이블은 코드의 가독성을 떨어뜨릴 수 있으므로, 꼭 필요한 경우에만 사용하세요. 대부분의 경우 메서드 분리나 플래그 변수로 대체할 수 있습니다.
무한 루프
조건이 항상 참이면 반복문이 끝나지 않는 무한 루프가 됩니다.
for 무한 루프
for (;;) {
System.out.println("무한 반복");
// break 없으면 영원히 반복
}
while 무한 루프
while (true) {
System.out.println("무한 반복");
// break 없으면 영원히 반복
}
무한 루프 활용 예제
int count = 0;
while (true) {
count++;
System.out.println("반복 " + count);
if (count >= 5) {
System.out.println("종료!");
break;
}
}
// 출력:
// 반복 1
// 반복 2
// 반복 3
// 반복 4
// 반복 5
// 종료!
무한 루프는 반드시 탈출 조건(break)이 있어야 합니다. 탈출 조건이 없으면 프로그램이 멈추지 않으므로 강제 종료(Ctrl+C)가 필요합니다.
종합 실습
문제 1 - for 문 기초 (기초)
다음 Java 프로그램의 실행 결과는 무엇입니까?
public class Test {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
System.out.println(sum);
}
}
문제 2 - while 문 기초 (기초)
다음 Java 프로그램의 실행 결과는 무엇입니까?
public class Test {
public static void main(String[] args) {
int i = 3;
while (i > 0) {
System.out.print(i + " ");
i--;
}
}
}
문제 3 - do-while 문 (기초)
다음 Java 프로그램의 실행 결과는 무엇입니까?
public class Test {
public static void main(String[] args) {
int num = 5;
do {
System.out.print(num + " ");
num--;
} while (num > 2);
}
}
문제 4 - 중첩 for 문 (중급)
다음 Java 프로그램의 실행 결과는 무엇입니까?
public class Test {
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 2; j++) {
count++;
}
}
System.out.println(count);
}
}
문제 5 - break 활용 (중급)
다음 Java 프로그램의 실행 결과는 무엇입니까?
public class Test {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
if (sum > 10) {
break;
}
}
System.out.println(sum);
}
}
문제 6 - continue 활용 (중급)
다음 Java 프로그램의 실행 결과는 무엇입니까?
public class Test {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue;
}
sum += i;
}
System.out.println(sum);
}
}
문제 7 - 복합 반복문 (고급)
다음 Java 프로그램의 실행 결과는 무엇입니까?
public class Test {
public static void main(String[] args) {
int result = 1;
for (int i = 1; i <= 4; i++) {
result *= i;
}
System.out.println(result);
}
}
문제 8 - 중첩 반복문과 break (고급)
다음 Java 프로그램의 실행 결과는 무엇입니까? (공백으로 구분하여 답하세요)
public class Test {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) break;
System.out.print(i + "" + j + " ");
}
}
}
}
실전 프로그래밍
과제 1: 팩토리얼 계산기
주어진 숫자의 팩토리얼을 계산하는 프로그램을 작성하세요.
요구사항:
- 정수 n을 변수에 저장 (예: 5)
- n! = n × (n-1) × (n-2) × … × 2 × 1 계산
- 결과 출력
예시 답안 보기
public class Factorial {
public static void main(String[] args) {
int n = 5;
long factorial = 1;
for (int i = 1; i <= n; i++) {
factorial *= i;
}
System.out.println(n + "! = " + factorial);
}
}
출력:
5! = 120
과제 2: 소수 판별기
1부터 100까지의 숫자 중 소수(Prime Number)를 모두 출력하는 프로그램을 작성하세요.
요구사항:
- 소수: 1과 자기 자신으로만 나누어지는 수 (1 제외)
- 1부터 100까지 검사
- 소수만 출력
예시 답안 보기
public class PrimeNumbers {
public static void main(String[] args) {
System.out.println("1부터 100까지의 소수:");
for (int num = 2; num <= 100; num++) {
boolean isPrime = true;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
System.out.print(num + " ");
}
}
}
}
출력:
1부터 100까지의 소수:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
과제 3: 별 다이아몬드 출력
높이가 주어졌을 때 다이아몬드 모양을 출력하는 프로그램을 작성하세요.
요구사항:
- 높이 변수 선언 (예: 5)
- 위쪽 삼각형과 아래쪽 역삼각형 결합
- 공백과 별을 적절히 배치
예시 답안 보기
public class Diamond {
public static void main(String[] args) {
int height = 5;
// 위쪽 삼각형
for (int i = 1; i <= height; i++) {
// 공백 출력
for (int j = 1; j <= height - i; j++) {
System.out.print(" ");
}
// 별 출력
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("*");
}
System.out.println();
}
// 아래쪽 역삼각형
for (int i = height - 1; i >= 1; i--) {
// 공백 출력
for (int j = 1; j <= height - i; j++) {
System.out.print(" ");
}
// 별 출력
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("*");
}
System.out.println();
}
}
}
출력:
*
***
*****
*******
*********
*******
*****
***
*
핵심 요약
이번 챕터에서 배운 내용
- for 문
for (초기화; 조건식; 증감식) { // 반복 코드 } - while 문
while (조건식) { // 조건이 true인 동안 반복 } - do-while 문
do { // 최소 1회 실행 } while (조건식); - 반복문 비교
구분 특징 사용 시점 for 초기화/조건/증감 한 곳에 반복 횟수 명확 while 조건만 검사 횟수 불명확 do-while 최소 1회 실행 1회 이상 보장 - break와 continue
break; // 반복문 즉시 종료 continue; // 현재 반복 건너뛰기 - 중첩 반복문
for (외부) { for (내부) { // 외부 × 내부 횟수만큼 실행 } } - 주요 포인트
- for 문 변수는 블록 내에서만 유효
- while 문은 조건 검사 후 실행
- do-while 문은 실행 후 조건 검사
- 무한 루프는 반드시 탈출 조건 필요
- 레이블은 가독성을 고려해 신중히 사용
다음 챕터 예고
다음 챕터에서는 배열 (Array)을 배웁니다.
- 배열이란?
- 1차원 배열
- 다차원 배열
- 배열과 반복문
- 향상된 for 문 (for-each)
- Arrays 클래스 활용
반복문 학습 완료!
반복문을 통해 같은 작업을 효율적으로 처리하는 방법을 배웠습니다.
이제 배열을 배우면 여러 데이터를 체계적으로 관리할 수 있습니다!