๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿฅ– Bread Basics/Swift

Swift ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ - ์ดˆ๊ธฐํ™” (Initialization)

by BreadDev 2025. 4. 11.
728x90

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ Swift '์ดˆ๊ธฐํ™”(Initialization)'์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋Š” ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์ค€๋น„ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ, Swift์˜ ํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ดˆ๊ธฐํ™”๋ž€? (Initialization)

์ดˆ๊ธฐํ™”๋Š” ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์ค€๋น„ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ๋Š”:

  • ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
  • ๊ธฐํƒ€ ์„ค์ • ๋ฐ ์ค€๋น„ ์ž‘์—… ์ˆ˜ํ–‰

Swift์—์„œ๋Š” init ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ(initializer)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

struct Fahrenheit {
    var temperature: Double
    
    init() {
        temperature = 32.0  // ๋ฌผ์ด ์–ผ์–ด๋ฒ„๋ฆฌ๋Š” ํ™”์”จ ์˜จ๋„
    }
}

var f = Fahrenheit()
print("๊ธฐ๋ณธ ์˜จ๋„๋Š” \(f.temperature)° ํ™”์”จ์ž…๋‹ˆ๋‹ค")
// ์ถœ๋ ฅ: "๊ธฐ๋ณธ ์˜จ๋„๋Š” 32.0° ํ™”์”จ์ž…๋‹ˆ๋‹ค"

 

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ(Initializer): ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋˜๋Š” ํŠน์ˆ˜ ๋ฉ”์„œ๋“œ๋กœ, ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ ์ ˆํžˆ ์ดˆ๊ธฐํ™”๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • ๋ฐฉ๋ฒ•

Swift์—์„œ๋Š” ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:

1. ๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์„ค์ •

ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ง์ ‘ ์ดˆ๊ธฐ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค:

struct Fahrenheit {
    var temperature = 32.0  // ์„ ์–ธ๊ณผ ๋™์‹œ์— ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •
}

๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ ๊ฐ’(Default Property Value): ํ”„๋กœํผํ‹ฐ ์„ ์–ธ ์‹œ ์ง์ ‘ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ดˆ๊ธฐํ™” ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

2. ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ๋‚ด์—์„œ ์„ค์ •

struct Celsius {
    var temperatureInCelsius: Double
    
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
}

์ฃผ์˜: ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์—์„œ ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ์„ค์ •ํ•  ๋•Œ๋Š” ํ”„๋กœํผํ‹ฐ ๊ด€์ฐฐ์ž๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•

Swift๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ดˆ๊ธฐํ™” ๊ณผ์ •์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™” ํŒŒ๋ผ๋ฏธํ„ฐ (Initialization Parameters)

struct Celsius {
    var temperatureInCelsius: Double
    
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
    
    init(_ celsius: Double) {  // ์ธ์ˆ˜ ๋ ˆ์ด๋ธ” ์—†๋Š” ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ
        temperatureInCelsius = celsius
    }
}

let bodyTemp = Celsius(37.0)  // ์ธ์ˆ˜ ๋ ˆ์ด๋ธ” ์—†์ด ํ˜ธ์ถœ
let boilingPoint = Celsius(fromFahrenheit: 212.0)  // ์ธ์ˆ˜ ๋ ˆ์ด๋ธ”๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ

ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ์ธ์ˆ˜ ๋ ˆ์ด๋ธ”: ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ๋„ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉํ•  ์ธ์ˆ˜ ๋ ˆ์ด๋ธ”์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ธ๋”์Šค์ฝ”์–ด(_): ์ธ์ˆ˜ ๋ ˆ์ด๋ธ”์„ ์ƒ๋žตํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ํ”„๋กœํผํ‹ฐ๋Š” ์˜ต์…”๋„ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

class SurveyQuestion {
    let text: String
    var response: String?  // ์˜ต์…”๋„ ๋ฌธ์ž์—ด - ์ดˆ๊ธฐ๊ฐ’์€ ์ž๋™์œผ๋กœ nil
    
    init(text: String) {
        self.text = text
    }
    
    func ask() {
        print(text)
    }
}

