λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“Œ Language/Swift

[Swift] ν΄λ‘œμ ΈλŠ” μ™œ μ°Έμ‘°νƒ€μž…μΌκΉŒ?(Why closure is reference type?)

by Fomagran πŸ’» 2021. 5. 27.
728x90
λ°˜μ‘ν˜•

 

μ•ˆλ…•ν•˜μ„Έμš” FomaπŸ‘Ÿ μž…λ‹ˆλ‹€!

μ˜€λŠ˜μ€ ν΄λ‘œμ Έκ°€ μ™œ μ°Έμ‘°νƒ€μž…μΈμ§€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ €κ³  ν•©λ‹ˆλ‹€!

 

λ°”λ‘œ μ‹œμž‘ν• κ²Œμš”~


ν΄λ‘œμ Έλž€?

 

ν΄λ‘œμ ΈλŠ” 이름이 μ •ν•΄μ Έμžˆμ§€ μ•Šμ€ ν•¨μˆ˜ 즉, 읡λͺ…ν•¨μˆ˜μž…λ‹ˆλ‹€!

(μ—„λ°€νžˆ λ§ν•˜λ©΄ λͺ¨λ“  ν•¨μˆ˜λ₯Ό λœ»ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.)

 

일급 객체둜써 역할을 ν•˜λ―€λ‘œ 인자둜 보낼 μˆ˜λ„ 있고 λ°˜ν™˜κ°’μ„ μ „λ‹¬ν•˜κ±°λ‚˜ μ €μž₯ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

보톡 ν•¨μˆ˜λŠ” μ•„λž˜μ™€ 같이 μž‘μ„±λ˜μ–΄ 있죠?

func hello() -> String {
    return "hello"
}

ν΄λ‘œμ ΈλŠ” μ•„λž˜μ™€ 같이 ν•¨μˆ˜λͺ…이 없이 ν•¨μˆ˜μ™€ 같은 역할을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let hello:(()->String) = { return "hello"}

 

ν΄λ‘œμ Έμ— λŒ€ν•œ 글이 μ•„λ‹ˆλ―€λ‘œ κ°„λ‹¨ν•˜κ²Œλ§Œ μ„€λͺ…ν•˜κ³  λ„˜μ–΄κ°ˆκ²Œμš”~


μ°Έμ‘° νƒ€μž…μ΄λž€?

 

μ°Έμ‘° νƒ€μž…μ€ 객체의 μ£Όμ†Œλ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•΄μ„œ μ‚¬μš©ν•  λ•Œ κ·Έ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜λŠ” νƒ€μž…μž…λ‹ˆλ‹€.

 

고둜 λ©”λͺ¨λ¦¬ μ˜μ—­μ—μ„œ 동적 ν• λ‹Ή λ©”λͺ¨λ¦¬ μ˜μ—­μΈ "νž™" μ˜μ—­μ— μ €μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

고둜 ν•΄λ‹Ή μ£Όμ†Œμ˜ 값이 μ‚¬λΌμ§€λŠ” μ‹œμ μ— λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό 잘 ν•΄μ€˜μ•Ό λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


근데 μ™œ ν΄λ‘œμ ΈλŠ” μ°Έμ‘° νƒ€μž…μ΄μ•Ό? 🀨

 

μœ„μ—μ„œ λ“  μ˜ˆμ‹œλ‘œ μ•„λž˜μ™€ 같은 ν•¨μˆ˜λŠ” String으둜 된 "hello"λΌλŠ” 값을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

 

let hello:(()->String) = { return "hello"}

 

 

μœ„ 클둜져처럼 μ›μ‹œ νƒ€μž…μ„ 가지고 μžˆλŠ”λ° μ™œ μ°Έμ‘° νƒ€μž…μΌκΉŒ? λΌλŠ” 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

 

μ—΄μ‹¬νžˆ μ°Ύμ•„λ³Έ κ²°κ³Ό 이에 λŒ€ν•œ 해닡은 "ν΄λ‘œμ ΈλŠ” 값을 μΊ‘μ³ν•œλ‹€" μž…λ‹ˆλ‹€.

 

이게 무슨 μ˜λ―ΈμΈμ§€ 천천히 μ„€λͺ…ν•΄λ“œλ¦΄κ²Œμš”!

λ‹€μŒκ³Ό 같이 ν΄λ‘œμ Έμ— νŒŒλΌλ―Έν„°κ°€ μžˆλŠ” 경우 ν•΄λ‹Ή νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λœ 값을 μ‚¬μš©ν•  수 μžˆμ–΄μ•Όκ² μ£ ?

