[그린컴퓨터] Server/JAVA(기본)

반복문 {정의, 종류, while문, do-while 문, for 문, for 문 요소 생략, 중첩된 반복문, continue 문, break 문}

Ben의 프로그램 2023. 5. 15. 13:55
728x90

반복문이란?

  • 1부터 10까지 더한 합을 이제까지 배운 것으로 계산해 보겠습니다.
int num = 1;
num += 2;
num += 3;
...
num += 10;
  • 엄청나게 비효율적인 코드입니다. 유지보수 하기도 힘든 코드입니다. 이렇게 반복되는 일을 처리하기 위해 사용하는 것이 '반복문'입니다.

반복문의 종류

  • 자바 프로그램에서 사용하는 반복문의 종류에는 while문, do-while문, for문 이렇게 세 가지가 있습니다.

while 문

  • while 문은 조건식이 참인 동안 수행문을 반복해서 수행합니다.
while (조건식) {
	수행문1;
    ...
}
  • while 문에서는 어떠한 조건식을 만족하는 동안 중괄호 { } 안의 수행문을 반복해서 처리합니다. 
  • 조건문과 마찬가지로 수행문이 하나인 경우에는 { }를 사용하지 않을 수 있습니다.
  • while 문의 수행문과 조건식은 어떻게 작성해야 할까요? 1부터 10까지 더하는 프로그램을 while 문으로 만들어보겠습니다.
int sum = 0;
int num = 1;

while (num <= 10) {
	sum += num;
    num++;
}
  • 조건식을 어느 순간이 되면 탈출할 수 있도록 num++; 을 작성해준 것을 알 수 있습니다.
  • 또한 이 반복문을 작성하기 전에 sum 과 num 변수를 초기화 해주었는데요. 왜 초기화를 해주었을까요? 
    변수를 항상 초기화해야 하는 것은 아니지만, 이 경우에는 초기화를 해주지 않으면 오류가 발생합니다. 왜냐하면, sum 에 num 을 더해주는 과정이 있는데, sum 과 num 값이 무엇인지도 모르면 더하는 작업을 시작할 수가 없습니다. 즉, 변수를 사용하여 연산을 하거나 그 값을 가져다 사용하려면 변수는 반드시 어떤 값을 가지고 있어야 하고 이 작업을 우리는 초기화라고 합니다.

while 문이 무한히 반복되는 경우

  • while 문은 조건식이 true 인 경우 수행문을 무한 반복 실행합니다.
  • 이런 경우는 일반적인 프로그램에서는 바람직하지 않지만, 필요한 경우도 있습니다.
  • 바로, 24시간 돌아가야 하는 웹 서비스의 서버입니다. 이런 시스템을 데몬(daemon)이라고 부릅니다. 

do-while 문

  • while 문은 조건을 먼저 검사하기 때문에 조건식에 맞지 않으면 반복 수행이 한 번도 일어나지 않습니다.
  • 하지만 do-while 문은 do { } 안의 문장을 무조건 한 번 수행한 후에 조건식을 검사합니다. 따라서 조건식 여부에 상관없이 무조건 한 번 이상 수행해야 할 때 while 문 대신 do-while 문을 사용합니다. 
    do {
        수행문1;
    } while(조건식); 

    수행문2;
  • 1부터 10까지 더하는 프로그램을 do-while 문으로 바꿔 보겠습니다.
    int num = 1;
    int sum = 0;
		
    do {
        sum += num;
        num++;
    } while (num <= 10); 

    System.out.println(sum);

for 문

  • 반복문 중에서 가장 많이 사용하는 반복문이 for 문입니다.
  • for 문은 반복문을 구현하는 데 필요한 여러 요소(변수의 초기화식, 조건식, 증감식)를 함께 작성합니다.
  • 어떤 조건부터 어떤 조건까지 반복 수행하는지 한눈에 알아볼 수 있어 편리합니다.

for 문의 기본 구조

