본문 바로가기

Studying/JAVA

[JAVA]_Loop Statement(반복문)

1. 반복문

- 특정 코드를 반복해서 실행할 때 사용.

- 종류 : while, do-while, for

 

package loop;

public class While1_1 {
    public static void main(String[] args) {

        int count = 0;

        count += 1;
        System.out.println("현재 숫자는 : " + count);
        count += 1;
        System.out.println("현재 숫자는 : " + count);
        count += 1;
        System.out.println("현재 숫자는 : " + count);
        
        // 개선
        count += 1 대신 count++로 작성하는 것이 더 편할 수 있음.
    }
}

[While1_1]

 

위에 코드를 보면 반복문이 필요한 이유를 알 수 있음.

1을 한 번씩 더해서 총 3번 더하는 간단한 코드임.

하지만 더해야 하는 숫자가 커질수록 직접 작성해야 하는 코드의 수가 길어질 수 있는 불편함이 있음.

 

이렇게 특정 코드를 반복해서 실행할 때 사용하는 것이 '반복문'임.


package loop;

public class While1_2 {
    public static void main(String[] args) {

        int count = 0;

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

[While1_2]

 

while문을 사용하면 코드를 간단하게 작성할 수 있음.

 

설명 :

while(count < 3)에서 코드 블럭을 반복 실행하고,

count의 값이 1, 2, 3으로 점점 커지다가 결국 count < 3이 거짓이 되면서 while문 빠져나옴. 


package loop;

public class While2_1 {
    public static void main(String[] args) {

        int sum = 0;
        sum += 1;
        System.out.println("i = " + 1 + ", sum = " + sum);

        sum += 2;
        System.out.println("i = " + 2 + ", sum = " + sum);

        sum += 3;
        System.out.println("i = " + 3 + ", sum = " + sum);
    }
}

[While2_1]

 

문제 : 1부터 하나씩 증가하는 수를 3번 더하는 코드 작성.

 

while문을 사용하지 않으면 하나씩 코드를 작성하며, 숫자를 바꿔야 함.

이 코드도 정답이 맞지만, 변경에 유연하지 않는 단점이 있음.

예를 들어 10부터 하나씩 증가하는 수를 3번 더하는 코드로 바꿔야 한다면, 코드를 많이 수정해야 함.


package loop;

public class While2_2 {
    public static void main(String[] args) {

        int sum = 0;
        int i = 1;

        sum += i;
        System.out.println("i = " + i + ", sum = " + sum);
        i++;

        sum += i;
        System.out.println("i = " + i + ", sum = " + sum);
        i++;

        sum += i;
        System.out.println("i = " + i + ", sum = " + sum);
    }
}

[While2_2]

 

While2_1이랑 다른 것이 변수를 사용한 것.

변수 i를 사용함으로써 i의 값만 변경하면 나머지 코드를 변경하지 않아도 됨.

 

좋은 코드인지 아닌 코드인지에 대해서는 변경 사항이 발생했을 때 알 수 있음.

변경 사항이 발생했을 때 변경해야 하는 부분이 적을수록 좋은 코드임.


package loop;

public class While2_3 {
    public static void main(String[] args) {

        int i = 1;
        int endNum =3;
        int sum = 0;

        while(i <= endNum) {
            sum += i;
            System.out.println("i = " + i + ", sum = " + sum);
            i++;
        }
    }
}

[While2_3]

 

문제 : i부터 하나씩 증가하는 수를 endNum(마지막 수)까지 더하는 코드 작성.

 

while문의 조건을 endNum(마지막 수)까지 하여 코드 블럭을 실행하게 만듦.


package loop;

public class DoWhile1 {
    public static void main(String[] args) {

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

[DoWhile1]

 

i = 10이기 때문에 while(i  < 3) 조건식은 거짓이 되어 출력되지 않음.


package loop;

public class DoWhile2 {
    public static void main(String[] args) {

        int i = 10;

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

[DoWhile2]

 

do-while문

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

 

예를 들어 조건에 만족하지 않아도 한 번은 현재 값을 출력하고 싶을 때 사용할 수 있음.

do-while문은 최초 한 번 실행되므로 현재 숫자 i의 값인 10이 출력하게 됨.

후에 코드 블럭을 실행한 후 조건식을 검증하는데 i = 11이기 때문에 while(i < 3) 조건식은 거짓이 되어 do-while문은 빠져나옴.


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

[Break1]

 

break- 반복문을 즉시 종료하고 나감.

- 반복문에서 많이 사용됨.

- 문법 :

      while(조건식) {

          코드1;

          break;   // 즉시 while문 종료로 이동.

          코드2;

     }     // while문 종료

 

문제 : 1부터 시작해서 숫자를 계속 누적해서 더하다가 합계가 10보다 처음으로 큰 값은 얼마인지 코드 작성.

 

조건식을 잘 보면 true라고 되어 있는데, 조건이 항상 참이기 때문에 이렇게 두면 while문은 무한 반복하게 됨.

break을 사용해서 while문을 빠져나가게 되는 것임.


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

 

[Continue1]

 

continue

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

- break와 마찬가지고 반복문에서 많이 사용.

- 문법 :

     while(조건식) {

          코드1;

          continue;   // 즉시 조건식으로 이동

          코드2;

     }

 

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

 

문제 : 1부터 5까지 숫자를 출력하는데, 숫자가 3일 때는 출력을 건너뛰는 코드 작성.

 

i == 3인 경우 i를 하나 증가하고 continue를 실행. 따라서 이 경우 i를 출력하지 않고 바로 while의 조건식으로 이동하는 코드.


package loop;

public class For1 {
    public static void main(String[] args) {

        for(int i = 1; i <= 10; i++) {
            System.out.println(i);
        }
    }
}

[For1]

 

for- while문과 같은 반복이고, 코드를 반복 실행하는 역할을 함.

- for문은 주로 반복 횟수가 정해져 있을 때 사용.

- 문법 :

     for (1.초기식; 2.조건식; 4.증감식) {

          // 3.코드

     }

1. 초기식이 실행. 주로 반복 횟수와 관련된 변수 선언하고 초기화할 때 사용. 초기식은 딱 1번 사용.

2. 조건식을 검증. 참이면 코드 실행하고, 거짓이면 for문 빠져나옴.

3. 코드 실행.

4. 코드 종료되면 증감식 실행. 주로 초기식에 넣은 반복 횟수와 관련된 변수의 값을 증가할 때 사용.

5. 다시 2.조건식부터 시작(무한반복) : 2 - 3 - 4

 

위에 코드를 보면 1부터 10까지 출력하는 for문.


package loop;

public class For2 {
    public static void main(String[] args) {

        int sum = 0;
        int endNum = 3;

        for(int i = 1; i <= endNum; i++) {
            sum += i;
            System.out.println("i = " + i + ", sum = " + sum);
        }
    }
}

[For2]

 

문제 : i부터 하나씩 증가하는 수를 endNum(마지막 수)까지 더하는 코드 작성.

 

While2_3(while문)보다 for문이 더 깔끔한 이유는 for문은 규칙적으로 한 줄에 모두 들어있어 코드를 이해하기 더 쉬움.

특히 반복을 위해 값이 증가하는 카운터 변수를 다른 부분과 명확하게 구분할 수 있음.


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

[Break2]

 

for문

- for( ; ;) { // 코드 }

- 조건 없이 작성할 수 있음. 이럴 때는 무한 반복하는 코드가 됨.

- while(true) { // 코드 }랑 같은 코드가 됨.

 

문제 : 1부터 시작하여 숫자를 계속 누적해서 더하다가 합계가 10보다 큰 처음 값은 얼마인지 코드 작성.

 

for( ; ; )를 보면 조건식이 없는데 무한으로 반복하며, break를 사용해서 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;
            }
        }
    }
}

[Break3]

 

for문은 증가하는 값이 무엇인지 초기식과 증감식을 통해서 쉽게 확인 가능.

따라서 i를 for문에 넣어서 관리하도록 변경하면 더 깔끔한 코드가 됨.

 

즉, for문 없이 while문으로 모든 반복을 다룰 수 있음.

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


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문 : 2번
        내부 for문 : 3번
        2 * 3 = 6번의 코드가 수행.
         */
    }
}

[Nested1]

 

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


1-1. 반복문 예제

1
2
3
4
5
6
7
8
9
10
package loop.ex;

public class WhileEx1 {
    public static void main(String[] args) {

        int count = 1;
        while(count <= 10) {
            System.out.println(count);
            count++;
        }
    }
}
package loop.ex;

public class ForEx1 {
    public static void main(String[] args) {

        for(int count = 1; count <= 10; count++){
            System.out.println(count);
        }
    }
}

[WhileEx1, ForEx1]

 

문제 : 자연수 출력

처음 10개의 자연수를 출력하는 프로그램을 작성.

이때 count라는 변수 사용.


2
4
6
8
10
12
14
16
18
20
package loop.ex;

public class WhileEx2 {
    public static void main(String[] args) {

        int num  = 2;
        int count = 1;
        while(count <= 10) {
            System.out.println(num);
            num += 2;
            count++;
        }
    }
}
package loop.ex;

public class ForEx2 {
    public static void main(String[] args) {

        int num = 2;
        for(int count = 1; count <= 10; count++) {
            System.out.println(num);
            num += 2;
        }
    }
}

[WhileEx2, ForEx2]

 

문제 : 짝수 출력

반복문 사용하여 처음 10개의 짝수를 출력하는 프로그램 작성.

num이라는 변수 사용.


// max = 1
1

// max = 2
3

// max = 3
6

// max = 100
5050
package loop.ex;

public class WhileEx3 {
    public static void main(String[] args) {

        int max = 100;
        int sum = 0;
        int i = 1;

        while(i <= max) {
            sum += i;
            i++;
        }
        System.out.println(sum);
    }
}
package loop.ex;

public class ForEx3 {
    public static void main(String[] args) {

        int sum = 0;
        int max = 100;

        for(int i = 1; i <= max; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
}

1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
...
9 * 9 = 81
package loop.ex;

public class NestedEx1 {
    public static void main(String[] args) {

        for(int i = 1; i < 10; i++) {
            for(int j = 1; j < 10; j++) {
                System.out.println(i + " * " + j + " = " + i * j);
            }
        }
    }
}

[NestedEx1]

 

문제 : 구구단 출력.

중첩 for문을 사용해서 구구단 완성하는 코드 작성.


// rows = 2
*
**

// rows = 5
*
**
***
****
*****
package loop.ex;

public class NestedEx2 {
    public static void main(String[] args) {

        int rows = 5;

        for(int i = 1; i <= rows; i++) {
            for(int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

[NestedEx2]

 

문제 : 피라미드 출력.

int rows를 선언하여 수만큼 피라미드를 출력.


2. 정리

 

○ for문

   ▷ 장점

      - 초기화, 조건체크, 반복 후의 작업을 한 줄에서 처리할 수 있어 편리.

      - 정해진 횟수만큼의 반복을 수행하는 경우에 사용하기 적합.

      - 루프 변수의 범위가 for 루프 블록에 제한되므로, 다른 곳에서 이 변수를 실수로 변경할 가능성이 적음.

 

   ▷ 단점

      - 루프의 조건이 루프 내부에서 변경되는 경우, for 루프는 관리하기 어려움.

      - 복잡한 조건을 가진 반복문을 작성하기에는 while문이 더 적합할 수 있음.

 

○ while문

   ▷ 장점

      - 루프의 조건이 루프 내부에서 변경되는 경우, while 루프는 이를 관리하기 쉬움.

      - for 루프보다 더 복잡한 조건과 시나리오에 적합.

      - 조건이 충족되는 동안 계속해서 루프를 실행하며, 종료 시점을 명확하게 알 수 없는 경우에 유용.

 

   ▷ 단점

      - 초기화, 조건체크, 반복 후의 작업이 분산되어 있어 코드를 이해하거나 작성하기 어려울 수 있음.

      - 루프 변수가 while 블록 바깥에서도 접근 가능하므로, 이 변수를 실수로 변경하는 상황이 발생할 수 있음.

 

즉, 정해진 횟수만큼 반복을 수행해야 하면 for문을 사용하고, 그렇지 않으면 while문을 사용.

(무조건 그렇다는 정답이 아닌 기준으로 삼는 정도로 이해하자.)

'Studying > JAVA' 카테고리의 다른 글

[JAVA]_Casting(형변환)  (0) 2024.12.03
[JAVA]_Scope(스코프)  (0) 2024.12.03
[JAVA]_Conditional Statement(조건문)  (2) 2024.11.29
[JAVA]_Operator(연산자)  (1) 2024.11.26
[JAVA]_Variable(변수)  (0) 2024.11.23