Swift

[Swift] ν”„λ‘œνΌν‹°(Property) β‘  - μ €μž₯, μ—°μ‚°

yeggrrr🐼 2024. 5. 28. 15:20

- ν”„λ‘œνΌν‹°(Property) : 클래슀, ꡬ쑰체 λ˜λŠ” μ—΄κ±°ν˜• 등에 κ΄€λ ¨λœ 값을 의미
- λ©”μ„œλ“œ(Method) : νŠΉμ • νƒ€μž…μ— κ΄€λ ¨λœ ν•¨μˆ˜

 

ν”„λ‘œνΌν‹°

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

- μ €μž₯ ν”„λ‘œνΌν‹°(Stored Properties)
- μ—°μ‚° ν”„λ‘œνΌν‹°(Computed Properties)
- νƒ€μž… ν”„λ‘œνΌν‹°(Type Properties)


• μ €μž₯ ν”„λ‘œνΌν‹°
- μΈμŠ€ν„΄μŠ€μ˜ λ³€μˆ˜ λ˜λŠ” μƒμˆ˜λ₯Ό 의미 (ꡬ쑰체와 ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 있음)

• μ—°μ‚° ν”„λ‘œνΌν‹°
-
값을 μ €μž₯ν•œ 것이 μ•„λ‹ˆλΌ νŠΉμ • 연산을 μ‹€ν–‰ν•œ 결과값을 의미 (클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ— 쓰일 수 있음)

• νƒ€μž… ν”„λ‘œνΌν‹°
- νŠΉμ • νƒ€μž…μ— μ‚¬μš©λ˜λŠ” ν”„λ‘œνΌν‹° (μ €μž₯, μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” νŠΉμ • νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ— μ‚¬μš©λ˜λŠ” 것)
- 클래슀 λ³€μˆ˜

βž• ν”„λ‘œνΌν‹° κ°μ‹œμž (Property Observers)

- ν”„λ‘œνΌν‹°μ˜ 값이 λ³€ν•  λ•Œ κ°’μ˜ 변화에 λ”°λ₯Έ νŠΉμ • μž‘μ—…μ„ μ‹€ν–‰ν•œλ‹€.
- μ €μž₯ ν”„λ‘œνΌν‹°μ— μ μš©ν•  수 있으며 λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받을 수 μžˆλ‹€.

μ €μž₯ ν”„λ‘œνΌν‹°

클래슀 λ˜λŠ” ꡬ쑰체의 μΈμŠ€ν„΄μŠ€μ™€ μ—°κ΄€λœ 값을 μ €μž₯ν•˜λŠ” ν”„λ‘œνΌν‹°

var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄? λ³€μˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°
let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄? μƒμˆ˜ μ €μž₯ ν”„λ‘œνΌν‹°

κ΅¬μ‘°μ²΄λŠ” μ €μž₯ ν”„λ‘œνΌν‹°κ°€ μ˜΅μ…”λ„μ΄ μ•„λ‹ˆλ”λΌλ„, μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•œλ‹€.

λ°˜λ©΄μ—, ν΄λž˜μŠ€λŠ” μ €μž₯ ν”„λ‘œνΌν‹°κ°€ μ˜΅μ…”λ„μ΄ μ•„λ‹ˆλΌλ©΄ ν”„λ‘œνΌν‹° 기본값을 μ§€μ •ν•΄μ£Όκ±°λ‚˜ μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 톡해 λ°˜λ“œμ‹œ μ΄ˆκΈ°ν™”λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.


<ꡬ쑰체>

κ΅¬μ‘°μ²΄λŠ” μœ„μ™€ 같이 ν”„λ‘œνΌν‹°μ— λ§žλŠ” μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μžλ™μœΌλ‘œ μ œκ³΅ν•΄μ€€λ‹€.