for(초기화식; 조건식; 증감식) {
	수행문;
}
  • 초기화식은 for문이 시작할 때 딱 한 번만 수행하며 사용할 변수를 초기화합니다. 
  • 조건식에서 언제까지 반복 수행할 것인지 조건 구현합니다.
  • 증감식에서 반복 횟수나 for 문에서 사용하는 변수 값을 1만큼 늘리거나 줄입니다.
    int num;
		
    for (num = 1; num <= 5; num++) {
        System.out.println(num);
    }
  • 1부터 5까지 출력하는 프로그램을 for 문으로 만들어 보았습니다.
  • 해당 프로그램이 작동하는 순서는 다음과 같습니다. 
    1-변수 초기화
    2-조건 여부 확인
    3-수행문 실행
    4-증감식 진행
    1-(다시 반복)
    int num;
    int sum;

    for (num=1, sum=0; num<=10; num++) {
        sum += num;
    }

    System.out.println(sum);
  • for 반복문을 활용하여 1부터 10까지의 수를 더한 프로그램입니다. 
  • 초기화 부분과 증감식 부분에 콤마(,)로 구분하여 여러 문장을 사용할 수 있습니다. 

for 문을 자주 사용하는 이유

  • for 문을 가장 많이 사용하는 이유는 반복 횟수를 관리할 수 있기 때문입니다. 
  • 물론 while 문에서도 반복 횟수를 관리할 수 있습니다. 1부터 10까지 더하는 프로그램을 통해 비교해보겠습니다.
    int sum = 0;
		
    for (int num=1; num<=10; num++) {
        sum += num;
    }

    System.out.println(sum);
    int num1 = 1;
    int sum1 = 0;

    while(num1 <= 10) {
        sum1 += num1;
        num1++;
    }

    System.out.println(sum1);
  • while 문으로 작성한 코드를 살펴보면 변수 num 의 초기화와 조건 비교, 증감식을 따로 다른 줄에서 구현했습니다.
  • 하지만 for 문을 사용하면 초기화, 조건비교, 증감식을 한 줄에 쓸 수 있을 뿐더러 가독성도 좋습니다.
  • 또한 for 문은 배열과 함께 자주 사용합니다. 배열의 특성은 배열의 전체 요소 개수가 n 개일 때, 요소 위치는 n-1번째로 표현할 수 있다는 것입니다. 배열의 특성과 증감에 따른 반복을 표현하는 데 적합한 for 문의 특성 때문에 for 문과 배열을 함께 자주 사용합니다.

i + 1; 과 i++; 는 다르다.

  • i + 1 이라고 쓴다고 i 의 값이 증가하지는 않습니다. i + 1 의 값을 사용한다는 것이지, i 값 자체가 i + 1 이 된 것이 아닙니다. 반면에 i++ 는 i의 값 자체가 바뀌게 됩니다.

for 문 요소 생략하기

  • for 문을 구성하는 요소는 코드가 중복되거나 논리 흐름상 사용할 필요가 없을 때 생략할 수 있습니다.
  • 초기화식 생략
    이미 이전에 다른 곳에서 변수가 초기화되어 중복으로 초기화할 필요가 없을 때 초기화 부분을 생략할 수 있습니다.
    int i = 0;
		
    for(; i < 5; i++) {
        System.out.println(i);
    }
  • 조건식 생략
    어떤 연산 결과 값이 나왔을 때 바로 for 문의 수행을 멈추려면 조건식을 생략하고 for 문 안에 if 문을 사용하면 됩니다. 
    int sum = 0;
		
    for(int i2=0; ; i2++) {
        sum += i2;
        if(sum > 200) break;
    }
  • 증감식 생략
    증감식의 연산이 복잡하거나 다른 변수의 연산 결과 값에 좌우된다면 증강식을 생략하고 for 문 안에 쓸 수 있습니다.
    for(int i3 = 0; i3 < 5; ) {
        i3 = (++i)% 10; 
    }
  • 요소 모두 생략
    모든 요소를 생략하고 무한 반복하는 경우에 사용합니다. 
    for( ; ; ) {
        ...
    }