let question = SurveyQuestion(text: "์น˜์ฆˆ๋ฅผ ์ข‹์•„ํ•˜๋‚˜์š”?")
question.ask()  // "์น˜์ฆˆ๋ฅผ ์ข‹์•„ํ•˜๋‚˜์š”?" ์ถœ๋ ฅ
question.response = "๋„ค, ์น˜์ฆˆ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค."

์˜ต์…”๋„ ํ”„๋กœํผํ‹ฐ(Optional Property): ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋กœํผํ‹ฐ๋กœ, ์ดˆ๊ธฐํ™” ์‹œ ์ž๋™์œผ๋กœ nil๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

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

class SurveyQuestion {
    let text: String  // ์ƒ์ˆ˜ ํ”„๋กœํผํ‹ฐ
    var response: String?
    
    init(text: String) {
        self.text = text  // ์ดˆ๊ธฐํ™” ์ค‘์— ์ƒ์ˆ˜ ๊ฐ’ ์„ค์ •
    }
}

์ƒ์ˆ˜ ํ”„๋กœํผํ‹ฐ(Constant Property): let์œผ๋กœ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ๋กœ, ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ๋Š” ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ์ดํ›„์—๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ๊ณผ ๋ฉค๋ฒ„๋ณ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ

Swift๋Š” ํŠน์ • ์กฐ๊ฑด์—์„œ ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ (Default Initializers)

๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์—†๋Š” ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด๋Š” ์ž๋™์œผ๋กœ ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:

class ShoppingListItem {
    var name: String?
    var quantity = 1
    var purchased = false
}

var item = ShoppingListItem()  // ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์‚ฌ์šฉ

๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ(Default Initializer): ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์—†๋Š” ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„๋ณ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ (Memberwise Initializers)

์‚ฌ์šฉ์ž ์ •์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ด ์—†๋Š” ๊ตฌ์กฐ์ฒด๋Š” ์ž๋™์œผ๋กœ ๋ฉค๋ฒ„๋ณ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:

struct Size {
    var width = 0.0, height = 0.0
}

let twoByTwo = Size(width: 2.0, height: 2.0)  // ๋ฉค๋ฒ„๋ณ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ
let zeroByTwo = Size(height: 2.0)  // width๋Š” ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ
let zeroByZero = Size()  // ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ

๋ฉค๋ฒ„๋ณ„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ(Memberwise Initializer): ๊ตฌ์กฐ์ฒด์˜ ๊ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์œ„์ž„ (Initializer Delegation)

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ํ˜ธ์ถœํ•˜์—ฌ ์ผ๋ถ€ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ’ ํƒ€์ž…์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์œ„์ž„

๊ฐ’ ํƒ€์ž…(๊ตฌ์กฐ์ฒด์™€ ์—ด๊ฑฐํ˜•)์—์„œ๋Š” self.init์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์— ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค:

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)  // ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์— ์œ„์ž„
    }
}

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์œ„์ž„(Initializer Delegation): ํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์—์„œ ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ํ˜ธ์ถœํ•˜์—ฌ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ค„์ด๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์œ„์ž„ ๊ทœ์น™

ํด๋ž˜์Šค๋Š” ์ƒ์†์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ณต์žกํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์œ„์ž„ ๊ทœ์น™์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

  1. ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ(Designated Initializers):
    • ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ดˆ๊ธฐํ™”
    • ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ ์ ˆํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ํ˜ธ์ถœ
    • ์ฃผ ์ดˆ๊ธฐํ™” ๊ฒฝ๋กœ๋กœ ์ž‘๋™
  2. ํŽธ์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ(Convenience Initializers):
    • ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ํ˜ธ์ถœ
    • ์ผ๋ฐ˜์ ์ธ ์ดˆ๊ธฐํ™” ํŒจํ„ด์— ๋Œ€ํ•œ shortcut ์ œ๊ณต
 
class Vehicle {
    var numberOfWheels = 0
    var description: String {
        return "\(numberOfWheels) wheel(s)"
    }
}

