본문 바로가기
Java

[Java] 반복문: for문, while문, do-while문

by lmyourpearl 2025. 11. 3.

제어문의 종류에는 조건문과 반복문이 있는데, 반복문에는 for문, while문, do-while문이 있다.

제어문 블록이 실행 완료되었을 때 조건문일 경우는 정상 흐름으로 돌아오지만, 반복문일 경우는 제어문 처음으로 다시 되돌아가 반복 실행하는데, 이것을 루핑(looping)이라 함.

 

for문과 while문은 서로 변환이 가능하기 때문에 반복문을 작성할 때 어느 쪽을 선택해도 좋지만, 

for문은 반복 횟수를 알고 있을 때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용함.

while문과 do-while문의 차이점은 조건을 먼저 검사하느냐 나중에 검사하느냐일 뿐 동작 방식은 동일함.

 

반복문은 한 번 작성된 실행문을 여러 번 반복 실행해주기 때문에 코드를 줄여 간결하게 만들어주며 코드가 간결하면 개발 시간을 줄일 수 있고, 에러가 날 확률도 줄어듬.


for문

for문은 주어진 횟수만큼 실행문을 반복 실행할 때 적합한 반복 제어문.

 

// 1부터 10까지 출력

package sec02.exam01;

public class ForPrintFrom1To10Example {
	public static void main(String[]args) {
      for(int i=1; i<=10; i++) {
        System.out.println(i);
     }
   }
}

// 실행 결과
// 1~10까지 줄줄이 출력

초기화식은 조건식과 실행문, 증감식에서 사용할 변수를 초기화하는 역할을 하며, 초기화식이 필요 없을 경우에는 생략 가능.

int i = 1;
for (; i<=10, i++) {...}

초기화 식이 둘 이상 있을 수 있고, 증감식 역시 둘 이상 있을 수 있음.

for (int i=0, j=100; i <= 50 && j >= 50; i++, j--) {...}
//        초기화식             조건식          증감식

초기화식에 선언된 변수는 for문 블록 내부에서 사용되는 로컬 변수로 for문을 벗어나서는 사용할 수 없음.

 

// 1부터 100까지 합을 출력(변수 i를 초기화식에서 선언한 로컬 변수)

package sec02.exam02;

public class ForSumFrom1To100Example1 {
	public static void main(String[]args) {
      int sum = 0;
      
      for(int i=1; i <= 100; i++) {
        sum += i;
      }
      
      System.out.println("1~100 합 : " + sum);
   }
}

// 실행 결과
// 1~100 합 : 5050

 

// 1부터 100까지 합을 출력(변수 i를 초기화식에서 선언하지 않고 for문 밖에서 선언)

package sec02.exam03;

public class ForSumFrom1To100Example2 {
	public static void main(String[]args) {
      int sum = 0;
      
      int i = 0;
      for(i=1; i <= 100, i++) {
        sum += i;
      }
      
      System.out.println("1~" + (i-1) + "합 : " + sum);
   }
}

// 실행 결과
// 1~100 합 : 5050

** for문을 작성할 때 주의할 점은 초기화 식에서 루프 카운터 변수를 선언할 때 float나 double과 같은 부동 소수점(Floating-Point) 타입은 기본적으로 2진수로 수를 표현하기 때문에 0.1과 같은 10진수 소수를 정확하게 표현할 수 없고 근사치로 저장됩니다.

이러한 특성 때문에 for문의 조건식이나 증감식에 부동 소수점을 사용할 때 다음과 같은 문제가 발생할 수 있으므로, 반복 횟수를 제어하는 for문을 작성할 때는 정수(Integer) 타입을 사용하는 것이 가장 안전하고 정확함.

 

 

중첩 for문

for문은 또 다른 for문을 내포할 수 있는데 이것을 중첩for문이라 하며, 이 경우 바깥쪽 for문이 한 번 실행할 때마다 중첩된 for문은 지정된 횟수만큼 반복해서 돌다가 다시 바깥쪽 for문으로 돌아감.

 

// 구구단 출력하기

package sec01.exam05;

public class ForMultiplicationTableExample {
	public static void main(String[]args) {
      for (int m = 2; m <= 9; m++) {
        System.out.println("***" + m + "단 ***");
        for (int n = 1; n <= 9; n++) {
          System.out.println(m + "x" + n + " = " + (m*n));
        }
      }
   }
}

// 실행 결과
// *** 2단 ***
// 2 x 1 = 2
// 2 x 2 = 4
// 2 x 3 = 6
// 2 x 4 = 8
// 2 x 5 = 10

while문

for문이 정해진 횟수만큼 반복한다면, while문은 조건식이 true일 경우에 계속해서 반복함.

조건식에는 비교 또는 논리 연산식이 주로 오는데, 조건식이 false가 되면 반복 행위를 멈추고 while문을 종료함.

 

// 1부터 10까지 출력

package sec02.exam06;

