인프런 커뮤니티 질문&답변

듀듀님의 프로필 이미지
듀듀

작성한 질문수

앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지

활용-8 앱 / 테이블뷰 코드로 만들기, 모델 구성 (활용 앱64강)

활용 앱 64강에서 lazt라는 키워드를 삭제해도되나요?

작성

·

190

0

안녕하세요

Member구조체에서 memberImage를 Lazy 키워드로 작성했는데요

이걸 삭제하고 그냥 하면 왜 안되나요?

 

답변 1

0

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 안녕하세요 듀듀 님.
swift문법 관련 lazy 키워드에 대해서 먼저 좀 찾아보시긴 하셔야 할 것 같아요.


그래도 최대한 이해하실 수 있는 선에 쉽게 설명드려보자면,

일반적으로 lazy를 사용하는 것은 "메모리에 나중에(lazy) 올라간다"는 의미를 가지고 있어요.
(여기서는 name, age, phone... 등 다른 저장 속성(stored property)보다 나중에 메모리에 올라간다는 의미예요.)

여기서는 Member 구조체에 name이라는 속성이 선언이 되어 있고,
(1) 해당 name속성이 먼저 메모리에 올라가 있어야만
(2) UIImage(named: "\(name).png") 에서 name이라는 이름을 이용("\(name).png")해서, 이미지를 생성할 수 있기 때문에..

반드시 name이 먼저 메모리에 올라가 있어야만 그것을 사용해서 이미지를 생성할 수 있기 때문이예요.

즉, 여기서는 이미지를 생성하기 위해선 순서가 필요하다는 거죠.
(name을 이용 ===> 이미지 생성)의 순서가 필요한데, 여기서 lazy를 제거해 버리면

lazy var memberImage: UIImage? = {
    guard let name = name else {       // name 속성에 접근 중
        return UIImage(systemName: "person")
    }
    return UIImage(named: "\(name).png") ?? UIImage(systemName: "person")
 }()

해당 클로저 내의 로직에서 name을 아예 이용(접근)할 수가 없습니다.

다른 말로 하자면... memberImage속성하고, name속성이 동시에 메모리에 올라가는데.. 어떻게 memberImage속성이 name을 이용할 수 있을까요? name이 먼저 존재해야, memberImage가 name을 사용할 수 있겠죠.

그래서, 여기서는 memberImage속성 내부의 로직에서 name속성에 접근하고 있기 때문에.. 순서가 필요합니다. 그래서 memberImage가 더 나중에 생성되도록 lazy를 붙여준 것이라고 보시면 됩니다.

 

 

감사합니다. :)

듀듀님의 프로필 이미지
듀듀
질문자

친절한 답변감사합니다.

그럼 구조체 내에 name을 memberImage에 사용하지 않을 꺼라면?

lazy var로 선언안해도 되고?

name, age와 같이 구조체 내에 memberImage를 선언해도 되는거죠?

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 맞아요.
지금 여기서의 memberImage 로직이 name이름을 name.png로 변환해서 해당하는 이름에 대한 이미지를 가지고 오고 있어서.. name이름이 필요할 뿐이지,
일반적인 경우엔 memberImage를 그냥 UIImage? 이런 타입으로 선언한다면 당연히 lazy로 선언할 필요가 없습니다. ^^

듀듀님의 프로필 이미지
듀듀

작성한 질문수

질문하기