728x90
반응형
SMALL
회사 프로젝트 분석을 하던도중
lazy 로 선언된 변수를 사용한 것을 보았다.
솔직히 그 당시에 필요한 부분이 아니라서 넘어갔는데,
알고보니 compile 할때 상당히 중요한 부분이어서 기록했었던 것을 공유한다.
정의
A lazy stored property is a propery whose initial value is not calculated until the first time it s used
=> 처음 사용되기 전까지는 연산이 되지 않는 변수
즉, 미리 이 변수에 대한 내용을 설정해두고,
이 변수를 사용하기 전까지는 설정한 내용들에 대해서 연산이 되지 않는 다는 것.
좀 난해하지만 실제적인 예를 들어보자.
예를 들어서 인스타그램 어플에 있는 스토리보기 같은 기능들을 살펴보면
처음 앱을 이니셜 할 때 서버에서 모든 스토리 내용을 불러오지 않는다.
그렇게 하면 보지 않을 스토리임에도 불구하고 계속 들고있어야하거나
너무 많은 데이터를 불러오느라 효율적이지 않기 때문.
따라서, 특적 부분을 클릭했을 때만 원하는 정보들을 가져올 수 있게 만든다는 것.
즉, 필요하지만 사용하기도 전에 불러오기 부담스러운 것들을 lazy를 통해서 선언해준다.
고려사항
이를 위해서 고려해야 할 사항들이 몇가지 있다.
lazy
는 반드시var
와 함께 쓰여야한다. 이는 한번만 생각해 보면 쉽게 이해할 수 있는다. 기본적으로 lazy로 선언된 변수는 초기에는 값이 존재하지 않고 이후에 값이 생기는 것이기 때문에let
으로는 선언될 수 없다.- 기본적으로
lazy
는struct
,class
에서만 사용할 수 있다. lazy
와closurelazy
에 어떤 특별한 연산을 통해 값을 넣어주기 위해서는 코드 실행 블록인closure
를 사용한다.class
나struct
의 다른 프로퍼티의 값을 lazy 변수에서 사용하기 위해서는 closure sodptjself
를 통해서 접근이 가능하다. 기본적으로 일반 변수들은 클래스가 생성된 이후에 접근이 가능하기 때문에 클래스 내의 다른 영역 (메소드, 일반 프로퍼티) 에서는 self를 통해 접근할 수 없지만 lazy 키워드가 붙으면 생성 후 추후에 접근할 것이라는 의미이기 때문에, cluser내에서 self 로 접근이 가능하다.
예시 코드를 보자
class Person {
var name:String
lazy var greeting:String = {
return "Hello my name is \((self.name))"
}()
init(name:String){
self.name = name
}
}
var me = Person(name:"John")
print(me.greeting // Hello my name is John
me.name = "James"
print(me.greeting // Hello my name is John
greeting 이라는 lazy변수는 self.name의 값이 필요하기 때문에, lazy로 선언하고
me 라는 변수에 "John" 값을 넣어주고나면 greeting 변수를 사용할 수 있게 된다.
참고한 글 : https://baked-corn.tistory.com/45
728x90
반응형
LIST
'iOS' 카테고리의 다른 글
[iOS][fastlane] 자동배포, testFilght 올리기 (0) | 2023.09.03 |
---|---|
[iOS] FlexLayout, PinLayout 이용해서 뷰 그리기 (0) | 2023.06.17 |
[iOS]UITextField, Delegate, 텍스트필드 구현, 글자수 제한하기 (0) | 2023.04.08 |
[iOS]This method should not be called on the main thread as it may lead to UI unresponsiveness. Thread 관련 문제? (2) | 2023.03.21 |
iOS에서 navigationController, segue를 이용한 화면전환 종류와 방법 (0) | 2022.12.29 |