โŒจ๏ธ Language/swift

[Swift] ์ดˆ๊ธฐํ™”

hyebin (Helia) 2024. 3. 25. 19:12
๋ฐ˜์‘ํ˜•

์ดˆ๊ธฐํ™” (Initialization)

  • ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ค€๋น„ ์ž‘์—…์„ ํ•˜๋Š” ๋‹จ๊ณ„
  • ๊ฐ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐ ๊ฐ’์„ ์„ค์ • →initializer๋ฅผ ์ •์˜ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„

 

์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •

์ธ์Šคํ„ด์Šค์˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ ํŠน์ • ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋ผ์•ผ ํ•จ (๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์„ค์ •/ํŠน์ • ๊ฐ’์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅ)

NOTE
initializer์—์„œ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ์ง์ ‘ ์„ค์ •ํ•˜๋ฉด ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ณ  ๊ฐ’ ํ• ๋‹น์ด ์ˆ˜ํ–‰

 

์ด๋‹ˆ์…œ๋ผ์ด์ €

ํŠน์ • ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (์ด๋‹ˆ์…œ๋ผ์ด์ €์˜ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ_ ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด init ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ)

init() {
// perform some initialization here
}

๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ

ํ”„๋กœํผํ‹ฐ ์„ ์–ธ๊ณผ ๋™์‹œ์— ๊ฐ’์„ ํ• ๋‹น, ์ด ๊ฐ’์„ ์ดˆ๊ธฐ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.

NOTE
ํ•ญ์ƒ ๊ฐ™์€ ์ดˆ๊ธฐ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๋ฉด ๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
ํ”„๋กœํผํ‹ฐ์— ํƒ€์ž…์„ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ดˆ๊ธฐ ๊ฐ’์„ ์ฐธ์กฐํ•ด์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์Œ
์ด ๊ธฐ๋ณธ๊ฐ’์€ ์ƒ์†์‹œ ํ•จ๊ป˜ ์ƒ์†

 

์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์ดˆ๊ธฐํ™”

์ดˆ๊ธฐํ™” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž…๋ ฅ ๊ฐ’๊ณผ ์˜ต์…”๋„ ํ”„๋กœํผํ‹ฐ ํƒ€์ž…/์ƒ์ˆ˜ ๊ฐ’์„ ํ• ๋‹น, ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ

์ดˆ๊ธฐํ™” ํŒŒ๋ผ๋ฏธํ„ฐ

์ดˆ๊ธฐํ™” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์˜ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ์ธ์ž ๋ ˆ์ด๋ธ”

๋ฉ”์†Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ดˆ๊ธฐํ™” ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชจ๋‘ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ์ธ์ž ๋ ˆ์ด๋ธ”์„ ๊ฐ–์ง€๋งŒ, ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ํŠน์ • ๋ฉ”์†Œ๋“œ์—์„œ ์ง€์ •ํ•˜๋Š” ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ์ด๋‹ˆ์…œ๋ผ์ด์ € ์‹๋ณ„์ž๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉ

๐Ÿ’ก

๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ธ์ž ๋ ˆ์ด๋ธ”์„ ๊ฐ–๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•˜์ง€ ์•Š์„ ์‹œ, Swift๊ฐ€ ์ž๋™์œผ๋กœ ํ•˜๋‚˜๋ฅผ ํ• ๋‹นํ•ด ์ œ๊ณต

 

์ธ์ž ๋ ˆ์ด๋ธ”์ด ์—†๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ € ํŒŒ๋ผ๋ฏธํ„ฐ

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ธ์ž ๋ ˆ์ด๋ธ”์„ ์ƒ๋žตํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ช…๋ฃŒํ•œ ๊ฒฝ์šฐ ' _ ๊ธฐํ˜ธ' ๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋‹ˆ์…œ๋ผ์ด์ €์—์„œ ์ธ์ž ๋ ˆ์ด๋ธ”์„ ์ƒ๋žต

 

์˜ต์…”๋„ ํ”„๋กœํผํ‹ฐ ํƒ€์ž…

ํ”„๋กœํผํ‹ฐ ์ตœ์ดˆ ๊ฐ’์ด ์—†๊ณ  ๋‚˜์ค‘์— ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์˜ต์…”๋„๋กœ ์„ ์–ธํ•ด ์‚ฌ์šฉ (์˜ต์…”๋„ ํ”„๋กœํผํ‹ฐ๋Š” ์ž๋™์œผ๋กœ nill๋กœ ์ดˆ๊ธฐํ™”)

 

