Initializer (초기화)
- 초기화
- 모든 객체는 사용하기 전에 초기화
- 프로퍼티 초기화
- 초기값과 함께 선언된 프로퍼티
- 옵셔널 타입의 프로퍼티
- 초기값이 없고, 옵셔널 타입이 아닌 프로퍼티!! - 객체 사용에 앞서서
- 객체를 사용하려면 초기화 필요
- 옵셔널 / 초기값이 있는 프로퍼티 : 자동 초기화
- 옵셔널 타입이 아니고 초기값이 없는 프로퍼티 : 수동 초기화 - Initializer
- 하나의 클래스에 다수의 Initializer 작성 가능
class Rectangle {
var width : Int
var height : Int
init() { // 초기화
width = 0
height = 0
}
}
- 파타미터가 있는 Initializer
//클래스 선언
class Rectangle {
var width : Int
var height : Int
init(width : Int, height : Int) { // 파라미터
self.width = width
self.height = height
}
}
Initializer의 종류
- Designated Initializer
- 객체 초기화를 단독으로 완료 가능
- 모든 초기화가 필요한 프로퍼티 초기화
- 클래스에 반드시 1개 이상 필요
//모든 값 초기화
class MyClass {
var a : Int
var b : Int
init(a: Int, b:Int){
self.a = a
self.b = b
}
}
class MyClass {
// 초기화 코드를 먼저 작성
init(a: Int, b:Int){
self.a = a
self.b = b
// 초기화가 끝나기 전에 다른 메소드 호출은 에러
}
var a : Int
var b : Int
}
- Convenience Initializer
- 단독으로 초기화 불가능
- 초기화가 필요한 모든 프로퍼티를 초기화하지 않음
- 다른 초기화 메소드에 의존(Initializer Delegation) - Initializer Delegation
- 다른 init 메소드 호출
- 다양한 객체 생성 방법 제공 -> init 메소드 다수
- 초기화 코드의 중복 방지, 재사용 높이기
Convenience --> Convenience --> Designated
class MyClass {
var a,b : Int
init() {
a = 0
b = 0
}
init(a:Int, b:Int) {
self.a = a
self.b = b
}
convenience init(b:Int) {
self.init() //initializer delegation
self.b = b
}
}
Failable Initializer
- 초기화 실패시 nil 반환
class MyClass {
init?(birthYear : Int) { // ? 파라미터 조건 검사
if birthYear <= 1900 {
return nil //nil 반환
}
else {
self.birthYear = birthYear
}
}
}
객체 해제
- 객체의 메모리 해제
- 객체가 메모리에서 해제되면서 호출
- 이름 deinit
- 파라미터, 리턴 타입 없음
class MyClass {
deinit {
// 객체 해제 시 동작
print("deinit obj")
}
}
//객체 생성
var obj : MyClass! = MyClass ()
//객체 해제
obj = nil