Lazy - 지연 저장 프로퍼티

lazy 키워드를 붙여서 프로퍼티를 선언하면 단어 뜻 그대로 다른 프로퍼티보다 지연된다.
즉, 해당 프로퍼티가 처음 사용되기 전까지는 메모리에 올라가지 않는다.
지연 저장 프로퍼티는 호출이 있어야만 값을 초기화 하는 특성 초기화 하는 특성을 가지고 있다.

주의점

lazy - 반드시 var 키워드를 사용해서 변수로 선언해야 한다.
프로퍼티가 초기화되기 전에 항상 값을 가지고 있어야 하는데 값이 없을 수도 있고 이 프로퍼티의 초기값을 인스턴스 초기화가 완료된 시점까지 알 수 없기 때문에 lazy let이 아닌 lazy var로 선언해야 한다!
또한 다중 스레드 환경에서 지연 저장 프로퍼티에 동시다발적으로 접근할 때는 한 번만 초기화된다는 보장이 없기때문에 생성되지 않은 지연 저장 프로퍼티에 많은 스레드가 비슷한 시점에 접근한다면, 여러번 초기화될 수 있다는 점을 주의해야 한다!

장점

  1. lazy property와 관련된 클로저는 오직 그 프로퍼티를 읽을 때만 실행 -> 사용자의 판단에 그 프로퍼티가 잘 사용되지 않는다면, 불필요한 할당과 실행을 방지할 수 있다.
  2. lazy propery를 stored property의 값으로 채울 수 있다.
  3. lazy 프로퍼티의 클로저 안에 self를 사용하여 순환 참조를 방지할 수 있다.
    즉, 뷰가 로드될 때 모든 인스턴스를 생성하여 메모리에 올리면 과부하로 앱이 종료될 위험이 존재 -> 각 인스턴스들이 사용될 때 생성하면 메모리를 효율적으로 관리할 수 있다.

lazy rules:

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

댓글남기기