인터페이스 빌더의 객체를 제어하는 방법: @IBOutlet, @IBAction

Lily·2021년 9월 24일
0

안녕하세요! 앱을 만들 때에는 인터페이스 빌더에서 스토리보드로 UI를 디자인하고, UI의 객체를 소스코드에 연결하는 과정이 필요합니다. 그래야 소스코드에서 객체를 제어할 수 있을테니까요. 오늘은 인터페이스 빌더상의 객체를 소스코드와 연결하는 방법에 대해 알아보도록 하겠습니다.

인터페이스 빌더 어노테이션 : @IBOutlet, @IBAction

인터페이스 빌더의 객체를 소스코드에 연결할 땐 인터페이스 빌더 어노테이션을 사용합니다.
@IBOutlet, @IBAction과 같은 어노테이션을 프로퍼티나 메소드를 정의 할때 앞에 붙여주어, 이 프로퍼티나 메소드는 인터페이스 빌더에 관련된 것임을 컴파일러에게 알려주는 것이죠. 그럼 앱이 빌드될 때 컴파일러가 체크하고, 연결정보를 찾아 인터페이스 빌더의 객체와 연결해줍니다. (어노테이션의 'IB'는 Interface Builder의 약자입니다)

사용예시⬇️

 @IBOutlet var slider: UISlider!
 
 @IBAction func sliderValueChanged(_ sender: UISlider) {
        print(sender.value)
        let integerValue: Int = Int(sender.value)
        sliderValueLabel.text = String(integerValue)
    }

그럼 @IBOutlet과 @IBAction은 어떻게 구분해서 사용해야 할까요?

먼저 @IBOutlet부터 살펴보겠습니다.

@IBOutlet : 객체의 참조

인터페이스 빌더의 객체의 속성을 제어하고 싶다면 @IBOutlet을 사용합니다.

화면상의 객체를 소스코드에서 참조하기 위해 사용하는 어노테이이션이 @IBOutlet 입니다. 이렇게 연결한 객체는 클래스내에서 변수로 자유롭게 제어할 수 있습니다. @IBOutlet으로 정의된 프로퍼티를 아울렛 변수라고 부릅니다. 이때 프로퍼티의 타입은 인터페이스 빌더의 객체와 타입이 일치해야합니다. 예를 들어 인터페이스 빌더의 객체가 슬라이더였다면 프로퍼티의 타입도 UISlider으로 정의해야합니다.

인터페이스 빌더의 슬라이더를 'slider'라는 변수로 소스코드에 연결한 예시⬇️

그럼 실제로 인터페이스 빌더의 객체를 소스코드에 연결해보는 작업을 해보겠습니다.

  1. 연결하려는 인터페이스 빌더내의 객체를 클래스 위로 끌어다 놓습니다. 그냥 끌어다 놓으면 안되고, 마우스 오른쪽 버튼을 눌러서 드래그 하거나 Ctrl키를 누른 상태에서 드래그해줍니다.

  2. 그럼 연결정보창이 뜹니다. 여기서 [Conntection] 항목을 Outlet으로 선택하고, [Name]에 프로퍼티의 이름을 작성해줍니다.

  3. [Storage]항목을 Strong/Weak중 선택합니다. 디폴트 값은 Strong입니다.

Strong/Weak의 차이점을 충분히 이해하려면 ARC(Auto Referencing Count)의 구조와 원리에 대한 이해가 필요하다고 합니다. 음...저도 아직 깊게 공부해보지 않은 부분이라 책의 설명을 바탕으로 작성했으니, 더 깊은 이해는 ARC관련 문서를 참고해주세요!

Strong과 Weak의 차이는 메모리 관리의 방법에 있습니다. Strong 타입으로 선언된 변수 나 상수는 다른 곳에서 참조되고 있을 시 메모리에서 제거되지 않습니다. 따라서 Strong타입 객체들끼리 상호 참조되는 일이 발생하면 참조 카운트가 0이 될 수 없으므로 앱이 실행되는 동안 영원히 메모리에서 제거되지 않아 메모리 누수로 이어집니다. 반면 Weak타입의 변수나 상수는 다른 곳에서 참조되고 있더라도 시스템에서 임의로 메모리에서 제거 할 수 있습니다. 따라서 상호 참조되는 객체 중 하나가 Weak타입이면 시스템에 의해 임의로 제거될 수 있으므로 상호참조로부터 벗어나 메모리 누수를 막을 수 있습니다.

이해가 되는 듯하면서, 안되네요.. 추후에 ARC에 대해서 공부해보는 시간을 가져봐야겠습니다.


@IBAction : 객체의 이벤트 제어

인터페이스 빌더의 객체가 사용자로부터 받은 이벤트를 제어할 때는 @IBAction을 사용합니다.

객체의 이벤트를 소스코드에 연결하고, 이벤트가 발생했을 때 수행해야하는 작업을 @IBAction으로 정의된 메소드 안에 작성해줍니다. 이렇게 정의된 메소드는 액션 메소드라고 부릅니다. 앱의 Event Roop가 객체의 이벤트를 감지하고, 시스템에 의해 연결된 액션 메소드가 호출되는 방식으로 앱은 작동합니다.

그럼 실제로 객체의 이벤트를 연결해 액션 메소드를 정의해보겠습니다.

  1. 액션 메소드로 정의하고 싶은 객체를 클래스 위로 끌여다 놓습니다. 아울렛 변수를 정의할 때와 방법은 동일합니다. 그냥 끌어다 놓으면 안되고, 마우스 오른쪽 버튼을 눌러서 드래그 하거나 Ctrl키를 누른 상태에서 드래그해줍니다.

  2. 그럼 연결정보창이 뜹니다. 여기서 [Conntection] 항목을 Action으로 선택하고, [Name]에 액션메소드의 이름을 작성해줍니다.

  3. 연결하고 싶은 객체의 이벤트를 [Event]항목에서 선택합니다.
    그럼 자동으로 해당 이벤트에 연결된 액션메소드가 클래스에 생성됩니다.


방법은 정말 간단하죠?ㅎㅎ 질문이나 피드백은 언제나 환영입니다!🤗

📑 참고자료
이재은, 꼼꼼한 재은씨의 Swift: 기본편, 루비페이퍼, 2020

profile
i🍎S 개발을 합니다

0개의 댓글