lazy property에 대해

JinSeok Hong·2021년 7월 21일
0

Lazy properties


이번에 스토리보드를 사용하지 않고 코드 베이스로 전체 코드를 짜면서 'lazy var'를 처음으로 사용하게 되었다.
뷰를 변경하는 것이 맘처럼 안되는 와중에 한 팀원이 한번 lazy로 선언해볼래? 라고 하길래 선언했더니 고쳐졌다.. 이후 UI Component에 대해 변경될 가능성이 있는 것들에 lazy var로 선언했더니 신기하게 대부분 고쳤다. 이게 뭐지..

도대체 lazy가 무엇인지 왜 이러한 상황이 발생했는지 분명히 짚고 넘어가서 앞으로는 이유있는 코드를 짜도록 하자.

"A lazy stored property is a property whose initial value is not calculated until the first time it is used"
-> lazy stored property는 처음 사용될 때까지 초기값이 계산되지 않는 프로퍼티입니다.

왜 Lazy properties를 쓸까?


생각 1.

메모리를 효율적으로 쓰기 위함이다. 일반적으로 변수를 var, let을 이용하여 반드시 초기화한 후 선언하지만, 이러한 초기화 시점을 이 변수가 처음 참조, 이용되는 시점으로 지연시키는 것이다. 여기까지 알아본 후 드는 생각은..
일반적으로 어떠한 뷰가 로드 되는 시점에 모든 한꺼번에 초기화시키며 메모리에 올려두는데, 이렇게 초기화한 변수들을 반드시 사용하는 것은 아니므로 리소스 낭비가 될 수 있기 때문에, lazy로 선언할 필요가 생기는 것이다?
라고 생각이든다.

생각 2.

값을 캐시할 수 있기 때문이다.
내가 아는 property 종류는 총 3가지이다. Stored Property, Computed Property, Lazy Stored Property. Stored Property는 선언되는 시점에 초기화되어 메모리에 올라갈 것이고, Computed Property는 따로 메모리 공간을 가지지 않을 것이고 Lazy Stored는 메모리에 처음에는 올라가 있지 않다가 처음 참조되는 시점에 메모리에 올라갈 것이다.
처음 lazy 프로퍼티는 메모리에 올라가 있지 않은 computed 프로퍼티의 형태를 띌 것이다. 하지만 사용 후에는 메모리에 올라가기 때문에 반복적인 연산 등에 대해서는 computed property를 캐시해서 쓸 수 있는 형태를 띄기 때문에 더욱 성능을 높일 수 있을 것이다.

생각 3.

초기화 시점을 다르게!
말 그대로 lazy, 즉 지연 (저장) 프로퍼티 라는 점이다.
이게 아마 내가 왜 도대체!! 맘처럼 뷰에 원하는 값을 띄지를 못했다가 lazy를 선언했을 때 해결됐을까. 왜 lazy로 선언을 할 경우 가끔은 되고 가끔은 실패하는 것일까. 이런 나의 생각에 대한 대답이다.

struct LazyDate {
    let date: Date = Date()
    lazy var formattedDate: String = {
       let f = DateFormatter()
        f.dateStyle = .long
        f.timeStyle = .medium
        return f.string(from: date) // 컴파일 에러 발생
    }()
}

구글링을 하다가 참고한 예제인데 formattedDate는 String 값을 저장할 때 date에 접근하게 된다.
이때 lazy로 선언을 하지 않으면 formattedDate 와 date의 초기화 시점이 같아 컴파일 에러가 생기며 내가 원하는 값을 못얻게 되는 것이다. 이러한 경우에 lazy를 선언하여 formattedDate의 초기화 시점을 지연시켜 해결하는 것이다.
나는 어떠한 로직을 짤 때 이러한 초기화 시점에 대해서 고려한 적이 없다...
지금으로선 이 부분이 지금까지 있었던 문제의 원인이라고 생각하는데 이전에 짰던 코드들을 오늘 배운 내용을 바탕으로 수정해보며 나의 생각을 다시 한번 확고히 잡을 생각이다.

좋은 배움이었다!

0개의 댓글