본문 바로가기
[JAVA]

[처음부터 다시 하는 JAVA] 반복문 while, do-while

by 북방바다코끼리표범 2024. 1. 10.

처음부터 다시 하는 자바 공부는 인프런의 김영한 강사님의 강의를 참고해서 공부했다.

 

반복문 시작

반복문은 이름 그대로 특정 코드를 반복해서 실행할 때 사용한다. 
자바는 다음 3가지 종류의 반복문을 제공한다.


while , do-while , for

 

먼저 while 문부터 알아보자.


while문1

while문은 조건에 따라 코드를 반복해서 실행할 때 사용한다.

while (조건식) {
  // 코드
}
  • 조건식을 확인한다. 참이면 코드 블럭을 실행하고, 거짓이면 while문을 벗어난다.
  • 조건식이 참이면 코드 블럭을 실행한다. 이후에 코드 블럭이 끝나면 다시 조건식 검사로 돌아가서 조건식을 검사 
    한다.(무한 반복)

while문을 사용해서 1을 한 번씩 더해서 총 3번 더하는 코드를 만들어보자

package loop;

public class While1_2 {
	public static void main(String[] args) { 
        int count = 0;
        while (count < 3) {
            count++;
		System.out.println("현재 숫자는:" + count);
        } 
    }
}

출력 결과
현재 숫자는:1 
현재 숫자는:2 
현재 숫자는:3

while (count < 3) 에서 코드 블럭을 반복 실행한다. 여기서 count 의 값이 1 , 2 , 3 으로 점점 커지다가 결국 
count < 3 이 거짓이 되면서 while 문을 빠져나간다.


while(count < 3) 에 있는 숫자를 while(count < 100) 으로 변경하면 while 문의 코드 블럭을 100번 반복한다.

 

while문2

이번에는 난이도를 조금 높여보자. 다음 문제를 같이 풀어보자.

package loop;

public class While2_1 {
	public static void main(String[] args) { 
		int sum = 0;
        
        sum = sum + 1; //sum(0) + 1 -> sum(1)
		System.out.println("i=" + 1 + " sum=" + sum);
        
        sum = sum + 2; //sum(1) + 2 -> sum(3)
		System.out.println("i=" + 2 + " sum=" + sum);
        
        sum = sum + 3; //sum(3) + 3 -> sum(6)
		System.out.println("i=" + 3 + " sum=" + sum);
    } 
}

출력 결과
i=1 sum=1 
i=2 sum=3
i=3 sum=6

이 코드의 정답은 맞다. 하지만 개선할 점이 많이 있는데, 무엇보다 변경에 유연하지 않다. 

 

다음과 같이 요구사항이 변경되었다.
문제: 10부터 하나씩 증가하는 수를 3번 더해라 (10 ~12더하기)
이렇게 되면 10 + 11 + 12 를 계산 해야한다. 문제는 코드를 너무 많이 변경해야 한다는 점이다. 


변수를 사용해서 더 변경하기 쉬운 코드로 만들어보자. 변경되는 부분을 변수 i 로 바꾸어보자.
문제: i부터 하나씩 증가하는 수를 3번 더해라 (i ~ i+2더하기)

package loop;
public class While2_2 {
public static void main(String[] args) { 
int sum = 0;
int i = 1;
        sum = sum + i; //sum(0) + i(1) -> sum(1)
System.out.println("i=" + i + " sum=" + sum);
        i++; //i=2
        sum = sum + i; //sum(1) + i(2) -> sum(3)
System.out.println("i=" + i + " sum=" + sum);
        i++; //i=3
        sum = sum + i; //sum(3) + i(3) -> sum(6)
System.out.println("i=" + i + " sum=" + sum);
    } 
}

출력 결과
//i=1
i=1 sum=1 
i=2 sum=3 
i=3 sum=6

변수 i 를 사용한 덕분에 i 의 값만 변경하면 나머지 코드를 전혀 변경하지 않아도 된다
.
i=10 으로 변경하면 다른 코드의 변경 없이 앞서 이야기한 10 + 11 + 12 의 문제도 바로 풀 수 있다. 

출력 결과
//i=10
i=10 sum=10 
i=11 sum=21 
i=12 sum=33

