IT/Go

defer

iamhyeon 2025. 1. 30. 03:11

- 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