ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION589 / 1500
언어·런타임난이도 중하5분 답변 목표 · 보강본

Go 반복문에서 파일을 열고 defer Close를 했더니 열린 파일이 계속 늘어납니다. defer는 언제 실행되나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

defer는 보통 현재 함수가 반환될 때 실행되므로 반복 한 번이 끝날 때마다 실행되는 것이 아닙니다. 긴 함수의 루프에서 자원을 계속 defer하면 함수가 끝나기 전까지 파일이 누적될 수 있습니다.

동작 원리와 전제

반복마다 짧은 함수를 호출해 그 안에서 defer하거나 필요한 시점에 명시적으로 닫습니다. open이 실패한 경우 nil 자원을 닫지 않도록 오류를 먼저 검사합니다. defer의 인자는 등록 시 평가되지만 closure가 참조하는 값은 별도 캡처 의미를 가집니다.

선택과 실패 처리

닫기 오류가 데이터 flush 실패를 의미할 수 있는 쓰기 작업은 오류를 처리해야 합니다. 모든 cleanup 오류를 무시해도 된다고 하지 않습니다. panic 경로의 defer와 os.Exit 같은 즉시 종료의 차이도 알아야 합니다.

구체적인 사례와 검증

반복문 안에서 익명 함수를 바로 호출하고 그 함수 안에 open·defer close를 두면 각 반복이 끝날 때 자원이 반환됩니다. 다만 모든 오류를 그 함수에서 삼키면 상위가 실패를 알 수 없으므로 결과를 반환해 처리합니다. defer로 mutex를 풀 때도 함수가 너무 길면 불필요하게 락을 오래 잡을 수 있어 임계 구역을 좁힙니다. defer가 역순으로 실행된다는 점은 의존 자원 정리에 유용하지만 등록 시점의 인자와 closure가 나중 읽는 변수를 구분해야 합니다. 성능을 이유로 defer를 제거하기 전에 실제 hot path 비용과 오류 경로의 안전성을 함께 측정하겠습니다.

많은 파일·루프 중 오류·중간 반환·panic을 시험해 최대 FD와 정리 시점을 확인합니다. defer는 자원 수명을 명시하기 쉽게 하는 수단이며 현재 함수의 범위가 너무 넓으면 자원 보유 기간도 길어집니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 핵심 구분: defer는 보통 현재 함수가 반환될 때 실행되므로 반복 한 번이 끝날 때마다 실행되는 것이 아닙니다.
  • 선택 조건: 닫기 오류가 데이터 flush 실패를 의미할 수 있는 쓰기 작업은 오류를 처리해야 합니다.
  • 검증 기준: 많은 파일·루프 중 오류·중간 반환·panic을 시험해 최대 FD와 정리 시점을 확인합니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 루프 안 defer가 매 반복 종료 시 실행된다고 한다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • 자원을 자동 해제해도 예외 전의 데이터 상태가 복원되는지는 어떤 보장으로 구분하나요?
  • 새 작업을 막은 뒤 진행 중 작업·공유 풀·로그를 어떤 순서로 종료하나요?
  • 취소·요청 메타데이터와 필수 의존성을 context에 어떻게 구분해 전달하나요?

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기