본문 바로가기
iOS - 실무관련/iOS

Designated Init / Convenience Init / Failable Init / Super.init / required init

by print_soo 2022. 7. 30.

Designated Init (지정 초기자)

  • 클래스 타입은 반드시 한개 이상의 Designated Init이 필요하다.
  • 클래스의 모든 프로퍼티를 초기화해야한다. 
class Person {
  var name: String
  var age: Int?
  var address: String
  
  init() {
    name = "DH"
    address = "서울특별시"
  }

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

Convenience Init (보조 초기자)

  • Convenience init 내부에서 반드시 Designated Init이 호출되어야 한다. (self.init())
class Person {
    var name: String
    var age: Int
    var gender: String
    
    init(name: String, age: Int, gender: String) {
        self.name = name
        self.age = age
        self.gender = gender
    }    
    
    convenience init(age: Int, gender: String) {        
        self.init(name: "zedd", age: age, gender: gender)    
    }
}

 


 Failable Init  (오류가능 초기자)

  • 초기화에 필요한 매개변수들을 전달받고 만족하지 못할 경우 nil로 처리할 수 있다.
  • 초기화가 실패했을 때는 nil을 반환해야하지만 초기화가 성공했을 떄도 무언가를 반환할 필요는 없다.
init?(name: String, address: String, age: Int) {
  guard age <= 100 else { return nil }
  
  self.name = name
  self.address = address
  self.age = age
}

Super.init

  • 상속을 받아서 사용하는 경우에는 Initializer를 부모의 것도 처리를 하여 주어야 한다.
    • 이유: 자신이 사용할수 있는 프로퍼티에 대해서 모두 초기화가 되지 않기 때문이다.
  • 위의 상황일 때 사용한다. 
  • Designated Initializer가 한개만 존재할 경우에는 별도로 따로 호출하여 줄 필요가 없다
class Person {
  var name: String
  var age: Int?
  var address: String
  
  init() {
    name = "DH"
    address = "서울특별시"
  }

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

class EastPerson : Person {
  var school: String
  var money: Int

  override init() {
    super.init() // Fail
    school = "서울고등학교"
    money = 0
  }

  init(school: String) {
    self.school = school
    self.money = 0
    super.init() // Okay
  }
}

 

 


required init  (필수적인 초기자)

  • 생성자의 재정의를 필수적으로 해줘야 한다는 것을 알려주기 위해서 사용한다.
  • 서브클래스에서 super.init이 아닌, 직접 구현해야 하는 초기화 메소드이다.
  • 해당 부분은 아직 이해가 부족해 좀 더 찾아본 다음 글을 작성하려고 한다.