[iOS]lazy 키워드

About Lazy

정의 ▾

Apple Developer

  • 이 시퀀스와 동일한 요소를 포함하지만 맵 및 필터와 같은 일부 작업이 지연 구현되는 시퀀스입니다.
  • 쉽게 말해 lazy 변수는 처음 사용되기 전까지는 연산이 되지 않는다고 볼 수 있습니다.

 

고려 사항 ▾

  • lazy는 반드시 var와 함께 쓰여야 합니다.
    • 기본적으로 lazy로 선언된 변수는 초기에는 값이 존재하지 않다가 이후에 값이 생기는 것이기 때문에 let으로 선언은 될 수가 없습니다.
  • Struct, Class에서만 사용이 가능합니다.
  • Computed Property에는 lazy 키워드를 사용할 수 없습니다.
    • lazy는 처음 사용될 때 메모리에 값을 올리고 그 이후부터는 계속해서 메모리에 올라온 값을 사용합니다.
    • 사용할 때마다 값을 연산하는 Computed Property에는 사용이 불가능하게 되는 것입니다.
  • lazy에 특정 연산을 통해 값을 넣어주기 위해서는 코드 실행 블록인 closure를 사용합니다.
    • class, struct의 다른 프로퍼티의 값을 lazy변수에서 사용하기 위해서는 closure내에서는 self를 통해 접근이 가능합니다.

예시) 

class Product {
	var name: String
    
    lazy var description: String = {
    	return "이 상품의 이름은 \((self.name))입니다."
    }()
    
   	init(name: String) {
    	self.name = name
    }
}

var car = Product(name:"Car")
print(car.description)		// 이 상품의 이름은 Car입니다.

car.name = "Keyboard"
print(car.description)		// 이 상품의 이름은 Car입니다.
  • 위 코드 중 description뒤에 ()가 붙은 걸 볼 수 있습니다.
  • 이는 메모리 누수를 방지하기 위해 즉시 실행하고 결과를 반환과 함께 종료하게 만듭니다.

 

Issue 📌

  • 위 사진에 TapGesture를 달아주었는데 let으로 선언이 되면 적용이 되지 않고, lazy var로 선언 시 적용이 된다.

 

왜 let은 안되고, lazy는 되는걸까?

  • lazy
    • 클래스 내의 메서드나 일반 프로퍼티에서는 self를 통해 접근할 수 없지만 lazy 키워드를 통해 생성 된 이후에 접근할 것이라는 의미로 self로 접근이 가능하다고 합니다.
    • 또한, 클로저 안에서 사용한 self는 순환 참조를 일으키지 않아 그대로 사용할 수 있다고 해요.
    • 원리로는 self가 ViewController인 것을 인지하는 시점에 값이 계산되고 메모리에 올라오게 됩니다.
      • 즉! lazy가 없을 경우 ViewController가 정상적으로 초기화 되지 않은 상태에서 Button의 addTarget을 할당하게 되는 거고, addTarget의 target인 self(= 해당 ViewController)가 정상적으로 초기화 되지 않은 상태이기 때문에 자기 자신을 할당하지 못하게 되는겁니다.

 

'iOS_Swift.zip' 카테고리의 다른 글

[iOS]NotificationCenter  (0) 2022.02.18
[iOS]App Thinning  (0) 2022.02.16
[iOS]Frame과 Bounds의 차이  (0) 2022.02.14
[iOS]Escaping Closure(@escaping)  (0) 2022.02.12
[iOS]SDWebImage 에러  (0) 2022.02.11