본문 바로가기
[JAVA]

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

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

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

 

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 코드가 수행된다.