GO · 함수
defer 심화
defer는 LIFO(후입선출) 순서로 함수 종료 시 실행됩니다. 리소스 정리와 잠금 해제에 필수적입니다.
함수중급deferLIFOmutexresource-cleanup
핵심 설명
defer는 LIFO(후입선출) 순서로 함수 종료 시 실행됩니다. 리소스 정리와 잠금 해제에 필수적입니다.
Go code
package main
import (
"fmt"
"sync"
)
func deferOrder() {
fmt.Println("시작")
defer fmt.Println("첫 번째 defer")
defer fmt.Println("두 번째 defer")
defer fmt.Println("세 번째 defer") // 가장 먼저 실행
fmt.Println("끝")
}
// 실전: 뮤텍스 잠금 해제
type SafeMap struct {
mu sync.Mutex
m map[string]int
}
func (s *SafeMap) Set(key string, val int) {
s.mu.Lock()
defer s.mu.Unlock() // 함수 종료 시 자동 해제
s.m[key] = val
}
func main() {
deferOrder()
// 출력: 시작, 끝, 세 번째, 두 번째, 첫 번째
sm := &SafeMap{m: make(map[string]int)}
sm.Set("count", 42)
fmt.Println(sm.m)
}학습 팁
defer는 Lock/Unlock, Open/Close 쌍을 가까이 배치하여 실수를 방지합니다. 잠금 직후 바로 defer Unlock()을 작성하세요.
주의할 점
루프 안에서 defer를 사용하면 루프가 끝나야 실행됩니다. 리소스가 누적될 수 있으므로 루프 내에서는 즉시 해제하거나 별도 함수로 분리하세요.
자주 묻는 질문
defer 심화란 무엇인가요?
defer 는 LIFO(후입선출) 순서로 함수 종료 시 실행됩니다. 리소스 정리와 잠금 해제에 필수적입니다.
defer 심화 학습 시 주의할 점은 무엇인가요?
루프 안에서 defer 를 사용하면 루프가 끝나야 실행됩니다. 리소스가 누적될 수 있으므로 루프 내에서는 즉시 해제하거나 별도 함수로 분리하세요.