λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS/Swift

[Swift] lazy ν‚€μ›Œλ“œ

μ•ˆλ…•ν•˜μ„Έμš” μ œμΈμž…λ‹ˆλ‹€ :)

μš”μ¦˜μ€ μƒˆλ‘œμš΄ 것듀을 κ³΅λΆ€ν•˜κΈ° 보닀 λΆ€μ‘±ν•œ 것듀을 κΌΌκΌΌν•˜κ²Œ μ±„μ›Œλ³΄μžλŠ” μƒκ°μœΌλ‘œ κ·Έλ™μ•ˆ μ •ν™•νžˆ λͺ¨λ₯΄κ³  λ„˜μ–΄κ°”λ˜ κ΅¬λ©λ‚œ 뢀뢄듀을 μ±„μ›Œλ³΄λ €κ³  λ…Έλ ₯ν•˜κ³  μžˆλŠ”λ°μš”! κ·ΈλŸ¬λ‹€λ³΄λ‹ˆ Swift, iOS κΈ°λ³ΈκΈ°λ₯Ό 더 νƒ„νƒ„νžˆ, μžμ„Έν•˜κ²Œ κ³΅λΆ€ν•΄μ•Όκ² λ‹€λŠ” 생각이 λ“€λ”λΌκ΅¬μš”..(사싀 기본지식이 제일 μ€‘μš”ν•˜λ‹ˆκΉŒμš”) κ·Έλž˜μ„œ 생각날 λ•Œλ§ˆλ‹€ μ •λ¦¬ν•˜λŠ” 것듀을 ν‹°μŠ€ν† λ¦¬μ—λ„ 기둝해보렀고 ν•©λ‹ˆλ‹€. μ˜€λŠ˜μ€ lazy ν‚€μ›Œλ“œ, 지연 μ €μž₯ ν”„λ‘œνΌν‹°μ— λŒ€ν•΄μ„œ 정리해보렀고 ν•˜λŠ”λ°μš”, lazy ν‚€μ›Œλ“œλ₯Ό μ™œ μ‚¬μš©ν•˜λŠ”μ§€μ— μ΄ˆμ μ„ λ§žμΆ°μ„œ 정리해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€!

Lazy Stored Properties (지연 μ €μž₯ ν”„λ‘œνΌν‹°)

The Swift Language Guide에 λ”°λ₯΄λ©΄, 지연 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

지연 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” 값이 처음으둜 μ‚¬μš© 되기 μ „μ—λŠ” κ³„μ‚°λ˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€. 지연 μ €μž₯ ν”„λ‘œνΌν‹°λ‘œ μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” ν”„λ‘œνΌν‹°μ˜ μ„ μ–Έ μ•žμ— lazy ν‚€μ›Œλ“œλ₯Ό 뢙이면 λ©λ‹ˆλ‹€. 

lazy μ™œ μ‚¬μš©ν•˜λ‚˜μš”?

지연 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μ™œ μ‚¬μš©ν•˜λŠ” κ²ƒμΌκΉŒμš”?

μœ„ μ§ˆλ¬Έμ— λŒ€ν•œ 닡변은 λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ! 라고 κ°„λ‹¨ν•˜κ²Œ ν•  수 μžˆμ„ 것 κ°™μ€λ°μš”,

μ’€ 더 ν’€μ–΄μ„œ μ„€λͺ…ν•΄λ³΄μžλ©΄, iOSλŠ” App의 μ‚¬μš©λŸ‰μ΄ λ„ˆλ¬΄ 높아지면 앱을 κ°•μ œλ‘œ μ’…λ£Œμ‹œν‚€κΈ° λ•Œλ¬Έμ— κ°œλ°œμžλŠ” μ²˜μŒλΆ€ν„° λ©”λͺ¨λ¦¬ 관리λ₯Ό μ‹ κ²½μ“°λ©° μ½”λ“œλ₯Ό μ§œλŠ”κ²Œ 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. λ³΅μž‘ν•œ μ•±μΌμˆ˜λ‘ λ·°κ°€ λ‘œλ“œλ  λ•Œ λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ λ©”λͺ¨λ¦¬μ— 올리면 κ³ΌλΆ€ν•˜λ‘œ 앱이 μ’…λ£Œλ  κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 상황을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ lazy ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ 각 μΈμŠ€ν„΄μŠ€λ“€μ΄ μ‹€μ œλ‘œ μ‚¬μš©λ  λ•Œ μƒμ„±λ˜λ„λ‘ ν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€!

