[java] Java에는 goto 문이 있습니까?

나는 이것에 대해 혼란스러워한다. 우리 대부분은 Java에 goto 문이 없다고 들었습니다.

그러나 나는 그것이 Java의 키워드 중 하나라는 것을 알았습니다. 어디에서 사용할 수 있습니까? 사용할 수 없다면 왜 키워드로 Java에 포함 되었습니까?



답변

자바 키워드 목록은 지정 goto키워드를 있지만 “사용하지”로 표시됩니다.

원래 JVM 에 있었지만 (@VitaliiFedorenko의 답변 참조 ) 제거되었습니다. 이후 버전의 Java에 추가 될 경우를 대비하여 예약 키워드로 유지되었을 수 있습니다.

경우 goto목록에없는, 그리고이 단어를 사용하는 코드를 기존 나중에 언어에 추가됩니다 goto식별자로 (등 변수 명, 메소드 명을, …) 휴식 것입니다. 그러나 goto키워드 이기 때문에 이러한 코드는 현재 컴파일되지 않으며 기존 코드를 손상시키지 않고 나중에 실제로 무언가를 수행 할 수 있습니다.


답변

James Gosling은 goto명령문 을 지원하여 원래 JVM을 작성 했지만이 기능을 불필요하게 제거했습니다. 주된 이유 goto는 일반적으로 더 읽기 쉬운 문장으로 대체 break/continue하거나 (예 🙂 코드 조각을 메소드로 추출하여 대체 할 수 있기 때문 입니다.

출처 : James Gosling, Q & A 세션


답변

키워드가 존재하지만 구현되지 않았습니다.

내가 생각할 수있는 goto를 사용해야하는 유일한 이유는 다음과 같습니다.

for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        goto outsideloops; // to break out of both loops
    }
}
outsideloops:

Java에서는 다음과 같이 할 수 있습니다.

loops:
for (int i = 0; i < MAX_I; i++) {
    for (int j = 0; j < MAX_J; j++) {
        // do stuff
        break loops;
    }
}


답변

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html

“const 및 goto 키워드는 현재 사용되지 않더라도 예약되어 있습니다.”


답변

언어 디자이너가 필요하다고 느끼면 언젠가 사용할 수 있습니다.

또한 이러한 키워드가있는 언어 (예 : C, C ++)의 프로그래머가 실수로 키워드를 사용하는 경우 Java 컴파일러가 유용한 오류 메시지를 표시 할 수 있습니다.

아니면 goto를 사용하여 프로그래머를 멈추는 것일 수도 있습니다. 🙂


답변

나중에 사용하기 위해 예약되어 있습니다 ( Java 언어 키워드 참조 ).

키워드 const와 goto는 현재 사용되지 않더라도 예약되어 있습니다.

그 이유 자바에는 고토 문 “에서 발견 할 수있다 Java 언어 환경

Java에는 goto 문이 없습니다. 연구에 따르면 goto는 단순히 “있는 이유”가 아니라 자주 사용됩니다. goto를 제거하면 언어가 단순화되었습니다. 예를 들어 for 문 중간에 goto의 영향에 대한 규칙은 없습니다. 약 10 만 줄의 C 코드에 대한 연구에 따르면 대략 90 %의 goto 문의가 순전히 중첩 루프에서 벗어날 수있는 효과를 얻는 데 사용 된 것으로 나타났습니다. 위에서 언급했듯이, 다단계 나누기와 계속해서 goto 문의 필요성을 대부분 제거합니다.


답변

Java에서 “continue”레이블을 사용하는 방법의 예는 다음과 같습니다.

public class Label {
    public static void main(String[] args) {
        int temp = 0;
        out: // label
        for (int i = 0; i < 3; ++i) {
            System.out.println("I am here");
            for (int j = 0; j < 20; ++j) {
                if(temp==0) {
                    System.out.println("j: " + j);
                    if (j == 1) {
                        temp = j;
                        continue out; // goto label "out"
                    }
                }
            }
        }
        System.out.println("temp = " + temp);
    }
}

결과 :

I am here // i=0
j: 0
j: 1
I am here // i=1
I am here // i=2
temp = 1