- 초기화를 진행해야, 메모리에 인스턴스가 생성된다.
- 빈 메모리에 접근하면 예상치 못한 에러가 발생될 수 있으므로, 에러에 대한 안전을 처리하는 과정이다. (스위프트는
에러에 대한 안전을 최우선
시 한다.)- 타입 내부에 프로퍼티가 있다면, 해당 프로퍼티에는 무조건 값이 있다는 것을 보장해야 한다. (저장 프로퍼티의 초기값을 설정)
- 인스턴스의 모든 저장 프로퍼티는 사용 전,
반드시
초기값을 갖고 있어야 한다.- 프로퍼티 작성 시 초기값을 지정해주거나,
Designated initializer
을 통해 초기값을 전달할 수 있다.
사용 예시
class Person {
var name: String = "Jee"
var age: Int = 29
}
- 클래스의 주요 이니셜라이저이다. (모든 클래스는 하나 이상의 지정 이니셜라이저를 갖는다.)
- 부모클래스의 이니셜라이저를 호출할 수 있다.
- 만약 부모 클래스에서 자식 클래스 이니셜라이저를 대체할 수 있다면, 자식클래스는 지정 이니셜라이저를 갖지 않아도 된다. (Ex. 상속받은 저장 프로퍼티, 옵셔널 저장 프로퍼티만 존재하는 경우)
- 메서드도 이니셜라이저가 가능하다. (인스턴스 생성 시 해당 메서드 호출)
사용 예시
// 지정 이니셜라이저
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
// 메서드 이니셜라이저
class Person {
var name: String = "Jee"
var age: Int = 29
func sayHello() {
print("안녕 나는 \(name)이야. \(age)살 이지!")
}
init() {
sayHello()
}
}
- 클래스의
Designated initializer
을 도와준다.- convenience init은 같은클래스에서 다른 이니셜라이저를 호출해야한다.
self.init
으로 자신의 지정 이니셜라이저를 호출- 사용하기 위해서는
Designated init
즉, 지정이니셜라이저가 먼저 선언이 되어있어야 한다.- 쉽게 말해, 정의되어 있는 초기화 메서드에 추가적인 내용을 덫 붙이는 것이다.
사용 예시
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
convenience init(age: Int) {
self.init(name: "Jee", age: 29)
}
}
extension
을 하거나, 시간이 흐른 뒤 생성자를 추가해야 하는 상황이 생길 때
- 프로퍼티를 옵셔널로 선언한 경우, 초기값이 없어도 된다.
- 초기값이 없는 경우에는 자동으로
nil
로 초기화
사용 예시
class Person {
var name: String?
var age: Int
init(age: Int) {
self.age = age
}
}
var test = Person(age: 29)
test.name = "Jee" // name: Optional("Jee")
참고 문서
1. https://zeddios.tistory.com/141
2. https://medium.com/@jgj455/1e3d329050c6