defer, 익명 함수와 클로저
지연된 호출과 함수값
defer, 익명 함수와 클로저은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
defer: 지연 실행
defer는 주변 함수가 반환될 때 함수를 호출하도록 예약합니다. 정상 반환, 오류 반환, 패닉 등 어떤 방식으로 반환하더라도 실행됩니다:
func readFile(path string) {
f, err := os.Open(path)
if err != nil { return }
defer f.Close() // runs when readFile returns
// read from f...
}defer 실행 순서
지연된 호출은 스택에 쌓이며 LIFO 순서(마지막에 들어온 것이 먼저 나오는 순서)로 실행됩니다:
func main() {
defer fmt.Println("third")
defer fmt.Println("second")
defer fmt.Println("first")
// Output: first, second, third
}정리를 위한 defer
defer는 리소스가 해제되도록 보장하는 Go의 관용적인 방법입니다:
- 뮤텍스를 잠근 후
Unlock호출하기 - 파일을 연 후
Close호출하기 - 데이터베이스 트랜잭션을 커밋하거나 롤백하기
WaitGroup.Add()후WaitGroup.Done()호출하기
인수를 사용하는 defer
지연된 호출의 인수는 실행될 때가 아니라 defer가 호출되는 즉시 평가됩니다:
x := 10
defer fmt.Println(x) // prints 10, not 20
x = 20
fmt.Println(x) // prints 20익명 함수
익명 함수(함수 리터럴)는 이름 없이 코드 안에서 직접 정의합니다:
double := func(n int) int {
return n * 2
}
fmt.Println(double(5)) // 10
// Immediately invoked:
result := func(a, b int) int { return a + b }(3, 4)클로저
클로저는 주변 범위의 변수를 캡처하는 함수입니다:
func makeCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
ctr := makeCounter()
fmt.Println(ctr(), ctr(), ctr()) // 1 2 3반복문에서 클로저 캡처 시 주의할 점
클로저는 변수를 참조로 캡처하므로 고루틴 반복문에서 흔히 문제가 발생합니다:
for i := 0; i < 3; i++ {
i := i // create a new variable per iteration
go func() { fmt.Println(i) }()
}이름 있는 반환과 defer
지연된 함수는 이름이 지정된 반환값을 수정할 수 있으므로, 오류에 설명을 덧붙일 때 유용합니다:
func doWork() (err error) {
defer func() {
if err != nil {
err = fmt.Errorf("doWork: %w", err)
}
}()
return riskyOp()
}클로저를 사용한 함수형 패턴
클로저를 사용하면 메모이제이션과 같은 함수형 패턴을 구현할 수 있습니다:
func memoize(f func(int) int) func(int) int {
cache := map[int]int{}
return func(n int) int {
if v, ok := cache[n]; ok {
return v
}
v := f(n)
cache[n] = v
return v
}
}미들웨어로 사용하는 클로저
클로저는 Go HTTP 서버에서 미들웨어를 구성하는 기본 요소입니다. 핸들러를 감싸고 그 주변에 동작을 추가합니다:
func withLogging(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s", r.Method, r.URL)
next(w, r)
}
}빠른 확인
지연된 함수 호출의 인수는 언제 평가되나요?
복습: defer, 클로저와 익명 함수
이 기능들은 Go 코드를 표현력 있고 안전하게 만들어 줍니다:
defer는 함수가 종료될 때 정리를 보장합니다(LIFO 순서)- defer의 인수는 즉시 평가됩니다
- 익명 함수는 변수에 할당하거나 호출문에서 직접 호출할 수 있습니다
- 클로저는 주변 변수를 참조로 캡처합니다
- 고루틴에서 반복문 변수 캡처 버그가 발생하지 않는지 주의하세요
다음 과정: 배열, 슬라이스와 맵입니다.
자주 묻는 질문
“defer, 익명 함수와 클로저” 강의는 무료인가요?
네 — “defer, 익명 함수와 클로저” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“defer, 익명 함수와 클로저”에서 뭘 배우나요?
지연된 호출과 함수값 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“defer, 익명 함수와 클로저” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 함수 기초와 시그니처
- 여러 반환값
- 가변 인수 함수
- defer, 익명 함수와 클로저