Menu
Coddy logo textTech

클로저 반환

Coddy Swift 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 41번째.

makeCounter가 클로저를 반환하는 것을 보았습니다. 동일한 기법을 사용하여 설정 가능한(configurable) 동작을 만들 수 있습니다. 매개변수를 한 번 받고, 이를 여러 번 사용하는 함수를 다시 돌려받는 방식입니다.

func multiplier(_ k: Int) -> (Int) -> Int {
    return { n in n * k }
}

let triple = multiplier(3)
let tenfold = multiplier(10)
print(triple(4))                  // 12
print(tenfold(4))                 // 40

반환된 클로저는 k를 캡처하므로, 각각의 multiplier(...) 호출은 자신만의 k를 가진 완전히 새로운 클로저를 생성합니다.

이 패턴은 Swift에서 "전략(strategy)" 코드의 핵심입니다: 설정을 받아서 클로저를 반환하는 함수를 작성하고, 그 클로저를 map, filter, sorted(by:) 또는 함수 형태의 값이 필요한 곳 어디든 전달하는 것입니다.

challenge icon

챌린지

중급

두 개의 클로저 팩토리를 작성하세요:

  • greaterThan(_ k: Int) -> (Int) -> Bool: 인수가 k보다 엄격히 클 때 true를 반환하는 서술어(predicate)를 반환합니다.
  • scaleBy(_ k: Int) -> (Int) -> Int: 인수에 k를 곱하는 함수를 반환합니다.

세 줄을 입력받습니다:

  1. 정수 threshold
  2. 정수 scale
  3. 쉼표로 구분된 정수 리스트 nums

세 줄을 출력합니다:

  1. 임계값(threshold)보다 큰 숫자들 (greaterThan에서 생성된 클로저로 필터링), ,로 연결하여 출력
  2. 동일한 숫자들을 스케일링한 결과 (scaleBy로 매핑), ,로 연결하여 출력
  3. 필터링을 통과한 숫자의 개수

입력이 5 / 3 / 2,7,3,8,9인 경우, 출력은 다음과 같습니다:

7,8,9
21,24,27
3

치트 시트

클로저 팩토리(closure factory)는 매개변수를 캡처하고 그에 따라 구성된 새로운 클로저를 반환하는 함수입니다:

func multiplier(_ k: Int) -> (Int) -> Int {
    return { n in n * k }
}

let triple = multiplier(3)
print(triple(4))   // 12

각 호출은 k의 자체 캡처된 값을 가진 완전히 새로운 클로저를 생성합니다. 반환된 클로저는 map, filter, sorted(by:) 등에 직접 전달될 수 있습니다:

func greaterThan(_ k: Int) -> (Int) -> Bool {
    return { n in n > k }
}

let nums = [2, 7, 3, 8, 9]
let filtered = nums.filter(greaterThan(5))  // [7, 8, 9]
let scaled = filtered.map(multiplier(3))    // [21, 24, 27]

직접 해보기

let threshold = Int(readLine()!)!
let scale = Int(readLine()!)!
let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: greaterThan, scaleBy; 필터링 후 매핑; 결합하여 출력 및 개수 세기
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