[iOS] lazy Variable

ungchun·2022년 8월 19일
0
post-thumbnail

iOS는 앱의 사용량, 메모리가 너무 높아지면 앱을 죽이기 때문에 메모리 관리를 항상 신경쓰며 코드를 짜야합니다. 이러한 메모리 관리에 있어 도움을 주는 많은 친구들 중에 한명이 바로 lazy 키워드 입니다. 이미 많은 분들이 lazy에 대해 자세하게 설명을 해놓으셨기에 오늘은 중요한 키포인트 몇개만 짚어보려합니다.

lazy variable ?

공식문서에는 lazy를 이렇게 정의합니다.
'A lazy stored property is a property whose initial value isn’t calculated until the first time it’s used. You indicate a lazy stored property by writing the lazy modifier before its declaration.'
한 마디로 lazy 변수는 처음 호출되기 전 까지는 초기화 값이 계산이 되지 않습니다. 호출 시에 생성이 되면서 메모리에 올라가고, 후에 다시 사용하면 이전에 생성된 프로퍼티를 이용합니다.

필요는 하지만 사용하기도 전에 불러오기 부담스러운 것들은 lazy를 통해 선언해주는 것이 좋습니다. 예를 들면 인스타나 유튜브에 있는 짧은 영상들을 클릭하기도 전에 전부 다 가져오게 된다면 쓸데 없는 메모리가 앱을 실행할 때 마다 생기게 됩니다.

특징

  1. lazy는 반드시 var과 함께 사용해야합니다.
    • lazy 프로퍼티는 호출될 때 까지 초기화가 되지 않기 때문에 var를 사용해야합니다.
  2. computed property (getter, setter)와 사용할 수 없습니다.
    • lazy 프로퍼티는 첫 호출 시 메모리에 값을 올리고, 그 이후에는 생성한 그 값을 사용하기 때문에 사용할 때마다 값을 새로 연산하는 computed property는 lazy로 사용할 수 없습니다.
  3. struct, class
    • 기본적으로 lazy는 struct와 class에서만 사용할 수 있습니다
  4. not thread safe
    • lazy property는 자동으로 초기화되지 않아 thread safe하지 않습니다.

lazy는 항상 쓰는게 이득인가 ?

꼭 그렇지는 않습니다. 써야할 상황이 있다면 쓰는게 좋겠지만 쓰면 안되는 상황이 있죠. 그 중에서도 제일 큰 문제점은 바로 thread safe 하지 않다는 것입니다.

애플 문서는 이렇게 적어놨습니다. '다중 스레드에서 접근하면 한번만 초기화되는 것이 보장되지 않는다.' 즉, 단일 스레드에서 lazy var에 접근하는 것을 보장할 수 없는 상황에서는 lazy var를 쓰면 안됩니다.

정리

객체 생성 시 항상 사용하는게 아니라 사용하는 경우가 드문 경우 lazy를 사용하는게 좋습니다. 하지만 위에서도 설명했듯 thread safe 하지 않고 쓸 수 없는 상황이 분명 존재하니 써야할 상황과 쓰지 말아야 할 상황을 잘 판단하는게 중요할 것 같습니다.

0개의 댓글