[Swift] 클로저(Closure)
swift를 공부하다 보면 클로저라는 단어를 많이 보게 되는데요. 저 또한 많이 들었고,, 항상 아 맞다 이런 거였지 하면서도 직접 사용해 보면 항상 헷갈리더라구요!
저와 같은 분이 많을 것 같다는 생각과 이왕 하는 거 정리도 해 보자 싶어서 글을 써보려 합니다!
- 클로저란?
- 클로저 표현 방법
- 클로저 표현 간소화
💻 클로저란?
그렇다면 클로저란 정확히 무엇일까요?
클로저는 일정 기능을 하는 코드를 하나의 블럭으로 모아놓은 것을 이야기합니다.
엇... 뭔가 함수랑 비슷한 것 같은데?
라는 생각이 드셨을 거예요! 맞아요, 함수도 클로저의 한 형태입니다. 클로저의 몇 가지 모양 중 하나가 함수라고 합니다.
💻 클로저 표현 방법
- 기본 클로저
- 후행 클로저
- 기본 클로저
- 후행 클로저
클로저는 위치를 기준으로 크게 기본 클로저 표현과 후행 클로저 표현으로 나눌 수 있습니다.
🍒 기본 클로저
우선, 기본 클로저의 형태는
{ (매개변수들) -> 반환타입 in
실행코드
}
입니다!
예시를 한번 들어볼게요. calculator 이라는 함수를 만들어 보겠습니다. 매개변수는 n1, n2와 함수 타입으로 들어올 수 있는 operation이라 하겠습니다.
밑에는 매개변수 두 값을 곱하여 반환하는 multiply 함수도 같이 선언하고, calculator 함수를 호출해 보겠습니다.
func calculator(n1: Int, n2: Int, operation: (Int, Int) -> Int) -> Int {
return operation(n1, n2)
}
func multiply(no1: Int, no2: Int) -> Int {
return no1*no2
}
calculator(n1: 2, n2: 3, operation: multiply) //6
이라는 코드를 완성했어요.
이번에는 multiply 함수를 호출하는 대신, 클로저를 사용하여 동일한 작업을 해 보겠습니다.
{ (no1: Int, no2: Int) -> Int in
return no1 * no2
}
calculator(n1: 2, n2: 3, operation: { (no1: Int, no2: Int) -> Int in
return no1 * no2
})
이런 식으로 작성하면 동일하게 6이라는 결과가 나온답니다!
🍒 후행 클로저
후행 클로저에 간단하게 정리해 보고, 뒤의 예제에서 적용해 볼게요.
-
함수나 메서드의 마지막 전달인자로 위치하는 클로저는,
함수의 메서드나 소괄호를 닫은 후 작성하면 됩니다. -
이때, 전달인자로 클로저 여러 개를 전달할 때는, 맨 마지막 클로저만 후행 클로저 형태로 사용할 수 있습니다.
-
또한, 단 하나의 클로저만 전달인자로 전달하는 경우에는 소괄호를 생략해 줄 수 있습니다.
💻 클로저 표현 간소화
이번에는 클로저 표현을 간소화하는 표현들을 알아 보겠습니당!
calculator(n1: 2, n2: 3, operation: { (no1: Int, no2: Int) -> Int in
return no1 * no2
})
위 코드를 같이 간소화시켜 보아요.
- 매개변수 타입 생략
- 반환 타입 생략
- 단축 인자 이름 사용
- 암시적 반환 표현
🍒 매개변수 타입 생략
메서드의 전달인자로 사용하는 클로저는, 메서드에서 요구하는 형태로 전달되어야 합니다. 즉, 매개변수의 타입이나 개수, 반환 타입 등이 가아야 전달인자로서 전달할 수 있습니다.
이는 전달인자로 전달할 클로저는 이미 적합한 타입을 준수하고 있다고 생각할 수 있겠죠?
따라서 클로저를 구현할 때는 매개변수의 타입을 굳이 명시해 주지 않아도 되는 것이랍니다.
calculator(n1: 2, n2: 3, operation: { (no1: Int, no2: Int) -> Int in
return no1 * no2
})
따라서 이 코드는 이렇게 표현할 수 있습니다.
calculator(n1: 2, n2: 3, operation: { (no1, no2) -> Int in return no1 * no2 })
🍒 반환 타입 생략
매개변수 타입을 생략할 때의 이유와 마찬가지로
calculator(n1: 2, n2: 3, operation: { (no1, no2) in return no1 * no2 })
이렇게 표현할 수도 있어요! 점점 간단해지고 있죠?
🍒 단축 인자 이름 사용
계속 코드를 작성하다 보니, 매개변수들의 이름이 의미없게 느껴지지 않나요? Swift에서는 이를 조금 더 멋스럽게 표현할 수 있도록 단축 인자 이름을 제공합니당.
첫 번째 전달인자부터 $0, $1, $2, ... 순서대로 표현합니다.
클로저를 표현할 때 항상 in을 사용했었는데요. in 이라는 키워드는 매개변수 및 반환타입과 실행 코드를 구분하기 위해 사용했던 것이므로 in도 같이 생략해 주면 됩니다.
calculator(n1: 2, n2: 3, operation: { return $0 * $1 })
🍒 암시적 반환 표현
아 이제 뭘 더 줄일 수 있지? 싶지만 사실 return 키워드마저 생략할 수 있답니다.
calculator(n1: 2, n2: 3, operation: { (no1, no2) in no1 * no2 })
엄청 간단해졌죠!
또한, 클로저가 반환 값을 갖는 클로저이고 클로저 내부의 실행문이 단 한 줄이면, 그 실행문을 바로 반환값으로 사용할 수도 있습니다.
이때 단축 인자 이름을 사용해 주면,
calculator(n1: 2, n2: 3, operation: { $0 * $1 })
이렇게까지 간단하게 표현할 수 있답니다!
앞에서 후행 클로저의 특징들을 적어봤었는데요.
- 함수나 메서드의 마지막 전달인자로 위치하는 클로저는,
함수의 메서드나 소괄호를 닫은 후 작성하면 됩니다.
이 특징을 이용하면, 마지막으로 이렇게까지 간단하게 표현할 수 있답니다.
calculator(n1: 2, n2: 3) { $0 * $1 })
엄청 간단하게 줄여지긴 했는데, 아직 저같은 코린이는 한눈에 알아보기엔 약간 가독성이 떨어지기도 하는 것 같아요!
오늘은 클로저에 대해 작성해 보았습니당.
빨리 더 많이 공부해 봐야겠어용... 문법 공부 열심히!!!!!!!
출처: SWIFT 스위프트 프로그래밍 - yagom
udemy iOS boostcamp - 안젤라유
Author And Source
이 문제에 관하여([Swift] 클로저(Closure)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@vvkkiie/Swift-클로저Closure저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)