좋은 코드인지 아닌지는 변경 사항이 발생했을 때 알 수 있다. 
변경 사항이 발생했을 때 변경해야 하는 부분이 적을수록 좋은 코드이다.


지금까지 변수를 사용해서 하나의 문제를 잘 해결했다. 이번에는 새로운 변경사항이 등장했다. 
기존 문제: i부터 하나씩 증가하는 수를 3번까지 더해라 (i ~ i+2 더하기)
새로운 문제: i부터 하나씩 증가하는 수를 endNum(마지막 수)까지 더해라 (i ~ endNum 더하기)

 

예)

  • i=1 , endNum=3 이라고 하면 1 ~ 3까지 총 3번 더해야한다.
  • i=1 , endNum=10 이라고 하면 1 ~ 10까지 총 10번 더해야한다. 
  • i=10 , endNum=12 이라고 하면 10 ~ 12까지 총 3번 더해야한다.

먼저 i=1 , endNum=3 이라고 생각하고 단순하게 문제를 풀어보자.

package loop;

public class While2_3 {
	public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        int endNum = 3;
        
        sum = sum + i;
		System.out.println("i=" + i + " sum=" + sum);
        i++;
        
        sum = sum + i;
		System.out.println("i=" + i + " sum=" + sum);
        i++;
        
        sum = sum + i;
		System.out.println("i=" + i + " sum=" + sum);
        i++; 
   	 }
    }
실행 결과
i=1 sum=1 
i=2 sum=3 
i=3 sum=6

i=1 , endNum=3 이므로 다음 코드를 총 3번 반복해야 한다.
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum); 
i++;

그런데 i=1 , endNum=10 와 같이 변경하면 이 코드를 총 10번 반복해야 한다. 따라서 같은 코드를 더 많이 추가해야 
한다.
이 문제를 제대로 풀기 위해서는 코드가 실행되는 횟수를 유연하게 변경할 수 있어야 한다. 한마디로 같은 코드를 반복 
실행할 수 있어야 한다.


while 문을 사용하면 원하는 횟수 만큼 같은 코드를 반복 실행할 수 있다.

 

package loop;

public class While2_3 {
	public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        int endNum = 3;

		while (i <= endNum) {
            sum = sum + i;
			System.out.println("i=" + i + " sum=" + sum);
            i++; 
        }
    } 
}
실행 결과
//i=1, endNum=3 
i=1 sum=1
i=2 sum=3
i=3 sum=6
//i=1, endNum=10
i=1 sum=1
i=2 sum=3
i=3 sum=6
i=4 sum=10
i=5 sum=15
i=6 sum=21
i=7 sum=28
i=8 sum=36
i=9 sum=45
i=10 sum=55
//i=10, endNum=12 
i=10 sum=10
i=11 sum=21 
i=12 sum=33

반복 횟수 정하기
i 가 endNum 이 될때 까지 반복해서 코드를 실행하면 된다.

  • i=1 , endNum=3 이라면 3번 반복하면 된다. i=1 -> 2 -> 3
  • i=3 , endNum=4 라면 2번 반복하면 된다. i=3 -> 4

while문 작성하기

  • while 문에서 i <= endNum 조건을 통해 i 가 endNum 이 될 때 까지 코드 블럭을 실행한다. 
  • i 가 endNum 보다 크면 while 문을 종료한다.

그림을 통해 코드를 분석해보자.
왼쪽은 while 의 조건식을 체크하는 단계이고, 오른쪽은 조건식을 통과하고 나서 while 문의 코드 블럭을 실행하는 
부분이다.

i=1, endNum=3

  • 조건식을 만족한다. 
  • i=1, sum=1 을 출력한다.

i=2, endNum=3

  • 조건식을 만족한다. 
  • i=2, sum=3 을 출력한다.

i=3, endNum=3

  • 조건식을 만족한다. 
  • i=3, sum=6 을 출력한다.

i=4, endNum=3

  • 조건식을 만족하지 않는다. 
  • while 문을 종료한다.

실행 코드 분석
sum(0), i(1), endNum(3) 
//루프 1
while (i(1) <= endNum(3)) -> true 
sum(0)+i(1) -> sum(1)
i(1)++ -> i(2) 

