TIL: 클로저(Closure)

Royce·2025년 3월 29일

Swift 문법

목록 보기
58/63

클로저(Closure)

클로저 - 이름이 없는(익명) 함수

  • 클로저는 이름이 없는 함수(익명 함수) 를 의미하며, 함수와 유사한 방식으로 사용된다
  • 클로저는 변수, 상수에 할당하거나 다른 함수의 파라미터로 전달할 수 있다
  • 클로저는 함수의 코드 블록을 간결하게 표현할 수 있다는 특징이 있다

함수의 타입 표기법 (복습)

  • 함수의 타입을 변수로 선언하는 방법을 알아보자
let functionA: (String) -> String     // 1) 파라미터: String, 리턴형: String

let functionB: (Int) -> ()            // 1) 파라미터: Int, 리턴형: 없음 (Void)

let functionC: (String) -> Void       // 1) 파라미터: String, 리턴형: 없음 (Void)

함수와 클로저의 형태 비교

  • 동일한 기능을 수행하는 함수와 클로저를 비교해보면, 클로저가 더 간결하게 표현되는 것을 알 수 있다
// 함수의 형태
func add(a: Int, b: Int) -> Int {
    let result = a + b
    return result
}

// 클로저의 형태 (기본 문법)
let addClosure = { (a: Int, b: Int) -> Int in
    return a + b
}

// 클로저의 형태 (타입 추론이 가능한 경우)
let addClosureSimplified: (Int, Int) -> Int = { a, b in
    return a + b
}

// 클로저 호출 예제
print(add(3, 4))  // 출력: 7
print(addClosure(3, 4))  // 출력: 7
print(addClosureSimplified(3, 4))  // 출력: 7

클로저 문법 간소화

  • 클로저는 리턴형 생략, 파라미터 타입 생략 등 문법적으로 간결하게 사용할 수 있다
// 기본 클로저 형태 (두 숫자의 합을 계산)
let addNumbers = { (a: Int, b: Int) in
    return a + b
}

// 타입을 명시한 클로저 (곱셈 연산)
let multiplyNumbers: (Int, Int) -> Int = { x, y in
    return x * y
}

// 파라미터가 없는 간단한 클로저 (메시지 출력)
let showMessage = {
    print("Swift 클로저 예제입니다.")
}

// 파라미터 타입 생략 (타입 추론 사용)
let doubleNumber = { number in
    return number * 2
}

// 클로저 호출 예제
print(addNumbers(3, 4))      // 출력: 7
print(multiplyNumbers(2, 5))    // 출력: 10
showMessage()                // 출력: Swift 클로저 예제입니다.
print(doubleNumber(6))        // 출력: 12

함수의 1급 객체(First-class Object)로서의 특징

  • Swift에서 함수는 1급 객체(First-class Object) 로 취급된다
  • 함수와 클로저 모두 다음의 조건을 만족한다:
    • 변수를 통해 저장, 전달 가능
    • 다른 함수의 파라미터로 전달할 수 있음
    • 다른 함수의 반환값으로 사용 가능

함수를 변수에 할당하여 사용하기

  • 함수는 변수나 상수에 할당하여 호출할 수 있다
func makeGreeting(name: String) -> String {
    return "안녕하세요, \(name)님!"
}

func makeFarewell(name: String) -> String {
    return "안녕히 가세요, \(name)님!"
}

// 함수들을 변수에 할당
var messageGenerator: (String) -> String = makeGreeting

// 변수로 함수 호출
print(messageGenerator("Royce"))  // 출력: 안녕하세요, Royce님!

// 다른 함수로 할당 변경
messageGenerator = makeFarewell

// 변수로 다시 호출
print(messageGenerator("Royce"))  // 출력: 안녕히 가세요, Royce님!

클로저를 변수에 할당하여 사용하기

  • 클로저를 변수에 할당하고 호출할 수 있다
let farewellMessage = { (name: String) -> String in
    return "잘 가요, \(name)님!"
}

// 클로저 호출
print(farewellMessage("Royce"))  // 출력: 잘 가요, Royce님!

요약

  • 클로저는 이름이 없는 함수(익명 함수)이며, 변수나 상수에 할당하거나 함수의 인자로 전달할 수 있다
  • 함수는 1급 객체로 취급되며, 변수에 할당되거나 파라미터로 전달되거나 반환될 수 있다
  • 클로저는 함수와 문법적으로 유사하지만 더 간결하게 표현할 수 있는 특징을 가지고 있다
profile
iOS 개발자 지망생

0개의 댓글