λ˜ν•œ, μ΄λ ‡κ²Œ μ΄ˆκΈ°κ°’μ„ ν• λ‹Ήν•΄μ£Όλ©΄ μ „λ‹¬μΈμžλ‘œ μ΄ˆκΈ°κ°’μ„ λ„˜κΈΈ ν•„μš”κ°€ μ—†λ‹€.
그리고 κΈ°μ‘΄κ³Ό 같이 μ΄λ‹ˆμ…œλΌμ΄μ €λ‘œλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.



<클래슀>

ν΄λž˜μŠ€λŠ” μœ„μ™€ 같이 ν”„λ‘œνΌν‹° 기본값을 지정해주지 μ•ŠμœΌλ©΄, μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό λ”°λ‘œ μ •μ˜ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

ν΄λž˜μŠ€λ„ λ§ˆμ°¬κ°€μ§€λ‘œ μ΄ˆκΈ°κ°’μ„ 미리 지정해쀬닀면, μœ„μ™€ 같이 μ‚¬μš©μž μ •μ˜ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

μ΄ˆκΈ°κ°’μ„ 미리 μ„€μ •ν•΄μ€€ 경우,
β‘  μ˜λ„μ™€ λ§žμ§€ μ•Šκ²Œ μΈμŠ€ν„΄μŠ€κ°€ μ‚¬μš©λ  κ°€λŠ₯성이 있음
β‘‘ μΈμŠ€ν„΄μŠ€ 생성 ν›„, μ›ν•˜λŠ” 값을 ν•˜λ‚˜ ν•˜λ‚˜ ν• λ‹Ήν•΄μ•Ό 함
β‘’ ν•œ 번 ν• λ‹Ήν•΄μ€€  λ³€κ²½μ΄ λΆˆκ°€λŠ₯ν•˜λ„λ‘ μƒμˆ˜λ‘œ μ •μ˜ν•˜κ³  μ‹Άμ§€λ§Œ, μΈμŠ€ν„΄μŠ€ 생성 후에 값을 ν• λ‹Ήν•΄μ£Όμ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— λΆˆκ°€λŠ₯함.

μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ, μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 톡해 μ΄ˆκΈ°κ°’μ„ λ³΄λ‚΄μ•Όν•˜λŠ” 이유
- ν”„λ‘œνΌν‹°κ°€ μ˜΅μ…”λ„μ΄ μ•„λ‹Œ κ°’μœΌλ‘œ μ„ μ–Έλ˜μ–΄ 있기 λ•Œλ¬Έμ— ν”„λ‘œνΌν‹°μ— 값이 κΌ­ μžˆλŠ” μƒνƒœμ—¬μ•Ό 함.



κ·Έλž˜μ„œ ν”„λ‘œνΌν‹° 값이 μ˜΅μ…”λ„μ΄λΌλ©΄ ꡳ이 μ΄ˆκΈ°κ°’μ„ 넣어주지 μ•Šμ•„λ„ λœλ‹€.

μ΄λ ‡κ²Œ μ˜΅μ…”λ„κ³Ό μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό 상황에 맞게 μ‚¬μš©ν•˜λ©΄, λ§Œλ“  μ˜λ„μ— 맞게 ꡬ쑰체와 클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ μœ λ„ν•  수 μžˆλ‹€.

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

이 ν”„λ‘œνΌν‹°λŠ” 호좜이 μžˆμ–΄μ•Ό 값을 μ΄ˆκΈ°ν™”ν•œλ‹€. μ΄λ•Œ lazy ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

struct Point {
    var a: Int = 0
    var b: Int = 0
}

