[Swift 문법] defer는 return 전에 실행될까?

Minji Kim·2023년 9월 30일
0

Swift 문법

목록 보기
8/8
post-thumbnail

defer는 함수 내부에서 제일 마지막으로 실행하고 싶을 때 사용하는 거라고 알고 있었지만, return 문 전에 실행되는지 후에 실행되는지 헷갈렸다. defer에 대해서 다시 알아보자.


import Foundation

func sampleDefer() {
  defer {
    print("나는 defer 안이다")
  }
  print("나는 return 전이다")
  return
}

sampleDefer()

// 결과:
// 나는 return 전이다
// 나는 defer 안이다

위 코드를 보면 defer문 바깥에 있는 코드 실행 -> defer문 실행 -> return
return이 오면 defer고 뭐고 함수를 끝낸다고 보면된다.


음.. 그럼 defer 전에 return을 호출하면?

import Foundation

func sampleDefer() {
  print("나는 return 전이다")
  return
  defer {
    print("나는 defer 안이다")
  }
}

sampleDefer()

// 결과:
// 나는 return 전이다

당연하게도 return 다음에 온 defer문은 실행되지 않는다.
defer는 반드시 return 전에 호출해야 한다.


그럼 한 함수 안에 defer가 여러 개 사용된다면?

import Foundation

func sampleDefer() {
  defer { print("나는 첫째 defer 안이다") }
  defer { print("나는 둘째 defer 안이다") }
  defer { print("나는 셋째 defer 안이다") }
  print("나는 return 전이다")
  return
}

sampleDefer()

// 결과:
// 나는 return 전이다
// 나는 셋째 defer 안이다
// 나는 둘째 defer 안이다
// 나는 첫째 defer 안이다

반대로 실행된다. 스택과 비슷하게 먼저 들어간 defer가 제일 나중에 실행된다.(선입후출)


그럼 중첩되어 사용된 경우는?

import Foundation

func sampleDefer() {
  defer {
    defer {
      defer {
        print("나는 셋째 defer 안이다")
      }
      print("나는 둘째 defer 안이다")
    }
    print("나는 첫째 defer 안이다")
  }
  print("나는 return 전이다")
  return
}

sampleDefer()

// 결과:
// 나는 return 전이다
// 나는 첫째 defer 안이다
// 나는 둘째 defer 안이다
// 나는 셋째 defer 안이다

차례대로 실행된다. 첫째가 둘째를 안고 있고 둘째가 셋째를 안고 있다고 생각하면 되겠다.


defer는 return 전에 실행되어야 한다.(return이 제일 쎄다.)

reference

profile
iOS Developer

0개의 댓글