0Pricing
Go Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 함수 기초와 시그니처
  2. 여러 반환값
  3. 가변 인수 함수
  4. defer, 익명 함수와 클로저
← Go Academy(으)로 돌아가기