본문 바로가기
카테고리 없음

반복문1 (for, while, do~while)

by 낭만 코딩 2024. 8. 11.

1. for 문

2. while 문

3. do ~ while 문

 

 

 

반복문은 주어진 조건이 true인 동안 반복문의 중괄호 블록의 실행문을 반복적으로 실행하고자 할 때 사용합니다. 모든 반복문은 조건문이 포함되어 있으며, 반복문의 종류는 for, while, do~while문이 있습니다. 세가지 모두 개념적으로는 비슷하기 때문에 하나만 기억하면 나머지는 크게 어렵지 않게 익힐 수 있을 것입니다.

 

1. for 문

for라는 단어를 찾아보면 “~를 위하여라는 뜻도 있지만, “~하는 동안이라는 뜻도 있습니다. , for문은 조건식이 true인 동안 반복되는 것입니다. for문의 구조를 살펴보겠습니다.

 

for (초기화식; 조건식; 증감식) {
    실행문; // 조건식이 true 인 경우 실행
}

 

for 문의 구조를 살펴보면 괄호 안에 초기화식, 조건식, 증감식이 존재합니다. 초기화식은 말 그대로 변수를 초기화하는 식이, 조건식은 비교연산 또는 논리연산이, 증감식은 1증가, 1감소하는 식이 오게 되는데요, for 문의 실행 흐름을 살펴보면 먼저 초기화식이 실행(1)되고, 조건식을 확인(2)해서 true이면 중괄호 블록 내의 실행문(3)이 실행되고, 증감식(4)을 실행합니다. 그 이후 조건식 확인(2) -> 실행문(3) -> 증감식(4)가 반복되면서 조건식이 true인 동안 계속 반복 실행되고, false일 때 for 문을 빠져나가고 종료됩니다. for 문에서 반복횟수의 조절은 증감식에 따른 조건식의 true여부를 알 수 있으면 원하는 만큼 반복을 지정할 수 있습니다. 즉 변수 i0으로 초기화되고, 조건식은 i < 10, 증감식은 i1씩 증가하면 i0부터 9까지 총 10번이 반복되게 되는 것입니다. 3개의 식은 모두 생략 가능하고, 각각의 식에는 ,를 이용하여 2개 이상의 연산식을 작성할 수도 있습니다. 두번째 조건식을 생략하는 경우 이 조건식의 결과가 false가 될 수 없으므로 실행문이 무한반복하게 되니 조심하세요.

그럼 i가 0부터 9까지 총 10번 반복되는 for 문을 작성해보겠습니다.

 

public class ForSample {

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

	}

}

 

실행 결과

i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9

 

초기화식 int i=0; 은 정수 타입의 변수 i0으로 초기화했고, 조건식 i < 10; 은 변수 i10보다 작다라는 비교 연산이, 증감식은 i++, i1씩 증가하는 것입니다. 조건이 만족할 때 실행되는 실행문은 for문 블록 내의 출력문입니다. 그래서 i의 변화는 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9로 변하면서 10이 되는 순간 조건이 만족하지 않아 for문이 종료됩니다. i가 변하는 과정을 출력했기 때문에 위와 같은 실행결과가 나오게 된 것이다.

이번엔 1부터 100까지의 합을 구해보겠습니다. 변수의 초기값은 1이고 i <= 100이라는 조건식이 만족할 때까지 1씩 증가하면 될 것입니다. 실행문은 변수에 i를 계속 더해주며 누적 합계를 구하게 됩니다. 그럼 반복되는 구문을 먼저 생각해볼까요? 누적 합계를 저장할 변수에 i를 계속 더하는 코드가 for 문 안에서 반복적으로 실행되어야 합니다.

sum = sum + i;

 

이 구문이 i1부터 100까지 변하면서 sum이라는 변수에 +로 더하고 = 로 대입해주면 전체 합계를 구할 수 있습니다. 이제 예제로 살펴보겠습니다.

 

public class ForSample2 {

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

	}

}

 

실행 결과

합계 : 5050

 

for문 괄호 안에 있는 i변수 초기값 1부터 100까지 1씩 증가하면서 총 100번이 반복되는데, 반복 실행되는 구문은 sum = sum + i; 입니. 이 실행문의 실행 과정를 살펴보면,

 

반복 횟수 i 값 실행문
1 1 sum = sum + 1;
2 2 sum = sum + 2;
3 3 sum = sum + 3;
4 4 sum = sum + 4;
5 5 sum = sum + 5;
...
100 100 sum = sum + 100;

 

