iOS/Swift

[Swift] lazy 키워드

누알라리 2020. 12. 20. 19:57

개요

 

메모리 관리에 대해 생각을 하다보니 C++에 lazy 키워드라는게 있었던거 같은데..생각이 들며 Swift에도 있겠지 하고 찾아보았습니다.

 

출처:

abhimuralidharan.medium.com/lazy-var-in-ios-swift-96c75cb8a13a

 

lazy var in ios swift

This article explains the working of lazy var in swift.You must have some knowledge in closures.

abhimuralidharan.medium.com


iOS는 App의 사용량이 너무 높아지면 앱을 죽이기 때문에, 개발자는 처음부터 메모리 관리를 신경쓰며 코드를 짜는게 매우 중요합니다.

따라서 개발자는 실제로 필요한 경우가 아니라면, 비싼 코스트의 작업을 하는것을 지양해야 합니다. (복잡한 allocation을 예로 들 수 있습니다.)

 

Swift는 비싼 코스트의 작업을 in-time 계산할 수 있게 하는 lazy variables라는 메커니즘을 제공합니다.

lazy variables는 변수가 처음 요청되었을 때만 사용자가 지정한 함수를 사용하여 생성됩니다.

만약 요청되지 않는다면, 지정된 함수는 절대 불리지 않고, 이는 processing time을 절약해줍니다.

 


애플의 공식 문서의 정의는 이렇습니다.

 

lazy 저장 변수는 이것이 처음 사용되기 전까지 초기값이 계산되지 않는 프로퍼티 입니다. 사용자는 선언부에 lazy 수정자를 붙임으로써 lazy 저장 변수를 나타낼 수 있습니다.

사용자는 항상 lazy 프로퍼티를 variable로 선언해야만 합니다.
왜냐하면 이 프로퍼트의 초기값을 인스턴스 초기화가 완료된 시점까지 알 수 없기 때문입니다.
상수 프로퍼티는 초기화가 끝나기전까지 반드시 값을 가져야하기 때문에, lazy로 선언될 수 없습니다.

 


예시를 들어봅시다!

import UIKit

struct InterviewCandidate {

	var isiOS: Bool?
    
    lazy var iOSDeveloper: String = {
    	return "I am an iOS Developer"
    }()
    
    lazy var androidDeveloper: String = {
    	return "I am an android Developer"
    }()
}

var person = InterviewCandidate()
person.isiOS = true

if person.isiOS! {
    print(person.androidDeveloper) // I am an android Developer
    // 지금 iOSDeveloper는 nil.
} else {
    print(person.iOSDeveloper) // I am an iOS Developer
    // 지금 androidDeveloper는 nil.
}

 

print에 불리지않은 xxxDeveloper는 nil 이 됩니다.


Lazy Stored Property vs Stored Property

lazy 변수를 사용하면 얻는 이점은 무엇일까요?

 

1.  lazy property와 관련된 클로저는 오직 그 프로퍼티를 읽을 때만 실행됩니다. 따라서 사용자의 판단에 그 프로퍼티가 잘 사용되지 않는다면, 사용자는 불필요한 할당과 실행을 방지할 수 있습니다.2. lazy propery를 stored property의 값으로 채울 수 있습니다.3. lazy 프로퍼티의 클로저 안에 self를 사용할 수 있습니다. 이는 순환 참조를 일으키지 않습니다. lazy 변수의 초기화에 사용되는 클로저에는 @noescape가 자동적으로 적용됩니다. 따라서 외부에서 접근하는것이 아니므로 캡쳐를 할 필요가 없습니다.

https://stackoverflow.com/questions/38141298/lazy-initialisation-and-retain-cycle

 

Lazy initialisation and retain cycle

While using lazy initialisers, is there a chance of having retain cycles? In a blog post and many other places [unowned self] is seen class Person { var name: String lazy var

stackoverflow.com

 

 

 


lazy rules:

  • 사용자는 let과 함께 lazy를 사용할 수 없습니다.
  • computed property와 사용할 수 없습니다. 왜냐면 computed property는 computation 블록 안의 코드가 모두 실행되고난 다음에 값을 반환하기 때문입니다.
  • lazy를 오직 struct나 class의 멤버로만 사용할 수 있습니다.
  • lazy 변수는 자동으로 초기화되지 않기 때문에 thread safe 하지 않습니다.
  • lazy 변수는 처음 request될 때 초기화되고 그 다음엔 그 값을 계속 저장합니다. 따라서 처음 값을 계속 유지합니다!

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

Reduce, Map, Filter  (0) 2021.03.28
Swift로 함수형 프로그래밍 시작하기  (2) 2021.03.28
[Swift] weak, unowned, Retain cycle 톺아보기  (1) 2020.12.10