Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
JAVA/Java Start

5. 반복문 (while, for, continue/break)

by Toughie 2024. 1. 20.

While

while (조건식) {
// 조건식이 true인 경우에만 코드블럭 내 코드가 실행된다.
}

// java에서는 if, While 등 조건식은 무조건 소괄호로 감싸줘야함.
// Swift에서는 소괄호 안 쓰는 경우도 많았는데 자바는 필수였고,
// 코틀린은 안 써도 되지만 자바에서 습관 때문에 보통 붙이는듯

 

public class While1_1 {

    public static void main(String[] args) {

        int count = 0;

        count = count +  1;
        System.out.println("count = " + count);
        count++;
        System.out.println("count = " + count);
        count += 1;
        System.out.println("count = " + count);
    }
}

위 코드와 같이 동일한 작업을 여러번 반복해야 하는 경우에 반복문을 사용하면 효율적으로 변경할 수 있다.

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

        while (count < 3) {
            count++;
            System.out.println("현재 count는 " + count);
        }
    }
}

리터럴값 하드코딩 대신 변수를 활용해보면 아래와 같은 코드도 가능하다.

public class While1_3 {
    public static void main(String[] args) {
        int sum = 0;
        int startNum = 1;
        int endNum = 5;

        while (startNum <= endNum) {
            sum += startNum;
            System.out.println("합계는 = " + sum + ", startNum은 " + startNum + "입니다.");
            startNum += 1;
        }
    }
}

 


Do While

조건식 검사부터 하는 것이 아니라 일단 한 번 실행하고(do) 조건식을 검사한다. 

반복문을 돌리긴 돌릴건데 한 번이라도 코드 실행이 필요한 경우에 사용한다. (잘 못 보긴 했지만..)

public class DoWhile1 {

    public static void main(String[] args) {
        int a = 10;
        while (a < 3) {
            System.out.println("false이므로 출력하지 않습니다.");
        }

        //최초 한 번은 코드 블럭을 꼭 실행해야 하는 경우에 do_while문 사용
        do {
            System.out.println("현재 숫자는 = "+ a);
            a += 1;
        } while (a < 3);
    }
}

Break

반복문은 기본적으로 종료 조건을 설정해줘야한다.

break를 만나면 루프문을 탈출한다.

public class Break1 {

    public static void main(String[] args) {
        int sum = 0;
        int i = 1;
        
        // 조건식이 항상 참이기 때문에 break가 없으면 무한 루프가 발생함.
        while (true) {
            sum += i;
            if (sum > 10) {
                System.out.println("처음으로 10보다 높은 합계는." + sum + "마지막으로 더한 i는 " + i);
                break;
            }
            i += 1;
        }
    }
}

Continue

continue를 만나면 아래 코드는 실행하지 않고(무시하고) 다시 반복문 조건식을 확인한다.

탈출은 아니고, 다음 루프로 바로 이동하는 것.

public class Continue {

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

        while (i <= 5) {
            // 3만 출력 제외하기
            if (i == 3) {
                i++;
                continue;
            }
            //continue를 만나면 아래 코드는 실행되지 않음
            System.out.println("현재 i는 = " + i);
            i++;
        }
    }
}

For 

반복횟수가 한정되어 있는 경우 더 깔끔하게 코드를 작성할 수 있는 for문

for (초기식; 조건식; 증감식) {
// 조건식이 true인 경우에 실행되는 코드
}

for문의 실행 순서

1. 조건식의 실행 (반복 횟수와 관련된 변수를 선언하고 초기화 할 때 사용함) 초기식은 딱 1번만 사용된다.

2. 조건식의 검증(조건식이 true인 경우 코드를 실행하고, 거짓이면 for문을 빠져나간다.)

3. 스코프 내 코드를 실행한다.

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

5. 다시 조건식을 판단한다. (조건식이 false가 될 때 까지)

 

public class For1 {

    public static void main(String[] args) {

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

while문으로도 완전 동일하게 코드를 작성할 수 있지만

for문의 경우에는 시작변수 초기화, 조건식, 증감식까지 한 줄에 작성할 수 있기 때문에 더욱 깔끔하다.

(while문은 조건식만 작성 가능하고, 초기변수는 따로 초기화 해주고 증감코드는 스코프 내부에 작성했던 것을 참고)

public class For2 {

    public static void main(String[] args) {

        int sum = 0;
        int endNum = 10;

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

직관적이지는 않지만, 아래와 같이 while문처럼 동작하도록 할 수도 있다.

public class Break2 {

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

        //초기식,조건식,증감식은 optional 세미콜론만 쓰면 for(true)와 같다.
        for(;;) {
            sum += i;
            if(sum > 10) {
                System.out.println("합이 10보다 크면 종료합니다 i = " + i + " sum = " + sum);
                break;
            }
            i++;
        }
    }
}
    //초기식과 증감식을 for 문에서 작성하는 경우
    
    public static void main(String[] args) {
        int sum = 0;

        //초기식,조건식,증감식은 optional 세미콜론만 쓰면 for(true)와 같다.
        for(int i= 1; ;i ++) {
            sum += i;
            if(sum > 10) {
                System.out.println("합이 10보다 크면 종료합니다 i = " + i + " sum = " + sum);
                break;
            }
        }
    }

* i를 전역변수로 선언하느냐, 지역변수로 선언하느냐의 차이가 있음.


중첩 반복문(Nested Loop)

반복문 안에 반복문 안에 반복문 안에 반복문을 반복해서 쓸 수 있다.

물론 반복문이 너무 중첩되면 가독성이 떨어져서 지양해야 한다고 생각함..

public class Nested1 {

    public static void main(String[] args) {

        for (int i = 0; i < 2; i++) {
            System.out.println("외부 for문 " + i + "를 시작합니다.️");
            for (int j = 0; j < 3; j++) {
                System.out.println("    내부 for문 " + i + "-" + j + "번을 시작합니다.");
            }

            System.out.println("외부 for 문 " + i + "번이 종료되었습니다.");
            System.out.println();
        }
    }
}

tip: 맥에서 개행 정리는 command + option + L이다. (Xcode에서 command + i 와 같은 기능)

 

 

명확히 정해진 횟수만큼 반복을 수행하고자 하면 for문을 선택해 보고,

조건이 복잡해지는 경우에는 while문을 고려해보자.


예시문제

10개의 짝수 출력하기

class WhileAnswer {
    public static void main(String[] args) {
        int num = 2;
        int count = 0;
        while (count < 10) {
            System.out.println(num);
            num += 2;
            count += 1;
        }
    }
}
class ForAnswer {
    public static void main(String[] args) {
        int num = 2;
        for (int count = 0; count < 10; count++) {
            System.out.println(num);
            num += 2;
        }
    }
}

 

구구단 출력하기

class multiplicationTables {
    public static void main(String[] args) {
        for (int i = 2; i < 10; i++) {
            System.out.println(i+" 단 시작합니다.");
            for (int j = 1; j < 10; j++) {
                System.out.println(i + " X " + j + " = " + i * j);
            }
            System.out.println();
        }
    }
}

 

단순 별찍기

class Stars {
    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();
        }
    }
}

 

피라미드별찍기

class PyramidStars {
    public static void main(String[] args) {
        int height = 5;
        for (int i = 1; i <= height; i++) {
        //공백 출력
            for (int j = 1; j <= height - i; j++) {
                System.out.print(" ");
            }
            // 별 출력
            // 1층은 1개, 2층은 3개, 3층은 5개와 같이 피라미드의 각 층에 별은 홀수개임
            for (int k = 1; k <= 2 * i - 1; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

 

 

학습 출처

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음