lazy ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ„œ 지연 μ €μž₯ ν”„λ‘œνΌν‹°λ‘œ μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ή ν”„λ‘œνΌν‹°κ°€ 처음 μ‚¬μš©λ˜κΈ° μ „κΉŒμ§€λŠ” λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (ν•΄λ‹Ή λ³€μˆ˜κ°€ 처음 μš”μ²­λ˜μ—ˆμ„ λ•Œ μ‚¬μš©μž μ§€μ •ν•¨μˆ˜λ₯Ό 톡해 생성됨)

 

μ‹€μ œλ‘œ μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ The Swift Language Guide에 λ‚˜μ™€μžˆλŠ” μ˜ˆμ‹œ μ½”λ“œλ‘œ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

class DataImporter {
    /*
        DataImporterλŠ” μ™ΈλΆ€ νŒŒμΌμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
         이 ν΄λž˜μŠ€λŠ” μ΄ˆκΈ°ν™” ν•˜λŠ”λ° 맀우 λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λœλ‹€κ³  κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.
     */
    var filename = "data.txt"
    // 데이터λ₯Ό κ°€μ Έμ˜€λŠ” κΈ°λŠ₯의 κ΅¬ν˜„μ΄ 이 뢀뢄에 κ΅¬ν˜„λΌ μžˆλ‹€κ³  κ°€μ •
}

class DataManager {
    lazy var importer = DataImporter() // lazyλ₯Ό μ‚¬μš©ν•΄ 지연 μ €μž₯ ν”„λ‘œνΌν‹°λ‘œ μ„ μ–Έ
    var data = [String]()
    // 데이터λ₯Ό κ΄€λ¦¬ν•˜λŠ” κΈ°λŠ₯이 이 뢀뢄에 κ΅¬ν˜„λΌ μžˆλ‹€κ³  κ°€μ •
}

let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// DataImporter μΈμŠ€ν„΄μŠ€λŠ” 이 μ‹œμ μ— 생성돼 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

DataImporterλΌλŠ” ν΄λž˜μŠ€λŠ” μ‹€μ œ λ””μŠ€ν¬ νŒŒμΌμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— μ΄ˆκΈ°ν™”μ‹œ λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ˜μ–΄ 이 클래슀λ₯Ό 지연 ν”„λ‘œνΌν‹°(lazy var importer = DataImporter()) 둜 μ„ μ–Έν•΄λ‘” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 그런데, μœ„μ˜ μ½”λ“œμ—μ„œ 지연 μ €μž₯ ν”„λ‘œνΌν‹°λ‘œ μ„ μ–Έν•΄λ‘” impoterλΌλŠ” λ³€μˆ˜λŠ” μ‚¬μš©λ˜μ§€ μ•Šκ³  있죠? 그러면 ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λŠ” μƒμ„±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€! 

 

print(manager.importer.filename)
// the DataImporter μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
// "data.txt" νŒŒμΌμ„ 좜λ ₯ν•©λ‹ˆλ‹€.

 

뒀에 μœ„μ˜ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ€€λ‹€λ©΄, μ΄μ œμ„œμ•Ό(= μ‹€μ œ importer ν”„λ‘œνΌν‹°μ— 처음 μ ‘κ·Όν•˜κ²Œ 될 λ•Œ) importer μΈμŠ€ν„΄μŠ€λŠ” μƒμ„±λ©λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ μ²˜μŒλΆ€ν„° μ‚¬μš©λ˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°λΌλ©΄, ν˜Ήμ€ 잘 μ‚¬μš©λ˜μ§€ μ•Šκ±°λ‚˜ 상황에 따라 μ•„μ˜ˆ μ‚¬μš©λ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλŠ” ν”„λ‘œνΌν‹°λΌλ©΄ lazy ν‚€μ›Œλ“œλ₯Ό 톡해 λΆˆν•„μš”ν•œ ν• λ‹Ήκ³Ό 싀행을 λ°©μ§€ν•˜μ—¬ λΆˆν•„μš”ν•œ μ„±λŠ₯ μ €ν•˜λ‚˜ λ©”λͺ¨λ¦¬ 곡간 λ‚­λΉ„λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

