์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ Swift ] init๊ณผ required init?์— ๋Œ€ํ•ด์„œ

๐ŸŽ iOS/Swift

by AHN.Jihyeon 2024. 7. 21. 08:06

๋ณธ๋ฌธ

์ง€๋‚œ ๊ธ€๊ณผ ์ด์–ด์ง€๋Š” ๋งฅ๋ฝ์ด๋‹ค. 

์ดˆ๊ธฐํ™” ์ž‘์—…์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” init๊ณผ required init?์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž. 

 

๐Ÿ”— https://dkswlgus0314.tistory.com/236

 


๐ŸŒŸ 1. init๊ณผ required init? ์— ๋Œ€ํ•ด์„œ

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

  • ๊ธฐ๋Šฅ: ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋กœ, ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์‚ฌ์šฉ ์˜ˆ: ์ฃผ๋กœ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ํ•„์š”ํ•œ ์†์„ฑ๋“ค์„ ์™ธ๋ถ€์—์„œ ๋ฐ›์•„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
init(coreDataRepository: CoreDataRepository, mode: PhoneBookMode) {
    self.coreDataRepository = coreDataRepository
    self.mode = mode
    super.init(nibName: nil, bundle: nil)
}

์—ฌ๊ธฐ์„œ coreDataRepository์™€ mode๋Š” ์™ธ๋ถ€์—์„œ ์ œ๊ณต๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

๋˜ํ•œ, UIViewController์˜ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ super.init(nibName:bundle:)์„ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™”๋„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

โœ… ์™ธ๋ถ€์—์„œ ๊ฐ’์ด ์ œ๊ณต๋˜๋Š” ๋ฐฉ์‹

ํด๋ž˜์Šค์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €์—์„œ ์™ธ๋ถ€ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ฃผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, PhoneBookViewController์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ coreDataRepository์™€ mode ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

let coreDataRepo = CoreDataRepository()
let phoneBookMode = PhoneBookMode()
let phoneBookVC = PhoneBookViewController(coreDataRepository: coreDataRepo, mode: phoneBookMode)

 

์—ฌ๊ธฐ์„œ coreDataRepo์™€ phoneBookMode๊ฐ€ PhoneBookViewController์˜ ์ด๋‹ˆ์…œ๋ผ์ด์ €์— ์ „๋‹ฌ๋˜๋ฉฐ,

self.coreDataRepository์™€ self.mode ์†์„ฑ์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

์ด๋Š” ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์˜ ์ผํ™˜์œผ๋กœ, ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

โœ… nibName: ์™€ bundle:์˜ ์˜๋ฏธ

nibName:bundle:์€ UIViewController์˜ ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ, NIB ํŒŒ์ผ ๋˜๋Š” XIB ํŒŒ์ผ์„ ํ†ตํ•ด

๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ UI๋ฅผ ๋กœ๋“œํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

 

  • nibName:
    NIB ํŒŒ์ผ(XIB ํŒŒ์ผ)์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.
    NIB ํŒŒ์ผ์€ Interface Builder์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ๋กœ, ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์˜ UI๋ฅผ ์ •์˜ํ•œ๋‹ค.
  • bundle:
    NIB ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋ฒˆ๋“ค(Bundle)์„ ์ง€์ •ํ•œ๋‹ค. nil๋กœ ์„ค์ •ํ•˜๋ฉด ๊ธฐ๋ณธ ๋ฒˆ๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ด ๋ฉ”์„œ๋“œ๋Š” ์ฃผ๋กœ ์ฝ”๋“œ๋กœ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ NIB ํŒŒ์ผ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

let myViewController = MyViewController(nibName: "MyCustomView", bundle: nil)

 

 

 

๐ŸŒŸ ํ•„์ˆ˜ ์ด๋‹ˆ์…œ๋ผ์ด์ € required init?

  • ๊ธฐ๋Šฅ: ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ์—์„œ ์š”๊ตฌํ•˜๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์‚ฌ์šฉ ์˜ˆ: ์ฃผ๋กœ NSCoding ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. NSCoding ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋ ค๋ฉด init?(coder:) ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

 

์ด ์ฝ”๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ํ”„๋กœ๊ทธ๋žจ์ ์œผ๋กœ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๋งŒ์•ฝ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค.

 

 

 

 

โœ… NSCoding ํ”„๋กœํ† ์ฝœ

NSCoding ํ”„๋กœํ† ์ฝœ์€ ๊ฐ์ฒด๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ๋””์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค.

์ฃผ๋กœ ๊ฐ์ฒด๋ฅผ ์•„์นด์ด๋ธŒ(archive)ํ•˜๊ฑฐ๋‚˜ ์ €์žฅ(storage)ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

NSCoding ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

 

  • func encode(with coder: NSCoder): ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฉ”์„œ๋“œ.
  • init?(coder: NSCoder): ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋Š” ์ด๋‹ˆ์…œ๋ผ์ด์ €.

์ด ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ๊ฐ์ฒด๋ฅผ ํŒŒ์ผ์ด๋‚˜ UserDefaults ๋“ฑ์— ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

class MyObject: NSObject, NSCoding {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    required init?(coder: NSCoder) {
        guard let name = coder.decodeObject(forKey: "name") as? String else { return nil }
        let age = coder.decodeInteger(forKey: "age")
        self.name = name
        self.age = age
    }

    func encode(with coder: NSCoder) {
        coder.encode(name, forKey: "name")
        coder.encode(age, forKey: "age")
    }
}

์ด ์ฝ”๋“œ๋Š” MyObject ํด๋ž˜์Šค๊ฐ€ NSCoding ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ธ์ฝ”๋”ฉ ๋ฐ ๋””์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