-
[Swift] 클래스의 init 파헤치기개발/Swift 2021. 10. 18. 17:14
구조체에서 init
struct에서 init 메소드를 구현하지않아도 그안의 프로퍼티에따라 init 함수를 사용할수있다.
"memberwise initializer" 를 제공하기 떄문이다.
struct Car { let brand: String let price : Int } let car = Car(brand:"KIA", price:3000)
클래스의 init 에서는 designated init / convenience init 이렇게 구분된다.
쉽게 designated는 클래스의 찐 init 이고
convenience 는 몇개의 프로퍼티를 init과 다르게 하고싶을때
designated init을 부르고 바꾸는 식이다.
class Car : Vehicle { var brand: String var price : Int override init() { self.brand = "KIA" self.price = 3000 super.init() //designated init } convenience init(price:Int) { //convenience init self.init() self.price = 2000 } }
이때 convenience init 은 동일 클래스의 designated init 을 호출 해야하며
designated init 은 상위클래스의 designated init 을 호출 해야한다.
class Vehicle { var speed : String init() { self.speed = "fast" } } class Car : Vehicle { var brand: String var price : Int override init() { self.brand = "KIA" self.price = 3000 super.init() //designated init } convenience init(price:Int) { //convenience init self.init() self.price = 2000 } }
위의 예제에서 convenience init 을 통해 init 한다고 해보자
이떄 convenience init 함수 안에서 self.price값을 지정하기전에 self.init()을 먼저 한 이유는
convenience init 에서는 값을 넣어 초기화 하느것이 아니라 변경하는것이기 떄문이다.
변경하기전에는 해당 클래스의 init 이 끝나고 상위클래스의 init 까지 끝이 나야한다.
상위 클래스의 init 이 끝난 시점을 Phase1 이라하고 self.price가 변경되는 부분을 Phase2라 한다.
Phase2 부터 self에 접근하여 값 변경을 할수있다
designated init 안에서는 값을 넣어 해당 클래스를 초기화하였다.
그리고 이는 super.init() 함수 전에 실행했다.
상위클래스를 초기화 하기전에 자식클래스 먼저 초기화 해야한다.
자식클래스의 메모리의 크기를 부모클래스에 가기전에 알아야하기 떄문이다.
규칙을 나열하자면
designated init 에서 프로퍼티 값이 super.init() 전에 지정되어야 한다.
designated init 에서 부모클래스 프로퍼티에 접근하려면 super.init() 다음에 해야한다.
convenience init 에서 프로퍼티 값을 넣기전에 self.init()을 호출해야한다.
'개발 > Swift' 카테고리의 다른 글
GCD - DispatchQueue Main/Global 큐 스레드에 관해 (0) 2021.11.23 언제 class 대신 struct 를 사용할까? (0) 2021.11.14 [Swift 기본]ARC 와 Weak vs Strong (3) 2021.10.04 Localize + UserDefaults 사용하여 언어 설정 기능 구현 하기 (0) 2021.09.16 재사용 가능한 tableview cell nib만들기 (0) 2021.09.02