# [Swift - UIKit] NavigationItem에서 #selector로 메서드 바인딩

UINavigationItem 아웃렛 위에 UIBarButtonItem을 설정하기 위해서는 다양한 방식을 사용할 수 있다. 버튼 UI기 때문에 버튼의 액션을 컨트롤 할 필요가 있다. 즉, Button에 target-action 설정이 필요하다. `UIBarButtonItem` 클래스 인스턴스를 코드로 생성해보면 삽입해야 하는 action 속성의 타입이 `Selector` 로 나오는 경우를 볼 수 있다. 이 경우에 @objc 라고하는 어트리뷰트를 붙인 메서드를 등록하게 된다.

```javascript
// Swift

let menuButton = UIBarButtonItem(
  title: "menu",
  style: .plain,
  target: self,
  action: #selector(self.someMethod)
)

@objc func someMethod() {
  ...logic
}
```

어트리뷰트 이름에서 유추할 수 있듯이 해당 속성은 Objective-C Structure에 등록된 구조체 타입이다. Objective-C에서 동적인 무언가를 만들어내는 메서드를 바인딩 할 때 사용되었던 구조체다. 

![Image](https://upload.cafenono.com/image/slashpagePost/20240521/161005_asCS6oOt8I7v97343e?q=75&s=1280x180&t=outside&f=webp)

Objective-의 경우런타임단에서 메서드를 바인딩하여 동적인 처리를 할 수 있게 해주는데, Swift에서는 컴파일 단계에서 메서드를 바인딩하기 때문에 Swift에서 Selector 타입을 사용하기 위해서 @objc 라고 하는 어트리뷰트가 필요해진 것이라고 보면 되겠다. (나는 그렇게 이해했다.)

정리하자면, 
Swift에서 Objective-C에 의존적인 API를 활용하기 위해서 @objc 라고 하는 어트리뷰트를 자주 사용하게 될 수 있다. 이는 Swift 컴파일러가 해당 어트리뷰트를 이해할 수 있게 도와주는 역할을 하는 것이라고 쉽게 이해하면 되겠다.

---

참고한 문서 👇

[Using Objective-C Runtime Features in Swift | Apple Developer Documentation](https://developer.apple.com/documentation/swift/using-objective-c-runtime-features-in-swift)

For the site tree, see the [root Markdown](https://slashpage.com/hankyeol.md).
