BOID

[swift] 후처리 defer란? - HoonIOS 본문

swift 시작기

[swift] 후처리 defer란? - HoonIOS

HoonIOS 2021. 4. 8. 13:58

안녕하세요 HoonIOS입니다. :)

후처리인 defer에 대해 알아보겠습니다. 크게 defer는 코드 블록을 나가기 전에 무조건 꼭! 꼭! 꼭! 실행되는 코드라고 생각하시면 됩니다.

 

defer란?

- defer구문을 사용하면 현재 있는 코드 블록을 빠져나가기 전에 꼭 실행해야 하는 코드를 작성해줄 수 있습니다.

- defer구문의 특징은 오류가 발생해서 코드블록을코드 블록을 나가든, 정상적으로 코드 블록을 나가든 defer구문은 코드가 블록을 빠져나가기 전에 무조건 실행이 됩니다.

( 따라서 만약 파일을 열고 사용하고 있다가 에러가 발생해서 코드가 블록을 빠져나가게 되면 그전에 그 파일을 정상적으로 닫아 메모리 해제를 해야 되는데 그때  defer구문 내부의 코드를 실행시켜 정상적으로 메모리를 해제시켜줄 수 있습니다. )

- defer의 역할은 오류처리뿐만 아니라, 함수, 메서드, 반복문, 조건문 등등 어디서든 사용을 할 수 있습니다.

- 만약 defer을 사용하지 않는다면 특정 순간순간에 사용할 코드를 모두 다 if문을 해줘야 합니다. 하지만 defer을 사용하면 if문을 안 써줘도 되므로 유지보수하기가 편합니다.

( 예를 들어 파일을 닫을 때 메모리 해제할 코드를 defer로 해주면 돼지만 defer로 쓰지 않을 경우 일일이 defer을 써줘야 합니다. )

- 프로그램 실행 흐름이 코드 범위를 벗어나기 전에 실행이 되므로 break, return 같이 흐름을 빠져나갈 수 있는 코드나 오류를 던지는 코드를 defer 블록에 작성을 해주면 안 됩니다.

- 여러 개의 defer가 블록 내부에 있을 시 맨 마지막에 작성된 구문부터 역순으로 실행이 됩니다.

 

- 간단한 예시를 몇 가지 봐보겠습니다. 

 

* 코드 설명

  1.   print가 먼저 출력되고 defer가 출력되는 것을 확인할 수 있습니다.
  2. 0... 3까지의 loop를 도는데 만약 1일 때 이것은 1입니다를 print 하고 if문 블록을 빠져나가므로 \n의 엔터를 출력하는 defer가 실행됩니다.

 

- 이번에는 defer가 블록 내부에 여러 개 있을 때 어떻게 실행이 되는지 확인해보겠습니다.

 

defer가 여러개일때

* 코드 설명

  1.  제일 먼저 1을 출력한 후 do에 있는 코드를 타게 되 4랑 블록을 나가게 되는 defer을 출력하므로 3이 출력되고 6이 출력되고 defer가 두 개가 중복되므로 아래에서부터 5, 2를 출력하게 됩니다.
  2.  이렇게 do구문을 catch절과 함께 사용하지 않고 단독으로 사용을 할 수 있습니다. 
  3. 코드 블록 내부에 또 한 단계 하위 블록을 만들고자 할 때 사용할 수 있는데 이럴 때는 하위 블록이 종료될 때 그 내부의 defer구문이 실행됩니다.

- try 함수를 이용했을 때 error가 나올 때 defer출력이 어떻게 되는지 확인해보겠습니다.

 

* 코드 설명

- try? 함수에서 만약 true이면 에러가 출력되므로 오류가 던지기 전에 if문 전까지 작성된 defer를 출력합니다.

- try 함수에서 만약 false로 에러가 출력되지 않으면 오류를 던지지 않고 함수 블록 맨 마지막부터 거꾸로 3 2 1 순으로 출력되는 것을 볼 수 있습니다.

 

후처리인 defer에 대해 알아봤습니다. 이것은 오류처리 코드가 아니지만 앞에서 예를 들었던 것처럼 파일을 열고 있을 때 에러 때문에 시스템이 꺼졌을 때 파일을 닫고 꺼질 수 있게 도와주는 코드라고 생각을 하면 될꺼같습니다.  

반응형
Comments