- Go에서 함수 호출이 종료될 때까지 실행을 미루는 데 사용되는 키워드
- 함수 종료 시점에 실행된다.
- 함수가 끝나기 전에 특정 코드가 실행되도록 예약할 수 있다.
- 주로 자원 해제, 파일 닫기, 락 해제 등 "정리 작업"을 수행하는 데 사용된다.
- 여러 개의 defer는 LIFO 방식으로 실행된다.
- defer는 함수가 return을 만나기 전에 실행되는 코드의 예약을 설정한다
- defer로 예약된 함수는, return이 실행된 후, 현재 함수의 스택이 모두 정리된 후에 호출된다.
package main
import "fmt"
func myFunction() {
defer fmt.Println("Deferred message") // return 전에 이 코드가 실행됨
fmt.Println("Normal message")
}
func main() {
myFunction()
}
출력
- defer가 여러 개 있을 때는 LIFO(Last In First Out) 순서로 실행된다
- 가장 나중에 등록된 defer가 가장 먼저 실행된다
package main
import "fmt"
func myFunction() {
defer fmt.Println("First defer")
defer fmt.Println("Second defer")
fmt.Println("Main function")
}
func main() {
myFunction()
}
출력
주로 사용되는 경우
- 파일 닫기: 파일을 열고 작업을 마친 후에 파일을 반드시 닫아야 할 때, defer를 사용하여 파일을 닫는 작업을 예약할 수 있다.
- 락 해제: 고루틴과 동시성 제어에서 락을 걸고, 작업이 끝나면 락을 해제하는 작업을 defer로 예약할 수 있다.
- 자원 해제: 네트워크 연결, 데이터베이스 연결 등 자원을 사용한 후 반드시 자원을 해제해야 할 경우 유용하다.
- defer는 편리하지만 성능에 영향을 줄 수 있다.
- 함수 호출 시 defer는 내부적으로 스택에 추가되어야 하고, 함수가 반환될 때까지 그 동작을 추적해야 하므로 성능 비용이 있다.
- 하지만 이 비용은 대부분의 경우 미미하며, 코드의 가독성과 안전성을 높이기 위해 defer를 사용하는 것이 유리할 때가 많다.
'IT > Go' 카테고리의 다른 글
log 패키지 (0) | 2025.01.30 |
---|---|
메서드 리시버 (0) | 2025.01.29 |
Golang Live Reloading command line utility (0) | 2025.01.23 |
Java Spring Boot 애플리케이션에서 Go REST API 호출 (0) | 2025.01.22 |
Go 변수, 데이터타입 (0) | 2024.12.26 |