본문 바로가기
Swift

클로저는 무엇인가?

by 밤새는탐험가 2023. 12. 8.

 

클로저란?

 

클로저는 코드의 블럭을 말함

1급시민으로 전달인자, 변수, 상수 등으로 저장 및 전달이 가능함 

 

★ 1급 시민이란?

1급 시민 또는 1급 객체라고도 함

다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킴

보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 경우를 말함 

 

func 키워드를 이용해 이름을 붙여주는 함수를 클로저라고 함

다만, 클로저에는 2가지가 있음

 

 

이번에 알아볼 것은 UnNamed Closure임

 

let sampleClosure = { 
    print("Hello Closure")
}

 

 


 

기본 클로저 문법

 

익명 함수이기 때문에 func 키워드는 사용하지 않음

in 이라는 키워드를 기준으로

(매개변수 목록) -> 반환타입 부분은 클로저 헤드라고 함

실행 코드 부분은 클로저 바디라고 함 

{ (매개변수 목록) -> 반환타입 in
    실행 코드
}

 

Parameter와 Return Type이 둘 다 없는 클로저 

 

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

 

Parameter와 Return Type이 둘 다  있는 클로저 

여기서 Parameter로 name이 있음

이거는 Argument Label이 아님 

(클로저에서는 Argument Label 사용하지 않음)

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

 

따라서 호출할 때는 다음과 같이 함 

 

SomeClosure("Mike")
Someclosure(name: "Mike")   // 이거는 에러

 

 


 

앞서 클로저는 1급 객체 (= 1급 시민) 이라고 함 

따라서 다음과 같이 사용 가능함 

 

 

클로저를 변수나 상수에 대입 가능 

 

let SomeClosure1 = { () -> () in
    print("SomeClosure")
}

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


let SomeClosure3 = SomeClosure1

 

 

함수의 파라미터 타입으로 클로저 전달 가능

 

함수를 파라미터로 전달받는 runSomething이라는 함수를 만듦

func runSomething(someClosure: () -> ()) {
    someClosure()
}

 

 

아래와 같이 파라미터로 클로저를 받음 

(someClosure: 뒤의 { 부터 } 까지가 클로저임 )

 

runSomething(someClosure: { () -> () in 
    print("Hello")
})

/*
아래와 같이도 작성 가능함
runSomething {
    print("Hello")
}

*/

 

 

함수의 반환 타입으로 클로저 사용 가능

 

func doSomething() -> () -> () {
    
    return { () -> () in
        print("Hello!")
    }
}


let closure = doSomething()
closure()

// Hello!

 

 

 


 

클로저 실행하는 방법

 

클로저가 대입된 변수나 상수 호출하기 

 

let closure = { () -> String in
    return "Hello!"
}

closure()

 

 

클로저를 직접 실행하기 

 

({ () -> () in
    print("Hello!")
})()

 

 


 

출처

https://babbab2.tistory.com/81

 

Swift) 클로저(Closure) 정복하기(1/3) - 클로저, 누구냐 넌

안녕하세요 :) 소들입니다 으휴 저번 주도 쓸데없이 바빴어서 포스팅을 못했네용 나태한 저번주의 나를 반성하며.. 하암..🥱 음 전에 제가 Swift의 꽃이 Optional이라고 말한 적 있는데, Optional 만큼

babbab2.tistory.com