육식하는야채의 개발일지
article thumbnail

 

import UIKit

class ViewController: UIViewController {
	@IBOutlet var uiTitle: UILabel!
	
	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view.
	}

	@IBAction func sayhellow(_ sender: UIButton) {
		self.uiTitle.text = "Hello World!"
	}
	
}

앞에 @로 시작하는 것을 어노테이션(Annotation) 이라고 부르며 주로 변수나 메소드의 성격을 알려주는 역할이다.

사용자가 아닌 컴파일러에게 알려준다.

@IBOutlet은 프로퍼티에 @IBAction은 메소드에 추가된다.

앞에 IB는 인터페이스 빌더(Interface Builder)를 의미한다.

즉, 인터페이스 빌더의 객체를 참조하는 프로퍼티거나, 인터페이스 빌더의 객체에서 일어나는 이벤트를 받는 메소드임을 표시하기 위해 사용되는 어노테이션이다.

 

3.1 📌 @IBOutlet과 @IBAction

이 두 어노테이션을 가진프로퍼티나 메소드는 처음 앱이 빌드될 때 컴파일러가 체크하고 연결 정보를 찾아 인터페이스 빌더의 객체와 서로 연결해준다.

 

인스펙터 탭 중에 마지막 탭에서 연결 정보를 확인할 수 있다.

 

[3.1.1] @IBOutlet - 객체의 참조

@IBOutlet은 객체의 속성을 제어할 목적으로 클래스의 프로퍼티와 연결한다. 연결하기 위해서는 인터페이스 빌더의 객체와 클래스의 프로퍼티는 서로 타입이 일치해야 한다.

 

만약 인터페이스의 객체가 Label이면 소스코드에서도 UILabel 클래스 타입으로 정의되어야 하고

인터페이스의 객체가 Button이면 소스코드에서도 UIButton 클래스 타입으로 정의되어야 연결할 수 있다.

 

스토리보드에 레이블을 추가하고 소스코드로 연결을 하면 위와 같은 팝업창이 뜨는데

Connection을 Outlet으로 선택하고 이름을 지정하면 연결할 수 있다.

Storage에서는 Strong과 Weak를 선택할 수 있는데

 

Strong과 Weak는 메모리 회수 정책에 관련이 있다.

일반적으로 변수나 상수는 다른 곳에서 참조되고 있을 경우 메모리에서 제거되지 않는 것이 원칙이지만

Weak로 선언한 변수나 상수는 참조되고 있더라고 시스템이 임의로 메모리에서 제거할 수 있다.

그렇기 때문에 Weak로 선언하면 가끔 변수나 상수에 저장한 값이 사라지는 현상이 발생하기도 한다.

 

Weak가 필요한 이유

Strong타입 객체끼리 서로 상호 참조를 하면 어떤 경우에도 참조 카운트가 0이 되지 않음

이는 앱이 실행되는 한 영원히 메모리에서 제거되지 않음을 뜻함

그리고 이건 메모리 누수가 발생한다는 의미

하지만 한쪽을 Weak로 선언하면 시스템에 의해 임의로 제거가 가능하므로 상호참조로부터 벗어날 수 있음

 

[3.1.2] @IBAction - 객체의 이벤트 제어

객체의 이벤트를 제어할 때 사용되는 어노테이션이다. 액션 메소드라고도 부른다.

버튼에 주로 사용되는 어노테이션이다.

버튼의 외형 및 성질에 관한 값을 변경하려면 @IBOutlet을 사용하고

사용자의 액션이 발생했을 때 수행해야 하는 작업 이 있다면 @IBAction을 사용한다.

사용자와 상호 반응할 수 있는 객체를 연결할 때만 사용할 수 있다.

 

Event를 누르면 이벤트 종류를 선택할 수있다. 

	@IBAction func sayhellow(_ sender: UIButton) {
	
	}

 

메소드 안에 버튼이 눌렸을 때 실행될 코드를 작성하면 된다.

 

3.2 📌 인터페이스 빌더 객체와 클래스를 연결하는 방법

[3.2.2] 소토리보드의 객체를 클래스와 연결하기

레이블과 버튼을 5개씩 만들었다.

import UIKit

class ViewController: UIViewController {

	@IBOutlet var label01: UILabel!
	override func viewDidLoad() {
		super.viewDidLoad()
		// Do any additional setup after loading the view.
	}
	@IBAction func button01(_ sender: Any) {
	}
	

}

레이블 1번과 버튼 1번을 연결해주었다.

레이블 01
버튼01

왼쪽에 흰색 원형부분에 마우스를 대면 해당하는 레이블을 확인할 수 있다.

 

[3.2.3] 커넥션 인스펙터 탭을 사용해서 객체 연결하기

Label02를 클릭하고 커넥션 인스펙터 탭으로 가면

이렇게 3가지를 볼 수 있는데 

Referencing Outlets에서 드래그해서 연결을 해줄 수 있다.

 

버튼도 똑같이 원하는 이벤트를 눌러서 드래그하면 해당 이벤트로 연결할 수 있다.

 

[3.2.4] 보조 에디터를 사용하여 객체 연결하기

직접 코드를 작성하면 위와 같이 원형이 생기는데 이것을 원하는 객체위로 드래그하면 연결된다.

코드에서 UILabel뒤에 !를 붙이는 이유는 

일반적으로 클래스에서 초기화 되지 않은 프로퍼티는 모두 옵셔널이어야 한다.

하지만 옵셔널로 선언하면 불편한점이 많기 때문에 강제언래핑을 사용해서 일반타입처럼 사용할 수 있도록 !를 붙인다.

 

profile

육식하는야채의 개발일지

@육식하는야채

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!