λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
3️⃣ Swift/Swift 정리

[Swift] ν”„λ‘œνΌν‹° κ°œλ… 정리 (1); μ €μž₯ ν”„λ‘œνΌν‹°

by seolhee2750 2021. 9. 22.

ν”„λ‘œνΌν‹°λΌκ³  ν•˜λ©΄ ν΄λž˜μŠ€λ‚˜ κ΅¬μ‘°μ²΄μ—μ„œ μ“°λŠ” λ³€μˆ˜, μƒμˆ˜,,?

기본적인 κ°œλ…μ΄μ§€λ§Œ μ •ν™•νžˆ μ„€λͺ…ν•˜κΈ° μ–΄λ ΅λ‹€.γ…œ

좔석을 λ§žμ•„ 이런 κ°œλ…λ“€μ„ νƒ„νƒ„νžˆν•˜κ³  λ„˜μ–΄κ°€λ €ν•œλ‹€.πŸ‘©πŸ»‍πŸ’»

 

ν”„λ‘œνΌν‹°λŠ” 클래슀, ꡬ쑰체, μ—΄κ±°ν˜• 등에 κ΄€λ ¨λœ 값을 λœ»ν•˜κ³ ,

κ·Έ μ’…λ₯˜λŠ” μ €μž₯ ν”„λ‘œνΌν‹°, μ—°μ‚° ν”„λ‘œνΌν‹°, νƒ€μž… ν”„λ‘œνΌν‹°λ‘œ 크게 λ‚˜λˆŒ 수 μžˆλ‹€.

 

πŸ“Ž μ €μž₯ ν”„λ‘œνΌν‹° (Stored Properties)

μ €μž₯ ν”„λ‘œνΌν‹°λŠ” ν΄λž˜μŠ€λ‚˜ κ΅¬μ‘°μ²΄μ—μ„œ

λ³€μˆ˜λ‚˜ μƒμˆ˜λ₯Ό μ €μž₯ν•˜λŠ” κ°€μž₯ λ‹¨μˆœν•œ ν”„λ‘œνΌν‹°μ΄λ‹€.

 

πŸ“Œ μ €μž₯ ν”„λ‘œνΌν‹°μ˜ κΈ°λ³Έ ν˜•νƒœ

κ°€μž₯ 기본적인 ν˜•νƒœμ˜ μ €μž₯ ν”„λ‘œνΌν‹° μ‚¬μš© 방법을 μ½”λ“œλ‘œ μž‘μ„±ν–ˆλ‹€.

struct Info1_sp {
    let name: String = "섀희" // μƒμˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°
    var age: Int = 0 // λ³€μˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°
}

class Info2_sp {
    let name: String = "섀희" // μƒμˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°
    var age: Int = 0 // λ³€μˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°
    
    // μ΄λ‹ˆμ…œλΌμ΄μ € 지정
    // => μ΄ˆκΉƒκ°’μ„ μ§€μ •ν•˜μ§€ μ•Šμ•˜κ±°λ‚˜,
    // μ§€μ •ν–ˆλ”λΌλ„ 후에 κ°’ 변경이 μžˆμ„ 경우 μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 지정해주어야 ν•œλ‹€.
    init(age: Int) {
        self.age = age
    }
}

// κ΅¬μ‘°μ²΄λŠ” 기본적으둜 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ κ°–λŠ” μ΄λ‹ˆμ…œλΌμ΄μ Έκ°€ μžˆλ‹€.
let printInfo1: Info1_sp = Info1_sp(age: 1)

// ν΄λž˜μŠ€λŠ” μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ‚¬μš©ν•œλ‹€.
// 그렇지 μ•ŠμœΌλ©΄ ν”„λ‘œνΌν‹° μ΄ˆκΉƒκ°’μ„ ν• λ‹Ήν•  수 μ—†μ–΄ μΈμŠ€ν„΄μŠ€ 생성이 λΆˆκ°€ν•˜λ‹€.
let printInfo2: Info2_sp = Info2_sp(age: 2)

각각 ꡬ쑰체, 클래슀둜 μž‘μ„±ν•œ Info1_sp와 Info2_spκ°€ μžˆλ‹€.

 

μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μ—΄κ±°ν˜•μ—μ„œ μ‚¬μš© λΆˆκ°€ν•˜κ³ , ꡬ쑰체와 ν΄λž˜μŠ€μ—μ„œλ§Œ κ°€λŠ₯ν•˜κΈ°μ—

같은 λ‚΄μš©μ˜ μ½”λ“œλ₯Ό ꡬ쑰체와 클래슀둜 μž‘μ„±ν•˜μ—¬ λΉ„κ΅ν–ˆλ‹€.

 

πŸ‘‰ λ‘˜μ˜ 차이점은 μ΄λ‹ˆμ…œλΌμ΄μ €μ˜ 쑴재 μœ λ¬΄μ΄λ‹€.

1) ꡬ쑰체의 경우 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μžλ™ μƒμ„±ν•œλ‹€.

2) ν΄λž˜μŠ€λŠ” μ €μž₯ ν”„λ‘œνΌν‹°κ°€ μ˜΅μ…”λ„μΈ 경우λ₯Ό μ œμ™Έν•˜λ©΄

ν”„λ‘œνΌν‹°μ˜ 기본값을 μ§€μ •ν•΄μ£Όκ±°λ‚˜, μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 지정해주어야 ν•œλ‹€.

(기본값을 μ§€μ •ν–ˆλ”λΌλ„ λ‚˜μ€‘μ— κ°’μ˜ 변경이 μžˆμ„ μ˜ˆμ •μ΄λΌλ©΄ μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ ν•„μš”ν•˜λ‹€.)

 

μœ„μ˜ μ„€λͺ…κ³Ό 같이 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ μ΄ˆκΉƒκ°’μ„ μ„€μ •ν•˜λ©΄ ꡬ쑰체든, ν΄λž˜μŠ€λ“  κ΄€λ ¨ 없이

μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό κ΅¬ν˜„ν•΄μ€„ ν•„μš”κ°€ 없어지기 λ•Œλ¬Έμ— νŽΈλ¦¬ν•΄μ§„λ‹€.

 

ν•˜μ§€λ§Œ κ·Έλ ‡κ²Œ 되면 μ˜λ„μ™€ λ‹€λ₯΄κ²Œ μΈμŠ€ν„΄μŠ€κ°€ μ‚¬μš©λ  κ°€λŠ₯성이 λ‚¨μ•„μžˆκ³ ,

μ•žμœΌλ‘œ κ°’μ˜ 변경이 없도둝 μƒμˆ˜λ‘œ μ •μ˜ν•΄μ£Όκ³  싢어도

μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ 후에 값을 ν• λ‹Ήν•΄μ£Όμ–΄μ•Ό ν•˜λ―€λ‘œ 그럴 수 μ—†λ‹€λŠ” 단점이 μžˆλ‹€.

 

μ΄λŸ¬ν•œ 단점을 κ°œμ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ˜΅μ…”λ„κ³Ό μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 적절히 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

μ•„λž˜μ— ν•΄λ‹Ή 방법을 μ½”λ“œλ‘œ μž‘μ„±ν•΄λ³΄μ•˜λ‹€.

 

πŸ“Œ μ €μž₯ ν”„λ‘œνΌν‹°μ˜ 효과적인 μ‚¬μš© 방법

struct Place {
    var placeName: String
}

class Position {
    var position: Place? // ν˜„μž¬ μœ„μΉ˜λ₯Ό λͺ¨λ₯Όμˆ˜λ„ μžˆμœΌλ―€λ‘œ μ˜΅μ…”λ„λ‘œ 지정
    let name: String = "섀희"
}

// ν•„μˆ˜ κ°’λ§Œ λ¨Όμ € ν• λ‹Ήν•˜κ³ , 값이 μžˆμ–΄λ„ 없어도 μƒκ΄€μ—†λŠ” ν”„λ‘œνΌν‹°λŠ”
// μ˜΅μ…”λ„λ‘œ μ§€μ •ν•˜μ—¬ μœ„μΉ˜λ₯Ό μ§€μ •ν•˜κ³  싢을 λ•Œ 지정할 수 μžˆλ‹€.
let nowPosition: Position = Position()
nowPosition.position = Place(placeName: "집")
print(nowPosition.name, nowPosition.position!) // 섀희 Place(placeName: "집")

