[iOS_Swift] 클로저(3) - 탈출클로저(Escaping Closure)

2021. 12. 31. 03:13Programming/iOS_Swift

탈출클로저란?

  함수 내부에 전달인자로 선언된 클로저를 함수외부로 반환된 후 실행이 되게 하는 클로저를 의미한다. 글로 적으면서도 말이 되게 어려운데, 최대한 쉽게 설명하면 함수가 종료된 뒤에 실행되는 클로저이다. 그럼 이게 왜 탈출클로저라는 명칭이 붙었느냐, 함수 내부에 전달인자로 있는 클로저가 함수가 종료되고 함수외부로 탈출!하기때문에 탈출클로저이다(..) 처음에 책을 봤을 때 이게 무슨 허무맹랑한 소리인가 싶었는데, 이해하고 다시 읽어보니 이보다 적합한 설명은 없는 것 같다.

 

어디에 주로 활용될까?  

  일반적으로 API를 호출하는 등 비동기 작업을 해야할 때 주로 쓰인다. 비동기 작업 자체가 한번에 여러작업을 하는 것이기에 순서가 뒤죽박죽이 될 수가 있다. 그렇기에 함수가 종료된 뒤에 실시하는 탈출클로저가 필요한 것이다!

    URLSession과 관련된 메서드를 보면 컴플리션 핸들러의 전달인자로 탈출클로저를 활용하는 것을 확인할 수 있다.

 

    꼭 비동기 작업이 아니더라도 순서가 중요한 작업이라면 언제든지 활용할 수 있다!

  최근에 프로젝트에서 수정한 코드인데, 백업 버튼을 누르면 백업경고얼럿을 먼저 띄워준 뒤 확인버튼을 누르면 액티비티뷰를 보여주려 했다. 물론 그냥 탈출클로저 안쓰고 얼럿액션 핸들러에서 다 처리해줘도 되지만, 학습차원에서 탈출클로저를 활용해봤다. 핸들러 부분을 탈출클로저로 받아서 외부 다른 함수로 던져줬다.

 

왜 알아야할까?

  앞서 기술했듯이, 작업 순서가 중요한데 비동기 작업을 꼭 해야하는 경우에 유용하기 때문이다. 네트워크 통신 등을 만약 동기로 작업하게되면 응답이 오기전까지 다른 어떤 작업도 할 수 없기에 효율이 너무 떨어지게 된다.

 

** 왜 알아야 할까? 부분은 현재까지 제가 느낀 사견이기 때문에, 틀릴 수도 있습니다. 내용이 잘못됐다면 언제든 지적해주세요!