본문 바로가기
BACK-END/JAVA

중첩 for문 탈출하기

by 썬키 2022. 12. 22.

중첩 for문이 하나 있다고 가정하자.

for(int i=0; i<10; i++) {
	System.out.println(i);
    for(int j=0; j<5; j++) {
    	System.out.println(\tj);
        if(i == 5 && j == 4) {
        	break;
        }
    }
}

i의 값이 5이면서 j의 값이 4일 때, 모든 for문이 종료되는 것을 기대했다.

 

 

 

하지만, 위의 코드를 실행해보면 아래와 같은 결과를 얻게 된다.

i = 0
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7
i = 1
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7
i = 2
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7
i = 3
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7
i = 4
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7
i = 5
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
i = 6
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7
i = 7
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7
i = 8
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7
i = 9
	j = 0
	j = 1
	j = 2
	j = 3
	j = 4
	j = 5
	j = 6
	j = 7

고로, for문 안의 for문이 종료되고 i의 값이 증감된 상태로 다시 for문을 실행하게 된다.

기댓값을 얻기 위해서는 2가지의 방법이 존재한다.

 

1) Loop수에 맞춰서 break 걸기

boolean b = false;

for(int i=0; i<10; i++) {
	System.out.println(i);
    for(int j=0; j<5; j++) {
    	System.out.println(\tj);
        if(i == 5 && j == 4) {
        	b = true;
        }
        if(b) {
        	break;
        }
    }
    if(b) {
    	break;
    }
}

코드의 복잡성을 낮추기 위해서 boolean타입의 변수 b를 지정해서 false로 초기화한다.

내가 원하는 시점에 b의 값을 true로 변경해서 b의 값이 true이면 break 하도록

안에 for문과 밖에 for문에 코드를 작성한다.

 

하지만, 이 방법은 for문이 많아지면 코드가 복잡해지기 때문에 다음 방법을 이용하는게 편리하다.

 

2) for문에 라벨 달아주기

loopout : for(int i=0; i<10; i++) {
			System.out.println("i = " + i);
			
			for(int j=0; j<8; j++) {
				System.out.println("\tj = " + j);
				
				if(i == 5 && j == 4) {
					break loopout;
				}
			}
		}

for문이 맨 처음 실행되는 구간에 라벨을 붙여준다.

필자는 loopout이라는 이름으로 붙여줬는데 이 라벨명은 변수명처럼 각자가 원하는대로 붙여주면 된다.

위의 코드에서는 i가 5이면서 j가 4인 시점에 break loopout을 만나 반복문을 빠져나오는데

loopout이라는 라벨이 붙은 반복문을 빠져 나오는것이므로 for문 전체를 빠져나오게 된다.

 

 

댓글