인스턴스를 생성해서 메모리 공간에 할당되는 것

초기화 과정에서 가장 중요한 것은 저장 프로퍼티임 모든 저장 프로퍼티의 초기값이 지정되어 있어야함

init 메소드

init(<매개변수>:타입 , <매개변수>:타입 ....){
	초기화 로직
}

초기화 구문은 자신이 원하는 형태로 오버로딩하여 여러개 정의 할 수 있다.

한개 이상의 초기화 구문이 정의된 다면 init()(기본 초기화 구문)은 더이상 자동으로 적용되지 않음

struct Resolution{
    var width = 0
    var height = 0
    
    init(width:Int){
        self.width = width
    }
}
class VideoMode{
    var resolution = Resolution(width: 2048)
    var interlaced = false
    var frameRate = 0.0
    var name : String?
    init(name:String){
        self.name=name
    }
}
let myVideoMode = VideoMode()// 에러 발생
//
init(name:String = ""){
	self.name=name
}
//티폴트 매개변수로 해결 가능함

상속시 초기화

class Base{
	var baseValue :Double
	init(inputValue:Double){
		self.baseValue = inputValue
	}
}
class ExBase :Base{
	override init(inputValue:Double){
		super.init(inputValue:3.0)
	}
}

객체를 생성하면서 부모초기화 구문 실행 super.init

class Base{
    var baseValue:Double
    init(){
        self.baseValue = 0.0
        print("Base Init")
    }
}
class ExBase: Base{
    override init() {
        print("ExBase Init")
    }
}
ExBase()

/*
output
ExBase Init
Base Init
*/

기본 초기 화 구문은 자식부터 실행

부모 클래스의 기본 초기화구문 이외의 초기화 구문이 존재

→ 명시적으로 어떤 초기화 구문을 선택할 것인지 설정해주지 않으면 오류 발생

class Base{
    var baseValue:Double
    init(){
        self.baseValue = 0.0
        print("Base Init")
    }
    init(baseValue:Double){
        self.baseValue = baseValue
    }
}
class ExBase: Base{
    override init() {
        super.init()
    }
}