클로저(Closure)
Swift에서 클로저(Closure)는 독립적으로 실행 가능한 코드 블록입니다. 클로저는 함수와 비슷한 역할을 하며, 코드를 캡슐화하고 전달할 수 있습니다. 클로저는 일급 객체(First-class citizen)로 취급되어 변수나 상수에 할당하거나 함수의 인자로 전달하고 반환값으로 사용할 수 있습니다.
쉽게 말해서 클로저는 특정 작업(함수)과 그 작업이 일어난 곳(환경 or 상태)을 모두 기억하고 있는 도구라고 생각하시면 됩니다.
클로저는 아래와 같은 형태를 가지고 있습니다.
클로저 표현식
{ (<매개변수 이름>: <매개변수 타입>, ... ) -> <반환타입> in
// 클로저 표현식 코드(실행될 코드)
}
여기서 매개변수, 반환타입, 그리고 실행될 코드 부분은 각각 생략 가능합니다. 클로저의 매개변수와 반환타입은 필요에 따라 선언하며, in 키워드를 통해 실행될 코드 부분과 구분합니다.
클로저는 주로 다음과 같은 상황에서 활용됩니다:
- 함수 내부에서 작업 단위 - 함수 내부에서 작은 작업 단위를 정의하고 필요한 곳에서 호출할 수 있습니다.
- 콜백(Callback) - 비동기적인 작업이 완료되거나 이벤트가 발생했을 때 호출되는 콜백 함수를 정의할 수 있습니다.
- 정렬(Sorting) - 배열이나 컬렉션을 정렬하기 위해 클로저를 사용할 수 있습니다.
- 맵(Map), 필터(Filter), 리듀스(Reduce) - 배열이나 컬렉션에 대해 맵, 필터, 리듀스 등의 고차함수(Higher-order function)와 함께 사용하여 데이터 처리 작업을 수행할 수 있습니다.
간단한 예제와 함께 더 자세히 알아보도록 하겠습니다.
클로저 예제
let multiply = {(A: Int, B: Int) -> Int in
return A * B
} // multiple의 자료형은 (Int, Int) -> Int
let result = multiply(20, 60) //상수를 함수처럼 호출
print(result) // 1200
이 예제는 2개의 정수 매개변수를 받아서 정수 결과 값을 반환하는 예제입니다.
1행부터 3행까지는 multiply라는 이름의 클로저 변수를 선언하고 있습니다. 클로저는 (A: Int, B: Int) -> Int 타입을 가지며, 두 개의 Int 타입 매개변수(A, B)와 Int 타입 반환값을 가지며, 클로저 내부에서는 매개변수 A와 B를 곱한 값을 반환하고 있습니다.
4행은 이전에 선언한 클로저 변수인 multiply를 함수처럼 호출하여 사용하고 있습니다. 호출 시에는 두 개의 정수 값인 20과 60을 인자로 전달합니다. 이렇게 전달된 인자 값은 클로저 내부에서 매개변수 A, B에 대응되어 곱셈 연산이 수행됩니다.
따라서 위의 코드에서는 20과 60을 곱한 결과인 1200이 변수 result에 저장됩니다.
5행에서는 변수 result에 저장된 값인 1200을 출력합니다.
// 값 획득(capturing values)
func makeIncrementer(incrementAmount: Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = {
total += incrementAmount
return total
}
return incrementer
}
let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo()) // 출력: 2
print(incrementByTwo()) // 출력: 4
위의 예제는 makeIncrementer라는 함수를 정의하고, 이 함수는 클로저를 반환합니다. makeIncrementer 함수는 incrementAmount라는 매개변수를 받으며, 이 값은 클로저 내부에서 참조됩니다.
함수 내부에 있는 total 변수는 클로저에 의해 "값 획득"되었습니다. 즉, 클로저가 생성될 때 total 변수의 복사본이 만들어지고, 이 복사본을 클로저 내부에서 사용합니다. 따라서 클로저가 호출될 때마다 total 변수의 값이 유지되며 변경됩니다.
클로저인 incrementer는 매번 호출될 때마다 total 값을 증가시키고, 현재 값을 반환합니다. 초기에 total은 0으로 초기화되었기 때문에 첫 번째 호출 시에는 2가 반환되고, 두 번째 호출 시에는 이전 값인 2에서 다시 2가 증가된 4가 반환됩니다.
따라서 위의 코드를 실행하면 "2"와 "4"가 순서대로 출력됩니다. 이 예제에서 주목할 점은 클로저 내부에서 외부 변수인 total을 참조하고 있다는 것입니다. 이렇게 외부 범위의 변수나 상수를 참조하는 것을 "값 획득(capturing values)"이라고 합니다.
클로저를 사용하여 외부 범위의 값을 획득할 수 있기 때문에 유용한 기능으로 활용할 수 있습니다. 예를 들어 비동기 작업이 완료된 후 결과 값을 처리하기 위해 콜백 함수 형태로 클로저를 사용할 수 있습니다. 또한 고차함수와 함께 사용하여 데이터 처리 작업을 간결하게 구현할 수도 있습니다.
감사합니다.
틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!
공감과 댓글 부탁드립니다.
'Apple > Swift' 카테고리의 다른 글
[Swift] 후행 클로저(trailing closure) (0) | 2023.10.18 |
---|---|
[Swift] 클로저 개념 완벽 이해하기 (0) | 2023.10.17 |
[Swift] 1급 객체 (first class object), 1급 시민 (first class citizen) (0) | 2023.10.13 |
[Swift] 가변 매개변수, call by address 구현 (0) | 2023.10.12 |
[Swift] guard~let, 디폴트 매개변수 정의, 함수 응용 (0) | 2023.10.11 |