[Swift] Lazy Stored Properties (지연 저장 프로퍼티)
private lazy var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
return formatter
}()
코드를 보다보면 lazy 라는걸 한번쯤 보셨을거에요.
오늘은 Lazy Property에 대해 알아 보려고해요 !
단어뜻으로 보면 게으르다는 뜻인데 어떤 뜻인지 같이 알아보겠습니다 :)
Lazy Stored Properties (지연 저장 프로퍼티 )
값이 사용되기 전에는 계산되지 않는 프로퍼티입니다.
불려지기 전에는 가만히 있는 애인가 보네요.
선언
프로퍼티의 선언 앞에 lazy 키워드를 붙이면 됩니다.
아래처럼 말이죠.
// lazy var 변수명: 타입 = 초기값
// ex)
lazy var age: Int = 1000
⚠️ 주의
1. 반드시 변수 (var)로 선언해야 합니다.
지연 프로퍼티는 처음 사용되기 전엔 값을 갖지 않는 프로퍼티이기 때문이에요.
글로만 보기엔 이해하기 역시 어렵네요.
예제로 같이 보시죠 !
눈으로 보는것보단 Playground에 같이 따라하는게 더 이해가 잘갑니다 :)
class Poop {
init() {
print("💩 ")
}
}
class Stomachache {
lazy var success = Poop()
init() {
print("하늘이 그레이 색이야, 제발 좀 나와~ 😫")
}
}
let goToToilet = Stomachache()
먼저 Poop과 Stomachache라는 Class를 만들었어요.
위의 코드를 실행해보면 아래와 같이 나옵니다.
💩 이게 왜 안나오는지 의아하시죠!?
앞서 정의에서 말씀드렸듯이 var 앞에 lazy가 붙으면 해당 프로퍼티가 불려지기 전에는 아무 응답이 없어요 !!
그럼 쾌변을 봐볼까요 !!
class Poop {
init() {
print("💩 ")
}
}
class Stomachache {
lazy var success = Poop()
init() {
print("하늘이 그레이 색이야, 제발 좀 나와~ 😫")
}
}
쾌변을 보기 위해선 Stomachache 안에 있는 success라는 변수에 접근을 해야해요.
접근은 어떻게 한다 ?
dot(.) 으로 한다.
let goToToilet = Stomachache()
goToToilet.success // Stomachache Class 안에 success 프로퍼티에 접근!!
그럼 이제 접근해서 쾌변을 봐봅시다.
그럼 lazy가 없는상태도 어떻게 나오는지 한번 봐볼게요 !
class Poop {
init() {
print("💩 ")
}
}
class Stomachache {
var success = Poop() // lazy 삭제
init() {
print("하늘이 그레이 색이야, 제발 좀 나와~ 😫")
}
}
let goToToilet = Stomachache()
// goToToilet.success .success에 접근하는것도 삭제
본의아니게 순서가 좀 그러네요..
어떠신가요 ?? lazy가 있고 없고의 차이점이 조금은 감이 잡히셨나요??
조금더 이해를 돕기 위해 예제를 하나더 해볼게요.
예를들어 height를 불러오고싶지 않을때
class Peppo {
let name: String
var age: Int
var gender: String
lazy var peppoPrivate = PeppoPrivate() // lazy 확인 !!
init() {
self.name = "peppo"
self.age = 500
self.gender = ""
}
}
class PeppoPrivate {
var height: Int
init() {
self.height = 200
}
}
let peppo = Peppo()
이렇게 height가 호출되지않아요.
그럼 키를 불러오려면?
위에서 했으니 이제 불러오실수 있겠죠 ?
peppo.peppoPrivate
이렇게 !!
지연 저장 프로퍼티는 이럴때 쓰여요.
계산이 오래걸리는 프로퍼티가 필요하거나, 필요한 경우에만 사용할 때
복잡한 클래스나 구조체를 구현할때 등등
잘 활용하면 불필요한 메모리 낭비도 줄일수 있어요!