종료 문장

종료 문장

코드 실행이 블록 안을 쭉 흐르다가, 그 흐름을 확 끊어야 할 때가 있어요. 함수에서 값을 돌려주는 return, 어디로 튈지 정하는 goto, 패닉을 일으키는 panic 같은 것들이죠. 이렇게 블록 안의 일반적인 제어 흐름을 중단시키는 문장을 우리는 종료 문장(terminating statement) 이라고 불러요. 지금은 이름이 낯설 수 있는데, 이 개념은 컴파일러가 "여기까지 오면 반드시 함수가 끝난다"를 판단하는 근거라서 Go 입장에서는 꽤 중요해요.

출처: Go Specification

본문

종료 문장(terminating statement)블록 안의 일반적인 제어 흐름을 중단시킵니다. 다음 문장들이 종료 문장입니다:

  1. “return” 또는 “goto” 문장.
  2. 내장 함수 panic 호출.
  3. 문장 목록이 종료 문장으로 끝나는 블록.
  4. 다음을 만족하는 “if” 문장:
    • “else” 분기가 존재하고,
    • 두 분기 모두 종료 문장이다.
  5. 다음을 만족하는 “for” 문장:
    • 그 “for” 문장을 가리키는 “break” 문장이 없고,
    • 루프 조건이 없으며,
    • 그 “for” 문장이 range 절을 사용하지 않는다.
  6. 다음을 만족하는 “switch” 문장:
    • 그 “switch” 문장을 가리키는 “break” 문장이 없고,
    • default case가 존재하며,
    • default를 포함한 각 case의 문장 목록이 종료 문장, 또는 어쩌면 레이블이 붙은 “fallthrough” 문장으로 끝난다.
  7. 다음을 만족하는 “select” 문장:
    • 그 “select” 문장을 가리키는 “break” 문장이 없고,
    • default가 존재한다면 그것을 포함한 각 case의 문장 목록이 종료 문장으로 끝난다.
  8. 종료 문장에 레이블을 붙인 레이블 문장.

그 밖의 모든 문장은 종료 문장이 아닙니다.

문장 목록이 비어 있지 않고, 그 목록의 마지막의 비어 있지 않은 문장이 종료 문장이라면, 그 문장 목록은 종료 문장으로 끝난다고 합니다.

더 알아보기

  • 이 규칙이 실전에서 가장 많이 쓰이는 곳은 함수의 마지막 줄이에요. 반환 타입이 있는 함수는 끝이 반드시 종료 문장이어야 컴파일러가 "모든 경로가 값을 돌려준다"고 확신할 수 있죠.
  • 조건이 없거나 range를 쓰지 않는 for 문은 무한 루프가 되므로, 빠져나올 break가 없다면 자연히 종료 문장으로 취급돼요.
  • if는 두 분기가 모두 종료 문장일 때만 종료 문장이 돼요. 한쪽이라도 흐름이 이어지면 그 함수는 끝까지 실행되는 경로가 남는다는 뜻이랍니다.