class Position {
    lazy var point: Point = Point() // μœ„μΉ˜ 정보 값을 담을 point에 λŒ€ν•œ 정보λ₯Ό μ–»κΈ° μ „κΉŒμ§€ μ‚¬μš©ν•  일이 μ—†μŒ! 
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

let yegrPosition: Position = Position(name: "yegr")

μœ„μ™€ 같이 μ‚¬μš©ν•˜λŠ”λ°, 이 ν”„λ‘œνΌν‹°λŠ” 주둜 λ³΅μž‘ν•œ ν΄λž˜μŠ€λ‚˜ ꡬ쑰체λ₯Ό κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©λœλ‹€.

클래슀 μΈμŠ€ν„΄μŠ€μ˜ μ €μž₯ ν”„λ‘œνΌν‹°λ‘œ λ‹€λ₯Έ 클래슀 μΈμŠ€ν„΄μŠ€λ‚˜ ꡬ쑰체 μΈμŠ€ν„΄μŠ€λ₯Ό ν• λ‹Ήν•΄μ•Όν•  λ•Œ,
- μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λ©΄μ„œ μ €μž₯ ν”„λ‘œνΌν‹°λ‘œ μ“°μ΄λŠ” μΈμŠ€ν„΄μŠ€λ“€μ΄ ν•œ λ²ˆμ— μƒμ„±λ˜μ–΄μ•Ό ν•œλ‹€λ©΄?
- λͺ¨λ“  μ €μž₯ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λ‹€λ©΄?

이런 κ²½μš°μ— 지연 μ €μž₯ ν”Όλ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄, λΆˆν•„μš”ν•œ μ„±λŠ₯μ €ν•˜λ‚˜ 곡간 λ‚­λΉ„λ₯Ό 쀄일 수 μžˆλ‹€.


μ—°μ‚° ν”„λ‘œνΌν‹°

μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” μ‹€μ œ 값을 μ €μž₯ν•˜λŠ” ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλΌ 'νŠΉμ • μƒνƒœμ— λ”°λ₯Έ 값을 μ—°μ‚°ν•˜λŠ” ν”„λ‘œνΌν‹°'이닀.

- μΈμŠ€ν„΄μŠ€ λ‚΄/μ™ΈλΆ€μ˜ 값을 μ—°μ‚°ν•˜μ—¬ μ μ ˆν•œ 값을 λŒλ €μ£ΌλŠ” 'μ ‘κ·Όμž(getter)'
- μ€λ‹‰ν™”λœ λ‚΄λΆ€μ˜ ν”„λ‘œνΌν‹° 값을 κ°„μ ‘μ μœΌλ‘œ μ„€μ •ν•˜λŠ” 'μ„€μ •μž(setter)'

μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” μ–Έμ œ μ‚¬μš©ν• κΉŒ?🧐
- μΈμŠ€ν„΄μŠ€ μ™ΈλΆ€μ—μ„œ λ©”μ„œλ“œλ₯Ό 톡해 μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 값에 μ ‘κ·Όν•˜λ €λ©΄, λ©”μ„œλ“œλ₯Ό 두 개λ₯Ό κ΅¬ν˜„ν•΄μ•Όν•œλ‹€. (getter, setter)
- 이 λ•Œ, 두 λ©”μ„œλ“œκ°€ λΆ„μ‚° κ΅¬ν˜„λ˜μ–΄ μ½”λ“œμ˜ 가독성이 λ–¨μ–΄μ§ˆ 수 μžˆλ‹€.
struct Panda {
    var name: String = "ν‘Έλ°”μ˜€"
    
