[Swift] Lazy Stored Properties

문다연·2023년 1월 10일
0

ios.moon

목록 보기
23/26
post-thumbnail

요즘은 꼼꼼한 재은씨의 Swift: 기본편을 보며 UIKit로 개발하는 방법을 공부하고 있다. Table View Controller 구현 파트를 보다가 그동안 잘 몰랐지만 알아보진 않았던 lazy 키워드를 쓰게 되었다. 이 글은 복습하는 겸 학습한 내용을 정리한 글이다!


➰ 실습 중 만난 프로퍼티 초기화 구문 사용의 예

위와 같이 변수를 초기화하는 것을 클로저를 이용한 프로퍼티 초기화 구문이라 한다.

클로저를 이용한 리턴값을 list에 대입하고 초기화한다. 클로저에서는 dataset에 정의된 데이터들을 for문으로 순회하며 차례로 MovieVO 인스턴스를 반들어 배열 변수 datalist에 담는다. 모든 순회가 끝나면 datalist를 반환하며, 반환된 datalist가 list에 대입된다.


➰ lazy?

lazy stored property 지연 저장 속성

A lazy stored propery is a property whose initial value is not calculated until the first time it is used.

lazy variables는 초기화(저장)을 지연시킨다. lazy stroed property가 처음 요청되었을 때, 사용자가 지정한 함수(프로퍼티 초기화 구문)를 사용하여 생성한다. 만약 요청되지 않는다면, 이 함수는 앱이 실행되는 동안 불리지 않고, 이는 processing time을 절약해준다.


🤔 그렇다면 위 예시에서는 lazy 키워드를 사용한 이유는?

첫 번째로, 미리 생성해서 메모리를 낭비할 필요가 없기 때문이다.

lazy 키워드를 붙여 변수를 정의하면 참조되는 시점에 맞추어 초기화되므로 메모리 낭비를 줄일 수 있다.


두 번째는, lazy 키워드를 붙이지 않은 일반 프로퍼티는 다른 일반 프로퍼티를 참조할 수 없기 때문이다.

위 예시 코드에서 보듯 list 변수를 초기하는 데에는 dataset 프로퍼티가 필요하다. 하지만 프로퍼티들이 초기화되는 순서는 개발자가 컨트롤할 수 없기 때문에 list 배열 변수의 클로저가 실행되는 시점에 dataset 배열이 이미 초기화된 상태라고 보장할 수 없다.
이 때문에 일반 저장 프로퍼티끼리는 서로 참조할 수 없다.


➰ lazy를 사용하기 위해 필요한 고려사항

  1. lazy는 반드시 var와 함께 쓰여야 한다.
    한 번만 생각해보면 당연하다. 기본적으로 lazy로 선언된 변수라면 초기에는 값이 존재하지 않고 이후에 값이 생기는 것이므로, 값을 변경할 수 없는 let으로는 선언될 수 없다.

    이는 lazy stored property를 멤버로 갖는 구조체, 클래스에서도 유의해야 한다.

    79, 80번째 줄과 같이 lazy 프로퍼티를 멤버로 갖는 BlogPost 구조체 인스턴스를 상수로 생성했다. 이후 post.attachment를 호출하게 되면, 그제야 closure 구문이 실행되면서 반환된 값으로 바뀌게 되는데, let 인스턴스이므로 멤버 프로퍼티의 값이 바뀌는 것이 허락되지 않는다. 따라서 error가 발생하게 된다.

  2. struct, class에서만 사용할 수 있다.
    enum (열거형)에서는 사용할 수 없다.

  3. lazy vs Computed Property
    Computed Propery에는 lazy 키워드를 사용할 수 없다. lazy는 처음 사용될 때 메모리에 값을 올리고, 그 이후부터는 계속 메모리에 올라온 그 값을 사용한다. 그렇기 때문에 사용할 때마다 값을 연산해 사용하는 Computed Property에는 사용할 수 없다.

  4. lazy와 closure
    lazy에 어떤 연산을 통해 값을 넣어주기 위해서는 클로저를 사용한다.
    다른 일반 프로퍼티의 값을 lazy 변수에서 사용하기 위해서는 클로저 내에서 self를 통해 접근이 가능하다. 앞에서 설명했듯 기본적으로 일반 변수들은 클래스가 생성된 이후에 접근이 가능하므로 클래스 내의 다른 영역(메소드, 일반 프로퍼티)에서는 self로 접근이 불가능하나, lazy 키워드가 붙으면 초기화 시점이 일반 프로퍼티보다 이후라는 것을 보장할 수 있기 때문에 self로 접근 가능하다.

profile
ios-moon.tistory.com 이전했어요 🚛

0개의 댓글