중첩된 반복문

  • 반복문 안에 또 다른 반복문을 중첩해서 사용하는 경우가 종종 있습니다. 간단한 예로 구구단이 있습니다. 
    int dan;
    int times;

    for(dan=2; dan<=9; dan++) {
        for(times=1; times<=9; times++ ) {
            System.out.println(dan + "X" + times + "=" + (dan*times) + "입니다.");
        }
    }
  • 반복문을 중첩해서 사용할 때 외부 for 문과 내부 for 문이 어떤 순서로 실행되는지 잘 이해해야 합니다. 구구단은 2단부터 9단까지 단이 증가합니다. 그리고 각 단은 1부터 9까지 곱하는 수가 증가합니다. 
  • 그러면, 단은 외부 for 문으로 2부터 9까지 진행되어야 하고 각 단마다 곱하는 수가 내부 for 문으로 1부터 9까지 진행되어야 합니다.
  • 정리하자면, 중첩 반복문을 쓸 때는 어떤 반복문을 먼저 수행해야 하는지 그리고 내부 반복문을 수행하기 전에 초기화해야 할 값을 잘 초기화했는지를 살펴야 합니다. 

어떤 반복문을 사용해야 할까? 상황에 맞는 반복문의 사용

  • 우리는 지금까지 whil 문, do-while 문, for 문 을 배웠습니다. 이 3가지 반복문을 어떤 상황에 사용해야 할까요?
  • 반복 횟수가 정해진 경우에는 for 문을 사용하는 것이 좋습니다. 
  • 수행문을 반드시 한 번 이상 수행해야 하는 경우에는 do-while 이 적합합니다. 
  • 조건의 참 거짓에 따라 반복문을 수행하는 경우 while 문을 사용합니다.

continue 문

  • continue 문은 반복문과 함께 쓰입니다. 
  • 반복문 안에서 continue 문을 만나면 이후의 문장은 수행하지 않고 for 문의 처음으로 돌아가 증감식을 수행합니다.
    int num = 0;
    int sum = 0;

    for (num = 1; num <= 100; num++) {
        int numDividedBy2 = num % 2;
        if (numDividedBy2 == 0) {continue;}
        sum += num;
    }

    System.out.println(sum);
  • 1 부터 100까지 수를 더할 때 홀수일 때만 더하고 짝수일 때는 더하지 않는 프로그램을 continue 문으로 작성해 보았습니다. 
  • continue 문은 언제 사용할까요?
  • continue 문은 반복문을 계속 수행하는데, 특정 조건에서는 수행하지 않고 건너뛰어야 할 때 사용합니다.

break 문

  • switch-case 문에서 break 문을 사용할 때 조건을 만족하면 다른 조건을 더 이상 비교하지 않고 switch 문을 빠져나왔습니다. 반복문에서도 마찬가지입니다.
  • 반복문에서 break 문을 사용하면 그 지점에서 더 이상 수행문을 반복하지 않고 반복문을 빠져나옵니다. 
  • 0부터 1씩 증가하는 숫자들의 합이 100을 넘는 순간을 알아내는 코드를 작성해보겠습니다.
    int num;
    int sum =0;

    for (num = 1; ; num++) {
        sum += num;

        if (sum >= 100) {
            break;
        }
    }

    System.out.println("num = " + num);
    System.out.println("sum = " + sum);
  • 위 예제는 0부터 시작해 1씩 늘린 숫자를 sum에 더합니다.
  • 그리고 sum 값이 100보다 크거나 같으면 반복문을 빠져나옵니다. 
  • 조건식을 for ( ) 안에 작성하면 조건을 만족한 이후에도 num++ 가 한 번 더 실행되므로 num 값이 14가 아니라 15가 됩니다. 
  • 따라서 프로그램 실행 중에 반복문을 중단하려면 break 문을 사용해야 정확한 결과 값을 얻을 수 있습니다.

break 문의 위치

  • 앞서서 우리는 반복문이 중첩된 경우를 보았습니다.
  • 이 경우에 break 문을 사용하면 모든 반복문을 빠져나오는 것이 아니고 break 문을 감싸고 있는 반복문만 빠져나옵니다.
    // 외부 반복문
    while () {
        // 내부 반복문
        while () {
            if ( ) {
                break
            }
        }
    }
  • 위와 같은 구조의 코드를 작성했다면, 내부 반복문의 위치에서 break 문을 사용하면 if 조건문만 빠져나온다고 생각할 수 있는데, 반복문 안의 break 문은 해당 반복문 수행만 중지합니다.
  • 즉, 위와 같은 경우에 내부 반복문만 빠져나오고 외부 반복문은 계속 수행합니다.