Swift 클로저 : 함수보다 강력한 이름 없는 함수
Swift를 배우다 보면 “클로저(Closure)”라는 낯선 문법을 만나게 된다. 처음에는 생김새도 낯설고, 함수랑 뭐가 다른지도 헷갈릴 수 있다.
하지만 걱정할 필요 없다. 클로저는 결국 함수와 아주 비슷하며, 익숙해지면 오히려 더 유연한 코드를 짤 수 있도록 도와주는 도구이니까(:
1. 클로저란?
간단히 말해, 클로저는 이름이 없는 함수다.
함수처럼 값을 받고 결과를 반환할 수 있으며, 코드 블록 자체를 변수에 저장하거나 다른 함수에 넘길 수 있다.
Swift에서는 함수도 사실 이름이 붙은 클로저일 뿐이다.
2. 클로저 문법
Swift에서 클로저는 다음처럼 생겼다:
{ (매개변수 목록) -> 반환타입 in
실행 코드
}
예시:
{ (a: Int, b: Int) -> Int in
return a + b
}
이 클로저는 a와 b라는 두 개의 정수를 받아서, 더한 값을 반환한다.
3. 클로저는 왜 특별할까? — 일급 객체(First-Class Citizen)
Swift에서 클로저는 “일급 객체”다. 이건 무슨 뜻일까?
즉, 클로저는 아래와 같은 행동이 모두 가능하다:
- 변수나 상수에 저장할 수 있다.
- 함수의 인자로 넘길 수 있다.
- 함수의 반환값으로 받을 수 있다.
이런 특징 덕분에 클로저는 매우 유연하게 사용된다. 복잡한 로직도 간결하게 정리할 수 있다.
4. 클로저 간단 예제
아래 코드를 보자:
let sum: (Int, Int) -> Int = { (a: Int, b: Int) in
return a + b
}
let result = sum(3, 5)
print(result) // 8
이게 무슨 뜻일까?
- sum이라는 상수는 “정수 두 개를 받아서 정수를 반환하는” 클로저 타입이다.
- -> Int는 이 클로저가 Int를 반환한다는 의미다.
- 중괄호 {} 안에 실제 동작 코드가 들어있다. return a + b
- sum(3, 5)를 실행하면 8이 나온다.
정리하자면: sum은 더하기 계산기를 담은 변수인 셈이다!
5. 클로저를 함수 인자로 넘기기
클로저는 다른 함수의 전달인자로 넘겨줄 수 있다.
예를 들어:
func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a, b)
}
이 함수는 세 개의 인자를 받는다:
- a, b: 정수 두 개
- method: 두 정수를 계산해주는 클로저
그리고 실제로 이렇게 사용할 수 있다:
let add = { (a: Int, b: Int) in return a + b }
let subtract = { (a: Int, b: Int) in return a - b }
let multiply = { (a: Int, b: Int) in return a * b }
print(calculate(a: 10, b: 5, method: add)) // 15
print(calculate(a: 10, b: 5, method: subtract)) // 5
print(calculate(a: 10, b: 5, method: multiply)) // 50
6. 클로저를 직접 함수에 작성할 수도 있다
클로저를 굳이 변수로 만들지 않고, 바로 함수 인자로 넣을 수도 있다.
let result = calculate(a: 10, b: 2, method: { (x: Int, y: Int) in
return x / y
})
print(result) // 5
여기서 { (x: Int, y: Int) in return x / y } 이 부분이 바로 클로저이다.
이 클로저는 x와 y를 받아서 나눈 값을 반환하는 것이다.
calculate 함수 안에서는 이 클로저를 호출해서 계산한다.
이렇게 클로저를 함수 인자로 직접 작성하면, 한 번 쓰고 끝낼 계산 등을 간결하게 표현할 수 있다.
7. 비동기 작업과 클로저
클로저는 특히 비동기 작업에 자주 사용된다.
그럼, “비동기”는 또 뭘까?
💡 비동기란?
비동기(asynchronous)는 “지금 당장 결과가 안 나오더라도, 기다리지 않고 다음 일을 먼저 하는 방식”을 말한다.
예: 서버에서 데이터를 받아오는 데 3초가 걸린다고 해보자.
그동안 앱이 멈추면 안 되니까, 데이터를 요청하고 → 다음 코드를 먼저 실행하게 만드는 게 “비동기”다.
print("1. 요청 시작")
요청 보내기 (클로저로 처리)
print("2. 화면 계속 보여주기")
데이터가 도착하면 나중에 클로저가 실행되며 알려준다.
Swift에서는 버튼 클릭, 네트워크 통신, 애니메이션 등 다양한 비동기 작업에서 클로저를 사용해 “작업이 끝나면 뭘 할지”를 정해준다.
8. 클로저 요약
정의 | 이름 없는 함수 |
문법 | { (매개변수) -> 반환타입 in 실행코드 } |
저장 | 변수/상수에 저장 가능 |
전달 | 함수 인자로 전달 가능 |
반환 | 함수에서 클로저를 반환 가능 |
비동기 | 네트워크 응답 등 작업 완료 후 실행할 코드 전달 가능 |
클로저는 Swift에서 가장 강력하고 자주 쓰이는 개념 중 하나다.
익숙해지면 코드가 훨씬 더 간결하고 유연해질 것이다✨.
'IT' 카테고리의 다른 글
Swift 프로퍼티 정리: 처음부터 끝까지 이해하는 계산 속성 (0) | 2025.05.05 |
---|---|
Swift 클로저 고급편: 단축 인자, 암시적 반환, 후행 클로저, map, filter (0) | 2025.05.04 |
Model Context Protocol(MCP)? LLM 생태계를 재정의하는 새로운 표준 (0) | 2025.05.02 |
클래스 vs 구조체/열거형, 무엇이 다를까? Swift 값 타입과 참조 타입 정리 (0) | 2025.05.02 |
Swift enum 제대로 이해하기: rawValue부터 메서드까지 (0) | 2025.04.30 |
댓글
이 글 공유하기
다른 글
-
Swift 프로퍼티 정리: 처음부터 끝까지 이해하는 계산 속성
Swift 프로퍼티 정리: 처음부터 끝까지 이해하는 계산 속성
2025.05.05 -
Swift 클로저 고급편: 단축 인자, 암시적 반환, 후행 클로저, map, filter
Swift 클로저 고급편: 단축 인자, 암시적 반환, 후행 클로저, map, filter
2025.05.04 -
Model Context Protocol(MCP)? LLM 생태계를 재정의하는 새로운 표준
Model Context Protocol(MCP)? LLM 생태계를 재정의하는 새로운 표준
2025.05.02 -
클래스 vs 구조체/열거형, 무엇이 다를까? Swift 값 타입과 참조 타입 정리
클래스 vs 구조체/열거형, 무엇이 다를까? Swift 값 타입과 참조 타입 정리
2025.05.02