Label
자바에서는 label을 사용해 반복문, switch문 등에 이름을 붙일 수 있다. break와 continue에서 사용 가능!
for문에 'mylabel' 이라는 이름의 레이블을 지정한 다음,
break mylabel;
구문을 만난다면 -> mylabel이라는 이름이 붙은 바깥 for문을 빠져나감.
public static void main(String[] args) {
mylabel:
for(int i=0; i<3; i++) {
for (int k=0; k<3; k++) {
if (i==0 && k ==2)
break mylabel;
System.out.println(i + ", " + k);
}
}
}
반복문이 아니더라도 레이블을 쓸 수 있을까?
label은 break, continue 에서 쓰이기 때문에 반복문에서 자주 사용할 것 같다.
하지만 레이블을 붙일 수 있는 구문이 for, while, switch 뿐일까? 다른 문장에도 붙일 수 있을 것 같은데...
결론적으로 레이블은 '문(statement)'이면 다 적용할 수 있다.
Statement vs Expression
문장(Statement)은 프로그램 내에서 하나의 동작을 기술하는 것이다.
자바에서 문장들은 블록{} 안에 모여서 매소드와 클래스를 구성한다. 문장의 끝에는 항상 세미콜론이 붙는다.
변수 선언과 할당, 조건문, 반복문 등이 문장에 포함된다.
식(Expression)은 값을 기술하는 것이다.
식은 반드시 컴파일러에 의해 값으로 평가될 수 있어야 한다. 즉, 식은 하나의 값으로 치환된다.
함수 호출, 객체 할당, 산술식 등이 식에 포함된다.
쓸 수 있음!
즉 다음과 같이 레이블을 설정할 수 있다!
public class LabelTest {
public static void main(String[] args) {
label1: System.out.println("");
label2: {LabelTest t = new LabelTest();}
}
}
그렇다면 label은 무엇인가?
레이블은 코드 내에서 특정 문장의 위치를 가리키는 이름이다.
아무래도 자바의 레이블은 C의 'goto'문과 같은 역할을 하기 위해 사용하는 듯 하다.
C의 'goto'문은 프로그램의 실행을 워하는 위치로 이동시켜 프로그램의 흐름을 제어한다.
초기 자바에는 'goto'문이 있었다고 한다. 하지만 현재 자바에는 'goto'문이 없고?
현재는 break, continue에서만 쓰므로 'goto'에 비해 제한적으로 사용할 수 있다.
아마도 레이블은 C의 유산 같은 느낌이 아닐까..??