클로저는 조금 복잡하기 때문에 조금씩 단계 별로 알아보도록 하겠습니다.
기본 클로저 - Creating basic closures
클로저는 일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것을 말합니다.
함수를 만들어 변수에 할당하고, 해당 변수를 사용하여 해당 함수를 호출하고, 해당 함수를 다른 함수에 매개 변수로 전달할 수도 있습니다. 이러한 방식으로 사용되는 함수를 클로저라고 하며 함수처럼 작동하지만 약간 다르게 작성됩니다.
메시지를 인쇄하는 간단한 예제로 시작해 보겠습니다.
let driving = {
print("나는 지금 운전을 하고 있다.")
}
자 이렇게 이름없이 함수를 생성했고, driving
에 함수가 할당되었습니다. 이제 driving()
사용하여 호출 할 수 있습니다.
클로저는 무엇이며 Swift에서 왜 이렇게 많이 사용될까요??
클로저는 Swift에서 아무 중요하고 좋은 기능 중 하나이지만, 처음 배우는 사람들에게 혼란스럽게 하는 기능입니다. 클로저를 사용하는 가장 일반적인 이유 중 하나는 기능을 저장하는 것입니다.
"언젠가는 해야 할 작업이지만 지금은 필요하지 않습니다."
라고 하는것 처럼요.
- 딜레이 후 일부 코드를 실행합니다.
- 애니메이션이 완료된 후 일부 코드를 실행합니다.
- 다운로드가 완료되면 일부 코드를 실행합니다.
- 사용자가 메뉴에서 옵션을 선택한 경우 일부 코드를 실행합니다.
클로저를 통해 일부 기능을 단일 변수로 마무리하고 어딘가에 저장할 수 있습니다. 또한 기능에서 return
하고 클로저를 다른 곳에 보관
할 수도 있습니다. 클로저는 Swift를 처음 배울 때 특히 자신의 매개 변수를 accept
하거나 return
할 때 읽기가 어렵습니다. 하지만 클로저를 자주 보게 되면 쉽게 익숙 해 질 거예요!
기본 매개변수 TEST: 문제를 풀려면 이곳을 클릭해주세요
클로저에서 매개변수 사용
클로저를 만들 때 매개변수를 사용할 이름이나 공백이 없습니다. 이 뜻은 '클로저는 매개변수를 받아들일 수 없다'는 것을 의미하는 것이 아니라 단지 '다른 방식으로 사용해야 한다'는 것을 의미합니다. 클로저에서 매개변수는 { }
안에 나열됩니다. 클로저가 매개변수를 받아들이도록 하려면 { }
바로 뒤 ( )
안에 나열한 다음 in
을 작성하여 클로저가 시작된다는 것을 알 수 있도록 작성합니다.
예를 들어 다음과 같이 장소 이름 문자열을 유일한 매개변수로 받아들이는 클로저를 만들 수 있습니다.
let driving = { (place: String) in
print("저는 차를타고 \(place)에 가고있습니다.")
}
여기서 함수와 클로저의 차이점 중 하나는 클로저를 실행할 때는 변수레이블
을 사용하지 않는다는 점입니다. 위 코드를 호출하는 방법은 다음과 같습니다.
driving("병원")
//저는 차를타고 병원에 가고있습니다.
왜 클로저 매개변수가 중괄호 { } 안에 있나요??
클로저와 함수 모두 매개변수를 가질 수 있지만 매개 변수를 갖는 방식 방식이 많이 다릅니다. 다음은 문자열과 정수를 받는 함수입니다.
func pay(user: String, amount: Int) {
// code
}
그리고 아래는 클로저를 사용한 코드입니다. 위 코드와 아래 코드는 결괏값이 같습니다.
let payment = { (user: String, amount: Int) in
// code
}
보시다시피, 함수에서 매개변수는 { }
내부로 이동했으며 in
키워드는 매개변수 끝에 있고, 클로저의 본문이 시작한다고 표시하고 있습니다. 클로저는 Swift의 혼동을 피하기 위해서 { }
안에 매개변수를 사용합니다.
만약 let payment = (user: String, amount: Int)
이라고 작성했다면 클로저가 아닌 튜플을 만든 것처럼 보이겠죠?
매개변수와 클로저 본문은 모두 동일한 코드 블록의 일부이며 변수입니다. 이제 { }
안에 매개변수가 있으면 in
키워드가 있어야 하는 이유를 알 것 같나요? 만약 in
키워드가 없으면 클로저 본문이 시작되는 위치를 알기 어렵기 때문에 아주 중요합니다.
클로저에서 매개변수 사용 TEST: 문제를 풀려면 이곳을 클릭해주세요.
클로저에서 값 반환
클로저는 값을 return
할 수도 있으며, 매개 변수와 유사하게 작성됩니다. return
하는 법은 클로저 내부 in
키워드 바로 앞에 작성합니다. 예시를 보면서 함께 알아보도록 하겠습니다.
let driving = { (place: String) in
print("저는 차를타고 \(place)에 가고있습니다.")
}
위 코드는 단순히 driving()
클로저를 가져와서 직접 출력하고 있습니다. 하지만 이거 대신 그 값을 return
하도록 하겠습니다. 메시지를 직접 출력하는 대신 문자열을 return
하는 클로저를 원하기 때문에 -> Stringin
을 사용한 다음 return
을 해서 일반 함수처럼 사용해야 합니다.
let drivingWithReturn = { (place: String) -> String in
return "저는 차를타고 \(place)에 가고있습니다."
}
이제 클로저를 실행하고 return
값을 출력할 수 있습니다.
let message = drivingWithReturn("병원")
print(message)
매개변수가 없는 클로저에서 값을 반환하는 방법은??
첫 번째, 하나의 매개변수를 받아들이고 아무것도 return
하지 않는 클로저
let payment = { (user: String) in
print("Paying \(user)…")
}
두 번째, 하나의 매개변수를 받아들이고 Bool
을 return
하는 클로저
let payment = { (user: String) -> Bool in
print("Paying \(user)…")
return true
}
매개변수를 받아들이지 않고 값을 반환하는 것은 불가능합니다. 매개변수 없이 -> Bool in 은 Swift에서 인식하지 못하기 때문이죠. 그 대신 다음과 같이 매개변수 목록에 빈 ( )를 사용해야 합니다.
let payment = { () -> Bool in
print("Paying an anonymous person…")
return true
}
함수에서 매개변수가 없을 때 사용했던 것과 똑같죠? func payment() -> Bool
클로저에서 값을 반환하는 법 TEST:문제를 풀려면 이곳을 클릭해주세요.
읽어주셔서 감사합니다🤟
'SWIFT > Grammar' 카테고리의 다른 글
Swift : 기초문법 [#3 후행 클로저 - Closure syntax] (0) | 2021.02.24 |
---|---|
Swift : 기초문법 [#2 클로저를 함수로 전달] (0) | 2021.02.24 |
Swift : 기초문법 [매개변수 레이블 - Parameter Label] (0) | 2021.02.23 |
Swift : 기초문법 [중첩된 루프에서 Break] (0) | 2021.02.21 |
Swift : 기초문법 [Break Loop / 항복건너뛰기(Continue)] (0) | 2021.02.21 |