Go의 `defer` 문 뒤에 숨겨진 마법: 지연 실행 잠금 해제
Sep 07, 2025
# Go
Emily Parker
Product Engineer · Leapcell

Go의 defer
문은 함수가 정상적으로 반환되든 패닉을 일으키든 상관없이, 주변 함수가 완료되는 순간 해당 함수 호출을 실행하도록 예약할 수 있는 강력하고 관용적인 기능입니다. 이 단순해 보이는 메커니즘은 리소스가 제대로 정리되고 중요한 작업이 안정적으로 실행되도록 보장하는 견고한 Go 프로그래밍의 초석입니다. 종종 다른 언어의 finally
블록과 비교되지만, 독특하고 종종 더 우아한 접근 방식을 가집니다.
defer
의 해부학: 작동 방식
함수가 실행되는 동안 defer
문을 만나면, defer
문에 지정된 함수 호출이 즉시 평가됩니다. 이는 지연된 함수의 인수들이 지연된 함수가 실제로 실행될 때가 아니라 defer
문이 실행되는 시점에 결정된다는 것을 의미합니다. 그런 다음 지연된 호출은 스택에 푸시됩니다. 주변 함수가 반환될 때, 이 스택의 함수들은 후입선출(LIFO) 순서로 실행됩니다.
기본 예제로 설명해 보겠습니다:
package main import "fmt" func main() { defer fmt.Println("Exiting main function.") fmt.Println("Inside main function.") fmt.Println("Doing some work...") }
출력:
Inside main function.
Doing some work...
Exiting main function.
보시다시피 fmt.Println("Exiting main function.")
은 처음에 선언되었지만 마지막에 실행됩니다.
이제 인수 평가를 살펴 보겠습니다:
package main import "fmt" func greet(name string) { fmt.Println("Hello,", name) } func main() { name := "Alice" defer greet(name) // 'name'은 이제 "Alice"로 평가됩니다. name = "Bob" // 이 변경은 지연된 호출에 영향을 미치지 않습니다. fmt.Println("Inside main, changing name to", name) }
출력:
Inside main, changing name to Bob
Hello, Alice
이것은 중요한 점을 보여줍니다. name
에 대한 값 `