아직은 개린이

[Swift] lazy 본문

Swift + iOS/Swift

[Swift] lazy

jiyeonlab 2020. 2. 10. 15:01

Swift에는 lazy라는 키워드가 있다.

Swift Programming Guide에 보면, Properties 부분에서 lazy stored properties라는 것이 나온다. 

 

A lazy stored property is a property whose initial value is not calculated until the first time it is used. You indicate a lazy stored property by writing the lazy modifier before its declaration.

 

즉, 처음 사용되기 전까지 초기값이 계산되지 않는 프로퍼티이다.

 

이게 어떤 때에 쓰이는 것일까?

 

Lazy properties are useful when the initial value for a property is dependent on outside factors whose values are not known until after an instance's initialization is complete. Lazy properties are also useful when the initial value for a property requires complex or computationally expensive setup that should not be performed unless or until it is needed.

 

lazy properties는 초기값이 외부 요인에 의해 인스턴스의 초기화가 완료되기 전까지 알지 못할 때 유용하다고 한다. 또한, 이 값이 필요하기 전까지 수행되어서는 안되거나 계산이 복잡할 때 필요하다고 한다.

 


 

Stanford cs193p의 첫번째 과제 코드를 다시 살펴보면서 정리해보았다.

 

Concentration 게임을 만드는 이 프로젝트에는 ① 화면에 보여지는 게임의 theme, 카드에 이모티콘을 입히는 역할을 하는 ViewController와 ② 사용자가 선택한 카드가 매칭인지 아닌지와 게임에 필요한 카드셋을 생성하기 위한 모델에 해당하는 Concentration 클래스가 있다.

Concentration 프로젝트 구조

 

ViewController에서는 사용자가 선택한 카드가 매칭인지 아닌지를 확인하기 위해 모델에게 사용자가 선택한 카드 정보를 보내야한다. 따라서, Concentration 타입의 변수를 하나 선언하는데, 이때 lazy 키워드가 쓰인다! 

 

ViewController에서 Concentration 모델에 접근하기 위해 game 변수를 선언

 

이 game 변수가 lazy property로 선언된 이유는 Concentration의 initialize 안에서 인스턴스 멤버에 해당하는 cardButtons가 아직 초기화 중이라 쓸 수 없기 때문이다. 

 

또한, 이 인스턴스 변수가 필요하지 않다고 해도 화면이 처음 로드되었을 때엔 모든 카드가 뒷면을 보이고 있기 때문에 아직 모델에 해당하는 Concentration 클래스가 할 일이 없다

즉, Concentration 클래스는 사용자가 선택된 카드의 앞면 정보를 ViewController에게 알려주고, 사용자가 선택한 2장의 카드가 매칭인지 아닌지를 확인할 때에만 필요하다. 

 

초기 게임 로드 시, 아직 모델이 할 일은 없음

 

사용자가 카드를 뒤집어야, 모델이 할 일이 생김.

 

따라서 game 변수에 lazy 키워드를 붙여줌으로써 모델에 접근해야하는 일이 실제로 생겼을 때, 초기화를 해주는 것이다. 


정리

 

메모리 관리와 관련해서 weak self를 써준다던지, lazy 키워드는 상수에는 붙일 수 없다던지 등의 내용도 항상 잊지 말아야한다. 그리고 실제로 적용해보는 연습도 많이 해봐야 할 것 같다. 


참고자료

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

 

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

[Swift] weak, unowned  (0) 2020.02.27
[Swift] ARC  (0) 2020.02.26
[Swift] CustomStringConvertible  (0) 2020.02.10