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

[Swift] ν”„λ‘œνΌν‹° κ°œλ… 정리 (2); μ—°μ‚° ν”„λ‘œνΌν‹°

by seolhee2750 2021. 9. 22.

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

μ €μž₯ ν”„λ‘œνΌν‹°λŠ” λ³€μˆ˜, μƒμˆ˜μ— λŒ€ν•œ κ°œλ…μœΌλ‘œ κ·Έλ‚˜λ§ˆ μ‰¬μš΄? νŽΈμ΄μ—ˆλŠ”λ°

μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” 비ꡐ적 μ–΄λ €μ› λ‹Ή. 같이 κ³΅λΆ€ν•΄λ³΄μŸˆ..

 

πŸ“Ž μ—°μ‚° ν”„λ‘œνΌν‹° (Computed Properties)

값을 μ €μž₯ν•˜λŠ” μ €μž₯ ν”„λ‘œνΌν‹°μ™€ 달리 μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” 값을 μ €μž₯ν•˜λŠ” 곡간이 μ—†λ‹€.

λ”°λΌμ„œ λ‹€λ₯Έ μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό κ°€μ Έμ™€μ„œ 연산을 ν•˜κ³  μ μ ˆν•œ 값을 λŒλ €μ£ΌλŠ” 역할을 ν•œλ‹€.

ꡬ쑰체, 클래슀, μ—΄κ±°ν˜• λͺ¨λ‘μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•˜κ³  μ ‘κ·Όμž(getter), μ„€μ •μž(setter)κ°€ ν•„μš”ν•˜λ‹€.

 

μ–΄λ– ν•œ 값을 가지고 μ—°μ‚°, λ°˜ν™˜ν•œλ‹€λŠ” λΆ€λΆ„μ—μ„œ λ©”μ„œλ“œμ™€ λΉ„μŠ·ν•˜λ‹€λŠ” 것을 μ•Œ 수 μžˆλŠ”λ°

λ©”μ„œλ“œ λŒ€μ‹  이 μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λŠ” 점을 μ•Œμ•„λ³΄λ©΄,

 

1) λ©”μ„œλ“œμ˜ 경우 μœ„μ—μ„œ λ§ν•œ μ ‘κ·Όμž, μ„€μ •μžλ₯Ό 각각 λ”°λ‘œ κ΅¬ν˜„ν•΄μ•Όν•œλ‹€.

λ”°λΌμ„œ κ΅¬ν˜„ν•˜λŠ”λ°μ— λΆˆνŽΈν•¨μ΄ μžˆμ„ 수 있고, λΆ„μ‚°κ΅¬ν˜„λ˜λŠ” 만큼 가독성이 λ‚˜λΉ μ§ˆ κ°€λŠ₯성이 μžˆλ‹€.

2) μ—°μ‚° ν”„λ‘œνΌν‹°μ˜ κ²½μš°μ—λ„ 단점은 μ‘΄μž¬ν•˜λŠ”λ°,

λ©”μ„œλ“œλŠ” 읽기 μ „μš©, μ“°κΈ° μ „μš© λͺ¨λ‘ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” 읽기 μ „μš©λ§Œ λ§Œλ“€ 수 μžˆλ‹€.

 

μœ„μ˜ μ—°μ‚° ν”„λ‘œνΌν‹°μ˜ νŠΉμ§•λ“€μ„ μ½”λ“œλ₯Ό 톡해 μžμ„Ένžˆ μ•Œμ•„λ³΄μž.

 

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

struct Person {
    // μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” μ΄λ ‡κ²Œ λ‹€λ₯Έ μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό κΌ­ ν•„μš”λ‘œ ν•œλ‹€.
    var name: String = "섀희"
    