//루프 2while (i(2) <= endNum(3)) -> true 
sum(1)+i(2) -> sum(3)
i(2)++ -> i(3) 

//루프 3
while (i(3) <= endNum(3)) -> true 
sum(3)+i(3) -> sum(6)
i(3)++ -> i(4) 

//루프 4while (i(4) <= endNum(3)) -> false

do-while문

do-while 문은 while 문과 비슷하지만, 조건에 상관없이 무조건 한 번은 코드를 실행한다.

 

do-while문 구조

do {
// 코드
} while (조건식);

예를 들어서 조건에 만족하지 않아도 한 번은 현재 값을 출력하고 싶다고 하자. 
먼저 while 문을 사용한 예제를 보자

 

package loop;

public class DoWhile1 {
	public static void main(String[] args) { 
        int i = 10;
        while (i < 3) {
       	 	System.out.println("현재 숫자는:" + i);
        	i++;
            }
       }
}
출력 결과
//없음

i=10 이기 때문에 while (i < 3) 조건식은 거짓이 된다. 따라서 아무것도 출력되지 않는다.

 

이번에는 do-while 문을 사용해보자.

package loop;

public class DoWhile2 {
	public static void main(String[] args) { 
        int i = 10;
        do {
        	System.out.println("현재 숫자는:" + i);
            i++; 
        } while (i < 3);
    } 
}
출력 결과
현재 숫자는:10

do-while 문은 최초 한번은 항상 실행된다. 따라서 먼저 현재 숫자는:10 이 출력된다.
코드 블럭을 실행 후에 조건식을 검증하는데, i=10 이기 때문에 while (i < 3) 조건식은 거짓이 된다. 따라서 
do-while 문을 빠져나온다.

 

do-while 문은 최초 한번은 코드 블럭을 꼭 실행해야 하는 경우에 사용하면 된다.

 

break, continue

break 와 continue 는 반복문에서 사용할 수 있는 키워드다.

break 는 반복문을 즉시 종료하고 나간다. continue 는 반복문의 나머지 부분을 건너뛰고 다음 반복으로 진행하는 
데 사용된다.
참고로 while , do-while , for 와 같은 모든 반복문에서 사용할 수 있다.

 

break

while(조건식) { 
  코드1;
  break;//즉시 while문 종료로 이동한다. 
  코드2;
}
//while문 종료

break 를 만나면 코드2 가 실행되지 않고 while문이 종료된다.

 

continue

while(조건식) { 
코드1;
continue;//즉시 조건식으로 이동한다. 
코드2;

continue 를 만나면 코드2 가 실행되지 않고 다시 조건식으로 이동한다. 조건식이 참이면 while 문을 실행한다.

 

예제를 통해서 알아보자.
문제: 1부터 시작해서 숫자를 계속 누적해서 더하다가 합계가 10보다 처음으로 큰 값은 얼마인가? 
1 + 2 + 3 ... 계속 더하다가 처음으로 합이 10보다 큰 경우를 찾으면 된다.

package loop;

public class Break1 {
	public static void main(String[] args) { 
        int sum = 0;
        int i = 1;

		while (true) {
            sum += i;
			if (sum > 10) {
            }
            System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum); 
            break;
            }
            i++;
            }
      }
}
실행 결과
합이 10보다 크면 종료: i=5 sum=15
  • 조건식을 잘 보면 true 라고 되어있다. 조건이 항상 참이기 때문에 이렇게 두면 while 문은 무한 반복된다. 물 
    론 break 문이 있기 때문에 중간에 빠져나올 수 있다.
  • 만약 sum > 10 조건을 만족하면 결과를 출력하고, break 를 사용해서 while 문을 빠져나간다.

문제: 1부터 5까지 숫자를 출력하는데, 숫자가 3일 때는 출력을 건너뛰어야 한다.

package loop;

public class Continue1 {
	public static void main(String[] args) { 
		int i = 1;

		while (i <= 5) {
			if (i == 3) {
                i++;
				continue;
            }
			System.out.println(i);
            i++; 
        }
    } 
}
실행 결과
1
2
4
5

 

실행 결과를 보면 3일 때는 출력하지 않은 것을 확인할 수 있다.