종료 문장
종료 문장
코드 실행이 블록 안을 쭉 흐르다가, 그 흐름을 확 끊어야 할 때가 있어요. 함수에서 값을 돌려주는 return, 어디로 튈지 정하는 goto, 패닉을 일으키는 panic 같은 것들이죠. 이렇게 블록 안의 일반적인 제어 흐름을 중단시키는 문장을 우리는 종료 문장(terminating statement) 이라고 불러요. 지금은 이름이 낯설 수 있는데, 이 개념은 컴파일러가 "여기까지 오면 반드시 함수가 끝난다"를 판단하는 근거라서 Go 입장에서는 꽤 중요해요.
출처: Go Specification
본문
종료 문장(terminating statement) 은 블록 안의 일반적인 제어 흐름을 중단시킵니다. 다음 문장들이 종료 문장입니다:
- “return” 또는 “goto” 문장.
- 내장 함수 panic 호출.
- 문장 목록이 종료 문장으로 끝나는 블록.
- 다음을 만족하는 “if” 문장:
- “else” 분기가 존재하고,
- 두 분기 모두 종료 문장이다.
- 다음을 만족하는 “for” 문장:
- 그 “for” 문장을 가리키는 “break” 문장이 없고,
- 루프 조건이 없으며,
- 그 “for” 문장이 range 절을 사용하지 않는다.
- 다음을 만족하는 “switch” 문장:
- 그 “switch” 문장을 가리키는 “break” 문장이 없고,
- default case가 존재하며,
- default를 포함한 각 case의 문장 목록이 종료 문장, 또는 어쩌면 레이블이 붙은 “fallthrough” 문장으로 끝난다.
- 다음을 만족하는 “select” 문장:
- 그 “select” 문장을 가리키는 “break” 문장이 없고,
- default가 존재한다면 그것을 포함한 각 case의 문장 목록이 종료 문장으로 끝난다.
- 종료 문장에 레이블을 붙인 레이블 문장.
그 밖의 모든 문장은 종료 문장이 아닙니다.
문장 목록이 비어 있지 않고, 그 목록의 마지막의 비어 있지 않은 문장이 종료 문장이라면, 그 문장 목록은 종료 문장으로 끝난다고 합니다.
더 알아보기
- 이 규칙이 실전에서 가장 많이 쓰이는 곳은 함수의 마지막 줄이에요. 반환 타입이 있는 함수는 끝이 반드시 종료 문장이어야 컴파일러가 "모든 경로가 값을 돌려준다"고 확신할 수 있죠.
- 조건이 없거나 range를 쓰지 않는
for문은 무한 루프가 되므로, 빠져나올break가 없다면 자연히 종료 문장으로 취급돼요. if는 두 분기가 모두 종료 문장일 때만 종료 문장이 돼요. 한쪽이라도 흐름이 이어지면 그 함수는 끝까지 실행되는 경로가 남는다는 뜻이랍니다.