자바 코드에서 "loop :". 이것은 무엇이며 왜 컴파일됩니까?


113

이 코드는 몇 분 동안 내 화면을 응시하게 만들었습니다.

loop:
for (;;) {
    // ...
}

( 여기 137 행 )

나는 이것을 전에 본 적이 없으며 Java에 "루프"키워드가 있다는 것을 전혀 몰랐으며 (NetBeans는 키워드처럼 색상을 지정하지도 않음) JDK 6으로 잘 컴파일됩니다.

설명은 무엇입니까?

답변:


205

그것은 아니다 keyword그것이이다 label.

용법:

    label1:
    for (; ; ) {
        label2:
        for (; ; ) {
            if (condition1) {
                // break outer loop
                break label1;
            }
            if (condition2) {
                // break inner loop
                break label2;
            }
            if (condition3) {
                // break inner loop
                break;
            }
        }
    }

문서 .


19
OP가 goto / label 개념에 익숙하지 않을 수 있으므로 매우 특별한 상황 (예 : 여러 중첩 루프 바로 가기)을 제외하고는 일반적으로 나쁜 관행으로 간주됩니다.
haylem

10
@haylem 사실이지만 더 나아갈 것입니다. 여러 중첩 루프도 일반적으로 나쁜 습관입니다. 루프 레이블을 사용할 때마다 결국 코드를 ​​리팩토링하여 필요하지 않게되었습니다. 그것보다 항상 더 나은 방법이 있습니다.
Sean Patrick Floyd

73

다른 포스터가 말했듯이 키워드가 아니라 레이블입니다. 레이블을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}

이것은 외부 루프를 끊을 수 있습니다.

문서 링크 .


31

질문에 대한 답이 있지만 참고로 다음과 같습니다.

"이 Java 코드가 유효한 이유는 무엇입니까?"라는 인터뷰 질문에 대해 들었습니다. (더 간단한 예를 제거했습니다. 여기에 더 비열한 것, Tim Büthe가 있습니다) :

url: http://www.myserver.com/myfile.mp3
downLoad(url);

이 코드가 무엇인지 알고 계십니까?

솔루션 : 두 개의 레이블, url및 레이블 과 동일한 이름 ( ) 을 가진 매개 변수를 사용하여 http주석 www.myserver.com/myfile.mp3및 메소드 호출 url. 예, 이것은 컴파일됩니다 (다른 곳에서 메서드 호출과 지역 변수를 정의한 경우).


참고로 루프가 필요하지 않습니다. 다음 줄로 충분합니다
Tim Büthe

상기시켜 주셔서 감사합니다. 질문에 루프가없는 것 같습니다. 나는 내 대답 (나는이 질문을하지 않았다하지만 면접관은 내 전 동료였다) 편집 할 수 있습니다
숀 패트릭 플로이드

16

그것은 키워드가 아니라 레이블입니다. 중첩 루프 내 에서 breakcontinue키워드 와 함께 사용됩니다 .

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}

inner라벨은, 여기에 쓸모가 break;있다 충분한
gertas

12
루프를 끊는 두 가지 방법이 있다면 inner명확성을 위해 레이블에 감사드립니다 .
Steve Jackson

1
@gertas : 나는 그가 단지 요점을 보여주고 있다고 생각합니다. 그러나 Steve Jackson에 따르면 어쨌든 자체 문서화 목적으로 말하는 것이 좋습니다.
Jay

5

키워드가 아닙니다. 그것은 레이블 입니다.

레이블이 지정 break되고 레이블 이 지정된으로 이동할 수 있습니다 continue.


4

이것은 org.life.java의 답변에 대한 seanizer의 의견에 대한 답변이지만 주석 기능을 사용할 수 없도록 코드를 입력하고 싶었습니다.

"브레이크 레이블"에 대한 용도를 찾는 것은 매우 드물지만 가끔 발생합니다. 가장 일반적인 경우는 다음과 같이 검색을 위해 중첩 루프가 필요한 구조에있는 항목을 검색 할 때입니다.

search:
for (State state : stateList)
{
  for (City city : state.cityList)
  {
    if (city.zipcode.equals(wantZip))
    {
      doSomethingTo(city);
      break search;
    }
  }
}

일반적으로 그런 경우에는 모든 것을 서브 루틴으로 밀어 넣어 적중시 발견 된 객체를 반환하고 루프의 맨 아래로 떨어지면 null을 반환하여 찾을 수 없음을 나타내거나 예외를 throw 할 수 있습니다. 그러나 이것은 때때로 유용합니다.

솔직히, Java의 발명가들이이 기능을 포함했다고 생각합니다.이 기능과 예외 처리 사이에서 GOTO의 마지막 두 가지 합법적 인 사용을 제거했기 때문입니다.

매우 늦은 부록 :

한 번은 훌륭한 개그 코드 라인을 보았습니다. 프로그래머는 다음과 같이 썼습니다.

http://www.example.com/xyz.jsp
for (Foo foo1 : foolist)

그는 실제로 "example.com"이라고 말한 것이 아니라 우리 회사의 웹 사이트입니다.

코드에 URL이 있다는 인상을줍니다. 무언가를하는 것처럼 성공적으로 컴파일됩니다. 하지만 ... 무엇을합니까?

실제로는 아무것도하지 않습니다. "http :"는 그가 결코 참조하지 않는 레이블입니다. 그런 다음 "//"는 나머지 줄을 주석으로 만듭니다.


4

중단 점 레이블로, 단순히 가장 안쪽에있는 루프가 아닌 지정된 루프에서 벗어날 수 있습니다.

148 행에 사용됩니다 .



2

다음 예를 살펴보면 레이블입니다.

int a = 0;
int b = 0
while (a<10){
    firstLoop:
    a++;
    while(true){
        b++
        if(b>10){
            break firstLoop;
        }
    }
 }

경우 b>10실행 흐름은 외부 루프로 진행한다.



1

키워드가 아니라 레이블 입니다. for루프 내부에 를 작성 break loop;하고 해당 루프를 종료합니다.


0

라벨입니다. 일반적으로 Java에서 제어 흐름을 원하는 위치로 전송하는 데 사용되는 레이블은 continue 및 break와 같은 모든 키워드에 지정된 위치 선택이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.