lazy 키워드를 붙여서 프로퍼티를 선언하면 단어 뜻 그대로 다른 프로퍼티보다 지연된다. 즉, 해당 프로퍼티가 처음 사용되기 전까지는 메모리에 올라가지 않는다.
⭐️⭐️⭐️ 중요!
lazy는 반드시 var 키워드를 사용해서 변수로 선언해야 한다.
그 이유는 공식 문서에 아주 잘 나와있는데, 프로퍼티가 초기화되기 전에 항상 값을 가지고 있어야 하는데 값이 없을 수도 있다. 그래서 lazy let이 아닌 lazy var로 선언해야 한다.
(lazy let으로 선언하면 에러가 발생할 것이다.)
Swift 공식 문서에 있는 예제를 가져와봤다.
여기서 importer 변수가 lazy로 선언되었다. 따라서 importer 변수가 사용되기 전까지는 DataImporter 인스턴스가 생성되지 않고 메모리에 올라가지 않는다.
즉, 지금은 DataManager의 data 변수만 사용되었으므로 DataImporter가 초기화되지 않은 셈이다.
class DataImporter {
var filename = "data.txt"
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
lazy 수식어가 붙어있는 importer 프로퍼티가 처음 사용될 때 DataImporter 인스턴스가 생성되고 메모리에 올라가는 것이다.
print(manager.importer.filename)
// Prints "data.txt"
그럼 lazy를 사용하면 어떤 점이 좋을까..?
"메모리를 효율적으로 관리할 수 있다."
예를 들어, 복잡한 앱일수록 뷰가 로드될 때 모든 인스턴스를 생성하여 메모리에 올리면 과부하로 앱이 종료될 위험이 따른다. 하지만 각 인스턴스들이 사용될 때 생성하면 메모리를 효율적으로 관리할 수 있다.
위의 예제에서도 DataImporter 클래스가 제공되고 초기화하는데 시간이 꽤 많이 걸린다고 가정한다면 DataManager가 생성될 때 DataImporter 인스턴스를 생성하는 것보단 DataImporter 인스턴스가 처음 사용될 때 생성하는 것이 더 효율적인 셈이다.
UIKit에서 사용했을 때의 코드를 가져와 봤다.
여기서는 lazy 키워드로 선언된 변수가 꽤 있는데, 각각 처음 사용될 때 인스턴스가 생성되어 메모리에 올라간다.
즉, 다시 말해 ReviewListViewController가 보일 때 아래 프로퍼티들이 메모리에 올라가는 것이 아니라 처음 사용될 때 메모리에 올라가는 것이다. 그래서 메모리를 효율적으로 관리할 수 있다는 것이다.
💙 참고한 사이트
https://bbiguduk.gitbook.io/swift/language-guide-1/properties