본문 바로가기
PROGRAM/JAVA / JSP

for 반복문 중첩 빠져나오기 - break label

by ojava 2020. 4. 13.
반응형

다중 데이터 출력에도 사용되고, 여러 건의 데이터 검증 시에도 사용되는 반복문.

다양한 반복문 구문이 있지만 그 중에서도 가장 많이 사용하는 건 아무래도 for 반복문이 아닐까 싶다.

변수를 선언해서 원하는 만큼의 반복을 수행하기도 하고
List 내의 Element를 순차적으로 추출해서 바로 데이터를 사용하는 방식으로도 사용한다.

반복문은 아무래도 중첩해서 사용할 때, 그 진가를 발휘한다고 생각하는데
어쩌면 학부생 시절에 별 찍을 때부터 중첩 반복문을 지겹게 써봐서 그렇게 생각할 수도 있다.
(교수님.. 잘 지내시나요. 교수님도 요즘 사이버강의 하시려나 궁금합니다...☆)

 

 

break와 continue로만 반복문을 제어한다고 생각했는데, 중첩 반복문을 한 번에 빠져나오기 위한 신박한 방법이 있다는 걸 알게 되었다.

개발하다가 맞닥들인 문제를 해결하기 위해 혼자 공부하는 과정에서 알게된 것도 아니고, 이번에는 코드 인스펙션 과정에서 다른 개발자가 사용했던 구문을 보면서 새롭게 알게된 문법이다.

 

바로 레이블 (label) 이다.
앗, 이미 이 개념을 알고 있다면, 더 이상 이 포스팅을 볼 이유가 없다.

물론 html에도 label이 있지만, 그 태그는 아니고 반복문에서 사용할 수 있는 일종의 변수의 개념으로
break 혹은 continue와 같이 선언해주면 원하는 반복문으로 이동할 수 있다.

 

사용법은 간단하다.

1) 빠져나가길 원하거나 다시 시작하길 원하는 반복문 앞에 Label을 붙이자.

testExit: for(int i=0; i < 10; i++) {
(물론 가독성을 위해 testExit: 다음 줄로 넘어가서 반복문을 선언해도 된다.)

 

2) 중첩된 반복문 내부에서 break <label 명>; 또는 continue <label 명>; 을 사용한다.

본인이 원하는 조건에 도달하는 경우, 기존에 사용하던 방식대로 break, continue를 사용해준다.

 

3) 단, Label을 통해 이동하려면 break, continue보다 위에 선언되어 있어야 한다.

for문을 빠져나가서 그 밑에 선언해놓은 for문으로 점프하고 그런건 안된다 ^0^
일종의 변수이므로, 당연히 먼저 선언되어 있는 label로만 이동이 가능하다.

 

 

이해를 위해 간단한 예시를 들어보자.

1) 반복문 내에서 원하는 값이 나왔을 때, 더 이상의 반복을 수행하지 않고 종료하길 원할 때

// 해당 반복문의 이름을 지정하는 레이블을 준다.
searchDoubleNine:
for (int i=2; i < 10; i++) {
	System.out.println(i + "단 시작!");
    
	for (int j=1; j < 10; j++) {
    	int result = i*j;
        System.out.print(result + " ");

		if (result == 49) {
        	// 원하는 값을 찾았으니, 더 이상 반복문을 수행하지 않는다.
            // searchDoubleNine 이름의 반복문을 빠져나간다
        	break searchDoubleNine;
        }
	}
    System.out.println();
}

System.out.println("찾았다 49!");

 

이렇게 써놓고 보니, 중첩되지 않은 for 구문을 사용할 때는 레이블이 생략되었다고 보면 되겠다.

break; 의 형태로 사용할 때는 별도의 레이블 지정이 없기 때문에
감싸고 있는 바로 바깥쪽의 반복문만 빠져나간다고 생각하면 된다.

 

continue <label 명>의 형태로 사용할 수 있는 예시를 하나 더 들어보자.

2) 중첩 반복문 내의 특정 조건은 건너뛰고, 바깥에 선언한 반복문의 다음 단계부터 다시 시작할 때.

// 해당 반복문의 이름을 지정하는 레이블을 준다.
System.out.println("369 게임 시작! 단, 33, 66, 99가 나오면 다음 십의 자리로 넘어간다.");

checkTwins:
for (int i=0; i =< 10; i++) {
	for (int j=0; j < 10; j++) {
    	int result = i*10 + j;

        // 1의 자리 수가 3, 6, 9에 해당된다면
		if (j != 0 && j%3 == 0) {
			// [1] 33, 66, 99에 해당되는 대상이면 다음 십의 자리로 넘어간다.
			if (i == j) {
				continue checkTwins;
			}
			// [2] 1의 자리만 3, 6, 9라면 숫자를 세지 않고 다음 숫자로 넘어간다.
			continue;
		} else {
        	// 아무것도 해당되지 않으면 숫자를 센다.
			System.out.print(result + " ");
        }
	}
}

System.out.println("게임 끝!");

결과문을 생각해보면 다음과 같겠다. (eclipse도 안켜보고 이렇게 올려도 되나 ^_ㅜ)

1 2 4 5 7 8 10 11 12 14 15 ..... 30 31 32 40 41 42 44 .... 60 61 62 64 65 70 .....

 

 

처음에는 코드 인스펙에 시간이 너무 많이 들어서 앞으로 어떻게 해야 하나 생각했는데,
이렇게 하나씩 새로운 지식만 얻어갈 수 있다면 내게 중요하고 도움이 되는 시간임은 분명해진다.

내가 또 누군가에게 이렇게 쓰임새있는 꿀팁과 지식을 나눠줄 시간이 있기를!
이 블로그를 보는 당신에게도 정시퇴근을 위한 좋은 포스팅이 되었기를!

 

내가 하는 일을 좋아하고 즐거워해서 참 다행이다. 

반응형