    // 값을 μ €μž₯ν•˜λŠ” 것이 μ•„λ‹ˆλ―€λ‘œ, νƒ€μž… μΆ”λ‘  λΆˆκ°€. λ”°λΌμ„œ νƒ€μž… λͺ…μ‹œ ν•„μˆ˜!
    var selfIntroduce: String {
        // μ ‘κ·Όμž getter (λ‹€λ₯Έ ν”„λ‘œνΌν‹°μ˜ 값을 μ–»κ±°λ‚˜ μ—°μ‚°ν•˜μ—¬ 리턴할 λ•Œ μ‚¬μš©)
        // => μ–΄λ–€ μ €μž₯ ν”„λ‘œνΌν‹°μ˜ 값을 μ—°μ‚°ν•˜μ—¬ λ°˜ν™˜ν•  것인지 return ꡬ문 ν•„μˆ˜
        get {
            return "λ‚΄ 이름은 \(name)μ•Ό??"
        }
        
        // μ„€μ •μž setter (λ‹€λ₯Έ μ €μž₯ ν”„λ‘œνΌν‹°μ— 값을 μ €μž₯ν•  λ•Œ μ‚¬μš©)
        // => νŒŒλΌλ―Έν„°λ‘œ 받은 값을 μ–΄λ–€ μ €μž₯ ν”„λ‘œνΌν‹°μ— μ–΄λ–»κ²Œ μ„€μ •ν•  것인지 κ΅¬ν˜„
        set(name) {
            self.name = "λ‚΄ 이름은 \(name)μ•Ό!!"
        }
        
        // μ•„λž˜μ™€ 같이 set νŒŒλΌλ―Έν„° μ§€μ •ν•˜μ§€ μ•Šκ³ , newValueλΌλŠ” μ΄λ¦„μœΌλ‘œ μ‚¬μš©λ„ κ°€λŠ₯!
        /*
        set {
            self.name = "λ‚΄ 이름은 " + newValue + "μ•Ό!!"
        }
        */
    }
}

var herName: Person = Person()

// get에 μ ‘κ·Ό
print(herName.selfIntroduce) // λ‚΄ 이름은 섀희야??

// set에 μ ‘κ·Ό
herName.selfIntroduce = "섀희"
print(herName.name) // λ‚΄ 이름은 섀희야!!

// --> κ·Έλƒ₯ μ—°μ‚° ν”„λ‘œνΌν‹°(selfIntroduce)λ₯Ό 읽으면 getterκ°€ μ‹€ν–‰,
// μ–΄λ– ν•œ 값을 μž…λ ₯ν•˜λ©΄ setterκ°€ μ‹€ν–‰!

ꡬ쑰체 μ•ˆμ— name μ €μž₯ ν”„λ‘œνΌν‹°μ™€ selfIntroduce μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό κ΅¬ν˜„ν–ˆλ‹€.

 

μœ„μ—μ„œ λ§ν–ˆλ“―μ΄ μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” λ‹€λ₯Έ μ €μž₯ ν”„λ‘œνΌν‹°μ˜ 값을 가지고 연산을 μ§„ν–‰ν•˜λ―€λ‘œ

μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό κΌ­ ν•„μš”λ‘œ ν•œλ‹€. λ”°λΌμ„œ 연산에 μ‚¬μš©ν•  name μ €μž₯ ν”„λ‘œνΌν‹°λ₯Ό μž‘μ„±ν–ˆλ‹€.

 

그리고 selfIntroduce ν”„λ‘œνΌν‹°λ₯Ό 보면 var둜 μ •μ˜ν•˜κ³  String으둜 νƒ€μž…μ„ λͺ…μ‹œν–ˆλ‹€.

πŸ‘‰ μ—°μ‚° ν”„λ‘œνΌν‹°μ˜ μ€‘μš”ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜μΈλ°, 

값을 μ €μž₯ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 무쑰건 var둜 μ •μ˜λ˜μ–΄μ•Ό ν•˜λ©°