λ§ˆμ°¬κ°€μ§€λ‘œ 각각 ꡬ쑰체와 클래슀둜 λ‚˜λˆ μ„œ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

 

μœ„μ˜ μ½”λ“œλŠ” μž₯μ†Œλ₯Ό ν‘œν˜„ν•˜λŠ” λ‚΄μš©μΈλ°,

μ‚¬λžŒμ€ λˆ„κ΅¬μΈμ§€ ν•„μˆ˜λ‘œ μ•Œμ•„μ•Ό ν•˜λ©°, μž₯μ†ŒλŠ” λͺ¨λ₯Ό μˆ˜λ„ μžˆλ‹€κ³  κ°€μ •ν–ˆλ‹€.

 

λ¨Όμ € μ˜΅μ…”λ„μ΄ μ•„λ‹Œ name 값에 λŒ€ν•΄μ„œλ§Œ μ΄ˆκΉƒκ°’μ„ 지정해주고,

(λ¬Όλ‘  μΆ”ν›„ 할당을 μ›ν•˜λ©΄ λΉ„μ›Œλ‘κ³ , μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό κ΅¬ν˜„ν•΄λ„λœλ‹€.)

μ˜΅μ…”λ„μΈ Place의 κ²½μš°μ—λŠ” λ‚˜μ€‘μ— μœ„μΉ˜λ₯Ό μ•Œκ²Œ 되면! κ·Έ λ•Œ ν• λ‹Ήν•˜λ©΄ λœλ‹€.

 

μ΄λ ‡κ²Œ μ˜΅μ…”λ„κ³Ό μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 적절히 ν™œμš©ν•˜λ©΄

λ‚΄κ°€ μ˜λ„ν•œλŒ€λ‘œ ꡬ쑰체와 클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μœ λ„ν•  수 μžˆλ‹€.

 

πŸ“Œ 지연 μ €μž₯ ν”„λ‘œνΌν‹°

μ§€κΈˆκΉŒμ§€ λ³Έ μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 경우 λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.

ν•˜μ§€λ§Œ 이 지연 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” ν•„μš”ν•  λ•Œ! 값이 ν• λ‹Ήλœλ‹€.πŸ’₯

πŸ‘‰ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”ν•  λ•ŒλŠ” μ„ μ–Έλ§Œλ˜κ³ , ν•΄λ‹Ή ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•  λ•Œ κ°’ 할당함.

 

μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™” ν•  λ•Œ, ꡳ이 λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό μ΄ˆκΈ°ν™”ν•  ν•„μš”κ°€ 없을 λ•Œλ„ μžˆλ‹€.

이럴 λ•Œ 지연 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ λΆˆν•„μš”ν•œ μ„±λŠ₯ μ €ν•˜λ‚˜ 곡간 λ‚­λΉ„λ₯Ό 쀄일 수 μžˆλ‹€.!

 

지연 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” lazy ν‚€μ›Œλ“œ ν•˜λ‚˜λ§Œ 뢙이면 끝이닀.

ν•˜μ§€λ§Œ μ£Όμ˜ν•  점은, 지연 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” ν•„μš”ν•  λ•Œ 값을 ν• λ‹Ήν•΄μ•Όν•˜λ―€λ‘œ

μƒμˆ˜λ‘œλŠ” μ‚¬μš©μ΄ λΆˆκ°€ν•˜λ‹€. 무쑰건 var둜 μ •μ˜ν•΄μ•Όν•œλ‹€.

 

μ•„λž˜μ— 지연 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό κ΅¬ν˜„ν•΄λ΄€λ‹€.

struct favoriteFruits {
    var first: String = "strawberry"
    var second: String = "peach"
}

