블록(Blocks)

블록(Blocks)

Go에서 코드가 묶이는 가장 기본적인 단위가 바로 이 블록이에요. 함수 본문, if 문, for 문 안쪽처럼 중괄호 {}로 감싸는 그 영역을 떠올리시면 돼요. 다만 여기서는 살짝 더 넓게 봐요. 소스 코드에 보이는 블록뿐 아니라, 눈에 안 보이지만 Go가 묵시적으로 만들어 주는 블록까지도 함께 다룬답니다.

출처: Go Specification

본문

블록(block)은 짝이 맞는 중괄호 안에 들어 있는, 선언과 문(statement)의 (비어 있을 수도 있는) 나열이에요. 굳이 말하자면 '중괄호로 감싼 내용물 전체'라고 보면 돼요. EBNF로는 이렇게 정의돼요.

Block         = "{" StatementList "}" .
StatementList = { Statement ";" } .

여기서 StatementList가 문장들을 세미콜론으로 구분해서 늘어놓은 것이고, 그 전체를 {}로 감싼 게 블록인 거죠.

소스 코드에 명시적으로 쓰는 블록 말고, Go는 **묵시적 블록(implicit block)**이라는 것도 만들어요. 소스에 중괄호가 없는데도 블록이 존재한다고 보는 거예요. 그 종류를 나열해 볼게요.

  • universe block: 모든 Go 소스 텍스트를 아우르는 블록이에요.
  • package는 그 패키지의 모든 Go 소스 텍스트를 담는 package block을 가져요.
  • file은 그 파일의 모든 Go 소스 텍스트를 담는 file block을 가져요.
  • if, for, switch 문은 각자 자신만의 묵시적 블록 안에 있다고 봐요.
  • **switch**나 select 문의 각 clause도 묵시적 블록 역할을 해요.

이런 블록들은 서로 중첩되고, **스코프(유효 범위)**에 영향을 줘요. 안쪽 블록에서 선언한 이름은 그 블록 안에서만 유효하다는 그 scoping 규칙의 기반이 바로 이 블록 구조예요.

더 알아보기

블록이 스코프에 어떻게 연결되는지, 선언한 이름이 어디까지 보이는지는 '선언과 유효 범위(Declarations and scope)'를 보면 더 자세히 알 수 있어요.