티스토리 뷰

Swift

[스위프트] lazy 지연 저장 프로퍼티

Hani_Levenshtein 2021. 8. 17. 02:36

안녕하세요 Hani입니다.

이번엔 lazy 키워드에 대하여 알아볼 거예요. 🥰

 


lazy는 무엇인고

lazy는 인스턴스를 생성하는 시점에 값을 부여하고 싶지 않은 변수에 대하여 붙여주는 키워드입니다.

lazy라는 키워드가 붙으면 초기 값을 주지 않고, 첫 번째 호출 때 초기화를 해주겠다는 의미이기 때문에 변수만 가능해요.

let으로 선언하면 나중에 값을 바꾸지 못하니까용.

 

 

Q. 그럼 연산 프로퍼티 쓰면 되자나? 😡

연산 프로퍼티와 lazy로 선언된 프로퍼티(=지연 저장 프로퍼티)의 차이를 한 번 볼게요.

연산 프로퍼티는 호출될 때마다 새롭게 바뀐 값에 대하여 연산을 수행해주고 있습니다.

 

그러나 지연 저장 프로퍼티 첫 번째 호출 시점에 초기화가 된 이후, 다음부터는 새 값으로 갱신되지 않고 있어요.

지연 저장 프로퍼티는 첫 번째 호출에서만 초기화를 하기 때문에 이후에 content가 바뀌어도 length값이 변경되지 않았습니다.

 

 

오.. 그러면 lazy변수는 한 번 초기화되면 항상 같은 값을 내놓겠구나

 

 

놉 😡😡  lazy프로퍼티는 초기화 이후 항상 같은 값을 내놓는다? -> 틀린 말

지연 저장 프로퍼티가 클로저의 결과를 return 받는 게 아니라 클로저 자체를 return 받는다면

초기화는 딱 한 번 되겠지만, 프로퍼티에 접근할 때마다 클로저가 실행되면서 다른 값을 뱉을 수 있습니다.

 

이런 방식으로 let도 다른 값을 내놓을 수도 있지만

인스턴스 생성 전에 self에 대하여 접근할 수 없어서 인스턴스의 프로퍼티를 사용할 수 없습니다.

 

참고) lazy는 저장 프로퍼티에만 붙기 때문에 struct나 class에서만 사용 가능합니다.

 

크.. 이제 왜 쓰는지 알아보면 되겠습니다.


lazy는 언제 쓰나

 

인스턴스를 생성할 때 어떤 작업에 의존적인 경우에 lazy을 사용해야 한다!

예를 들면..

 

치킨 인스턴스를 생성할 때 계란이 필요한데..

계란은 엄마 치킨이 필요하고..

엄마 치킨은 계란이 필요하고..

계란은 엄..

 

이런 상황이 반복돼서 에러가 뜹니다. (닭이 계란에 의존적)

치킨 클래스의 자식 계란을 lazy로 돌려버리면 치킨 인스턴스를 생성할 때 계란은 안 만들어도 됩니다.

chicken변수의 child프로퍼티에 접근할 때!

그때 암탉이 계란을 싸악 만들면서 해당 계란의 엄마의 이름이 호출됩니다.

(계란이 만들어지면서 새엄마가 생성되는 현상..)

 

 

이렇게 하면 계란 엄마를 잘 찾아줄 수 있습니다.

치킨의 init시점에 계란의 엄마로 self를 넘겨줄 수 없으나 인스턴스가 생성된 후에는 lazy를 통해 self를 넘겨줄 수 있게 되고👍

 

...ㅎ 먼가 끝내주는 예시가 생각이 안 나네

 

 

또 다른 상황은..

인스턴스를 생성할 때 오래 걸리는 작업에 의한 프로퍼티를 lazy로 돌리면 실제 사용하기 전에는 실행되지 않아서 좋다!

예를 들면 네트워크를 통해 뭔가 데이터를 가져와야 할 때?

 

흠흠.. 

 


lazy는 남발해도 되나

 

아직 초기화되지 않은 지연 저장 프로퍼티애 멀티스레드가 의해 동시에 접근하면,

프로퍼티가 한번 초기화되는 것이 보장되지 않습니다.

그래서 lazy는 thread safety를 보장하지 않는다고 하네요.

 

 

 

 


 

그래서 계란이 먼저냐 닭이 먼저냐.. 


References

https://docs.swift.org/swift-book/LanguageGuide/Properties.html

https://baked-corn.tistory.com/45

 

댓글