Programming/Java

[Java] 반복문: for, while, do while

Isaac S. Lee 2023. 7. 24. 10:12

반복문을 이용하면 특정 코드를 개발자가 원하는 횟수만큼 반복 제어하여 생산성을 향상하고, 유지보수성을 향상시킬 수 있다.

반복문의 종류로는 for, while, do while, for(foreach)가 있다. 이때, foreach는 향상된 for문(Enhanced for statement)을 의미한다.

 

💡for문


for (초기식; 조건식; 증감식){
    문장;
}

for문은 초기식, 조건식, 증감식으로 구성되며 소괄호 안에 문장을 3개 넣을 수 있다.

반복문은 증감식을 만나면 반복문을 나오지 않고, 다시 초기식으로 돌아간다는 특징이 있다.

 

1. 초기식: 루프 변수(i)를 초기화한다.

2. 조건식: 루프 지속 유무를 결정한다.

3. 증감식: 루프 변수에 변화를 주는 역할을 한다. (언젠가 루프를 탈출할 수 있도록-false)

 

"안녕하세요" 문장을 3회 출력하는데 사용할 수 있는 방법을 살펴보며 반복문의 특성을 알아보도록 하자.

 

Case 1: 등짝을 맞는 방법

System.out.println("안녕하세요");
System.out.println("안녕하세요");
System.out.println("안녕하세요");

시간에 쫓길 때 사용할 수 있는 방법이다. 하지만 빨랐죠?

같은 목적을 가지고 있는 코드는 두 번 이상 사용하지 않는 것이 좋다.

 

Case 2: 메소드를 활용하는 방법

public static void main(String[] args) {
	hello();
	hello();
	hello();
}

public static void hello() {
    System.out.println("안녕하세요.");
}

메소드 호출을 반복함으로써 출력하며, 이 방법은 코드를 수정하기에 용이하다는 장점이 있다.

하지만 위의 과정을 for문으로 작성하여 더욱 단순하게 하는 것이 가능하다.

 

Case 3: 반복문을 활용하는 방법

for(int i = 1; i <= 3; i++) {
    System.out.println("안녕하세요.");
}

1. 초기식: 메모리에 i라는 변수를 만들고 1로 초기화한다.

2. 조건식: i가 3보다 작거나 같은지 검사한다.

3. 문장: 블럭(문장)을 실행한다.

4. 증감식: i에 1을 더해 저장한다.

(초기식은 처음 한 번만 실행된다.)

 

for문은 위 과정을 반복하며 "안녕하세요" 문장을 3회 출력한다.

 

for문의 다양한 사용

for (int i = 1; i <= 5; i++) {
    System.out.println("실행문");
}
System.out.println("");

for (int i = 5; i <= 9; i++) {
    System.out.println("실행문");
}
System.out.println("");

for (int i = 1; i <= 9; i = i + 2) {
    System.out.println("실행문");
}
System.out.println("");

for (int i = 5; i > 0; i--) {
    System.out.println("실행문");
}
System.out.println("");

위의 4가지 for문은 모두 다른 방법이지만, 출력하는 건 같다.

통상적으로 1식 증가하는 for문을 많이 사용하긴 하지만, 필수는 아니므로 상황에 따라서 적절하게 사용하면 된다. 그리고 증감식에서 꼭 ++를 사용할 필요 또한 없다.

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

for문은 수열 등을 표현할 때, 내가 원하는 숫자의 패턴 값을 수월하게 공급받기 위해 사용할 수 있다.

단순히 for문을 돌리는 게 중요한 게 아니라 내가 원하는 패턴 값을 만드는 게 훨씬 중요하다.

 

따라서 for문은 아래의 두 가지 목적으로 사용한다는 것을 알 수 있다.

1. 원하는 횟수 만큼 반복하는 목적

2. 원하는 패턴대로 루프 변수 값을 얻는 목적

 

무한루프 Infinite Loop

int sum = 0; // 누적 변수
int num = 0; // 입력

Scanner scan = new Scanner(System.in);

// 무한루프
for (;;) {

    System.out.print("숫자: ");
    num = scan.nextInt();

    if (num % 2 == 0) { // 짝수 입력시 종료
        break;
    }
    sum += num;
}
System.out.println(sum);

회전수를 예측하기 힘들 때 무한루프를 사용한다.

위 소스코드는 사용자의 숫자 입력을 누적하여 저장하되, 짝수를 입력하면 루프를 종료한다.

 

다중 for문

// 대회전 (시침)
for (int i = 0; i < 10; i++) {
    // 중회전 (분침)
    for (int j = 0; j < 10; j++) {
        // 소회전 (초침)
        for (int k = 0; k < 10; k++) {
            // 실행문
            
            if (j == 5) {
            	break;
            }
            
            System.out.printf("i: %d, j: %d, k: %d\n", i, j, k);
            
        }
    }
}

for문은 2중, 3중으로도 사용이 가능하며, 시침, 분침, 초침으로 생각하면 이해하기 쉽다.

위의 3개의 for문은 단지 겹쳐놓은 것임으로, k를 선언한 for문 내에서 break문을 만나더라도 모든 반복문을 나가는 게 아니라 해당 break문을 포함하고 있는 1개의 반복문(k루프)만을 나가게 된다.

 

💡while문


while (조건식) {
    문장;
}

while은 조건식을 만족하면 다시 올라가 실행하며, if를 반복하는 구조라고 생각하면 편하다.

조건을 만족하지 않으면 반복문을 빠져나온다.

 

for문과 while문의 공통점

for (int i = 1; i <= 10; i++) { // 초기식, 조건식, 증감식
    System.out.println(i);
}
System.out.println();


int num = 1; // 초기식
while (num <= 10) { // 조건식
    System.out.println(num);
    num++; // 증감식
}

위의 for문과 while문 모두 1 ~ 10까지 출력하는 코드이다.

따지자면 for문과 while문은 같다고 할 수 있다. while문도 for문과 같이 초기식, 조건식, 증감식을 필요로 하기 때문이다.
다만 for문은 양식이 정해진 딱딱한 코드라고 하면, while문은 그보다 유연한 코드라고 할 수 있다. 초기식, 증감식에 정해진 위치가 없으므로 while문이 for문보다 활용이 용이하다.

 

💡do while문


do {
    문장;
} while (조건식);

while문은 선조건 후조건인 반면, do while문은 선실행 후조건이다.

do while문은 조건식이 false라고 하더라도 조건과 상관없이 처음은 무조건 실행한다.
do while문을 이용하는 작업이 많이 없기 때문에 자연스럽게 도태되었다.