class Bicycle: Vehicle {
    override init() {
        super.init()  // ์ƒ์œ„ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ํ˜ธ์ถœ
        numberOfWheels = 2
    }
}

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์œ„์ž„ ๊ทœ์น™:

  1. ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ๋ฐ˜๋“œ์‹œ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•จ
  2. ํŽธ์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•จ
  3. ํŽธ์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ๊ถ๊ทน์ ์œผ๋กœ ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•จ

๊ฐ„๋‹จํžˆ ๊ธฐ์–ตํ•˜๋Š” ๋ฐฉ๋ฒ•:

  • ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ํ•ญ์ƒ ์œ„๋กœ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.
  • ํŽธ์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ํ•ญ์ƒ ์˜†์œผ๋กœ ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ํด๋ž˜์Šค ์ƒ์†๊ณผ ์ดˆ๊ธฐํ™” (2๋‹จ๊ณ„ ์ดˆ๊ธฐํ™”)

Swift์˜ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”๋Š” ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด 2๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค:

1๋‹จ๊ณ„

  • ํด๋ž˜์Šค์— ๋„์ž…๋œ ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ์— ์ดˆ๊ธฐ๊ฐ’ ์ง€์ •
  • ์ƒ์œ„ ํด๋ž˜์Šค ์ฒด์ธ์„ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๊ฐ ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐํ™”
  • ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ง€๋ฉด 1๋‹จ๊ณ„ ์™„๋ฃŒ

2๋‹จ๊ณ„

  • ์ตœ์ƒ์œ„์—์„œ ์ตœํ•˜์œ„๋กœ ๋‚ด๋ ค์˜ค๋ฉด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
  • self๋ฅผ ์ฐธ์กฐํ•˜๊ณ , ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ, ํ”„๋กœํผํ‹ฐ ์ˆ˜์ • ๋“ฑ์ด ๊ฐ€๋Šฅ
 
class Food {
    var name: String
    
    init(name: String) {
        self.name = name  // 1๋‹จ๊ณ„: ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐํ™”
    }
}

class RecipeIngredient: Food {
    var quantity: Int
    
    init(name: String, quantity: Int) {
        self.quantity = quantity  // 1๋‹จ๊ณ„: ์ž์‹ ์˜ ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐํ™”
        super.init(name: name)    // 1๋‹จ๊ณ„: ์ƒ์œ„ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ํ˜ธ์ถœ
    }
    
    override convenience init(name: String) {
        self.init(name: name, quantity: 1)  // ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์— ์œ„์ž„
    }
}

2๋‹จ๊ณ„ ์ดˆ๊ธฐํ™”(Two-Phase Initialization): Swift์˜ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋กœ, ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋œ ํ›„์—๋งŒ self๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ƒ์†๊ณผ ์žฌ์ •์˜

์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์žฌ์ •์˜

ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

class Vehicle {
    var numberOfWheels = 0
    
    init() {
        // ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™”
    }
}

class Bicycle: Vehicle {
    override init() {
        super.init()  // ๋ฐ˜๋“œ์‹œ ์ƒ์œ„ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ํ˜ธ์ถœ
        numberOfWheels = 2
    }
}

override: ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์žฌ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

์ž๋™ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ƒ์†

ํŠน์ • ์กฐ๊ฑด์—์„œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ž๋™์œผ๋กœ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด, ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ƒ์†
  2. ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๊ตฌํ˜„ํ•˜๋ฉด, ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํŽธ์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ๋„ ์ž๋™ ์ƒ์†
 
class ShoppingListItem: RecipeIngredient {
    var purchased = false  // ๋ชจ๋“  ์ƒˆ ํ”„๋กœํผํ‹ฐ์— ๊ธฐ๋ณธ๊ฐ’ ์ œ๊ณต
    
    // ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ž๋™ ์ƒ์†
}

๐Ÿ“Œ ์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ (Failable Initializers)

์ดˆ๊ธฐํ™”๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Swift๋Š” ์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

struct Animal {
    let species: String
    
    init?(species: String) {  // ์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ
        if species.isEmpty { return nil }
        self.species = species
    }
}

