본문 바로가기
iOS/Swift 문법 심화 학습

클로저

by 황민우 2022. 2. 1.

정의

- 코드의 블록입니다.

- 참조 타입입니다.

- 일급 객체(시민)입니다.

          1, 일급 객체는 전달 인자로 보낼 수 있습니다.

          2, 일급 객체는 변수, 상수, 등으로 저장하거나 전달 할 수 있습니다.

          3, 일급 객체는 함수의 반환 값이 될 수 있습니다.

- 함수 또한 클로저의 포함됩니다. ( 함수 = 이름 있는 클로저 )


형식

- 매개변수가 없는 경우 ( ) 로 생략 가능

- 반환타입이 없으면 void로 생략 가능

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

 

예제

1, 함수

- 다음은 일반적인 함수입니다.

- Sum 이라는 함수에 매개변수 a, b에 대한 값을 계산해주는 기능입니다.

- SumResult라는 변수에 a=1, b=2 값을 입력한 Sum 함수를 초기화하고 실행해보겠습니다.

func Sum(a: Int, b: Int) -> Int{
    return a + b
}

var SumResult: Int = Sum(a: 1, b: 2)
print(SumResult)

실행결과
// 3

2, 함수의 클로저 사용

- Sum 함수를 클로저로 표현한 형식입니다.

- 위의 예제와 동일한 기능을 수행하지만, 클로저를 사용해 코드의 작성 형식이 다른 것을 확인할 수 있습니다.

var Sum: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
    return a + b
}
var SumResult = Sum(1, 2)
print(SumResult)

실행결과
// 3

3, 함수를 할당한 클로저

- 함수는 클로저의 일종이므로 Sum 변수에 SumFuntion 함수를 할당할 수 있습니다.

- Sum이라는 변수에 SumFuntion 함수를 할당했습니다.

- 그리고 SumResultV라는 변수에 Sum 변수를 값을 지정해 호출하면 SumFuntion 함수에 내장된 코드를 수행합니다.

- 실행을 통해 함수와 클로저와 동일하게 수행됨을 확인할 수 있습니다.

func SumFuntion(a: Int, b: Int) -> Int{
    return a + b
}

var SumResult: Int = SumFuntion(a: 1, b: 2)
print(SumResult)

var Sum: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
    return a + b
}
var SumResultA = Sum(1, 2)
print(SumResultA)

Sum = SumFuntion(a:b:)
var SumResultV = Sum(1, 2)
print(SumResultV)

실행결과
// 3
// 3
// 3

4, 함수의 전달인자로서의 클로저

- 클로저는 함수의 전달인자로 많이 사용됩니다.

- 다음 예제를 보면 각 계산에 따른 클로저를 생성한 뒤, 함수를 사용하며 메서드로 클로저를 호출합니다.

- 함수를 실행할 때 method 뒤에 클로저를 호출하여 클로저에 작성된 코드기능을 구현할 수 있습니다.

let add: (Int, Int) -> Int
add = { (a: Int, b: Int) -> Int in
    return a + b
}

let substract: (Int, Int) -> Int
substract = { (a: Int, b: Int) -> Int in
    return a - b
}

let divide: (Int, Int) -> Int
divide = { (a: Int, b: Int) -> Int in
    return a / b
}

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var calculated: Int

calculated = calculate(a: 50, b: 10, method: add)

print(calculated) // 60

calculated = calculate(a: 50, b: 10, method: substract)

print(calculated) // 40

calculated = calculate(a: 50, b: 10, method: divide)

print(calculated) // 5

5, 함수의 전달인자로서의 클로저 2

- 위의 예제와 동일한 예제입니다.

- 메서드라는 매개변수의 전달 인자에 바로 코드 블록을 작성해도 위와 동일하게 기능을 구현할 수 있습니다. 

let add: (Int, Int) -> Int
add = { (a: Int, b: Int) -> Int in
    return a + b
}

let substract: (Int, Int) -> Int
substract = { (a: Int, b: Int) -> Int in
    return a - b
}

let divide: (Int, Int) -> Int
divide = { (a: Int, b: Int) -> Int in
    return a / b
}

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var calculated: Int

calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in
    return left * right
})

print(calculated) // 500

내용 출처

https://www.youtube.com/watch?v=Ix9gGuupjBU&list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy&index=17 

 

'iOS > Swift 문법 심화 학습' 카테고리의 다른 글

구조체 [ Struct ]  (0) 2022.02.03
클로저 고급  (0) 2022.02.02
값 타입과 참조 타입  (0) 2022.01.31
extensions  (0) 2022.01.30
guard  (0) 2022.01.28

댓글