HIT해

[Swift 기초문법 - 23] lazy 키워드 본문

Swift/기초문법

[Swift 기초문법 - 23] lazy 키워드

힛해 2024. 8. 14. 04:22
728x90

Lazy란?

메모리에 바로 올리지 않고 사용할 떄 올리게 하는 키워드다.

 

예시코드

import UIKit

struct Pet {
    init(){
        print("Pet 이 생성되었다.")
    }
}
    
struct Friend {
var name: String
var pet : Pet = Pet ()
    init(_ name: String){
        self.name = name
        print("Friend 가 생성됨")
    }
}
var myFriend = Friend("자우림")

 

Friend에서 Pet이 생성이 되면 메모리에 올라가고 init이 실행되어 아래와 같은 실행 순서를 보이게 된다.

 

Pet 이 생성되었다.

Friend 가 생성됨

 

변수 앞에 lazy를 붙여보자

import UIKit

struct Pet {
    init(){
        print("Pet 이 생성되었다.")
    }
}
    
struct Friend {
var name: String
lazy var pet : Pet = Pet ()
    init(_ name: String){
        self.name = name
        print("Friend 가 생성됨")
    }
}
var myFriend = Friend("자우림")

myFriend.pet

 

실행 결과


Friend 가 생성됨

Pet 이 생성되었다.

 

정리하자면

lazy는 인스턴스가 생성될때 메모리에 올리는게 아니라 접근했을때 메모리에 올리는 것이다.

 

프로젝트 사용예시

1.UIKit에서는

 

메모리에 올리지 않고 사용할때 메모리에 올리겠다!

 

2.Combine에서는

@Published var tempArray : [String] = []

lazy var arrayCount : AnyPublisher<Int, Never> $tempArray.map{ (array : [String]) -> Int in
	return array.count
}.eraseToAnyPublisher() // 자료형을 바꾸기 위해서

 

lazy를 붙였기 때문애 tempArray값이 들어올 때 발동이 된다

 

var disposableBag = Set<AnyCancellable>()

self.viewModel.arrayCount.sink { arrayCount in
	print("ViewController - arrayCount :", arrayCount)
    self.nagicationItem.title = "배열 갯수 : \(arrayCount)"
}.store(in:&disposableBag)

 

최초에 메모리에 올라갈때 값을 내뱉는데 빈 배열이라 처음에는 0이 보이고

배열값이 늘어나거나 줄어들때 변수에 접근해서 변하게 된다!

 

정리하자면

메모리 접근제어를 통해 사용자에게 보다 가벼운 서비스를 제공하는데에 유용할 것 같다!