Swift

[Swift] Closure(클로저)란?

Hatchling.dev 2023. 6. 21. 17:09

(편의상 편한 말투로 작성하는 점 이해 부탁드립니다.😅)

(부정확한 정보가 있을 수 있습니다. 지적 환영🤩)

 

오늘은 Closure는 무엇인지에 대해 알아보도록 하겠습니다!

Closure는 Optional과 같이 Swift의 꽃이라고 볼 수 있습니다! 실제로 많이 사용하기도 하고 많은 편리함을 제공하기 때문이죠!

Closure의 정의는 코드에서 전달 및 사용할 수 있는 코드블럭입니다. 코드블럭? 함수가 코드블럭이었는데 그럼 함수랑 어떤 차이가 있는지 알아봐야겠죠?

사실 함수도 클로저의 일종입니다. 이게 무슨 말이냐구요? 클로저에는 크게 Nemed Closure와 Unnamed Closure가 있는데 여기서 Nemed Closure, 즉 이름이 있는 클로저를 함수라고 표현하고 Unnamed Closure, 즉 이름이 없는 클로저(익명함수)를 보통 클로저라고 표현합니다. 또한, 함수와 마찬가지로 일급객체의 역할을 할 수 있습니다.

더보기

일급객체란?

전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환 값이 될 수 있다.

클로저는 Unnamed Closure라고 했죠? 함수와 사용방법은 같지만 이름만 없다고 생각하시면 좋을 것 같네요! 클로저에는 클로저 헤드와 바디가 존재하는데 이 둘을 구분하기 위해 사이에 in 키워드를 사용합니다.

{ (매개 변수) -> 리턴 타입 in // 클로저 헤드
	실행 구문 // 클로저 바디
}

클로저에는 매개변수와 리턴이 있을 수도 없을 수도 있습니다. 실제로 어떻게 사용하는지 알아보도록 하죠!

 

매개변수와 리턴이 있는 클로저

아래와 같이 함수처럼 매개변수 이름과 타입, 리턴 타입을 명시하여 사용할 수 있고 아래처럼 클로저를 변수에 담아 사용할 수 있습니다.

let hello = { (name: String) -> String in
    return "Hello, \(name)"
}

hello("woo")	// Hello, woo

 

매개변수와 리턴이 없는 클로저

아래처럼 매개변수와 리턴 없이 클로저를 사용할 수 있습니다. 또한, 클로저 헤드에 있는 () -> () in 같은 부분을 생략할 수도 있습니다.

let hello = { () -> () in
    print("hello")
}

hello()

 

클로저를 함수의 매개변수로 전달하는 예시

클로저는 일급객체이기 때문에 아래 코드처럼 함수의 매개변수로 전달할 수도 있습니다!

func doSomething(closure: () -> ()) {
    closure()
}

doSomething ( closure: { () -> () in
    print("hello")
})

 

클로저를 반환하는 함수 예시

func doSomething2() -> () -> () {
    return { () -> () in
        print("hello")
    }
}

doSomething2()()    // hello

 

후행클로저

후행클로저란 아래처럼 매개변수로 클로저를 사용하는 상황에 코드를 더 읽기 쉽도록 하는 방법입니다. 아래 코드에서 doSomething 함수를 호출하는 두 코드를 보겠습니다. 첫번째는 원래 방법대로 매개변수에 클로저를 할당하는 코드이고 두번째는 후행클로저를 사용한 코드입니다. 딱봐도 두번째 코드가 더 간결하여 읽고 이해하기 편한 것을 알 수 있죠?? 하지만 만약 매개변수로 전달하는 클로저가 두 개 이상이라면 마지막 클로저만 후행클로저로 전달 할 수 있습니다ㅠㅠㅠ 

func doSomething(closure: () -> ()) {
    closure()
}

doSomething ( closure: { () -> () in
    print("hello")
})

doSomething {
    print("hello")
}

 

클로저 단축 문법

클로저는 정말 다양한 방법으로 코드를 단축하여 사용할 수 있습니다. 하지만 너무 단축문법만을 사용하면 코드를 읽기는 쉬워지지만 이해하기 어려워질 수 있기 때문에 단축문법을 사용할 때는 항상 가독성 측면을 고려하여 사용하시는 것을 추천드립니다!

func doSomething3(closure: (Int, Int, Int) -> Int) {
    closure(1,2,3)
}

doSomething3(closure: { (a, b, c) in
    return a+b+c
})

doSomething3(closure: {
    return $0+$1+$2
})

doSomething3(closure: {
    $0+$1+$2
})

doSomething3() {
    $0+$1+$2
}

doSomething3 {
    $0+$1+$2
}

 

 

오늘은 Closure(클로저)에 대해 알아보았습니다. 사실 클로저는 굉장히 많이 사용하는 문법이기도 하고 내용도 방대하기 때문에 잘 이해하고 사용하는 것이 좋을 것 같습니다.

다음에는 고차함수에 대해 알아보도록 하겠습니다!!!

'Swift' 카테고리의 다른 글

[Swift] 고차함수란?  (0) 2023.06.23
[Swift] 예외처리(try-catch)  (0) 2023.06.18
[Swift] Extension(익스텐션)이란?  (0) 2023.06.15
[Swift] Protocol(프로토콜)이란?  (0) 2023.06.13
[Swift] 열거형(Enumeration)이란?  (0) 2023.06.11