์ดˆ๊ธฐํ™” ์ค‘์— ์ƒ์ˆ˜ ํ”„๋กœํผํ‹ฐ ํ• ๋‹น

์ด๋‹ˆ์…œ๋ผ์ด์ ธ์—์„œ ์ƒ์ˆ˜ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ ๊ฐ€๋Šฅ

NOTE
ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์—์„œ ์ƒ์ˆ˜ ํ”„๋กœํผํ‹ฐ๋Š” ์ดˆ๊ธฐํ™” ์ค‘ ๊ทธ ํด๋ž˜์Šค ์•ˆ์—์„œ๋งŒ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์„œ๋ธŒํด๋ž˜์Šค์—์„œ๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅ

 

ํ”„๋กœํผํ‹ฐ๋ฅผ let์œผ๋กœ ์„ ์–ธํ•ด์„œ ์ด ํ”„๋กœํผํ‹ฐ๋Š” ์ฒ˜์Œ์— ์ดˆ๊ธฐํ™” ๋˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ”„๋กœํผํ‹ฐ๋ผ๋Š” ๊ฒƒ์„ ํ‘œํ˜„

 

๊ธฐ๋ณธ ์ด๋‹ˆ์…œ๋ผ์ด์ €

๋งŒ์•ฝ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐ๊ฐ’์ด ์„ค์ •๋ผ ์žˆ๊ณ , ํ•˜๋‚˜์˜ ์ดˆ๊ธฐ์ž๋„ ์ •์˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด Swift๋Š” ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๊ธฐ๋ณธ ์ดˆ๊ธฐ์ž๋ฅผ ์ œ๊ณต

 

๊ตฌ์กฐ์ฒด ํƒ€์ž…์„ ์œ„ํ•œ ๋ฉค๋ฒ„์ชฝ ์ด๋‹ˆ์…œ๋ผ์ด์ € (ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €)

๊ธฐ๋ณธ ์ด๋‹ˆ์…œ๋ผ์ด์ €์™€ ๋‹ค๋ฅด๊ฒŒ ๋งด๋ฒ„์ชฝ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ธฐ๋ณธ ๊ฐ’์ด ์—†์–ด๋„ ์ปค์Šคํ…€ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฉค๋ฒ„์ชฝ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ œ๊ณต

 

๊ฐ’ ํƒ€์ž…์„ ์œ„ํ•œ ์ด๋‹ˆ์…œ๋ผ์ด์ € ์œ„์ž„

  • ์ด๋‹ˆ์…œ๋ผ์ด์ € ์œ„์ž„: ์ด๋‹ˆ์…œ๋ผ์ด์ €์—์„œ ๋‹ค๋ฅธ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ํ˜ธ์ถœ
  • ๊ฐ’ ํƒ€์ž…(struct, enum)๊ณผ ํด๋ž˜์Šค ํƒ€์ž…(class)๊ฐ„ ์ด๋‹ˆ์…œ๋ผ์ด์ € ์œ„์ž„ ๋™์ž‘ ๋‹ค๋ฆ„
    • ๊ฐ’ ํƒ€์ž…์€ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์•„ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ž๊ธฐ ์ž์‹ ์˜ ๋‹ค๋ฅธ ์ด๋‹ˆ์…œ๋ผ์ด์ €์—๋งŒ ์‚ฌ์šฉ
    • ํด๋ž˜์Šค ํƒ€์ž…์€ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— superclass์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ subclass์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ์ƒ์† ๋ฐ›์€ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐํ™”๋Š” ์ฑ…์ž„์€ ์ด๋‹ˆ์…œ๋ผ์ด์ €์— ์žˆ์Œ
  • ์ปค์Šคํ…€ ์ด๋‹ˆ์…œ๋ผ์ด์ € ์„ ์–ธ์‹œ ๊ธฐ๋ณธ ์ด๋‹ˆ์…œ๋ผ์ด์ € ํ˜น์€ ๋ฉค๋ฒ„์ชฝ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
    • ์œ„์˜ ์ œ์•ฝ์œผ๋กœ ์ด๋‹ˆ์…œ๋ผ์ด์ €์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๊ณ  ์ด๋‹ˆ์…œ๋ผ์ด์ €๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€

