티스토리 뷰

728x90
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()

 

heigth 호출 X

 

이렇게 height가 호출되지않아요. 

그럼 키를 불러오려면?

위에서 했으니 이제 불러오실수 있겠죠 ?

 

peppo.peppoPrivate

 

이렇게 !!


지연 저장 프로퍼티는 이럴때 쓰여요.

계산이 오래걸리는 프로퍼티가 필요하거나, 필요한 경우에만 사용할 때

복잡한 클래스나 구조체를 구현할때 등등

잘 활용하면 불필요한 메모리 낭비도 줄일수 있어요!

 

728x90

'iOS' 카테고리의 다른 글

[Swift] The Basics  (0) 2021.12.08
[Swift] 기본 연산자 (Basic)  (0) 2021.12.05
[iOS] DatePicker, DateFormatter  (0) 2021.11.25
[Swift] 프로퍼티 (Properties)  (0) 2021.11.24
[Swift] 인스턴스 (instance) / 메서드 (methods)  (0) 2021.11.17