let someCreature = Animal(species: "๊ธฐ๋ฆฐ")  // Optional<Animal> ํƒ€์ž…
if let giraffe = someCreature {
    print("๋™๋ฌผ์ด \(giraffe.species) ์ข…์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
}

let emptyAnimal = Animal(species: "")  // nil ๋ฐ˜ํ™˜

์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ(Failable Initializer): init? ํ˜•ํƒœ๋กœ ์„ ์–ธ๋˜๋ฉฐ, ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ดˆ๊ธฐํ™”๋ฅผ ์‹คํŒจ์‹œํ‚ค๊ณ  nil์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ด๊ฑฐํ˜•์˜ ์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ

enum TemperatureUnit: Character {
    case kelvin = "K", celsius = "C", fahrenheit = "F"
    
    // ์›์‹œ๊ฐ’์„ ๊ฐ€์ง„ ์—ด๊ฑฐํ˜•์€ ์ž๋™์œผ๋กœ init?(rawValue:)๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค
}

if let fahrenheitUnit = TemperatureUnit(rawValue: "F") {
    print("ํ™”์”จ ๋‹จ์œ„๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค")
}

์ดˆ๊ธฐํ™” ์‹คํŒจ ์ „ํŒŒ

class Product {
    let name: String
    
    init?(name: String) {
        if name.isEmpty { return nil }
        self.name = name
    }
}

class CartItem: Product {
    let quantity: Int
    
    init?(name: String, quantity: Int) {
        if quantity < 1 { return nil }  // ์ž์ฒด ๊ฒ€์ฆ ์‹คํŒจ
        self.quantity = quantity
        super.init(name: name)  // ์ƒ์œ„ ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”๋„ ์‹คํŒจ ๊ฐ€๋Šฅ
    }
}

๐Ÿ“Œ ํ•„์ˆ˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ (Required Initializers)

๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

class SomeClass {
    required init() {
        // ์ดˆ๊ธฐํ™” ๊ตฌํ˜„
    }
}

class SomeSubclass: SomeClass {
    required init() {  // ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
        // ํ•˜์œ„ ํด๋ž˜์Šค ๊ตฌํ˜„
    }
}

required: ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•œ ๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์„ค์ •

๋ณต์žกํ•œ ์ดˆ๊ธฐํ™” ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

struct Chessboard {
    let boardColors: [Bool] = {
        var board = [Bool]()
        var isBlack = false
        
        for i in 1...8 {
            for j in 1...8 {
                board.append(isBlack)
                isBlack = !isBlack
            }
            isBlack = !isBlack
        }
        
        return board
    }()  // ํด๋กœ์ €๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰
    
    func squareIsBlackAt(row: Int, column: Int) -> Bool {
        return boardColors[(row * 8) + column]
    }
}

let board = Chessboard()
print(board.squareIsBlackAt(row: 0, column: 1))  // true

ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•œ ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐํ™”: ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ํ”„๋กœํผํ‹ฐ์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํด๋กœ์ € ๋’ค์˜ ()๋Š” ํด๋กœ์ €๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ •๋ฆฌ

Swift์˜ ์ดˆ๊ธฐํ™” ์‹œ์Šคํ…œ์€ ์•ˆ์ „ํ•˜๊ณ  ์œ ์—ฐํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ํŠน์ง•์„ ์š”์•ฝํ•˜๋ฉด:

  1. ๋ชจ๋“  ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•จ
  2. ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ํด๋ž˜์Šค/๊ตฌ์กฐ์ฒด์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ
  3. ํด๋ž˜์Šค๋Š” ์ง€์ • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ๊ณผ ํŽธ์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ดˆ๊ธฐํ™” ๊ณ„์ธต์„ ํ˜•์„ฑ
  4. 2๋‹จ๊ณ„ ์ดˆ๊ธฐํ™” ํ”„๋กœ์„ธ์Šค๋Š” ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”์˜ ์•ˆ์ „์„ฑ ๋ณด์žฅ
  5. ์‹คํŒจ ๊ฐ€๋Šฅํ•œ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ์ดˆ๊ธฐํ™” ์‹คํŒจ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›
  6. ํด๋กœ์ €๋Š” ๋ณต์žกํ•œ ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐํ™”์— ํ™œ์šฉ ๊ฐ€๋Šฅ

Swift์˜ ์ดˆ๊ธฐํ™” ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๊ฐ์ฒด ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.