let hello:((_ name:String)->String) = { name in return "\(name) hello"}
hello("foma") //foma hello

 

이 λ•Œ ν΄λ‘œμ ΈλŠ” 값을 "캑쳐" ν•΄μ„œ μ €μž₯ν•΄λ†“κ²Œ λ©λ‹ˆλ‹€.

 

λ§Œμ•½ μ•„λž˜μ™€ 같이 객체가 νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” κ²½μš°λŠ” μ–΄λ–»κ²Œ ν• κΉŒμš”?

class Person {
    var name:String
    
    init(name:String) {
        self.name = name
    }
}

let person = Person(name: "foma")

let hello:((_ person:Person)->String) = { person in return "\(person.name) hello"}

hello(person) //foma hello

ν΄λ‘œμ ΈλŠ” 값을 "캑쳐"ν•  λ•Œ νŒŒλΌλ―Έν„°λ‘œ λ“€μ–΄μ˜¨ νƒ€μž…μ— λ”°λΌμ„œ 값을 "캑쳐"ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

즉, μ°Έμ‘°νƒ€μž…μ΄ λ“€μ–΄μ˜€λ©΄ ν΄λ‘œμ Έλ„ μ°Έμ‘°νƒ€μž…μœΌλ‘œ 값을 "캑쳐" ν•΄λ†“λŠ”λ‹€λŠ” 의미이죠!


νƒˆμΆœ 클둜져

 

μ΄λŸ¬ν•œ μ›λ¦¬λ‘œ νƒˆμΆœ ν΄λ‘œμ ΈλŠ” μ°Έμ‘° νƒ€μž…μ˜ 값을 캑쳐해놓고 μžˆλ‹€κ°€ ν•¨μˆ˜κ°€ λλ‚œ 뒀에도 값을 전달할 수 μžˆλŠ” 것이죠!

 

μ•„λž˜λŠ” escaping ν•¨μˆ˜κ°€ 2초 뒀에 μ‹€ν–‰λ˜λ„λ‘ 해놓고 κ·Έ 뒀에 person의 이름을 gran으둜 λ°”κΏ”λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ ν•˜λ©΄ μ°Έμ‘°ν•œ 값이 λ°”λ€Œμ—ˆμœΌλ―€λ‘œ 2초 뒀에 좜λ ₯λ˜λŠ” 값도 바뀐 값인 "gran hello" κ°€ 좜λ ₯되게 λ©λ‹ˆλ‹€.

class Person {
    var name:String
    
    init(name:String) {
        self.name = name
    }
}

let person = Person(name: "foma")

let hello:((_ person:Person)->String) = { person in return "\(person.name) hello"}

func escaping(completion:@escaping(Person)->String) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
       print("From Escaping Closure",completion(person))
    }
}

escaping(completion: hello) //gran hello
person.name = "gran"

Weak Self

 

ν‰μ†Œμ— 클둜져의 λ°”λ”” λΆ€λΆ„ μ•žμ— [weak self] κ°€ μžˆλŠ” 것을 많이 λ³΄μ…¨μ„κ±°μ—μš”!

 

이것 λ˜ν•œ 같은 μ›λ¦¬λ‘œ λ·°μ»¨νŠΈλ‘€λŸ¬μ™€ 클둜져 λͺ¨λ‘ μ°Έμ‘° νƒ€μž…μ΄λ―€λ‘œ μ„œλ‘œ κ°•ν•˜κ²Œ μ—°κ²°λ˜λŠ” λ¦¬ν…ŒμΈ 사이클을 

 

방지해 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ§‰μ•„μ£ΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

class ViewController: UIViewController {
  
    @IBOutlet weak var nameLabel:UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        escaping {[weak self] person in
            self?.nameLabel.text = person.name
        }
        
    }
    
    func escaping(completion:@escaping(Person)->Void) {
        let person = Person(name: "foma")
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            print("From Escaping Closure",completion(person))
        }
    }
    
}

μ˜€λŠ˜μ€ μ΄λ ‡κ²Œ ν΄λ‘œμ Έκ°€ μ°Έμ‘°νƒ€μž…μΈ μ΄μœ μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

ν˜Ήμ‹œλΌλ„ κΆκΈˆν•˜μ‹  점이 μžˆκ±°λ‚˜ ν‹€λ¦° 뢀뢄이 μžˆλ‹€λ©΄ μ–Έμ œλ“  λŒ“κΈ€λ‘œ μ•Œλ €μ£Όμ„Έμš”!

728x90
λ°˜μ‘ν˜•

λŒ“κΈ€