[Swift 기초] 클로저 Closure

2022. 3. 14. 20:00Swift 기초 정리

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

1. 클로저

{(매개변수 목록) -> 반환타입 in 
  //in은 반환형과 상태를 구분 짓는 구문
	/*실행 코드*/
}
  • {} 형식의 코드 블럭 → 클로저 표현을 통해 문장을 짧고 간단하게 만들 수 있다.
    • 일회용 함수를 작성할 수 있는 구문
  • 변수, 상수 등으로 저장하거나, 매개변수처럼 전달 인자로 전달되거나 사용할 수 있는 코드 블럭 역할
  • 함수: 이름이 있는 클로저, 클로저의 일종
    • 함수 역시 다른 함수의 매개변수로 사용될 수 있다.
    • 클로저는 func와 함수 이름이 생략된 경량 함수 객체이다.

1-1. 함수와 클로저 사용

  • 함수는 클로저의 일종이기 때문에 클로저 변수에 함수를 할당할 수 있다. 
  • //함수
    func sumFunction(a: Int, b: Int) -> Int{
        return a + b 
    }
    var sumResult: Int = sumFunction(a: 1, b: 2)
    
    //클로저
    var sum: (Int, Int) -> Int = { (a: Int, b:Int) -> Int in
        return a + b
    }
    sumResult = sum(1,2)  
    //함수는 클로저의 일종이기 때문에 sum변수에 함수 할당 가능
    sum = sumFunction(a:b:)
    sumResult = sum(1,2) //sumFunction이 호출 되는 것

1-2. 함수의 전달 인자로서의 클로저

  • 클로저는 주로 함수의 전달인자로 많이 사용된다. 함수 내부에서 원하는 코드블럭을 실행할 수 있다.
  • let add: (Int, Int) -> Int
    add = { (a: Int, b: Int) in
        return a + b
    }
    
    //method라는 이름으로 클로저를 전달받는 함수
    func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
        return method(a, b)
    }
    
    var calculated: Int
    calculated = calculate(a: 10, b: 20, method: add)
    print(calculated) //20
    
    //따로 클로저를 상수 변수에 넣어 전달하지 않고, 함수를 호출할 때 클로저를 넣어 작성할 수 있다.
    calculated = calculate(a: 10, b: 20, method: {(left: Int, right: Int) -> Int in
        return left * right
    })
    print(calculated)
     

2. 클로저 고급

2-1. 후행 클로저

  • 클로저가 함수의 마지막 전달 인자라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있다.
  • //method가 없어진 것
    calculated = calculate(a: 10, b:10) { (left: Int, right: Int) -> Int in
    	return left + right
    }

2-2. 반환 타입 생략

  • calculate 함수의 method 매개변수는 Int 타입을 반환할 것이라는 사실을 컴파일러가 알기 때문에 굳이 클로저에서 반환 타입을 명시해주지 않아도 된다.
  • 대신 in 키워드는 생략할 수 없다.
  • // -> Int 가 없어진 것
    calculated = calculate(a: 10, b: 10, method: {(left: Int, right: Int) in
        return left * right
    })
  • 후행 클로저와 함께 사용 가능
  • calculated = calculate(a: 10, b: 10){(left: Int, right: Int) in
        return left - right
    }

2-3. 단축 인자 이름

  • 컴파일러가 매개변수 목록 타입을 알고 있기 때문에 클로저 내에 매개변수 목록 없이 사용할 수 있다.
  • 단축 인자 이름은 클로저의 매개변수의 순서대로 $0, $1...처럼 표현한다.
  • //매개변수 목록 left, right 없어진 것 + in키워드
    calculated = calculate(a: 10, b: 10, method: {
    	return $0 + $1
    })
  • 후행 클로저와 함께 사용 가능
  • calculated = calculate(a: 10, b: 10) {
    	return $0 + $1
    }

2-4. 암시적 반환 표현

  • 클로저가 반환하는 값이 있다면 클로저의 마지막 줄의 결과값은 암시적으로 반환 값으로 취급한다.
  • //return이 없어진 것
    calculated = calculate(a: 10, b:10) {
    	$0 + $1
    }

2-5 비교

//축약 X
calculated = calculate(a: 10, b: 10, method: {(left: Int, right: Int) -> Int in
    return left + right
})
print(calculated) //20

//축약 O
calculated = calculate(a:10, b:10) {$0 + $1}
print(calculated)  //20

3. 클로저 사용 예시

3-1. 배열의 map

  • 배열 원소에 개별적으로 적용되어 손쉽게 여러 번의 연산을 수행함
  • 배열의 map 함수는 함수를 매개변수로 입력받아 각 멤버에게 적용함
  • func doubler(i : Int) -> Int {
        return i * 2 
    }
    func square(i: Int) -> Int {
        return i * i
    }
    
    //함수를 한 번만 사용한다면 굳이 함수를 만들 필요가 없다: 익명화한 코드블럭 클로저 사용
    let arrayC = array.map({(i: Int) -> Int in 
        return i * 2
    })
    let arrayD = array.map({(i: Int) -> Int in
        return i * i
    })

 

 

 

참고하였습니다. 감사합니다.

https://yagom.net/courses/swift-basic/lessons/클로저/topic/클로저-기본/

https://yagom.net/courses/swift-basic/lessons/클로저/topic/다양한-클로저-표현/

 

​https://www.inflearn.com/course/창원대학교-박동규-교수의-swift-기초-강좌/lecture/1895?tab=note 

 

728x90

'Swift 기초 정리' 카테고리의 다른 글

[Swift 기초] 참조타입과 값타입  (0) 2022.03.19
[Swift 기초] 사용자정의타입  (0) 2022.03.18
[Swift 기초] 제너릭  (0) 2022.03.11
[Swift 기초] 함수  (0) 2022.03.11
[Swift 기초] 제어구문-반복문  (0) 2022.03.07