IBOutlet과 IBAction
- UIKit
- Swift
IBOutlet과 IBAction
IBOutlet , IBAction은 UIKit의 스토리보드에서 자주 쓰이며 두 역할은 다르다!
🤔 IBOutlet이란?
IBOutlet 은 Interface Builder Outlet의 약자이다.
UI 요소(Button이나 Label 등..)를 수정할 수 있도록 프로퍼티로 연결해주는 역할을 수행한다.
IBOutlet을 통해 스토리보드에서 생성한 요소 객체에 접근하여 조작할 수 있게 한다!
@IBOutlet weak var titleLabel: UILabel!
스토리보드에 추가하고 싶은 요소가 있다면 Command + Shift + L을 입력한 뒤 아래처럼 Label을 추가한다.

그 후 스토리보드에서 생성한 Label 객체에 접근할 수 있도록 코드 프로퍼티로 연결하기 위해 스토리보드에서 생성한 Label를 control 를 꾹 누른 상태로 코드에 드래그 엔 드랍을 수행하면 다음과 같은 창이 팝업된다.

원하는 옵션과 라벨명을 입력한 뒤 Connect를 입력할 시 아래와 같이 스토리보드와 연결된다.

이제 titleLabel 객체를 통해 titleLabel.text = "Hello S022" 와 같이 속성을 수정할 수 있다.
🤔 IBAction이란?
IBAction은 Interface Builder Action의 약자이다.
스토리 보드에서 연결된 UI 요소들의 이벤트(터치, 클릭 등..)을 메서드로 연결해주도록 한다.
즉, 버튼 클릭이나 값 변경과 같은 동작을 코드에서 처리하기 위해 사용된다.
@IBAction func didTapButton(_ sender: UIButton) {
print("버튼을 눌렀어요!")
}
// 스토리보드에서 didTapButton이 연결된 버튼을 클릭할 경우 해당 메서드가 호출된다.
스토리보드에서 IBAction을 추가하는 방법은 아래와 같이 간단하다.

IBOutlet을 코드로 가져올 때와 동일하게 컨트롤을 누른 뒤 코드로 가져오면 설정창이 팝업된다.
동일하게 원하는 옵션(Connection, Type, Event 등)을 설정한 뒤 Connect 시키면 된다.

그 뒤 IBAction으로 연결된 버튼을 Tap 했을 때 titleLabel 값이 변경되도록 아래와 같이 코드를 작성한 뒤 빌드해보자.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
var count: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
titleLabel.text = "\(count)"
}
@IBAction func didTapButton(_ sender: UIButton) {
print("titleLabel을 수정했습니다.")
count += 1
titleLabel.text = "\(count)"
}
}
실제 기기로 빌드해보면 정상적으로 작동하는 것을 확인할 수 있다.


🤔 왜 IBOutlet을 선언할 때 weak와 strong의 차이가 있을까?
IBOutlet을 생성하고자 할 때 weak가 기본값인 이유가 무엇인지 궁금했다.
또, strong으로 선언하면 어떤 문제가 발생할 수 있을지도 탐구하고 싶다.
weak과 strong은 ARC와 아주 깊은 관련이 있다는 것은 알고 있지만, 스토리보드와 실제 코드를 연결할 때 발생할 수 있는 문제는 무엇이 있을 지 시나리오를 세워보고 탐구할 예정이다.