[JAVA]

[처음부터 다시 하는 JAVA] 반복문 for문

북방바다코끼리표범 2024. 1. 11. 21:49

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

 

for문

for문도 while문과 같은 반복문이고, 코드를 반복 실행하는 역할을 한다. for문은 주로 반복 횟수가 정해져 있을 때 사 
용한다.

for문 구조
for (1.초기식; 2.조건식; 4.증감식) {
// 3.코드
}

 

for문은 다음 순서대로 실행된다.

  • 1.   초기식이 실행된다. 주로 반복 횟수와 관련된 변수를 선언하고 초기화 할 때 사용한다. 초기식은 딱 1번 사용된다.
  • 2.   조건식을 검증한다. 참이면 코드를 실행하고, 거짓이면 for문을 빠져나간다.
  • 3.   코드를 실행한다.
  • 4.   코드가 종료되면 증감식을 실행한다. 주로 초기식에 넣은 반복 횟수와 관련된 변수의 값을 증가할 때 사용한다.
  • 5.   다시 2. 조건식 부터 시작한다. (무한 반복)

for문은 복잡해 보이지만 while문을 조금 더 편하게 다룰 수 있도록 구조화 한 것 뿐이다. 


예를 들어 1부터 10까지 출력하는 for문은 다음과 같다.

for (int i = 1; i <= 10; i++) { 
  System.out.println(i);
}
  • 1.   초기식이 실행된다. int i = 1
  • 2.   조건식을 검증한다. i <= 10
  • 3.   조건식이 참이면 코드를 실행한다. System.out.println(i);
  • 4.   코드가 종료되면 증감식을 실행한다. i++
  • 5.   다시 2. 조건식을 검증한다. (무한 반복) 이후 i <= 10 조건이 거짓이 되면 for문을 빠져나간다.
public class For2 {

	public static void main(String[] args) { 
		int sum = 0;
		int endNum = 3;
	
    	for (int i = 1; i <= endNum; i++) {
            sum = sum + i;
            System.out.println("i=" + i + " sum=" + sum);
        } 
    }
}
출력 결과
i=1 sum=1 
i=2 sum=3 
i=3 sum=6

 

for vs while

앞서 같은 문제를 풀었던 while문과 for문을 서로 비교해보자.

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++; 
        }
    } 
}

둘을 비교했을 때 for문이 더 깔끔하다는 느낌을 받을 것이다. for문은 초기화, 조건 검사, 반복 후 작업 등이 규칙적으 
로 한 줄에 모두 들어 있어 코드를 이해하기 더 쉽다. 특히 반복을 위해 값이 증가하는 카운터 변수를 다른 부분과 명확 
하게 구분할 수 있다.

 

for (int i = 1; i <= endNum; i++)
여기서는 바로 변수 i 가 카운터 변수이다. 증가하면서 반복 횟수가 올라가고, 또 변수 i 를 사용해서 계속 반복할지 아 
니면 빠져나갈지 판단할 수 있다.
이렇게 반복 횟수에 직접적인 영향을 주는 변수를 선언부터, 값 증가, 또 조건식에 활용까지 for (초기식; 조건식; 
증감식) 구조를 활용해서 처리하는 것이다.
덕분에 개발자는 루프 횟수와 관련된 코드와 나머지 코드를 명확하게 구분할 수 있다.
반면에 while을 보면 변수 i 를 선언하는 부분 그리고 i++ 로 증가하는 부분이 기존 코드에 분산되어 있다.

 

for-each문 (향상된 for문)

for문 구조
for (초기식; 조건식; 증감식) {
  // 코드
}

for문에서 초기식, 조건식, 증감식은 선택이다. 다음과 같이 모두 생략해도 된다. 단 생략해도 각 영역을 구분하는 세미 
콜론( ; )은 유지해야 한다.

for (;;) {
  // 코드
}

이렇게 하면 조건이 없기 때문에 무한 반복하는 코드가 된다. 따라서 다음과 같은 코드가 된다.

while (true) {
 // 코드
}

for문을 사용해서 다음 문제를 풀어보자.

 

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

package loop;

public class Break2 {

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

        for (; ; ) {
            sum += i;
			if (sum > 10) {
           	 System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum); 
           	 break;
            } 
            i++; 
        }
    } 
}
실행 결과
합이 10보다 크면 종료: i=5 sum=15
  • for (; ; ) 를 보면 조건식이 없다. for문은 조건이 없으면 무한 반복한다. 
  • sum > 10 조건을 만족하면 break 를 사용해서 while문을 빠져나간다.

for문은 증가하는 값이 무엇인지 초기식과 증감식을 통해서 쉽게 확인할 수 있다. 이 코드나 while문을 보면 어떤 값이 반복에 사용되는 증가 값인지 즉시 확인하기는 어렵다.

 

여기서는 i 가 증가하는 값이다. 따라서 다음과 같이 i 를 for 문에 넣어서 관리하도록 변경하면 더 깔끔한 코드가 된다.

 

package loop;

public class Break3 {

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

        for (int i = 1; ; i++) {
            sum += i;
			if (sum > 10) {
            System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum); 
			break;
            } 
        } 
    }
}

정리하면 for문이 없이 while문으로 모든 반복을 다를 수 있다. 하지만 카운터 변수가 명확하거나, 반복 횟수가 정해진 경우에는 for문을 사용하는 것이 구조적으로 더 깔끔하고, 유지보수 하기 좋다.

 

참고
for문을 좀 더 편리하게 사용하도록 도와주는 향상된 for문 또는 for-each문으로 불리는 반복문도 있다. 
이 부분은 뒤에서 나온다.

 

중첩 반복문

반복문은 내부에 또 반복문을 만들 수 있다. for , while 모두 가능하다.

package loop;

	public class Nested1 {
		public static void main(String[] args) { 
			for (int i = 0; i < 2; i++) {
				System.out.println("외부 for 시작 i:" + i); 
				for (int j = 0; j < 3; j++) {
					System.out.println("-> 내부 for " + i + "-" + j);
           	 }
                System.out.println("외부 for 종료 i:" + i); 
                System.out.println(); //라인 구분을 위해 실행
      	  } 
    }
}
실행 결과
외부 for 시작 i:0 
-> 내부 for 0-0 
-> 내부 for 0-1 
-> 내부 for 0-2 
외부 for 종료 i:0 
외부 for 시작 i:1 
-> 내부 for 1-0 
-> 내부 for 1-1 
-> 내부 for 1-2 
외부 for 종료 i:1

 

외부 for는 2번, 내부 for는 3번 실행된다. 그런데 외부 for 1번당 내부 for가 3번 실행되기 때문에 외부(2) * 내부(3) 해서 총 6번의 내부 for 코드가 수행된다.