public class WhilePrintFrom1To10Example {
	public static void main(String[]arga) {
      int i = 1;
      while (i <= 10) {
        System.out.println(i);
        i++;
      }
   }
}

// 실행 결과
// 1~10까지 줄줄이 출력

 

// 1부터 100까지 합을 출력

package sec02.exam07;

public class WhileSumForm1To100Example {
	public static void main(String[]args) {
      int sum = 0;
      
      int i = 1;
      
      while(i <= 100) {
        sum += i;
        i++;
      }
      
      System.out.println("1~" + (i-1) + " 합 : " + sum);
   }
}

// 실행 결과
// 1~100 합 : 5050

조건식에는 boolean 타입 변수나 true/false 값을 산출하는 어떤한 연산식이든 올 수 있지만, 조건식에 true를 사용하면 while(true){...}가 되어서 무한 루프를 돌게 되므로 while문을 빠져나가기 위한 코드가 필요함.

while문을 종료시키기 위해서는 변수의 값을 false로 만들거나, break문을 이용하면 됨.

 


do-while문

do-while문은 조건식에 의해 반복 실행한다는 점에서는 while문과 동일하지만, while문은 시작할 때부터 조건식을 검사하여 블록 내부를 실행할지 결정하지만, 경우에 따라서는 블록 내부의 실행문을 우선 실행하고 실행결과에 따라서 반복 실행을 계속할지 결정 할 수도 있는데 이때 do-while문을 사용하며 while( ) 뒤에 반드시 세미콜론(;)을 붙여야함.


break문

break문은 반복문인 for문, while문, do-while문의 실행 중지 할 때 사용되며, switch문에서도 break문을 사용하여 switch문을 종료함.

break문은 대개 if문과 같이 사용되어 if문의 조건식에 따라 for문과 while문을 종료할 때 사용됨.

 

// break로 while문 종료

public class BreakExample {
	public static void main(String[]args) {
      while(true) {
        int num = (int) (Math.random() * 6) + 1;
        System.out.println(num);
        if (num == 6) {
          break;
        }
      }
      System.out.println("프로그램 종료");
   }
}

// 실행 결과
// 1
// 5
// 6
// 프로그램 종료

만약 반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료하지 않음.

중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름(라벨)을 붙이고, 'break 이름;'을 사용하면 됨.

 

// 바깥쪽 반복문 종료

package sec02.exam09;

public class BreakOutterExample {
	public static void main(String[]args) {
      Outter: for(char upper='A'; upper <= 'Z'; upper++) {
        for(char lower='a'; lower <= 'z'; lower++) {
          System.out.println(upper + "-" + lower);
          if(lower == 'g' {
            break Outter;
          }
        }
      }
      System.out.println("프로그램 실행 종료");
   }
}

// 실행 결과
// A-a
// A-b
// A-c
// A-d
// A-e
// A-f
// A-g
// 프로그램 실행 종료
// Outter은 별칭, break뒤에 별칭 붙이면 그 라인이 break.
// Js는 break랑 가까운 라인이 break된다는 차이점이 있음.

 


continue문

continue문은 반복문인 for문, while문, do-while문에서만 사용되는데, 블록 내부에서 continue문이 실행되면 for문의 증감식 또는

while문, do-while문의 조건식으로 이동 함.

continue문은 반복문을 종료하지 않고 계속 반복 수행한다는 점이 break문과 다르고, break문과 마찬가지로 continue문도 대개 if문과 같이 사용되는데, 특정 조건을 만족하는 경우에 continue문을 실행해서 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어감.

 

// continue를 사용한 for문

package sec02.exam10;

public class ContinueExample {
	public static void main(String[]args) {
      for(int i=1; i<=10; i++) {
        if(i%2 != 0) {			// 2로 나눈 나머지가 0이 아닐 경우, 즉 홀수인 경우
          continue;
        }
        System.out.println(i);	// 홀수는 실행되지 않음
      }
   }
}

// 실행 결과
// 2
// 4
// 6
// 8
// 10

 

🔘 for문: for(초기화식; 조건식; 증감식) {...}을 말하며 조건식이 true가 될 때까지만 중괄호 내부를 반복하며, 반복할 때마다 증감식이 실행됨. 초기화식은 조건식과 증감식에서 사용할 루프 카운터 변수를 초기화하며, 주로 지정된 횟수만큼 반복할 때 사용.

 

🔘 while문: while(조건식) {...}을 말하며 조건식이 true가 될 때까지만 중괄호 내부를 반복 실행.

 

🔘 do-while문: do {...} while(조건식);을 말하며 먼저 do 중괄호 내부를 실행하고 그다음 조건식이 true가 되면 다시 중괄호 내부를 반복 실행.

 

🔘 break문: for문, while문, do-while문 내부에서 실행되면 반복을 취소.

 

🔘 continue문: for문, while문, do-while문 내부에서 실행되면 증감식 또는 조건식으로 돌아감.