Replies: 1 comment 1 reply
-
링고께 다시 여쭤본 내용을 급하게 정리한 것입니당
|
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
사건의 발단
케미의 코드리뷰 중 lazy 관련 얘기가 나왔고 링고께서 UI Component를 그릴 때 lazy를 사용하는게 좋다! 라고 하셔서 의문이 들기 시작했습니다.
그렇다면 lazy 에 대해서 부터 천천히 파헤쳐 봐봅시다!
Lazy property
"A lazy stored property is a property whose initial value is not calculated until the first time it is used”
→ lazy stored property 는 처음 사용될 때까지 초기값이 계산되지 않는 프로퍼티 입니다.
왜 사용할까?
일반적으로 변수를 var, let 를 사용하여 초기화한 후 선언하지만, 이러한 초기화 시점을 이 변수가 처음 참조, 이용되는 시점으로 의도적으로 지연시키는 것이다. → 어떠한 뷰가 로드 되는 시점에 모든 변수를 한번에 초기화하여 메모리에 올려두는데, 이러한 변수들은 반드시 사용되는 것은 아니므로 리소스 낭비가 될수 있다.
말 그대로 Lazy (지연) 프로퍼티 라는 점이다.
iOS는 멀티쓰레드에서 초기화를 하기 때문에 의도적으로 지연시켜 줘야 할때 사용한다
Lazy propert 사용할 때 고려사항
기본적으로 lazy로 선언되는 변수는 초기에 값이 존재하지 않고, 이후에 값이 생기는 것이기 때문에 let 으로 선언될 수 없다.
기본적으로 lazy는 struct 와 class 에서만 사용할 수 있다.
Computed Property 에는 lazy 키워드를 사용할 수 없다. lazy는 처음 사용될 때 메모리에 값을 올리고 그 이후부터는 계속해서 메모리에 올라온 값을 사용한다. 사용할 때마다 값을 연산해서 사용하는 Computed property에는 사용할 수 없다.
lazy에는 어떤 특별한 연산을 통해 값을 넣어주기 위해 closure를 사용한다.
class 나 struct의 다른 프로퍼티으 값을 lazy 변수에서 사용하기 위해서는 closure 내에서 self를 통해 접근이 가능하다. 기본적으로 일반 변수들은 클래스가 생성된 이후에 접근이 가능하기 때문에 클래스 내의 다른 영역(메소드, 일반 프로퍼티)에서는 self를 통해 접근할 수 없지만, lazy키워드가 붙으면 생성 후 추후에 접근할 것이라는 의미이기 때문에 closure내에서 self로 접근이 가능하다.
그러면 Lazy를 계속 사용하는게 좋지 않나?
lazy로만 사용한다면 뷰를 보여줄때 사용자가 느리다고 생각할 수 있다.
lazy로 사용하면 thread safe 하지 못하다 → 아직 초기화되지 않은 lazy 프로퍼티에 멀티스레드가 동시에 접근하면, 프로퍼티가 한번 초기화되는것이 보장되지 않는다!
[Properties - The Swift Programming Language (Swift 5.7)](https://docs.swift.org/swift-book/LanguageGuide/Properties.html)
두 쓰레드가 동시에 액세스하려고 하면 부분적으로 초기화 된 개체를 수신할 수 있어서 안전하지 않다
멀티 쓰레드 환경에서 모든 lazy 변수가 한번 초기화 되는것이 보장되지 않는것인가? → 명시하거나 static 사용해야하나?
모든 Cocoa/Cocoa Touch 클래스와 메소드는 문서에서 쓰레드로부터 안전하다고 명시적으로 선언된 것을 제외하고는 스레드로 부터 안전하지 않다. (immutable 클래스는 쓰레드로 부터 안전할 것으로 기대되지만 보장되지 않음)
추후,...
링고께서 말씀하신 Only lazy 사용의 장점은 사실 찾을 수 가 없었습니다.
discussion으로 올리려한 이유가 뭔가 장점을 찾고 뭐가 더 좋다 이게 더 좋다를 얘기하고 싶어서 올리려 했는데 일방적인 의견밖에 찾을 수 없어 애매해 졌네요 ㅎㅎㅎ 그래도 일단 제 생각은 이렇고 방학 기간이 끝나면 멘토분들께도 여쭤봐서 내용 추가하도록 하겠습니다!!
내 의견: UI를 그릴때 lazy로만 그리는것은 좋다는 근거를 하나도 찾을 수 가 없었다..! 적절하게 사용하는게 좋다!
Resource
Beta Was this translation helpful? Give feedback.
All reactions