클로저(Closures)

썹스·2022년 11월 4일
0

Swift 문법

목록 보기
33/68

클로저(Closures)

  • 클로저(Closures)는 이름이 없는 함수(익명 함수)입니다.

  • 클로저는 특정 기능이 있는 코드들을 하나의 독립적인 코드 블록으로 묶어 사용할 수 있습니다. (함수와 동일)

  • 클로저는 상황에 따라 축약 표현이 가능합니다.

  • 클로저는 참조 타입 입니다. (call by reference) (Swift에서 참조 타입은 클래스와 클로저 두 개 뿐입니다.)

✅ 함수 표현

func sum(x: Int, y: Int) -> Int{
    return x+y
}

✅ 클로저 표현

{(x: Int, y: Int) -> Int in
    return x + y
}

🤔 클로저(Closures)를 왜 사용할까??

보통 클로저는 단독으로 사용되지 않고 함수의 파라미터(parameter)로 많이 사용됩니다.(파라미터로 사용하는 함수를 콜백 함수(Callback function)라 부릅니다.)

클로저를 파라미터로 사용할 경우 다양한 형태로 구현이 가능해집니다. (파라미터 타입을 정의하는 곳에 클로저를 정의한다면 다양한 형태로 활용 가능)

대표적인 클로저의 활용으로는 고차 함수(Higher-order function)가 있습니다.

✅ 외부에서 정의한 클로저를 파라미터로 활용

let test = {(x: Bool) -> String in
    if x{
        return "간편 결제를 사용하여"
    }
    else{
        return "간편 결제를 사용하지 않고"
    }
}

func pay(price: Int, TF: Bool, simplePayment: (Bool) -> String) -> String{
    return "\(simplePayment(TF)) \(price)원의 제품을 구매했습니다."
}


print(pay(price: 25000, TF: true, simplePayment: test))  
/*
 -출력 결과-
 간편 결제를 사용하여 25000원의 제품을 구매했습니다.
*/

✅ 파라미터 타입을 정의하는 곳에 클로저 정의

func pay(price: Int, TF: Bool, simplePayment: (Bool) -> String) -> String{
    return "\(simplePayment(TF)) \(price)원의 제품을 구매했습니다."
}

let result = pay(price: 25000, TF: true, simplePayment: {(x: Bool) -> String in
    print("다양한 형태로 추가 구현1")
    if x{
        return "간편 결제를 사용하여"
    }
    else{
        return "간편 결제를 사용하지 않고"
    }
    print("해당 print() 함수는 동작하지 않습니다.")  // 함수는 return문을 만날 때 동작을 종료됩니다.
})

print(result)
/*
 -출력 결과-
 다양한 형태로 추가 구현1
 간편 결제를 사용하여 25000원의 제품을 구매했습니다.
*/

📌 클로저의 다양한 축약 표현

클로저는 상황에 따라 다양한 방식으로 축약 표현이 가능합니다.

  1. 파라미터(parameter)와 리턴값(return value)의 타입을 추론할 수 있으면, 타입 작성을 생략할 수 있습니다.

  2. 코드를 한 줄로 표현할 수 있으면, "return"을 생략할 수 있습니다.

  3. 아규먼트(argument) 이름을 축약(Shorthand Argument)하여 단축 형태의 파라미터를 사용할 수 있습니다.

  4. 후행 클로저(trailing closure): 함수의 마지막 아규먼트가 클로저인 경우 파라미터의 이름을 생략 및 소괄호를 생략할 수 있습니다.

✅ 축약 표현 없이 사용

func sum(x: Int, y: Int, closure: (Int, Int) -> Int){
    print(closure(x, y))
}


sum(x: 10, y: 10, closure: {(a: Int, b: Int) -> Int in
    return a + b
})

/*
 출력 결과
 20
*/

✅ 타입을 추론할 수 있으면, 타입 작성 생략

  • 출력값의 타입을 추론할 수 있으면, return type을 생략할 수 있습니다.
func sum(x: Int, y: Int, closure: (Int, Int) -> Int){
    print(closure(x, y))
}


sum(x: 10, y: 10, closure: {(a, b) in  // "-> Int" 생략
    return a + b
})

/*
 출력 결과
 20
*/

✅ 코드를 한 줄로 표현할 수 있으면, "return" 생략

func sum(x: Int, y: Int, closure: (Int, Int) -> Int){
    print(closure(x, y))
}


sum(x: 10, y: 10, closure: {(a: Int, b: Int) -> Int in
    a + b   //"return" 생략
})

/*
 출력 결과
 20
*/

✅ 아규먼트(argument) 이름을 축약(Shorthand Argument)

func sum(x: Int, y: Int, closure: (Int, Int) -> Int){
    print(closure(x, y))
}


sum(x: 10, y: 10, closure: {
    return $0 + $1   // 아규먼트 "a와 b"를 생략
})

/*
 출력 결과
 20
*/

✅ 후행 클로저(trailing closure)를 사용한 축약 표현

func sum(x: Int, y: Int, closure: (Int, Int) -> Int){
    print(closure(x, y))
}


sum(x: 10, y: 10){(a: Int, b: Int) -> Int in  //클로저 이름 "closure:"을 생략
    return a + b
}

/*
 출력 결과
 20
*/

✅ 사용 가능한 축약 표현을 모두 사용

  • 타입 추론
  • "return" 생략
  • 아규먼트 이름 축약
  • 후행 클로저
func sum(x: Int, y: Int, closure: (Int, Int) -> Int){
    print(closure(x, y))
}

/* 축약 표현이 없는 full code
sum(x: 10, y: 10, closure: {(a: Int, b: Int) -> Int in  
    return a + b
})
*/

sum(x: 10, y: 10){$0 + $1}  //축약 표현을 모두 사용한 code

/*
 출력 결과
 20
*/
profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글