NOTE
์ปค์Šคํ…€ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ธฐ๋ณธ ์ด๋‹ˆ์…œ๋ผ์ด์ €์™€ ๋งด๋ฒ„์ชฝ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ปค์Šคํ…€ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์˜ค๋ฆฌ์ง€๋„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ์ต์Šคํ…์…˜(extension)์—์„œ ๊ตฌํ˜„

struct Rect {
    var origin = Point()
    var size = Size()

    init() {}

    init(origin: Point, size: Size) {
        self.origin = origin
        self.size = size
    }

    init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2)
        let originY = center.y - (size.height / 2)

        self.init(origin: Point(x: originX, y: originY), size: size)
    }
}

 

ํด๋ž˜์Šค ์ƒ์†๊ณผ ์ดˆ๊ธฐํ™”

๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์™€ superclass๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋Š” ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐ๊ฐ’ ํ• ๋‹น (Swift์—์„œ๋Š” ํด๋ž˜์Šค ํƒ€์ž…์—์„œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ดˆ๊ธฐ ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ง€์›)

 

์ง€์ • ์ดˆ๊ธฐ์ž์™€ ํŽธ๋ฆฌํ•œ ์ดˆ๊ธฐ์ž

  • ์ง€์ • ์ดˆ๊ธฐ์ž: ํด๋ž˜์Šค์˜ ์ฃผ ์ดˆ๊ธฐ์ž
    • ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ดˆ๊ธฐํ™”, ํด๋ž˜์Šค ํƒ€์ž…์€ ๋ฐ˜๋“œ์‹œ ํ•œ๊ฐœ ์ด์ƒ์˜ ์ง€์ • ์ดˆ๊ธฐ์ž ์กด์žฌํ•„์ˆ˜
  • ํŽธ๋ฆฌํ•œ ์ดˆ๊ธฐ์ž: ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ ๋ฏธ๋ฆฌ ์ง€์ •๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์ตœ์†Œํ•œ์˜ ์ž…๋ ฅ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ดˆ๊ธฐ์ž
    • ํŽธ๋ฆฌํ•œ ์ดˆ๊ธฐ์ž ๋‚ด์—์„œ ๋ฐ˜๋“œ์‹œ ์ง€์ • ์ดˆ๊ธฐ์ž๊ฐ€ ํ˜ธ์ถœ

์ง€์ • ์ดˆ๊ธฐ์ž์™€ ํŽธ๋ฆฌํ•œ ์ดˆ๊ธฐ์ž์˜ ๋ฌธ๋ฒ•

//์ง€์ • ์ดˆ๊ธฐ์ž ๋ฌธ๋ฒ•
init(parameters) {
	statements
}
//ํŽธ๋ฆฌํ•œ ์ดˆ๊ธฐ์ž ๋ฌธ๋ฒ•
convenience init(parameters) {
	statements
}

 

์ž๋™ ์ดˆ๊ธฐ์ž ์ธ์Šคํ„ด์Šค

์ดˆ๊ธฐํ™” ๊ณผ์ • ์ค‘์— ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ดˆ๊ธฐ์ž๋ฅผ init๋’ค์— ๋ฌผ์Œํ‘œ(?)๋ฅผ ์‚ฌ์šฉํ•ด ์‹คํŒจ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐ์ž๋ผ๊ณ  ํ‘œ์‹œ

NOTE
์ดˆ๊ธฐ์ž๋Š” ์ด๋ฆ„์ด ๋”ฐ๋กœ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐ์ž์™€ ์‹คํŒจ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐ์ž๋ฅผ ๊ฐ™์€ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…๊ณผ ์ด๋ฆ„์œผ๋กœ ๋™์‹œ์— ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ

์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐ์ž๋Š” ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์˜ต์…”๋„ ๊ฐ’์„ ์ƒ์„ฑ (์ดˆ๊ธฐํ™”์— ์‹คํŒจํ•˜๋Š” ๋ถ€๋ถ„์—์„œ nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์ดˆ๊ธฐํ™”๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Œ)

NOTE
์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์ดˆ๊ธฐ์ž init์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ. ๋น„๋ก nil์„ ๋ฐ˜ํ™˜ํ•˜๋Š” return nil ์ฝ”๋“œ์—๋Š” ์‚ฌ์šฉํ•˜์ง€๋งŒ init์ด ์„ฑ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ return ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

 

