2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Go에서 defer 문은 어떤 용도로 사용하나요?

_____
Q: Go에서 defer 문은 무엇인가요?
A: defer 문은 함수가 종료되기 직전에 특정 함수를 지연하여 실행하도록 예약하는 기능입니다. 보통 자원 해제, 파일 닫기, 락 해제 등 반드시 실행되어야 할 코드를 선언할 때 사용합니다.

Q: defer 문은 언제 실행되나요?
A: defer로 지정된 함수는 해당 함수의 종료 직전에 실행됩니다. 즉, 호출된 함수가 return하기 전에 역순으로 실행됩니다.

Q: defer 문을 사용하는 주된 이유는 무엇인가요?
A: 주로 리소스 정리(clean-up)를 자동으로 처리하기 위해 사용합니다. 예를 들어 파일을 열고 작업한 뒤 반드시 파일을 닫아야 할 때, defer로 파일 닫는 코드를 예약해 놓으면 함수 종료 시 반드시 닫기 동작이 실행되어 누수나 오류를 방지할 수 있습니다.

Q: defer 문이 여러 번 쓰이면 어떻게 실행되나요?
A: defer로 등록된 함수들은 호출된 순서의 역순으로 실행됩니다. 즉, 먼저 등록된 defer가 나중에 실행되고, 가장 마지막에 등록된 defer가 가장 먼저 실행됩니다.

Q: defer의 매개변수는 언제 평가되나요?
A: defer에 등록된 함수 호출 시 인자들은 즉시 평가됩니다. 하지만 함수 자체는 함수 종료 시점까지 호출이 지연됩니다.

Q: defer 문 사용 시 성능에 영향이 있나요?
A: 불필요하게 많이 사용하면 약간의 오버헤드가 있을 수 있으나, 일반적으로 자원 해제 코드 작성의 안정성을 높이는 것이 더 중요해 성능보다 안전성이 우선시됩니다.
Q: defer 문으로 panic 상황도 처리할 수 있나요?
A: 네, defer 함수 내에서 recover를 호출하면 panic을 복구할 수 있습니다. 이를 통해 에러를 우아하게 처리할 수 있습니다.

Q: 예를 들어 defer 문은 어떻게 사용하나요?
A:
```go
func readFile(filename string) error {
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close() // 함수 종료 시 파일 닫기
// 파일 읽기 작업
return nil
}
```

Q: 요약하면 defer의 핵심 기능은 무엇인가요?
A: 함수가 끝날 때 반드시 실행해야 하는 코드를 미리 예약하여, 코드 가독성 및 안전성을 높이고 자원 누수를 방지하는 역할을 합니다.
Go 언어에서 `defer` 문은 주로 함수의 종료 시점에 특정 작업을 지연 실행하기 위해 사용됩니다.

`defer`를 사용하면 함수가 종료될 때까지 실행을 미루고, 함수가 반환될 때 자동으로 실행되는 코드를 정의할 수 있습니다.

이는 주로 리소스 해제, 파일 닫기, 뮤텍스 잠금 해제 등과 같은 작업에 유용합니다.

`defer`의 주요 특징 1. 지연 실행 : `defer`로 선언된 함수는 해당 함수가 종료될 때까지 실행되지 않습니다.

즉, `defer` 문이 호출된 위치에서 즉시 실행되지 않고, 함수의 마지막 부분에서 실행됩니다.



2. 스택 구조 : 여러 개의 `defer` 문이 있을 경우, LIFO(Last In, First Out) 방식으로 실행됩니다.

즉, 가장 나중에 선언된 `defer` 문이 가장 먼저 실행됩니다.



3. 에러 처리 : `defer`는 에러 처리와 함께 사용될 때 유용합니다.

예를 들어, 파일을 열고 작업을 수행한 후 파일을 닫는 작업을 `defer`를 통해 안전하게 처리할 수 있습니다.

이렇게 하면 함수가 중간에 에러가 발생하더라도 파일이 항상 닫히도록 보장할 수 있습니다.

사용 예시 다음은 `defer` 문을 사용한 간단한 예시입니다: ```go package main import ( "fmt" "os" ) func main() { // 파일 열기 file, err := os.Open("example.txt") if err != nil { fmt.Println("Error opening file:", err) return } // defer를 사용하여 파일을 닫기 defer file.Close() // 파일에서 작업 수행 // ... fmt.Println("File opened successfully") } ``` 위의 코드에서 `defer file.Close()`는 `main` 함수가 종료될 때 파일을 닫도록 예약합니다.

만약 파일을 여는 과정에서 에러가 발생하면, `defer` 문은 실행되지 않지만, 파일이 정상적으로 열렸다면 함수가 종료될 때 파일이 안전하게 닫힙니다.

성능 고려사항 `defer` 문은 코드의 가독성을 높이고 리소스 관리를 쉽게 해주지만, 성능 측면에서 약간의 오버헤드가 있을 수 있습니다.

특히, `defer` 문이 반복문 안에서 호출될 경우 성능 저하가 발생할 수 있으므로, 성능이 중요한 경우에는 주의해야 합니다.

이러한 경우에는 `defer` 대신 직접 리소스를 관리하는 방법을 고려할 수 있습니다.

결론 Go 언어에서 `defer` 문은 함수의 종료 시점에 특정 작업을 안전하게 수행할 수 있도록 도와주는 강력한 도구입니다.

리소스 관리, 에러 처리, 코드 가독성 향상 등 다양한 용도로 활용될 수 있으며, Go 프로그래밍에서 중요한 역할을 합니다.

`defer`를 적절히 사용하면 코드의 안정성과 유지보수성을 높일 수 있습니다.

작성자: 김서율 [비회원] | 작성일자: 1년 전 2024-09-19 01:50:25
조회수: 136 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.