lazy ν‚€μ›Œλ“œ μ‚¬μš© μ‹œ μ£Όμ˜ν•  점

lazy ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ λͺ‡ 가지 μ£Όμ˜ν•΄μ•Όν•  점듀이 μžˆμŠ΅λ‹ˆλ‹€.

 

1. λ³€μˆ˜(var)μ—λ§Œ 뢙일 수 μžˆμŠ΅λ‹ˆλ‹€.

지연 ν”„λ‘œνΌν‹°λŠ” λ°˜λ“œμ‹œ λ³€μˆ˜(var)둜 μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ μƒμˆ˜λŠ” μ΄ˆκΈ°ν™”κ°€ λ˜κΈ°μ „μ— 항상 값을 κ°™λŠ” ν”„λ‘œνΌν‹°μΈλ°, 지연 ν”„λ‘œνΌν‹°λŠ” 처음 μ‚¬μš©λ˜κΈ° μ „μ—λŠ” 값을 갖지 μ•ŠλŠ” ν”„λ‘œνΌν‹°μ΄κΈ° λ•Œλ¬Έμ— μƒμˆ˜λŠ” lazy둜 선언될 수 μ—†μŠ΅λ‹ˆλ‹€.

 

2. struct, class

lazyλŠ” struct와 classμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

3. μ—°μ‚° ν”„λ‘œνΌν‹°(Computed Property)μ—λŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ—°μ‚° ν”„λ‘œνΌν‹°μ—λŠ” lazy ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

lazyλŠ” 처음 μ‚¬μš©λ  λ•Œ λ©”λͺ¨λ¦¬μ— 값을 올리고 κ·Έ 이후에 계속 λ©”λͺ¨λ¦¬μ— 올라온 값을 μ‚¬μš©(처음 값이 계속 μœ μ§€λ¨)ν•©λ‹ˆλ‹€. λ•Œλ¬Έμ— μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ 값을 μ—°μ‚°ν•˜λŠ” computed propertyμ—λŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

3. lazy λ³€μˆ˜λŠ” thread safeν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

지연 ν”„λ‘œνΌν‹°κ°€ μ—¬λŸ¬ μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš©λ  λ•Œ, 지연 ν”„λ‘œνΌν‹°κ°€ ν•œ 번만 μ‹€ν–‰λ˜λŠ” κ±Έ 보μž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 닀쀑 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μƒμ„±λ˜μ§€ μ•Šμ€ 지연 μ €μž₯ ν”„λ‘œνΌν‹°μ— λ§Žμ€ μŠ€λ ˆλ“œκ°€ λΉ„μŠ·ν•œ μ‹œμ μ— μ ‘κ·Όν•œλ‹€λ©΄, μ—¬λŸ¬ 번 μ΄ˆκΈ°ν™”λ  수 μžˆμŠ΅λ‹ˆλ‹€.

 


[참고 자료]

 

ν”„λ‘œνΌν‹° (Properties) - The Swift Language Guide (ν•œκ΅­μ–΄)

ν”„λ‘œνΌν‹°λŠ” 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•κ³Ό κ΄€λ ¨ν•œ κ°’μž…λ‹ˆλ‹€. ν”„λ‘œνΌν‹°μ˜ μ’…λ₯˜μ—λŠ” μ €μž₯ ν”„λ‘œνΌν‹°(Stored Properties)와 κ³„μ‚°λœ ν”„λ‘œνΌν‹°(Computed Properties)κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ €μž₯ ν”„λ‘œνΌν‹°λŠ” 말 κ·ΈλŒ€λ‘œ 값을 μ €

jusung.gitbook.io

 

lazy var in ios swift

This article explains the working of lazy var in swift.You must have some knowledge in closures.

abhimuralidharan.medium.com