[Java] 자바의 정석 4장 회고 - 반복문

토닉·2021년 8월 25일
0

Java

목록 보기
5/13
post-thumbnail

반복문

특정 코드가 반복되서 사용되어야 할 때 사용됩니다.

반복문의 종류
1. for
2. while
3. do-while

for

보통 반복 횟수를 사용자가 지정해줄 때 사용
예를 들어 hello world 라는 문구를 5번 출력하기 위한 코드를 작성해보면

public static void main(String[] args){
    System.out.println("hello world");
    System.out.println("hello world");
    System.out.println("hello world");
    System.out.println("hello world");
    System.out.println("hello world");
}

위 코드처럼 작성됩니다. 같은 코드가 5번 반복되기 때문에 우리는 반복문을 사용하면 보다 편리하게 작성할 수 있습니다.

public static void main(String[] args){
    for (int i=1; i<=5; i++){
    	System.out.println("hello world");
    }
}

풀이하자면
첫번째 인자(초기화) int i=1;은 코드가 실행할 때 딱 한번 선언하고 실행하는 코드입니다.
두번째 인자(조건식) i<=5;은 for문의 {}블럭이 끝까지 다 실행 후 두번째 인자안의 조건식을 실행하여 true값이면 {}블럭 코드를 실행, false 이면 반복을 종료한다는 뜻입니다.
세번째 인자(증감식) i++;은 for문의 {}블럭이 끝까지 다 실행 후 바로 실행되는 코드로 두번째 인자의 조건식이 실행되기 전에 실행됩니다.

선언된 i 변수는 {} 안에서만 사용할 수 있습니다.

public static void main(String[] args){
    for (int i=1; i<=5; i++){
    	System.out.println(i);
    }
    // System.out.println(i); -- 에러
}

초기화, 조건식, 증감식은 생략이 가능합니다. 이 때는 무한 반복문이 됩니다.

public static void main(String[] args){
    for (;;){
    	System.out.println("hello world");
    }// 무한 반복해서 hello world  출력
}

이 때는 조건식(if)과 break문을 {}블럭안에 넣어 반복을 빠져 나올 수 있게 해주어야 합니다.

public static void main(String[] args){
    int i = 0;
    for (;;){
    	if (i > 5){
            break;
        }
    	System.out.println("hello world");
        i++;
    }
}

이렇게 작성하고 싶을 때는 for문보다 while문이 더 적합합니다.

while

조건이 만족할 때까지 반복하고 싶을 때 사용
보통 반복의 횟수가 정해지지 않고 조건에 따라 프로그램의 순서를 제어하고 싶을 때 사용됩니다.

public static void main(String[] args){
    int i = 0;
    while (i <= 5){ // i 가 5보다 크면 반복문 탈출!
    	System.out.println("hello world");
        i++;
    }
}
public static void main(String[] args){
    int i = 0;
    while (true){
    	if (i > 5){ // i가 5보다 크면 반복문 탈출!
            break;
        }
    	System.out.println("hello world");
        i++;
    }
}

이 코드는 위 for문과 동일한 결과를 출력합니다.
while의 인자에는 조건식만 들어갑니다.
이 때 주의할 점은 while문을 사용할 때는 꼭 반복을 빠져나오게 하는 코드(break)나 조건식이 false가 되는 코드를 {}안에 작성해주어야 합니다.

break / continue

break: 해당 블럭의 반복문 탈출!
continue: for문일 경우 증감식으로 이동하고, while문일 경우 조건식으로 이동

public static void main(String[] args){
    int i = 0;
    while (true){
    	if (i > 5){ // i가 5보다 크면 반복문 탈출!
            break;
        }else if (i == 2){ // i가 2일 땐 while의 true 조건식으로 이동
            continue;
        }
    	System.out.println(i);
        i++;
    }
}
>> 0
>> 1
>> 3
>> 4
>> 5

위 코드처럼 break문은 더이상 반복을 하고 싶지 않을 때 사용하고 continue는 다음 코드를 실행하지 않고 다시 조건문의 처음 실행과정을 반복하고 싶을 때 사용합니다.

2중 반복문

반복문은 2중으로 사용이 가능합니다.

  • for문 블럭에 for문 작성
  • while문 블럭에 while문 작성

3중, 4중도 가능하지만 프로그램의 실행 속도에 영향을 미칠 수 있기 때문에 가급적이면 피하는게 좋습니다.

대표적인 예시로 구구단이 있습니다.

public static void main(String[] args){
   for(int i=1; i<=9; i++){
       for(int j=1; j<=9; j++){
           System.out.printf("%d * %d = %d%n", i, j, i*j);
       } 
   }
}

실행 순서를 보면
1. i가 1일 때 j가 1~9까지 반복 실행되고 바깥 for문의 증감식i++이 실행됩니다.
2. i는 2가 되고 다시 j가 1~9까지 반복 실행되고 바깥 for문의 증감식이 실행됩니다.
3. 이를 반복하면 바깥쪽 for문이 9번 반복할 때 안쪽 for문은 81번 반복되는 것을 알 수 있습니다.

시간 복잡도
알고리즘에서 보통 시간 복잡도에 신경을 쓰게 되는데 특히 for, while 문과 같은 반복문의 사용을 줄이려고 노력합니다.
반복문의 시간 복잡도: O(N)
예를 들어 100,000번의 for 반복문이 있다고 했을 때 이 for문의 시간 복잡도는 100000번을 하게 됩니다.
만약 똑같은 횟수의 for문이 2중으로 작성되었다면
100000 * 100000 = 10000000000 으로 총 10억번입니다.
이는 프로그램에 무리가 갈 수 있기 때문에 2중 반복문으로 작성하는 것을 되도록 피하려고 노력해야합니다.

이름 붙은 반복문

반복문에는 변수로 명명을 하는 것처럼 이름을 붙일 수 있습니다.
이름을 붙이는 이유는 2중 반복문 처럼 반복문이 여러번 사용했을 때 break와 continue문을 햇갈리지 않고 사용하기 위해서입니다.

public static void main(String[] args){
   outer:
   for(int i=1; i<=9; i++){
       inner:
       for(int j=1; j<=9; j++){
           if (i == 5){
               break outer;
           }else if (j == 5){
               break inner;
           }
           System.out.printf("%d * %d = %d%n", i, j, i*j);
       } 
   }
}
// 4*4까지 반복하는 구구단

바깥쪽 for문은 outer, 안쪽 for문은 inner라고 명명했습니다.
만약에 안쪽 for문에서 특정한 조건이 있을 때 바깥쪽 for문까지 반복을 벗어날려면 어떻게 해야할까요?
위 처럼 break문 뒤에 탈출하고 싶은 반복문에 이름을 작성해주면 됩니다.
break inner;는 그냥 break로 작성해도 좋습니다.

배열 순회(for 활용)

배열의 값들을 순회할 때 for문을 활용한 2가지 방법이 있습니다.

public static void main(String[] args) {
	int[] arr2 = {1,2,3,4,5}; // 배열의 값들을 직접 설정
        for (int i=0; i < arr2.length; i++){
		System.out.println("i = " + i);
	}
	for (int i : arr2){
		System.out.println("i = " + i);
	}
}
profile
우아한테크코스 4기 교육생

0개의 댓글