Swift 문법 기초 - 클로저(Closure) 완전 정리 [#11]

개발/iOS - Swift1 2025. 11. 6. 12:30

Swift를 공부하다 보면 꼭 한 번쯤은 마주치는 문법이 있습니다. 바로 클로저(Closure) 인데요.
처음 접하면 낯설지만, 한 번 개념을 잡고 나면 Swift의 함수형 프로그래밍 스타일을 이해하는 데 큰 도움이 됩니다.

 


클로저란?

간단히 말해 클로저는 "이름 없는 함수" 입니다.
일반 함수처럼 기능을 수행하지만, 별도의 이름이 없고 변수나 상수에 담아 전달하거나 실행할 수 있는 코드 블록이에요.

// 기본 함수
func sayHello(name: String) -> String {
    return "안녕하세요, \(name)님!"
}

// 클로저 표현
let helloClosure = { (name: String) -> String in
    return "안녕하세요, \(name)님!"
}

print(sayHello(name: "민수"))     // 안녕하세요, 민수님!
print(helloClosure("지연"))       // 안녕하세요, 지연님!

두 코드 모두 동일한 결과를 출력하지만,
클로저는 이름이 없고, 코드 안에 in 키워드를 사용해 매개변수와 실행 구문을 구분하는 것이 특징입니다.

 


클로저의 형태 간소화

Swift의 문법은 클로저를 점점 더 짧고 간결하게 표현할 수 있도록 설계되어 있습니다.
예를 들어 아래처럼 점점 줄여나갈 수 있어요.

// 1) 기본 형태
let add = { (a: Int, b: Int) -> Int in
    return a + b
}

// 2) 타입 추론
let add2: (Int, Int) -> Int = { a, b in
    return a + b
}

// 3) 암시적 반환 (한 줄 코드일 때 return 생략 가능)
let add3: (Int, Int) -> Int = { a, b in a + b }

// 4) 축약 인자 사용 ($0, $1)
let add4: (Int, Int) -> Int = { $0 + $1 }

print(add4(10, 20)) // 30

위처럼 $0, $1은 각각 첫 번째, 두 번째 매개변수를 의미하며, 익숙해지면 훨씬 빠르게 작성할 수 있습니다.

 


클로저와 함수의 연결

Swift에서는 클로저를 함수의 인자로 전달해 콜백(callback)처럼 활용할 수 있습니다.

func requestData(completion: (String) -> Void) {
    print("데이터 요청 중...")
    completion("요청 완료!")
}

// 클로저를 인자로 전달
requestData { result in
    print(result)
}

출력 결과:

데이터 요청 중...
요청 완료!

여기서 completion은 작업이 끝난 뒤 실행되는 콜백 클로저입니다.
이런 패턴은 네트워크 통신이나 비동기 작업에서 매우 자주 사용됩니다.

 


고차함수(map, filter, reduce)와 클로저

Swift의 배열(Array) 은 클로저를 활용한 고차함수들을 제공합니다.
대표적인 예로 map, filter, reduce가 있습니다.

반응형

1) map - 변환하기

map은 배열의 각 요소를 변환하여 새로운 배열을 반환합니다.

let numbers = [1, 2, 3, 4, 5]

// 각 요소에 2를 곱한 새로운 배열
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6, 8, 10]

2) filter - 조건으로 걸러내기

filter는 특정 조건을 만족하는 요소만 남겨 새로운 배열을 만듭니다.

let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [2, 4]

 

3) reduce - 하나로 합치기

reduce는 배열의 모든 요소를 하나의 값으로 합쳐줍니다.

let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 15

reduce는 첫 번째 인자로 초기값(여기서는 0)을 받고, 이후 순서대로 $0(누적값)과 $1(현재 요소)을 더해 나갑니다.

 


트레일링 클로저(Trailing Closure)

마지막 인자가 클로저라면, 소괄호 밖에 클로저를 쓸 수도 있습니다.
이걸 트레일링 클로저 문법이라고 해요.

func loadData(completion: (String) -> Void) {
    print("데이터 로드 중...")
    completion("로드 완료!")
}

// 일반 형태
loadData(completion: { result in
    print(result)
})

// 트레일링 클로저 형태
loadData { result in
    print(result)
}

둘 다 완전히 동일하게 동작합니다.
Swift의 많은 프레임워크가 이런 형태로 클로저를 활용하고 있죠.

 


마무리

정리하자면,

  • 클로저는 이름 없는 함수
  • 함수의 인자나 반환값으로 활용 가능
  • 고차함수(map, filter, reduce) 에서 자주 사용
  • 트레일링 클로저 문법으로 깔끔하게 작성 가능

Swift의 함수형 문법은 모두 클로저에서 시작된다고 해도 과언이 아닙니다.
익숙해지면 코드가 훨씬 간결해지고, 비동기 처리나 데이터 변환 로직을 더 깔끔하게 작성할 수 있습니다.

 

반응형
admin