Open Do-hyun-Kim opened 1 year ago
어떤 기능을 하는 코드를 하나의 블럭으로 모아놓은 것. 함수도 클로저의 한 형태, 클로저의 큰 특징은 클로저가 선언된 위치에서 어떤 상태를 캡쳐하고 참조를 얻을 수 있다는 것임
탈출 클로저란 @escaping
이 붙은 클로저로, 함수가 반환된 후 밖에서 실행시키는 클로저 를 말 함
-> 서버 비동기처리가 필요하거나, 특정 함수가 종료될때 특정 행동을 취하고 싶으면 탈출 클로저를 사용함
사용은 다음과 같이 해볼 수 있다.
func doSomethingAsync(completion: @escaping () -> Void) {
// 비동기 작업 수행 후
// completion 클로저를 나중에 호출
}
import Foundation
// 네트워크 요청을 수행하는 함수
func fetchURLData(from url: URL, completionHandler: @escaping (Data?, Error?) -> Void) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
completionHandler(nil, error) // 클로저가 함수를 벗어나 호출됨
} else if let data = data {
completionHandler(data, nil) // 클로저가 함수를 벗어나 호출됨
}
}.resume()
}
// 네트워크 요청 실행
if let url = URL(string: "https://example.com/data.json") {
fetchURLData(from: url) { (data, error) in
if let error = error {
print("에러 발생: \(error)")
} else if let data = data {
let responseString = String(data: data, encoding: .utf8)
print("데이터 받아옴: \(responseString ?? "데이터 없음")")
}
}
}
@escaping
을 작성할 수 있다.@escaping
)func doSomeThing(closure: @escaping () -> ()) {
}
non-escaping
의 경우 클로저가 함수 직전에 무조건 실행되기에(함수가 종료됨과 동시에 클로저도 사용이 끝남) 컴파일러가 메모리 관리를 지저분하게 하지 않아도 되어 성능이 향상된다.escaping
의 경우 함수가 종료되더라고 실제 클로저가 사용되지 않을 때까지 메모리를 추적해야 한다.코드를 하나의 블럭으로 모아놓은 것을 의미한다. named closure
와 unnamed closure
가 있으며 func
키워드로 시작해서 뒤에 이름이 붙는 클로저를 named closure
라 하며 일반적으로 함수라고 부른다. 반면 func
키워드 없이 매개변수와 리턴타입을 정의하는 헤더부분과 구현부인 바디부분 이루어진 것을 unnamed closure
라 한다. 보통 클로저라고 하면 이 unnamed closure
라고 할 수 있다.
클로저는 외부 변수를 참조할 때 기본적으로 strong
방식으로 캡처하기 때문에, 강한 참조 사이클이 발생할 수가 있어서 weak
이나 unowned
방식으로 캡처할 수 있도록 하여 memory leak 상황을 방지할 수 있다.
non-escaping
) 클로저와 탈출(escaping
) 클로저non-escaping
과 escaping
메카니즘은 함수의 매개변수로 클로저를 받을 때 적용된다.
non-escaping
: 함수의 매개변수로 클로저를 받을 때는 기본적으로 non-escaping
으로 설정이 되어 있다. non-escaping
클로저는 함수 내부에서 호출이 되는 것이 보장되기 때문에 클로저에 대한 메모리 관리를 효율적으로 할수 있다.
escaping
: escaping
클로저는 함수의 리턴값 반환 이후 외부에서도 사용이 될 수 있다. iOS는 이러한 escaping
클로저의 메모리를 추적해야 하기 때문에 퍼포먼스에 영향을 준다.
탈출 클로저에 대하여 설명하시오.
탈출(Escaping) 클로저
는 클로저가 함수의 인자로 전달 됬을때, 함수의 실행이 종료된 후에 실행되는 클로저 이다.탈출(Escaping) 클로저
를 사용하기 위해서는@escaping
키워드를 사용하여야 한다.탈출(Escaping) 클로저
내부에서는 해당 타입의 프로퍼티, 메서드, 서브스크립트 등에 접근하려면self
키워드를 명시적으로 사용해야한다.비탈출 클로저에 대해 알아가기!!
비탈출(Non- Escaping) 클로저
는 함수 스코프(scope) 범위 내에서 벗어날 수 없으며, 종료 전까지 반드시 실행되어야 하는 탈출 불가능한 클로저 이다.self
키워드 선택사항으로 제공해준다.Closure Capturing Values
context
내에 있는 상수나 변수에 대한 참조를 캡처(Capturing by reference) 하고 저장 할 수 있다.closure
가 캡쳐하는 값이 Reference Type이면 강한 순환 참조(Strong Reference Cycle)을 발생 시킬 수 있으며, weak, unowned 키워드를 사용하여 강한 순환 참조 발생을 막는다.📝 참고 사이트