실행 과정을 나타낸 표를 살펴보면 반복 횟수에 따라 i값의 변화를 볼 수 있고, 실행문이 실행되는 흐름도 살펴 볼 수 있습니다. 이렇게 총 100번이 실행되며, sum 변수에는 1부터 100까지의 누적 합계가 저장 되며 최종적으로 5050이 되면서 반복은 종료됩니다. 여기서 주의할 점은 합계값을 대입할 sum 변수는 for문 안에 선언하는 것이 아니라 for문 전에 선언이 되어 있어야 한다는 것입니다. 만약 for 문 블록 안에 선언되어 있으면 변수 선언이 반복되어 출력값은 5050이 아니라 100 이 출력될 것입니다. 매 반복마다 변수를 선언하고 0으로 초기화해서 i값을 대입하기 때문이죠.

for 문은 보통 이렇게 반복횟수를 미리 알고 있는 경우에 많이 사용하게 됩니다.

 

2. while 문

while문은 조건에 따라 반복여부를 결정하며, 조건식이 true인 경우에만 블록 내의 실행문이 반복 실행되게 됩니다.

 

while (조건식) {
    실행문; // 조건식이 true 인 경우에만 실행
}

 

 

while 이라는 단어 역시 우리말로 해석하면 “~하는 동안이라는 의미를 가지고 있습니다. while 문의 구조는 for 문에 비해 간단한데요, while 문 괄호 안에 조건식만 넣고 조건식이 true인 경우에만 실행문이 실행됩니다. for문에서 실행했던 1부터 100까지의 합을 구하는 소스를 while문으로 작성해보겠습니다.

 

public class WhileSample {

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

	}

}

 

실행 결과

합계 : 5050

 

예제를 보면 for 문과 구조는 다르지만 실행순서는 비슷한 것을 알 수 있습니다. 누적합계를 구할 변수 sum 을 미리 선언해놓고, 1부터 100까지 변하면서 sum + 연산을 수행할 변수 i 역시 while문 바깥에 선언하고 조건은 i <= 100 이 조건이 만족하는 동안 중괄호 블록의 실행문이 실행되며 sum = sum + i; 가 반복 실행되며 누적합계를 구하게 됩니다. for 문과 다른점은 i 변수가 1씩 증가해야 하기 때문에 while 문 중괄호 블록 가장 하단에 다른 실행문이 실행되고 나서 1 증가 시키는 것을 볼 수 있습니다. 그래서 결과는 for 문과 동일하게 5050을 출력됩니. while 문을 사용할 때 주의할 점은 1 씩 증가되는 변수 i 를 중괄호 블록 안에서 1증가시키지 않는 경우 이 while 문은 무한 반복 실행되게 됩니다. 즉, 프로그램이 종료되지 않는 것입니다. i 는 계속 1이고, 조건 역시 계속 만족하기 때문에 반복이 종료되지 않고, 계속 실행되게 됩니다. 이를 무한 루프 (반복) 이라고 합니다. 간혹 일부러 무한 반복되는 프로그램을 만들게 되는 경우도 있지만, 실수하지 않도록 조심하세요.

 

 

 

3. do ~ while 문

while 문과 유사하지만 앞에 do 가 추가됐습니다. do ~하다라는 의미로 생각해보면 while 문의 조건 확인 전에 일단 실행문을 실행한다 라고 이해하시면 쉽게 사용할 수 있습니다. 그래서 최소한 무조건 한번은 실행되게 되는데요, 즉 조건식이 false 여도 적어도 한번은 실행문이 실행이 된다라는 이야기입니다. 그럼 do~while문의 구조를 살펴보겠습니다.

 

do {
    실행문; // 처음 실행문은 일단 한번 실행되고 그 후 조건식을 확인해서 true이면 반복 실행
} while (조건식);

 

do ~ whle 문 구조에서 보듯이 구문 가장 위쪽에 do { 로 시작합니다. 중괄호 안에 먼저 실행문을 만나게 되므로, 실행문이 처음은 일단 한번 실행되고 나서 그 아래에 있는 while (조건식)을 만납니다. 그 이후 부터는 조건식이 true인 경우에만 반복 실행되게 됩니다.

이번에도 역시 while 문에 구현했던 1~100까지의 합계를 구하는 예제를 do~while문을 이용해 같은 결과가 출력되도록 해보겠습니다.

 

public class DoWhileSample {

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

	}

}

 

역시 while 문과 동일한 실행 결과가 출력되었습니다. 차이점은 조건식이 true이던 false이던 무조건 한번은 실행된다는 것인데, 다음 예제를 통해 조건과 실행문을 확인해보겠습니다.

 

public class DoWhileSample2 {

	public static void main(String[] args) {
		
		int i = 10;
		
		do {
			System.out.println("i = "+i);
		} while (i < 10);
		
	}

}

 

실행 결과

i = 10

 

위 예제에서 i 변수에 10으로 초기화하고, do ~ while문의 조건식은 i < 10 입니. 조건식이 만족하지 않는데도 "i = " + i 의 출력문이 실행된 것을 볼 수 있는데요, 조건식이 밑에 있기 때문에 조건식 확인 전에 출력을 먼저하고 조건식의 결과값이 false 이므로 반복되지 않고 종료된 것입니다.