๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป/Swift

Swift์˜ ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ์— ๋Œ€ํ•ด

reujusong 2021. 3. 29. 17:05

์˜ˆ์ „์— ์žˆ์—ˆ๋˜ ๋ฉด์ ‘์—์„œ ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ์ž˜ ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•ด ์งˆ๋ฌธ์„ ๋ฐ›์€ ์ ์ด ์žˆ๋‹ค. ๊ทธ ๋•Œ ๋‹จ์ˆœํžˆ weak์™€ strong์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ๋งŒ ์ค„์ค„์ด ์Š์€ ๊ธฐ์–ต์ด ์žˆ๋Š”๋ฐ.. ์ •๋ฆฌ๋ฅผ ์ข€ ํ•ด์•ผ๊ฒ ๋‹ค ์‹ถ์—ˆ๋‹ค. 

 

ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์‚ฌ์ด์˜ ๊ฐ•๋ ฅ ์ˆœํ™˜ ์ฐธ์กฐ(Strong Reference Cycle)

: ๋‘ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์„œ๋กœ ๊ฐ•๋ ฅ ์ฐธ์กฐ๋ฅผ ์ฅ๊ณ  ์žˆ๋‹ค๋ฉด, ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ์„œ๋กœ ์‚ด๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.

 

 

ex)

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { println("\(name) is being deinitialized") }
}

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    var tenant: Person?
    deinit { println("Apartment #\(number) is being deinitialized") }
}

๊ฐ์ž์˜ ํด๋ž˜์Šค๋Š” ์„œ๋กœ๋ฅผ ์†์„ฑ์œผ๋กœ ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง„๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

var john: Person?
var number73: Apartment?

john = Person(name: "John")
number73 = Apartment(number: 73)

๋‘ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ  ํ• ๋‹น ๋œ ํ›„์— ๊ฐ•๋ ฅ ์ฐธ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ฆผ์ด๋‹ค.

์ด์ œ ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋„๋ก Person๋Š” apartment๋ฅผ ๊ฐ€์ง€๊ณ , apartment๋Š” tenant๋ฅผ ๊ฐ€์ง€๋„๋ก ํ•œ๋‹ค. ๋Š๋‚Œํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ต์…”๋„ ๋ณ€์ˆ˜์ธ john๊ณผ number73๋ฅผ ์–ธ๋ž˜ํ•‘ํ•˜๊ณ  ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ์— ์„ค์ •ํ•œ๋‹ค.

john!.apartment = number73
number73!.tenant = john

 

 

์ด ๋‹ค์Œ ๋‘ ๊ฐ์ฒด๋ฅผ nil๋กœ ์„ค์ •ํ•œ ํ›„ ๊ฐ•๋ ฅ ์ฐธ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์•Œ์•„๋ณด์ž.

 

john = nil
number73 = nil

 

 

Person ์ธ์Šคํ„ด์Šค์™€ Apartment ์ธ์Šคํ„ด์Šค ๊ฐ„์˜ ๊ฐ•๋ ฅ ์ฐธ์กฐ๋Š” ๋Š์–ด์ง€์ง€ ์•Š๊ณ  ๋‚จ์•„์žˆ๋Š” ๋ชจ์Šต์ด๋‹ค.

 

ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ๊ฐ„์˜ ๊ฐ•๋ ฅ ์ฐธ์กฐ ์ˆœํ™˜ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

  • ์•ฝํ•œ ์ฐธ์กฐ (Weak Reference)
    • ์•ฝํ•œ ์ฐธ์กฐ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ๋ฅผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์œ ์ง€ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ARC๋Š” ์ฐธ์กฐ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.
    • ์•ฝํ•œ ์ฐธ์กฐ๋Š” ์†์„ฑ์ด๋‚˜ ๋ณ€์ˆ˜ ์„ ์–ธ ์•ž์— weak ํ‚ค์›Œ๋“œ๋ฅผ ์•ž์— ๋†“๋Š”๋‹ค.
    • ์ฐธ์กฐ๊ฐ€ ์–ด๋Š ์ˆœ๊ฐ„ “๊ฐ’ ์—†์Œ”์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋  ๋•Œ, ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์ˆœํ™˜์„ ํ”ผํ•˜๋„๋ก ํ•œ๋‹ค. ์ฐธ์กฐ๊ฐ€ ๊ฐ’์„ ํ•ญ์ƒ ๊ฐ€์ง„๋‹ค๋ฉด, ๋ฏธ์†Œ์œ  ์ฐธ์กฐ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•œ๋‹ค. ์œ„์˜ Apartment ์˜ˆ์ œ์—์„œ apartment๊ฐ€ ํŠน์ • ์‹œ์ ์— tenant๊ฐ€ ์—†์Œ์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋ฉด, ์•ฝํ•œ ์ฐธ์กฐ๋Š” ์ฐธ์กฐ ์ˆœํ™˜์„ ๊นจ๋Š” ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

  • ๋ฏธ์†Œ์œ  ์ฐธ์กฐ (Unowned References)
    • ์•ฝํ•œ ์ฐธ์กฐ์™€ ๋น„์Šทํ•˜๊ฒŒ, ๋ฏธ์†Œ์œ  ์ฐธ์กฐ๋Š” ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์•ฝํ•œ ์ฐธ์กฐ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฏธ์†Œ์œ  ์ฐธ์กฐ๋Š” ํ•ญ์ƒ ๊ฐ’์ด ์žˆ์Œ์„ ๊ฐ€์ •ํ•œ๋‹ค. ์ด๋Š” ๋ฏธ์†Œ์œ  ์ฐธ์กฐ๋Š” ํ•ญ์ƒ ์˜ต์…”๋„์ด ์•„๋‹Œ ํƒ€์ž…์œผ๋กœ ์ •์˜๋œ๋‹ค. ์†์„ฑ์ด๋‚˜ ๋ณ€์ˆ˜ ์„ ์–ธ ์ „์— unowned ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ธ๋‹ค.
    • ๋ฏธ์†Œ์œ  ์ฐธ์กฐ๋Š” ์˜ต์…”๋„์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๋ฏธ์†Œ์œ  ์ฐธ์กฐ๋ฅผ ์–ธ๋ž˜ํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ฏธ์†Œ์œ  ์ฐธ์กฐ๋Š” ํ•ญ์ƒ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ARC๋Š” ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ๋ฅผ ํ• ๋‹น ํ•ด์ œํ•  ๋•Œ ์ฐธ์กฐ๋ฅผ nil๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Š” ์˜ต์…”๋„์ด ์•„๋‹Œ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋Š” nil๋กœ ์„ค์ •๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

references