-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Swift에서 클로저(Closure)란 무엇이며, 어떻게 사용하나요? #34
Comments
1. 정의
우리가 평소에 부르는 클로저는 익명함수(Unnamed Closure)를 클로저라 부릅니다.
2. 후행 클로저(trailing closure)후행 클로저는 클로저 표현을 간소화 하는 방법입니다.
이런 코드를
이렇게 간략하게 표현하여 가독성을 향상 시킬 수 있습니다. 3. 캡처 리스트(Capture List)캡처 리스트는 값 타입 일때는 클로저 내부에서 클로저 외부의 값을 참조할 때 참조하는 값이 변경되면 클로저 내부에서도 참조하는 값 또한 바뀌게 되므로 이를 방지하고자 주로 사용되고, 참조 타입 일때는 클로저의 강한 참조 순환 문제를 해결하기 귀해 사용됩니다. 3-1. 값(Value) 타입 캡처 리스트클로저 내부에서 외부의 값을 참조할 때 의 예시입니다.
위 코드처럼 클로저 내부에서 외부 변수를 캡처를 하는 경우인데 변수의 주소값을 힙(Heap) 영역에 저장하기 때문에 값이 변경되면 클로저 내부에도 변경이된다. 캡처 리스트에 의한 캡처의 예시입니다.
이 경우는 외부 변수 값 자체를 힙(Heap) 영역에 저장하여 외부 변수에 다른 값을 할당하더라도 내부 값이 변경되지않습니다. 3-2. 참조(Reference) 타입의 캡처 리스트강한 참조가 문제가 되는 예시를 설명하겠습니다.
결과 : 최종적으로 phang 인스턴스의 카운트 1, 클로저(run)의 카운트 1 인스턴스와 클로저가 강한 참조 사이클을 유지하고 있기 때문에 소멸자가 작동하고 있지 않습니다. 메모리 누수를 해결한 예시입니다.
결과 : 최종적으로 phang 인스턴스의 카운트 0, 클로저(run)의 카운트0 이기때문에 소멸자 작동 4. escaping, non-escaping 클로저4-1. non-escaping 클로저
이런 코드처럼 우리가 일반적으로 아무런 키워드 없이 파라미터로 받는 클로저를 모두 non-escaping 클로저라 부릅니다.
같은 코드를 3초 뒤에 실행하고 싶어 위와 같이 수정을 하면 이런 에러가 발생합니다. 그 이유는 이름 그대로 탈출이 불가능한 클로저이기 때문에 함수의 "흐름"을 탈출 하지 않는 클로저 이기 때문입니다.
따라서 위와 같이 함수 외부의 변수에 값을 할당하는 이런 경우도 에러가 발생합니다. 4-2. escaping 클로저non-escaping 클로저에서 함수의 흐름을 벗어날 수 없던 경우에 @escaping 키워드를 붙여 함수를 탈출하여 사용할 수 있습니다.
이렇게 사용을하면 이 클로저는 함수의 실행 흐름에서 벗어나도 상관 없이 실행되는 클로저이기 때문에 에러가 발생하지 않습니다.
이 에시 또한 함수 외부의 변수에 할당을 해주고싶을때 @escaping 키워드를 사용하여 사용할 수 있습니다. escaping 클로저는 이러한 특징 때문에 비동기작업을 시행할 때 주로 사용이 많이됩니다. |
The text was updated successfully, but these errors were encountered: