본문 바로가기
앱/iOS

iOS - 객체 제어

by msm1029 2021. 11. 7.
반응형

Label과 Button을 클래스에 연결하면 각각 @IBOutlet, @IBAction이 클래스에 추가되는 것을 본 적이 있을 것이다.

이 '@' 키워드로 시작하는 것을 Annotation이라고 하며 변수나 메소드의 성격을 컴파일러에게 알려주는 역할을 한다.

@IBOutlet은 Property에, @IBAction은 Method에 각각 추가되는데 이는 IB(Interface Builder)에 관련된 것이라는 의미를 나타낸다.

 

이렇게 IB Annotation이 붙은 Property나 Method들은 처음 앱이 Build될 때 컴파일러가 확인하고 연결 정보를 찾아 IB의 객체와 서로 연결해준다. 연결된 정보들은 Xcode의 Connection Attribute 탭에서 확인할 수 있다. 이 탭은 다른 Inspector 탭과 마찬가지로 현재 활성화되어 있는 객체에 한해 정보를 보여준다. IB에서 어떤 객체가 활성화되어 있느냐에 따라 전혀 다른 결과를 보여주므로 주의해야 한다. View Controller를 선택하면 연결된 모든 정보를 한꺼번에 확인할 수 있으므로 연결 정보를 확인할 때 편리하다.

 

@IBOutlet

@IBOutlet은 화면상의 객체를 소스 코드에서 참조하기 위해 사용하는 Annotation이며 주로 객체의 속성을 제어할 목적으로 클래스의 Property에 연결한다. 이 때, IB(Interface Builder)의 객체와 클래스의 Property는 서로 타입이 일치해야 한다. 예를 들어, IB의 객체가 Label이었다면 소스 코드에서는 동일한 객체 타입인 UILabel 클래스 타입으로 정의되고 Button이었다면 UIButton 클래스 타입으로 정의된다. 이렇게 @IBOutlet으로 정의된 Property를 아울렛 변수(Outlet Variable)라고 부른다.

 

아울렛 변수를 연결하려면 객체를 클래스 위로 끌어다놓으면 된다. 이 때, 그냥 마우스 왼쪽 버튼만 누른 채 끌어다 놓으면 객체가 통째로 옮겨져 원하는 기능이 동작하지 않을 수 있다. 이를 방지하기 위해 Ctrl을 누른 채로 왼쪽 버튼을 눌러 드래그하하거나 오른쪽 버튼을 눌러서 드래그해야 한다. 연결 정보창에서는 [Connection] 항목을 Outlet으로 선택하고 Property의 이름을 입력해주면 생성된다.

 

Storage 항목에는 Strong/Weak 두 가지 값이 존재한다. 이 둘의 차이는 메모리 회수 정책에 있다. 일반적으로 변수나 상수는 다른 곳에서 참조되고 있을 경우 메모리에서 제거되지 않는 것이 원칙이지만, Weak 타입으로 선언된 변수나 상수는 다른 곳에서 참조되고 있더라도 시스템이 임의로 메모리에서 제거할 수 있다. 기본적으로 속성 변수는 Strong타입이다. 자세한 내용은 ARC 공식 문서를 통해 알아보자.

https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

 

@IBAction

@IBAction은 객체의 이벤트를 제어할 때 사용하는 Annotation이며 버튼을 눌렀을 때 메시지를 띄워주는 등, 특정 객체에서 지정된 이벤트가 발생했을 때 일련의 프로세스를 실행하도록 할 목적을 가진다. 이를 위해 이 Annotation은 Action Method와 함께 사용된다.

 

버튼 객체를 떠올려보자. 버튼 객체는 배경 색상, 크기, 모양, 텍스트 내용 등의 정적인 상태를 표현할 수 있는 Property와 터치, 클릭, 드래그 등 동적인 상태를 처리하는 Method를 가진다. 각각의 상황에 맞춰 Property를 변경하고 싶다면 @IBOutlet을, Method 관련 작업을 하고싶다면 @IBAction을 사용해야 한다.

 

당연하게 Action Method는 버튼이나 테이블 셀과 같이 사용자와 상호 반응을 할 수 있는 객체와 연결할 때만 사용할 수 있다. Action Method는 다양한 이벤트를 가지고 있고 객체가 지원하는 이벤트 목록은 Connection Inspector의 [Sent Events]에서 확인할 수 있다. 

반응형

' > iOS' 카테고리의 다른 글

Swift - 모나드  (0) 2022.01.22
Swift의 연산자  (0) 2022.01.13
iOS와 코코아 터치 프레임워크  (0) 2021.11.06
iOS 앱의 구조  (0) 2021.11.05
첫 iOS 앱 클론코딩 후기  (0) 2021.02.10