[iOS_Swift] Properties - 지연 저장 프로퍼티(Lazy Stored Property)

2022. 2. 6. 13:51Programming/iOS_Swift

지연 저장 프로퍼티란? 

  우선 공식문서의 정의를 살펴보면, 지연 저장 프로퍼티는 해당 프로퍼티가 처음으로 사용되어지기 전까지 최초의 값을 계산하지 않는 프로퍼티이다. 즉 사용되어지기 전까지는 nil을 할당 받는 것이다.

  지연 저장 프로퍼티가 대충 무엇인지는 이제 알겠다. 그렇다면 이 개념을 언제 사용하고 왜 알아두면 유용한지 구체적으로 이해해보자.

 

언제 사용할까?

공식 문서에서는 2가지 경우에 유용하게 쓸 수 있다고 설명하고 있다.

1. 어떤 프로퍼티의 최초 값이 외부 다른 인스턴스의 영향을 받을 때.

이 부분을 이해하기 위해서는 공식 문서에 있는 예시 코드를 잠시 활용해보자.

  위의 예시 코드를 보면, 2개의 클래스 DataImporter, DataManager가 있다. 그리고 DataManager클래스의 프로퍼티 중에 DataImporter의 인스턴스를 가지는 지연 저장 프로퍼티가 있다. 해당 프로퍼티를 왜 지연 저장 프로퍼티로 사용할까? 이 부분에 대해서 스위프트 공식문서는 이렇게 설명한다.

  DataImporter라고 하는 클래스는 꽤나 복잡한 작업을 수행하기 때문에 초기화 하는 데에 적지 않은 시간이 걸린다고 가정해보자. 그런데 우리는 DataManager의 프로퍼티인 importer를 평소에 잘 쓸 일이 없어서 정말 필요할 때만 불러서 쓰고 싶다. 만약 이러한 상황에서 importer를 그냥 일반적인 저장 프로퍼티로 사용한다면, DataManager를 초기화하는 과정에서 DataImporter의 인스턴스도 마찬가지로 초기화해줘야 한다! 왜냐하면, importer가 DataImporter의 인스턴스를 가져야 하기 때문이다. 자, 그러면 우리는 자주 사용하지도 않을 importer 프로퍼티 때문에 안그래도 오래 걸리는 DataImporter를 초기화 하느라 과도한 메모리 낭비를 해버렸다.

  이런 상황을 개선하기 위해 우리는 importer가 사용할 일이 정말 생겼을 때 DataImporter를 초기화 해주려고 한다. 이럴 때 사용하는 것이 바로 지연 저장 프로퍼티이다. 정리하자면, impoter 같은 프로퍼티의 최초 값이 외부에 초기화가 오래 걸리는 DataImporter 같은 클래스의 영향을 받을 때 지연 저장 프로퍼티를 사용해준다면 효율적으로 메모리 관리가 가능하다.

 

2.  어떠한 프로퍼티의 최초 값이 복잡하고 시간이 오래 걸리는 연산을 요구할 때

  이 부분을 이해하기 위해서 아주아주 간단한 예시를 준비했다.

  Soldier 인스턴스를 초기화하는 시간 차이가 극명하게 드러난다. trainee 프로퍼티가 시간이 오래 걸리는 연산을 하기 때문에 만약 지연 저장 프로퍼티로 만들지 않는다면 위 코드 처럼 trainee 프로퍼티를 당장 사용하지 않음에도 Soldier 인스턴스를 초기화 하는 시간 자체가 엄청 늘어나버리는 걸 확인할 수 있다. 이럴 때, 지연 저장 프로퍼티를 사용해줌으로써 효과적으로 대응할 수 있다.

 

왜 알아야 할까?

  Swift라는 언어는 메모리에 매우 민감한 언어이다. 메모리 관리를 위해 ARC 등 다양한 기능이 존재하는데, 지연 저장 프로퍼티도 메모리 관리의 일환이다. 효율적인 메모리 관리 차원에서 지연 저장 프로퍼티는 유용하게 쓰일 수 있기 때문에 반드시 알아 둘 필요가 있다! 

 

 

** 왜 알아야 할까? 부분은 현재까지 제가 느낀 사견이기 때문에, 틀릴 수도 있습니다. 내용이 잘못됐다면 언제든 지적해주세요!