- 객체 초기화 : 모든 객체는 사용하기 전에 반드시 클래스 내부에서 사용하는 값에 대한 초기화를 해야한다.
- 프로퍼티 초기화
- 자동 초기화
- 옵셔널 타입을 이용한 프로퍼티 초기화 : var optionalValue : Int?
- 초기값이 있는 프로퍼티 초기화 : var initalValue : Int = 0
- 수동 초기화
- 옵셔널 타입이 아니고 초기값이 없는 프로퍼티 : var manualInitValue : Int
- 객체 초기화 코드인 Initializer(init 메소드)를 작성하여 프로퍼티를 초기화한다.Initializer를 이용한 초기화
class Rectangle {
var width : Int
var height : Int
// init 메소드에 초기화 진행
override init() {
width = 0
height = 0
}
}
// Initializer 형태에 맞게 객체 생성
let rect = Rectangle() - Initializer : 수동 초기화에서 보았듯이 초기화가 필요한 프로퍼티를 초기화하며 init 메소드를 이용한다.
- Initializer 종류
- Designated Initializer
- 객체 초기화를 단독으로 완료 가능
- 모든 초기화가 필요한 프로퍼티 초기화
- 클래스 내에서 반드시 1개 이상 필요
- 사용 방법Designaged Initializer 사용법
// 모든 값을 초기화
class Rectangle {
var width : Int
var height : Int
// init 함수에 초기화 진행
// Designated Initializer 1
override init() {
width = 0
height = 0
}
// Designated Initializer 2
init(width : Int, height : Int) {
self.width = width
self.height = height
}
}
// Initializer 형태에 맞게 객체 생성
// Designated Initializer 1 로 객체 생성
let rect1 = Rectangle()
// Designated Initializer 2 로 객체 생성
let rect2 = Rectangle(width : 10, height : 20) - Convenience Initializer
- 단독으로 초기화 불가능
- 일부 프로퍼티만 초기화
- 다른 Initializer(Designated Initializer)를 이용해서 초기화
- 중복 코드 방지
- 사용 방법Convenience Initializer 사용법
class Rectangle {
var width : Int
var height : Int
// Designated Initializer 1
override init() {
width = 0
height = 0
}
// Designated Initializer 2
init(width : Int, height : Int) {
self.width = width
self.height = height
}
// Convenience Initializer
init(height : Int) {
self.init() // Designated Initializer 1 반드시 필요
self.height = height
}
}
// Initializer 형태에 맞게 객체 생성
// Designated Initializer 1 로 객체 생성
let rect1 = Rectangle()
// Designated Initializer 2 로 객체 생성
let rect2 = Rectangle(width : 10, height : 30)
// Convenience Initializer 로 객체 생성
var rect3 = Rectangle(height : 20) - Failable Initializer : 객체 생성 시 초기화 실패 시에 nil로 처리하는 방법이다.
- 작성 방법은 Initializer와 동일하고, 오류 상황에 대한 조건을 확인하여 nil로 반환해준다.
- 옵셔널 타입을 이용하여 Initializer 작성옵셔널 타입을 이용하여 Initializer 작성
class Rectangle {
var width : Int
var height : Int
// Designated Initializer 1
override init() {
width = 0
height = 0
}
// Designated Initializer 2
init?(width : Int, height : Int) {
// Failable Initializer 작성
guard(width > 0 && height >0 ) else {
return nil
}
self.width = width
self.height = height
}
}
// Initializer 형태에 맞게 객체 생성
// Designated Initializer 2 로 객체 생성
var rect1 = Rectangle(width : 10, height : 30)
// 정상 실행
var rect2 = Rectangle(width : -19, height : 30) // nil 반환 - 강제 언래핑을 이용하여 Initializer 작성Convenience Initializer 사용법
class Rectangle {
var width : Int
var height : Int
// Designated Initializer 1
override init() {
width = 0
height = 0
}
// Designated Initializer 2
init!(width : Int, height : Int) {
// Failable Initializer 작성
guard(width > 0 && height >0 ) else {
return nil
}
self.width = width
self.height = height
}
}
// Initializer 형태에 맞게 객체 생성
// Designated Initializer 2 로 객체 생성
var rect1 : Rectangle! = Rectangle(width : 10, height : 30)!
// 정상 실행
var rect2 : Rectangle! = Rectangle(width : -10, height : 30)! // nil이 반환되므로 런타임 에러 발생 - 객체 해제 : 객체가 메모리에서 해제되는 것을 의미한다.
- 객체 해제 시에 deinit 메소드가 호출된다.
- deinit 메소드는 파라미터, 리턴 타입이 없다.
- deinit 메소드에 객체가 해제 되면서 동작할 코드를 작성한다.
- 사용 방법deinit 메소드 사용법
class Rectangle {
var width : Int
var height : Int
// 객체 초기화
override init() {
width = 0
height = 0
}
// 객체 해제 시 호출
deinit {
// 객체 해제 시 동작할 코드 작성
}
}
// Initializer 형태에 맞게 객체 생성
/* 객체 해제 시 nil 값을 넣어야 하므로 옵셔널 타입 또는 암시적 언래핑으로 호출*/
var rect1 : Rectangle? = Rectangle() // 옵셔널 타입
var rect2 : Rectangle! = Rectangle() // 암시적 언래핑
// 객체 해제되면서 deinit 메소드를 호출
rect1 = nil
rect2 = nil
// 위와 같이 객체 해제하려면 반드시 옵셔널 타입이나 암시적 언래핑으로 호출