더북(TheBook)

2.4.3 defer

defer 키워드는 함수가 종료되기 전까지 특정 구문의 실행을 지연시켰다가, 함수가 종료되기 직전에 지연시켰던 구문을 수행한다. 자바나 C#의 finally 같은 개념이다. 주로 리소스를 해제시키거나 클렌징 작업이 필요할 때 사용한다.

다음 예제는 defer의 동작 방식을 보여준다.

▼ defer 사용 예제

package main
  
import "fmt"
  
func main() {
    f1()
}
func f1() {
    fmt.Println("f1 - start")
    defer f2()
    fmt.Println("f1 - end")
}
func f2() {
    fmt.Printf("f2 - deferred")
}

실행 결과

f1 - start

f1 - end

f2 - deferred

defer 키워드를 제거한 예제와 결과를 비교해 보면 defer의 동작 방식을 명확히 이해할 수 있을 것이다.

함수 하나에 defer 키워드를 여러 개 사용하면 defer로 지정한 각 구문은 스택(stack)에 쌓였다가 가장 나중에 쌓인 defer 구문부터 수행된다.

▼ defer를 여러 개 사용

package main
  
import "fmt"
  
func f() {
    for i := 0; i < 5; i++ {
        defer fmt.Printf("%d ", i)
    }
}
  
func main() {
    f()
}

실행 결과

4 3 2 1 0

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.