본문 바로가기

 𝗔𝗣𝗣𝗟𝗘/SWIFT : GRAMMAR

Swift 기초 문법 - 클로저(Closure)

 

 

 

 

클로저(Closure)

 

 

💡 클로저(Closure)

 

- 1급 객체 함수로, 다른 함수와 메서드의 인자로 전달하거나 함수나 메서드에서 반환값으로 사용할 수 있음

- 코드 블록으로서 변수나 상수를 캡처하여 저장할 수 있으며, 필요한 경우 나중에 호출할 수 있음

- 보통 이름 없는 익명 함수로 알려져 있으나, func 키워드를 통해 이름을 붙인 함수들도 클로저의 종류

 

 

 클로저의 형식 

전역 함수(Global Functions)

   이름이 있고 어떤 값도 캡처하지 않는 클로저

   → 전역 함수는 전역 범위에서 정의되며, 함수와 비슷한 구문으로 작성된다. 

 

 

중첩 함수(Nested Functions)

   이름이 있고 둘러싸는 함수에서 값을 캡처할 수 있는 클로저

   → 중첩 함수는 다른 함수 내에 정의되어 있으며, 해당 함수의 스코프 내에서만 사용된다.

 

 

클로저 표현식(Closure Expressions)

   주변 컨텍스트(혹, Scope)에서 값을 캡처할 수 있는 이름 없는 클로저

   → 클로저 표현식은 간결하게 작성할 수 있으며, 다른 함수의 인자로 전달하거나 반환값으로 사용될 수 있다.

 

 

 클로저 형식의 차이점 

형식 이름 캡처 여부 사용법
전역 함수 이름 있음 아니오 { (parameters) -> ReturnType in ... }
중첩 함수 이름 있음 { (parameters) -> ReturnType in ... }
클로저 표현식 이름 없음 { (parameters) -> ReturnType in ... }

 

 

 클로저 표현식(Closure Expressions) 

{ (parameters) -> <return type> in
   // 실행 구문
}

 

Closure(클로저) Head

(parameters) ->  </return type>  

   → 클로저의 매개변수 및 반환 유형을 정의(반환 유형은 필요에 따라 생략)

 

Closure(클로저) Body

실행 구문

   → 실행되는 코드 블록으로, 클로저의 동작을 정의

 

Closure Head와 Closure Body를 이워주는 키워드

 in

   → 클로저의 매개변수 및 반환 유형 정의와 실행 코드 블록을 분리하는 역할

 

 

클로저(Closure)를 변수처럼 정의 

let hello: (String, String) -> String = { $1 + $0 + "님 안녕하세요!" }
hello("로저", "클")

 

 

클로저(Closure)를 옵셔널로 정의 

let hello: ((String, String) -> String)?
hello?("로저", "클")

 

※ 옵셔널 체이닝도 가능

 

 

클로저(Closure)를 파라미터로 받기 

func manipulate(number: Int, using block: Int -> Int) -> Int {
  return block(number)
}

manipulate(number: 10, using: { (number: Int) -> Int in
  return number * 2
})

 

 

클로저(Closure)를 사용한 sort() & filter() 

let numbers = [1, 3, 2, 6, 7, 5, 8, 4]

let sortedNumbers = numbers.sort { $0 < $1 }
print(sortedNumbers) // [1, 2, 3, 4, 5, 6, 7, 8]

let evens = numbers.filter { $0 % 2 == 0 }
print(evens) // [2, 6, 8, 4]

 

 

 

 

Tip : 함수는 곧 클로저이기 때문에 연산자는 클로저다. 1 + 2를 실행하면, +라는 이름을 가진 연산자 함수가 실행된다. 파라미터로는 1과 2가 넘겨지게 되며 즉, + 함수는 파라미터 두 개를 받아서 합을 반환하는 클로저다. 그렇기 때문에, 아래 예시와 같이 +라는 연산자를 클로저로 넘겨버리는 문법도 가능해진다. 

arr1.reduce(0, +) // 28

 

 

 

 

 

참고

Recent Posts
Visits
Today
Yesterday
Archives
Calendar
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31