class favoriteFruitsList {
    lazy var fruits: favoriteFruits = favoriteFruits() // lazy ν‚€μ›Œλ“œλ‘œ 지연 μ„€μ •!
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

// μ—¬κΈ°μ„œλŠ” 아직 favoriteFruits 생성x
let bestFruits: favoriteFruitsList = favoriteFruitsList(name: "seolhee")

// 이 μ½”λ“œλ₯Ό 톡해 fruits ν”„λ‘œνΌν‹°λ‘œ μ ‘κ·Ό, fruits ν”„λ‘œνΌν‹°μ˜ favoriteFruitsκ°€ μƒμ„±λœλ‹€.
print(bestFruits.fruits) // favoriteFruits(first: "strawberry", second: "peach")

λ‚΄κ°€ μ’‹μ•„ν•˜λŠ” 과일을 λ³΄μ—¬μ£ΌλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

favoriteFruitsListμ—μ„œλŠ” name을 let으둜,

favoriteFruits ꡬ쑰체λ₯Ό λ°›μ•„μ˜€λŠ” fruits μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό  lazy둜 μ •μ˜ν–ˆλ‹€.

 

λ”°λΌμ„œ 맨 μ•„λž˜ print κ΅¬λ¬Έμ—μ„œ fruits ν”„λ‘œνΌν‹°λ‘œ 직접 μ ‘κ·Όν•˜λ©΄

κ·Έ λ•Œ favoriteFruitsκ°€ μƒμ„±λœλ‹€.

 

ν•˜μ§€λ§Œ μ£Όλͺ©ν•΄μ•Ό ν•  lazy의 νŠΉμ§•μ΄ ν•˜λ‚˜ μžˆλŠ”λ°,

πŸ‘‰ λ‹€μ€‘μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” 지연 μ €μž₯ ν”„λ‘œνΌν‹°μ— λ™μ‹œλ‹€λ°œμ μœΌλ‘œ μ ‘κ·Ό ν•  λ•Œ ν•œ 번만 μ΄ˆκΈ°ν™”λœλ‹€λŠ” 보μž₯을 ν•  수 μ—†λ‹€.

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

λ”°λΌμ„œ 이 점을 μ£Όμ˜ν•˜μ—¬ 지연 μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€. 

ν•œ 번만 μ΄ˆκΈ°ν™”λ˜λ„λ‘ ν•˜λ €λ©΄ μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜λŠ”λ°, 이건 λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œ 닀루겠닀.


🌟 정리

ν”„λ‘œνΌν‹°λŠ” ꡬ쑰체, 클래슀, μ—΄κ±°ν˜•μ—μ„œ μ“°μ΄λŠ” κ΄€λ ¨λœ 값을 λ§ν•˜λŠ”λ°,

κ·Έ μ€‘μ—μ„œλ„ ꡬ쑰체와 ν΄λž˜μŠ€μ—μ„œ λ³€μˆ˜λ‚˜ μƒμˆ˜μ™€ 같이 값을 μ €μž₯ν•˜λŠ” 것을 μ €μž₯ ν”„λ‘œνΌν‹°λΌκ³  ν•œλ‹€.

μ €μž₯ ν”„λ‘œνΌν‹°λŠ” κ΅¬μ‘°μ²΄μ—μ„œ μ‚¬μš©μ‹œ μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ ν•„μš” μ—†κ³ ,

ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  λ•ŒλŠ” μ΄ˆκΉƒκ°’ μ§€μ •ν•˜κ±°λ‚˜ μ˜΅μ…”λ„λ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ ν•„μš”ν•˜λ‹€.

lazy ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ μΈμŠ€ν„΄μŠ€ 생성 μ‹œ ν”„λ‘œνΌν‹° μ΄ˆκΈ°ν™”μ—μ„œ μ œμ™Έν•˜κ³ , ν•„μš”ν•  λ•Œ κ°’ 할당이 κ°€λŠ₯ν•˜λ‹€.

 

μ˜€λŠ˜μ€ μ΄λ ‡κ²Œ ν”„λ‘œνΌν‹° 쀑 μ €μž₯ ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ μ •λ¦¬ν–ˆλŠ”λ°

λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œ μ—°μ‚° ν”„λ‘œνΌν‹°μ™€ νƒ€μž… ν”„λ‘œνΌν‹°,

그리고 ν”„λ‘œνΌν‹° κ°μ‹œμž λ“± ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ 글을 μ΄μ–΄λ‚˜κ°€λ„λ‘ ν•˜κ² λ‹€.

 


μ°Έκ³ 

  • πŸ“– μŠ€μœ„ν”„νŠΈ ν”„λ‘œκ·Έλž˜λ°

λŒ“κΈ€