본문 바로가기

Java/Java SE, EE

[Java/Java SE, EE] 반복문(for, while, do-while)

제어문

반복문 역시 제어문에 속합니다. 제어문은 코드의 실행 순서를 제어하는 구문이라고 이전 포스트(https://namepgb.tistory.com/46)에서 소개했습니다. 이번 포스트에서는 제어문에서 for, while, do-while 반복문에 대해서 소개하도록 하겠습니다.

  • 조건문
    • if 조건문
    • switch 조건문
  • 반복문
    • for 반복문
    • while 반복문
    • do-while 반복문

for 반복문

프로그램을 작성 할 때 어떤 코드를 반복적으로 수행해야 하는 경우가 있습니다. 이 때 반복되는 코드 안의 변수는 서로 다른 값을 저장하고 있을 수 있습니다.

int x = 0;
x += 1;
x += 2;
x += 3;
x += 4;
x += 5;

System.out.println(x);    // 15

예시에서 변수 x의 값을 1부터 5까지 순차적으로 가산하여 그 결과를 표시하고 있습니다. 이 때 가산되는 값(1부터 5)를 임의의 규칙으로 지정 할 수 있다면 이를 반복문으로 재구성 할 수 있을 것입니다. 다음 코드는 예시와 동일한 연산을 수행하고, 동일한 결과를 산출하는 반복문입니다.

int x = 0;
for (int i = 1; i <= 5; ++i) {
   x += i;
}

System.out.println(x);    // 15

for 반복문은 (초기화 식; 조건식; 증감식)과 실행문에 해당하는 블록으로 구성됩니다.

  • 초기화 식
    조건식에 사용하기 위한 변수를 초기화 합니다. 이미 변수를 선언하였다면 초기화 식은 생략 될 수 있습니다.
  • 조건식
    반복문이 종료되기 위한 조건식을 입력합니다. 이 조건식과 조건식에 사용되는 변수의 초기 값(초기화 식)에 의해 실행 횟수가 결정됩니다.
  • 증감식
    반복문이 조건식에 의해 종료하기 위해, 조건식에 사용되는 변수의 값을 증감합니다.
  • 블록
    반복문의 조건식이 성사 될 때 수행되는 코드 블록입니다.

예시에서 초기화 식은 다음과 같습니다. 조건식에 사용하기 위한 int 타입 변수 i를 선언하고, 값을 1로 초기화 합니다.

int i = 1;

조건식은 다음과 같습니다. 초기화 식에서 선언한 변수 i의 값이 5보다 작거나 같을 때 반복해서 블록 내 코드를 실행합니다.

i <= 5;

증감식은 다음과 같습니다. 조건식에서 검사하는 변수 i의 값이 블록 내 코드를 한 번 실행하여 블록을 마칠 때마다 i의 값이 1씩 증가합니다.

i += 1

블록은 다음과 같습니다. 조건식이 성사될 때마다 다음 블록 내 코드가 모두 수행됩니다. 블록이 한 번 종료될 때마다 증감식에 의해서 i의 값이 1씩 증가하므로, 다음 번 조건식이 성사되어 블록이 다시 수행 될 때 변수 x에는 이전 i 변수의 값보다 1 더 큰 값이 더해지게 됩니다.

x += i;

초기화 식은 이미 초기화 변수를 선언한 경우 생략 할 수 있습니다. 

int x = 0;
int i = 1;
for ( ; i <= 5; ++i) {
   x += i;
}

마찬가지로 조건식 역시 블록 내 반복문을 종료 할 수 있는 조건문이 존재한다면 생략 할 수 있습니다. break 키워드는 switch 조건문의 break 키워드와 동일한 역할을 합니다. break 코드는 제어문 내에서 사용 할 수 있으며, 이 코드를 만나면 break 키워드를 포함하는 제어문을 즉시 종료하게 됩니다.

for ( ; ; ++i) {
   x += i;
   if (5 < i) {
      break;
   }
}

증감식 역시 생략 될 수 있는데, 마찬가지로 블록 내에서 반복문을 반복문을 종료하기 위한 증감 처리가 추가되어 있다는 전제가 필요합니다. 

int x = 0;
int i = 1;
for ( ; ; ) {
   x += i;
   ++i;
   if (5 < i) {
      break;
   }
}

만약 조건식 또는 증감식이 생략된 채로 블록에 해당 제어를 위한 코드가 존재하지 않으면 반복문의 블록은 무한히 수행됩니다. 이를 무한 루프라고 부르며, 아래는 가장 대표적인 무한 루프의 예시입니다(while 반복문에 대해서는 이어서 소개합니다).

while (true) {
   
}

초기화 식, 조건식, 증감식에 사용되는 자료형은 특별한 제한이 없습니다. 각 식을 구성하는 논리적인 조건만 갖추고 있다면 어떤 데이터 타입이라도 사용 될 수 있습니다. 또한 여러가지 논리 연산자 등을 사용하여 복합적인 조건식을 구성하는 등의 작업이 모두 허용됩니다(예시 처럼 반복문을 구성할 일은 없습니다).

int x = 400;
float y = 1.0f;

for (boolean z = true; (100 <= x) && (y < 10.0f) && (true == z) ; y = y + 1.0f * 2.0f) {

}

while 반복문

while 반복문은 조건식만 갖추고 있는 for 반복문과 같습니다. 초기화 식과 증감식이 없기 때문에 이를 블록 내에서 구현해야 합니다. 아래는 앞서 소개했던 무한 루프의 대표적인 코드입니다. while 키워드에 이어지는 괄호 내부가 조건식에 해당합니다. 예시에서 조건식의 결과는 언제나 상수 true이기 때문에 무한 루프가 발생하게 됩니다.

while (true) {
   
}

정상적인 while 반목문이라는 다음 코드처럼 조건식을 달성하기 위한 증감식이 블록 내 포함되게 됩니다. while은 반복문의 조건식을 먼저 검사하고, 조건식이 성사되면 블록 내의 코드를 순차적으로 실행합니다. 즉, 반복문의 첫 조건식 검사에서 조건식을 성사하지 않으면 반복문에 진입하지 않습니다.

int x = 0;
while (x < 10) {
   System.out.println("x 의 값은 " + x + " 입니다.");
   ++x;
}

 

while 반복문의 조건식을 블록으로 빼는 방법도 있습니다. break 키워드를 사용하여 블록 내부에서 제어문의 종료 여부를 검사하고 있습니다.

int x = 0;
while (true) {
   System.out.println("x 의 값은 " + x + " 입니다.");
   if (10 <= ++x) {
      break;
   }
}

do-while 반복문

while 반복문이 조건식을 먼저 검사하는데 반해, do-while 반복문은 첫 조건식 검사에 앞서 while의 블록을 한 번 수행합니다. 블록 내 코드를 먼저 수행하고 while 구문을 처리하는 경우 do-while 반복문을 사용합니다. 

int x = 0;

do {
   System.out.println("x 의 값은 " + x + " 입니다.");
   ++x;
} while (x < 10);