λ§ˆμ°¬κ°€μ§€λ‘œ 값을 μ €μž₯ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ νƒ€μž… 좔둠이 λΆˆκ°€ν•˜μ—¬ νƒ€μž…μ„ κΌ­ λͺ…μ‹œν•΄μ•Όν•œλ‹€.

 

μ—°μ‚° ν”„λ‘œνΌν‹° λ‚΄λΆ€λ₯Ό 보면, μ•„κΉŒ λ§ν–ˆλ˜ getter, setterκ°€ μ‘΄μž¬ν•œλ‹€.

 

1) getterλŠ” 말 κ·ΈλŒ€λ‘œ 값을 κ°€μ Έμ™€μ„œ μ—°μ‚°ν•˜μ—¬ λ¦¬ν„΄ν•˜λŠ” 역할을 ν•œλ‹€.

: returnλ¬Έ ν•„μˆ˜! ν•˜μ§€λ§Œ returnμ΄λΌλŠ” ν‚€μ›Œλ“œλŠ” μƒλž΅μ΄ κ°€λŠ₯ν•  μˆ˜λ„ μžˆλŠ”λ°,

μœ„μ—μ„œ λ§ν–ˆλ“― μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” νƒ€μž… λͺ…μ‹œλ₯Ό κΌ­ ν•΄μ€˜μ•Ό ν•œλ‹€.

λ”°λΌμ„œ getter의 λ°˜ν™˜ 값이 ν”„λ‘œνΌν‹° νƒ€μž…κ³Ό λ™μΌν•˜λ‹€λ©΄

return ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•΄λ„ κ·Έ 결괏값이 μ ‘κ·Όμžμ˜ λ°˜ν™˜κ°’μ΄ λœλ‹€.

 

2) setter λ˜ν•œ 말 κ·ΈλŒ€λ‘œ! μ–΄λ–€ 값을 μ„€μ •ν•˜λŠ” 역할을 ν•œλ‹€.

: νŒŒλΌλ―Έν„°λ‘œ 받은 값을 μ–΄λ– ν•œ μ €μž₯ ν”„λ‘œνΌν‹°μ— μ—°μ‚°ν•˜μ—¬ μ €μž₯ν•œλ‹€.

λ”°λΌμ„œ setterλŠ” νŒŒλΌλ―Έν„°κ°€ κΌ­ ν•„μš”ν•œλ°, μœ„ μ½”λ“œμ— 주석 μ²˜λ¦¬ν•œ set을 보면

newValue ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ νŒŒλΌλ―Έν„°λ₯Ό μƒλž΅ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

(μ–΄μ°¨ν”Ό ν•΄λ‹Ή νŒŒλΌλ―Έν„°μ— 값을 μž…λ ₯ν•˜μ§€ μ•Šκ³  μ„ μ–Έλ§Œ ν•˜λ©΄ get, μž…λ ₯ν•˜λ©΄ set으둜 μžλ™ λ°°μ •λ˜λ―€λ‘œ

ꡳ이 νŒŒλΌλ―Έν„° 이름을 μ„€μ •ν•˜μ§€ μ•Šκ³ λ„ κ°€λŠ₯ν•œ 것이닀.)

 

μ΄λ ‡κ²Œ ꡬ쑰체 μž‘μ„±μ„ 마치고, μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” ν›„

get, set에 μ ‘κ·Όν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•œ 것을 확인할 수 μžˆλ‹€.

각각에 μ ‘κ·Όν•˜λŠ” 방법은 λ‹¨μˆœν•˜λ‹€. 

κ·Έλƒ₯ μ—°μ‚° ν”„λ‘œνΌν‹°μΈ selfIntroduceλ₯Ό 읽기만 ν•˜λ©΄ get,

λ­”κ°€ 값을 μ“°λ©΄ set에 μ ‘κ·Όν•˜λŠ” 것이닀.πŸ’₯

 

그리고 맨 처음 μ—°μ‚° ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ μ„€λͺ…ν•˜λ©° μ–ΈκΈ‰ν–ˆλŠ”λ°,

μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” get만 μ‚¬μš©ν•˜μ—¬ 읽기 μ „μš©μœΌλ‘œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ μ½”λ“œλ‘œ μž‘μ„±ν•΄μ„œ ν™•μΈν•΄λ³΄μž.

 

πŸ“Œ 읽기 μ „μš© μ—°μ‚° ν”„λ‘œνΌν‹°

struct Person2 {
    var name: String = "섀희"
    
    var selfIntroduce: String {
        get {
            return "λ‚΄ 이름은 \(name)μ•Ό??"
        }
    }
}

var herName2: Person = Person()

print(herName2.selfIntroduce) // λ‚΄ 이름은 섀희야??

// set에 μ ‘κ·Ό -> 였λ₯˜
// herName2.selfIntroduce = "섀희"
// print(herName2.name)

// + μΆ”κ°€
// get만 μ“Έ λ•ŒλŠ” get ν‚€μ›Œλ“œ 없이 κ΅¬ν˜„λ„ κ°€λŠ₯ν•˜λ‹€.
struct Person3 {
    var name: String = "섀희"
    
    var selfIntroduce: String {
        return "λ‚΄ 이름은 \(name)μ•Ό??"
    }
}

var herName3: Person = Person()

print(herName3.selfIntroduce) // λ‚΄ 이름은 섀희야??

Person2, Person3 ꡬ쑰체에 읽기 μ „μš© ν”„λ‘œνΌν‹°λ₯Ό κ΅¬ν˜„ν–ˆλ‹€.

 

λ¨Όμ € Person2 ꡬ쑰체 μ•ˆμ˜ selfIntroduce μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό 보면

set ν•¨μˆ˜λŠ” μ—†κ³  get만 μ‘΄μž¬ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

(λ‹Ήμ—°ν•˜κ²Œλ„ μΈμŠ€ν„΄μŠ€ 생성 ν›„ get ν•¨μˆ˜μ— μ ‘κ·Όν•˜λ©΄ 정상적인 μž‘λ™μ΄ κ°€λŠ₯ν•˜κ³ ,

set ν•¨μˆ˜ μ ‘κ·Ό μ‹œ set이 μ—†μœΌλ―€λ‘œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.)

 

그리고 이 읽기 μ „μš© μ—°μ‚° ν”„λ‘œνΌν‹°μ˜ 경우 get만 μžˆμœΌλ―€λ‘œ get, set을 ꡬ뢄할 ν•„μš”κ°€ μ—†κ³ 

λ”°λΌμ„œ ꡳ이 get ν‚€μ›Œλ“œλ₯Ό ν‘œκΈ°ν•˜μ§€ μ•Šμ•„λ„ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

이 λ‚΄μš©μ€ Person3 ꡬ쑰체λ₯Ό 보면 확인할 수 μžˆλ‹€.


🌟 정리

μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” 값을 μ €μž₯ν•˜λŠ” 곡간 없이,

λ‹€λ₯Έ μ €μž₯ ν”„λ‘œνΌν‹° 값을 λ°›μ•„μ™€μ„œ μ—°μ‚° ν›„ λ°˜ν™˜ν•˜λŠ” 역할을 ν•œλ‹€.

ꡬ쑰체, 클래슀, μ—΄κ±°ν˜•μ—μ„œ λͺ¨λ‘ κ΅¬ν˜„ν•  수 μžˆλ‹€.

λ©”μ„œλ“œλ‘œ κ΅¬ν˜„ν•˜λŠ” 것에 λΉ„ν•΄ 직관적이고 νŽΈλ¦¬ν•œ 것이 μž₯점이고,

읽기 μ „μš© μ—°μ‚° ν”„λ‘œνΌν‹°λ‘œλ„ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

 

λ‹€μŒ ν¬μŠ€νŒ…μ€ νƒ€μž… ν”„λ‘œνΌν‹°!

 


μ°Έκ³ 

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

λŒ“κΈ€