초기화란 새로운 인스턴스를 사용할 준비를 하기 위해
저장 프로퍼티의 초깃값을 설정하는 등의 일을 말한다.
초기화(Initializer)는
init 키워드를 사용하여 정의하며
하단 예제 코드와 같은 모양을 가지고 있다.
init
class SomeClass {
init() {
...
}
}
struct SomeStruct {
init() {
...
}
}
enum SomeEnum {
case someCase
init() {
self = .someCase
}
}
구조체와 클래스의 인스턴스는 처음 생성할 때
Optional한 프로퍼티를 제외한 모든 저장 프로퍼티에
초깃값을 지정해주어야 한다.
만약 값을 꼭 가지고 있지 않아도 되는 속성이 있다면
Optional 처리를 해줘서 기본값을 nil로 설정해 줄 수 있다.
init을 정의하여 초깃값 지정 & Optional한 초깃값 지정
struct Score {
var math: Int
var english: Int
var history: Int
var bonusScore: Int? // 보너스 점수를 가지고 있지 않은 사람도 있을수 있음.
init() {
math = 0
english = 0
history = 0
}
}
let myScore = Score()
print(myScore.math) // 0
print(myScore.bonusScore) // nil
따로 사용자 정의 Initializer를 정의해주지 않으면
기본 Initializer를 사용한다. ( 모든 기본값이 설정되어있을때만 )
기본 init
struct Score {
var math: Int = 0
var english: Int = 0
var history: Int = 0
}
let myScore = Score()
print(myScore.math) // 0
구조체에서는 특별하게 사용자 정의 Initializer를 구현하지 않으면
아래와 같이
프로퍼티의 이름으로 매개변수를 갖는 MemberWiseInitializer를 기본으로 제공한다.
MemberWiseInitializer
struct Score {
var math: Int = 0
var english: Int = 0
var history: Int = 0
}
let myScore = Score(math: 10, english: 20, history: 30)
Initializer를 따로 정의해 매개변수를 받는 초기화 과정을 직접 구현할 수 있고
그 Initializer는 곧 반환값이 없는
새로운 인스턴스를 생성하는 메서드가 된다.
매개변수를 받는 init을 정의하여 초깃값 지정
struct Score {
var math: Int
var english: Int
var history: Int
init(math: Int, english: Int, history: Int) {
self.math = math
self.english = english
self.history = history
}
}
let myScore = Score(math: 50, english: 60, history: 70)
print(myScore.math) // 50
변하지 않을 속성이라 생각해여 상수로 선언을 하는 경우가 있을텐데
이때 그 상수는 인스턴스를 초기화하는 과정에서만 초깃값을 할당할 수 있다.
class Person {
let name: String
init(name: String) {
self.name = name
}
}
let kim = Person(name: "kim")
kim.name = "park" // error 초기화 후에 변경 불가능
deinit
클래스의 인스턴스는 DeInitializer를 구현할 수 있다.
DeInitializer는 Initializer와 반대로 소멸시키는 역할을 한다.
메모리에서 해제되기 직전 처리해야 할 코드를 작성해주면 된다.
class VC {
.
.
.
deinit {
/*
ex) VC가 dismiss 되면 deinit이 호출될것이고
dismiss 되어 VC가 메모리에서 해제되기 직전에
처리해야 할게 있다면 이곳에서 처리한다
*/
}
}
'Swift_Grammar' 카테고리의 다른 글
[Swift_Library] ProgressHUD (0) | 2021.01.14 |
---|---|
[Swift_Grammar] Method (0) | 2021.01.06 |
[Swift_Grammar] Property (0) | 2020.12.31 |
[Swift_Grammar] 구조체와 클래스 (0) | 2020.12.30 |
[Swift_Grammar] Optional (0) | 2020.12.28 |