레이블의 스코프
레이블의 스코프 (Label scopes)
레이블(label)을 어디까지 쓸 수 있는지는 살짝 특이해요. 일반적인 변수나 타입처럼 블록 단위로 묶이는 게 아니라, 함수 전체를 영역으로 삼거든요. Go의 스코프 규칙에서 레이블만 한 번 짚고 넘어가 볼게요.
출처: Go Specification
본문
레이블(label)은 labeled statement(레이블이 붙은 문장)으로 선언되고, "break" 문과 "continue" 문, "goto" 문에서 사용돼요.
이때 주의할 점이 하나 있어요. 한 번도 사용되지 않는 레이블을 정의하는 건 불법(illegal)이에요. 다시 말해 레이블만 선언해 두고 어디에서도 쓰지 않으면 컴파일 오류가 나죠. 혹시 "선언만 해 두고 나중에 쓰려고" 레이블을 남겨 두는 습관이 있다면, Go에서는 그게 허용되지 않는다는 걸 기억해야 해요.
또 재미있는 점은, 레이블이 다른 식별자들과는 다른 스코프 규칙을 가진다는 거예요.
- 다른 식별자는 블록 스코프(block scope)를 따르는데, 레이블은 블록 스코프를 갖지 않아요.
- 그래서 레이블은 레이블이 아닌 식별자와 충돌하지 않아요. 함수 안에 같은 이름의 변수가 있다고 해서 레이블이 그 변수와 겹쳐서 문제가 되지 않는다는 뜻이에요.
그렇다면 레이블의 스코프는 정확히 어디까지일까요? 레이블의 스코프는 레이블이 선언된 함수의 몸통(body) 전체예요. 단, 여기에는 예외가 있어요. 중첩된 함수(nested function)의 몸통은 제외돼요. 즉 바깥 함수에서 선언한 레이블이, 그 안에 중첩된 함수까지는 미치지 않는다는 거예요.
정리하면, 레이블은 "블록을 무시하고 함수 하나 통째로"를 자기 영역으로 삼되, 그 함수 안에 들어있는 다른 함수의 몸통까지만은 침범하지 않아요. 그리고 쓰지 않는 레이블은 아예 처음부터 만들 수 없다고 보면 돼요.
더 알아보기
- Labeled statements — 레이블이 문장에 어떻게 붙는지 보여주는 문법이에요.
"break"문 — 반복문이나 switch에서 빠져나올 때 레이블을 지정할 수 있어요."continue"문 — 다음 반복으로 넘어갈 때 레이블을 쓸 수 있어요."goto"문 — 레이블로 직접 점프하는 흐름 제어예요.