    var introduce: String {
        get {
            return "κ·€μ—¬μš΄ \(name)~!" // λ‚΄λΆ€ μ½”λ“œκ°€ ν•œ 쀄이고, κ²°κ³Όκ°’κ³Ό ν”„λ‘œνΌν‹° νƒ€μž…μ΄ κ°’λ‹€λ©΄! return μƒλž΅ κ°€λŠ₯
        }
        
        set(name) { // μ΄λ ‡κ²Œ μ„€μ •μž(setter)의 λ§€κ°œλ³€μˆ˜λ‘œ μ›ν•˜λŠ” 이름을 μ†Œκ΄„ν˜Έ μ•ˆμ— λͺ…μ‹œν•΄μ£Όλ©΄, set λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ 전달받은 μ „λ‹¬μΈμžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
            self.name = "ν–‰λ³΅ν•œ \(name)"
        }
    }
}

var baoName: Panda = Panda()
// get에 μ ‘κ·Ό
baoName.introduce // κ·€μ—¬μš΄ ν‘Έλ°”μ˜€~!
// set에 μ ‘κ·Ό
baoName.introduce = "μ•„μ΄λ°”μ˜€"
baoName.name // ν–‰λ³΅ν•œ μ•„μ΄λ°”μ˜€

// μ—°μ‚°ν”„λ‘œνΌν‹°λ₯Ό 읽으면 getterκ°€ μ‹€ν–‰λ˜κ³ , 값을 μž…λ ₯ν•˜λ©΄ setterκ°€ μ‹€ν–‰λœλ‹€.

μ΄λ ‡κ²Œ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•˜λ‚˜μ˜ ν”„λ‘œνΌν‹°μ— μ ‘κ·Όμž(getter)와 μ„€μ •μž(setter)κ°€ λͺ¨λ‘ λͺ¨μ—¬μžˆκ³ ,
ν•΄λ‹Ή ν”„λ‘œνΌν‹°κ°€ μ–΄λ–€ 역할을 ν•˜λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

struct Panda {
    var name: String = "ν‘Έλ°”μ˜€"
    
    var introduce: String {
        get {
            "κ·€μ—¬μš΄ \(name)~!"
        }
    }
}

var baoName: Panda = Panda()
baoName.introduce // κ·€μ—¬μš΄ ν‘Έλ°”μ˜€~!
baoName.introduce = "μ•„μ΄λ°”μ˜€" // error: Cannot assign to property: 'introduce' is a get-only property

λŒ€μΉ­μ μ„ μ„€μ •ν•  ν•„μš”κ°€ μ—†λ‹€λ©΄ μœ„μ™€ 같이 get λ©”μ„œλ“œλ§Œ μ‚¬μš©ν•˜μ—¬ 읽기 μ „μš©μœΌλ‘œ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
(단, set만 μ‚¬μš©ν•˜λŠ” 것은 λΆˆκ°€λŠ₯)


ν”„λ‘œνΌν‹° κ°μ‹œμž(Property Observers)

ν”„λ‘œνΌν‹°μ˜ 값이 변경됨에 λ”°λΌμ„œ μ μ ˆν•œ μž‘μ—…μ„ μ·¨ν•  수 μžˆλ„λ‘ ν”„λ‘œνΌν‹° 값이 μƒˆλ‘œ 할당될 λ•Œλ§ˆλ‹€ ν˜ΈμΆœλ˜λŠ” 'ν”„λ‘œνΌν‹° κ°μ‹œμž'κ°€ μžˆλ‹€.

 

<λ‹€μŒ κ²Œμ‹œλ¬Ό>
- ν”„λ‘œνΌν‹° κ°μ‹œμž
- νƒ€μž… ν”„λ‘œνΌν‹°

 

[Swift] ν”„λ‘œνΌν‹°(Property) β‘‘ - νƒ€μž…

ν”„λ‘œνΌν‹° κ°μ‹œμž (Property Observers)- ν”„λ‘œνΌν‹° 값이 변경됨에 따라 μ μ ˆν•œ μž‘μ—…μ„ μ·¨ν•  수 μžˆλ‹€. - λ˜ν•œ, ν”„λ‘œνΌν‹° 값이 μƒˆλ‘œ 할당될 λ•Œλ§ˆλ‹€ ν˜ΈμΆœλœλ‹€.- λ³€κ²½λ˜λŠ” 값이 ν˜„μž¬μ˜ κ°’κ³Ό 같더라도 호좜된

yegenie-coding.tistory.com

 

728x90

'Swift' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Swift] ν”„λ‘œνΌν‹°(Property) β‘‘ - νƒ€μž…  (0) 2024.06.04
[Swift] AutomaticDimension  (0) 2024.06.03
[Swift] for-in κ³Ό forEach  (0) 2024.05.21
Swift μ–Έμ–΄λž€?  (0) 2024.02.19