제네릭 공부하다가 java.util.ArrayList를 뜯어보던 중 아래와 같은 코드를 발견했다.
public boolean remove(Object o) {
final Object[] es = elementData;
final int size = this.size;
int i = 0;
found: {
if (o == null) {
for (; i < size; i++)
if (es[i] == null)
break found;
} else {
for (; i < size; i++)
if (o.equals(es[i]))
break found;
}
return false;
}
fastRemove(es, i);
return true;
}
found 가 바로 라벨이다.
라벨 자체는 변수나 타입이 아니라, 중괄호({})로 감싸진 코드 블록에 이름을 붙이는 역할을 한다.
Java에서 블록 단위로 실행 흐름을 빠르게 이동할 수 있도록 하는 기능이다.
break 라벨명;을 통해 라벨 밖으로 바로 빠져나갈 수 있고, continue 라벨명; 을 통해 라벨의 시작 위치부터 다시 실행할 수 있다.
C언어의 goto 문법과 비슷하지만 Java의 라벨은 본인이 속한 라벨에 한해서 시작과 끝 위치로 이동할 수 있고, 다른 라벨로의 이동은 할 수 없다.
public void loopEscapeTest(int[][] array) {
final int INF = 1_000_000_000;
nestedForLoop:
{
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array[i].length; j++) {
if (array[i][j] == INF) {
break nestedForLoop; // nestedForLoop의 밖으로 이동
}
}
}
}
...
}
라벨은 중첩 루프를 탈출할 때 매우 유용하다.