ํ•„์ˆ˜ ์ดˆ๊ธฐ์ž

  • ๋ชจ๋“  ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ดˆ๊ธฐ์ž, required ํ‚ค์›Œ๋“œ ๋ถ™์ž„
  • ํ•„์ˆ˜์ดˆ๊ธฐ์ž๋ฅผ ์ƒ์†๋ฐ›์€ ์„œ๋ธŒํด๋ž˜์Šค์—์„œ๋„ ๋ฐ˜๋“œ์‹œ required ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ๋‹ค๋ฅธ ์„œ๋ธŒํด๋ž˜์Šค์—๊ฒŒ๋„ ์ด ์ดˆ๊ธฐ์ž๋Š” ํ•„์ˆ˜ ์ดˆ๊ธฐ์ž๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์•ผ ํ•จ

 

ํด๋กœ์ €๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ

๊ธฐ๋ณธ ๊ฐ’ ์„ค์ •์ด ๋‹จ์ˆœํžˆ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์†Œ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ํ•„์š”ํ•˜๋‹ค๋ฉด ํด๋กœ์ €๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜๋Š”๋ฐ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

์ดˆ๊ธฐํ™” ํ•ด์ง€ (Deinitialization)

์ƒ์„ฑ์ž์™€ ๋ฐ˜๋Œ€๋กœ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ

deinit {
	// perform the deinitialization**
}
  • ํด๋ž˜์Šค๋‹น ์˜ค์ง ํ•˜๋‚˜๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†์Œ
  • ์†Œ๋ฉธ์ž๋Š” ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๊ณ  ์ˆ˜๋™์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Œ
  • Superclass์˜ ์†Œ๋ฉธ์ž๋Š” Subclass์—์„œ ์†Œ๋ฉธ์ž๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋จ

 

์ดˆ๊ธฐํ™”์˜ ์‚ฌ์šฉ

class Bank {
    static var coinsInBank = 10_000
    static func distribute(coins numberOfCoinsRequested: Int) -> Int {
        let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
    static func receive(coins: Int) {
        coinsInBank += coins
    }
}

class Player {
    var coinsInPurse: Int
    init(coins: Int) {
        coinsInPurse = Bank.distribute(coins: coins)
    }
    func win(coins: Int) {
        coinsInPurse += Bank.distribute(coins: coins)
    }
    deinit {
        Bank.receive(coins: coinsInPurse)
    }
}

var playerOne: Player? = Player(coins: 100)

print("A new player has joined the game with \\(playerOne!.coinsInPurse) coins")
// Prints "A new player has joined the game with 100 coins"
// ์‚ฌ์šฉ์ž๋Š” 100 ์ฝ”์ธ์„ ๊ฐ–๊ณ  ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

print("There are now \\(Bank.coinsInBank) coins left in the bank")
// Prints "There are now 9900 coins left in the bank"
// ํ˜„ ์‹œ์ ์— ์€ํ–‰์€ 9900์˜ ์ฝ”์ธ์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

playerOne!.win(coins: 2_000)

print("PlayerOne won 2000 coins & now has \\(playerOne!.coinsInPurse) coins")
// Prints "PlayerOne won 2000 coins & now has 2100 coins"
// ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์ž„์— ์ด๊ฒจ 2000์ฝ”์ธ์„ ๋ฐ›์•„ ์ฒ˜์Œ์— ๊ฐ–๊ณ  ์žˆ๋˜ 100 ์ฝ”์ธ๊ณผ ๋”๋ถˆ์–ด ํ˜„์žฌ ์ด 2100 ์ฝ”์ธ์„ ์†Œ์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

print("The bank now only has \\(Bank.coinsInBank) coins left")
// Prints "The bank now only has 7900 coins left"
// ์‚ฌ์šฉ์ž์—๊ฒŒ 2100 ์ฝ”์ธ์„ ๋‚˜๋ˆ ์ค€ ์€ํ–‰์—๋Š” ํ˜„์žฌ 7900 ์ฝ”์ธ์ด ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.

playerOne = nil

print("PlayerOne has left the game")
// Prints "PlayerOne has left the game"
// ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒŒ์ž„์—์„œ ๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค.

print("The bank now has \\(Bank.coinsInBank) coins")
// Prints "The bank now has 10000 coins"
๋ฐ˜์‘ํ˜•