[swift] 클로저와 델리게이트(Delegate)

클로저와 델리게이트는 Swift에서 많이 사용되는 기능 중 하나입니다. 이들은 코드를 조금 더 모듈화하고 유연하게 만들어주는 역할을 합니다. 이번 포스트에서는 클로저와 델리게이트의 기본 개념과 사용 방법에 대해 알아보겠습니다.

클로저(Closure)

클로저는 일종의 코드 블럭으로, 이름 없이 정의할 수 있는 함수입니다. 클로저는 변수나 상수로 선언되어 다른 함수에 전달될 수 있고, 함수의 반환 값으로 사용될 수도 있습니다.

클로저의 기본 문법은 다음과 같습니다:

{ (parameters) -> ReturnType in
    statements
}

예제 코드를 통해 클로저의 사용을 살펴보겠습니다:

let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { (number) -> Int in
    return number * number
}
print(squaredNumbers) // 출력: [1, 4, 9, 16, 25]

위 예제에서 map 메서드의 인자로 클로저를 전달하여 배열의 각 요소를 제곱한 결과를 새로운 배열로 반환합니다.

클로저는 주로 함수나 메서드의 인자로 사용되며, 사용자 지정 작업을 수행하고자 할 때 특히 유용합니다.

델리게이트(Delegate)

델리게이트는 한 객체가 다른 객체로 작업을 위임하는 디자인 패턴입니다. 일반적으로 델리게이트는 프로토콜을 통해 정의되며, 델리게이트를 구현하고자 하는 객체는 해당 프로토콜을 채택해야 합니다. 델리게이트를 사용함으로써 객체 간의 결합도를 낮출 수 있고, 코드의 재사용성을 높일 수 있습니다.

델리게이트의 구현 순서는 다음과 같습니다:

  1. 프로토콜을 정의하고, 원하는 작업에 대한 메서드를 선언합니다.
  2. 델리게이트 역할을 하는 객체는 해당 프로토콜을 채택합니다.
  3. 델리게이트 객체는 필요한 메서드를 구현합니다.

델리게이트의 사용 예제를 살펴보기 위해 간단한 커스텀 버튼 클래스를 만들어보겠습니다:

protocol CustomButtonDelegate: AnyObject {
    func buttonClicked()
}

class CustomButton {
    weak var delegate: CustomButtonDelegate?
    
    func onClick() {
        delegate?.buttonClicked()
    }
}

class ViewController: CustomButtonDelegate {
    let button = CustomButton()
    
    init() {
        button.delegate = self
    }
    
    func buttonClicked() {
        print("Button clicked")
    }
}

let viewController = ViewController()
viewController.button.onClick() // 출력: "Button clicked"

위 예제에서 CustomButtonDelegate 프로토콜은 buttonClicked() 메서드를 선언합니다. CustomButton 클래스에서는 delegate 프로퍼티로 해당 프로토콜을 가지며, onClick() 메서드를 호출할 때에 델리게이트 객체를 통해 buttonClicked() 메서드를 호출합니다. ViewController 클래스는 CustomButtonDelegate를 채택하고, buttonClicked() 메서드를 구현하여 버튼이 클릭되었을 때 원하는 작업을 수행합니다.

결론

클로저와 델리게이트는 Swift에서 기능을 모듈화하고 유연하게 만드는 데 도움을 주는 중요한 요소입니다. 클로저는 코드의 재사용성과 간결성을 향상시키며, 델리게이트는 객체 간의 결합도를 낮추고 더 유연한 코드 작성을 가능하게 합니다.

더 많은 정보를 원하신다면 아래의 참고 자료를 확인해보세요: