반복문

반복문은 특정 코드를 반복해서 실행할 때 사용한다.

① while

② do-while

③ for

 

1. While문

1) While문 1

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

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

조건식을 확인해서 참이면 코드 블럭을 실행하고, 다시 조건식 검사로 돌아가서 조건식을 검사한다. (무한반복)

그러다가 거짓이면 더 이상 코드 블럭을 실행하지 않고 while문을 벗어난다.

while(true): 계속 반복(무한 루프)
while(false): 아예 반복하지 않음
while(a < 3): 변수 a값이 3보다 작은 상태면 true가 되어 계속 반복하고, 3과 같거나 크면 while문을 종료함

 

 

* 1을 한 번씩 더해서 총 3번 더하는 코드

package loop;

public class While1_2 {
    public static void main(String[] args) {
        int count = 0;

        while (count < 3) {
            count = count + 1;
            System.out.println("현재 숫자는:" + count);
        }

    }
}

실행 결과

 

2) While문 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번 더해야한다.
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++;
        }
    }
}

 

while (i <= endNum): i가 endNum이 될 때까지 반복해서 코드 블럭을 실행한다.

i가 endNum보다 크면 while문을 종료한다.

실행 결과

 

2. do-while문

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);

    }
}

실행 결과

do-while문은 최초 한번은 항상 실행된다. 따라서 먼저 "현재 숫자는:10"이 출력된다.

그 뒤 조건식을 검증하는데, while (i < 3) 조건식이 거짓이 되어서 do-while문을 빠져나오게 된다.

 

 

※ break, continue

1) break

반복문을 즉시 종료하고 나간다.

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

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

 

예제) 1부터 시작해서 숫자를 계속 누적해서 더하다가 합계가 10보다 처음으로 큰 값은 얼마인가?

package loop;

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

        while(true){
            sum = sum + i; // sum= 0+1+2+3+4+5
            if (sum > 10){
                System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
                break;
            }
            i++;
        }
    }
}
  • while(true): 계속 반복(무한 루프)
  • sum > 10 조건을 만족하면 결과를 출력(system.out.printIn)하고, break를 사용해서 while문을 빠져나간다.

실행 결과

 

2) continue

반복문의 나머지 부분을 건너뛰고 다음 반복으로 진행하는 데 사용된다.

while(조건식) {
    코드1;
    continue; / / 코드2를 건너뛰고 다시 조건식으로 이동한다.
    코드2;
}

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

 

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

package loop;

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

        //i=1, 2, 3, 4, 5
        while(i <= 5) {
            if (i == 3) {
                i++;
                continue; //뒤의 코드를 건너뛰고 다시 i<=5로 돌아감
            }
            System.out.println(i);
            i++;
        }
    }
}

i==3인 경우 i를 하나 증가시켜 i는 4가 되고 continue를 실행한다. 따라서 이 경우에는 i를 출력(system.out.printIn)하지 않고 다시 while 조건식 (i <= 5)로 이동한다.

실행 결과

 

 

3. for문

1) for문1

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

while문을 조금 더 편하게 다룰 수 있도록 구조화한 것

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

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

실행 결과

 

예제) i부터 하나씩 증가하는 수를 endNum(마지막 수)까지 더해라 (i ~ endNum 더하기)

package loop;

public class 예제 {
    public static void main(String[] args) {
        int endNum = 3;
        int sum = 0;
        for (int i = 1; i <= endNum; i++){
            sum = sum + i;
            System.out.println("i=" + i + " sum=" + sum);
        }
    }
}

실행 결과

 

for vs while

for문과 while문 비교

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

 

for문: (int i = 1; i <= endNum; i++) → 변수 i가 한 곳에 묶여 있음

while문: 변수 i를 선언하는 부분과 i++로 증가하는 부분이 분산되어 있음

 

2) for문2

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

 

무한 반복하는 코드

for ( ; ; ) {
        / / 코드
}
while (true) {
        / / 코드
}

 

 

예제) 1부터 시작하여 숫자를 계속 누적해서 더하다가 합계가 10보다 큰 처음 값은 얼마인가?

package loop;

public class Break22 {
    public static void main(String[] args) {
        int sum = 0;
        for(int i = 1 ; ; i++){
            sum = sum + i;
            if(sum>10){
                System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
                break;
            }
        }
    }
}

 

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

 

 

4. 중첩 반복문

반복문은 내부에 반복문을 또 만들 수 있다.

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는 2번 실행 (i = 0, 1일 때)
            for (int j = 0; j < 3; j++){
                System.out.println("-> 내부 for " + i + "-" + j);
            }                                       // 내부 for는 3번 실행 (j = 0, 1, 2일 때)
            System.out.println("외부 for 종료 i:" + i);
            System.out.println(); // 엔터
        }
    }
}

실행 결과

외부 for은 2번 실행, 내부 for은 3번 실행되어 총 2 x 3 = 6번의 내부 for 코드가 수행된다. (곱하기)

 


※ 향상된 for문(Enhanced For Loop) = for each문

향상된 for문 (=for each문)은 배열을 사용함에 있어서 for문보다 더 편리하게 사용할 수 있다.

for (①변수 : ②배열 또는 컬렉션) {
    // 배열 또는 컬렉션의 요소를 순회하면서 수행할 작업
}

②에 배열을 작성하고, ①에는 그 배열을 담을 변수를 작성한다.

 

//일반 for문
for (int i = 0; i < numbers.length; i++){
    int number = numbers[i];
    System.out.println(number);
}
//향상된 for문, for-each문
for (int number : numbers){
    System.out.println(number);
}
  • 향상된 for문은 배열의 인덱스를 사용하지 않고, 종료 조건을 두지 않아도 된다. 단순히 해당 배열을 처음부터 끝까지 탐색한다.
  • :의 오른쪽에 numbers와 같이 탐색할 배열을 선택하고, :의 왼쪽에 int number와 같이 반복할 때마다 찾은 값을 저장할 변수를 선언한다. 그러면 배열의 값을 하나씩 꺼내서 왼쪽에 있는 number에 담고 for문을 수행한다. for문의 끝에 가면 다음 값을 꺼내서 number에 담고 for문을 반복 수행한다. numbers 배열의 끝에 도달해서 더 값이 없으면 for문이 완전히 종료된다.
  • 향상된 for문(for each문)은 배열의 인덱스를 사용하지 않고도 배열의 요소를 순회할 수 있기 때문에 코드가 간결하고 가독성이 좋다.

+ Recent posts