본문 바로가기

면접질문정리

[Swift] lazy var로 초기화했을때의 장단점?

 lazy로 선언하지않고 바로 초기화해주는 인스턴스가 우리같은 프로젝트에서 조금만 사용된다면 상관이 없지만 이게 1000개 이상이되면 성능과 메모리에 영향을 받는다. 그렇기 때문에 공식문서에 내용대로 가능하면 lazy로 초기화해주는게 좋다. ?

        

[lazy의 장점]

- lazy 프로퍼티와 관련된 클로저는 해당 프로퍼티를 읽을때만 실행된다. 따라서 어떤 이유로 해당 프로퍼티가 사용되지않는 경우 불필요한 할당 및 계산을 피할 수 있따.

- 저장 프로퍼티값으로 lazy프로퍼티를 채울 수 있음

            lazy var label: UILabel = {

                let label = UILabel()

                return label

            }()

        

- self를 클로저내부에 사용할 수 있다. 이는 어떤 순환참조을 일으키 않는다. 이유는 {}()가 @noescape로 자동으로 적용되기떄문이다. 따라서 외부에서 접근하는 것이 아니므로 캡쳐를 할 필요가 없다.

        

- 실제로 구조체가 아닌 클래스를 사용하는 경우 강력한 참조 주기를 생성하지않도록 함수내부에 unowner self도 선언해야함

# lazy프로퍼티는 처음에 필요할때만 계산되고 이후에는 저장이되는 원리이다. 고루 두번째 호출부터는 저장한 값이 반환된다.

 

- lazy는 원자적으로 초기화되지않기에 스레드로 부터 안전하지않다. 이말은 즉슨 비동기작업을 할때 멀티스레드가 동시에 lazy에 접근하게되면 동시에 한개가 아닌 두개가 메모리에 올라가는 현상이 발생할 수 있기때문에 안전하지않다 라고 이해했음

- lazy를 사용하게되면 수많은 인스턴스를 초기화해야하는 클래스를 빠르게 초기화하여 빌드속도를 높일 수 있다는 장점이 있다.

 

[lazy의 규칙]

- let과 함께사용할 수 없다. 이 프로퍼티의 초기값을 인스턴스 초기화가 완료된 시점까지 알 수 없기때문이다. let은 초기화가 끝나기전까지 반드시 값을 가져야하기 때문에? lazy로 선언될 수 없다. 이부분은 이해가 잘 되지않는다.

- computed Properties와 함께 사용할 수 없다. 왜냐하면 값을 사용할때마다 반환하기되며 저장할 수 없기때문

- lazy를 오직 struct와 class의 멤버로만 사용할 수 있다. 이유는... 저장프로퍼티는 struct와 class만 가질 수 있으니깐 ..?