- swift에 대해 공부한 내용을 정리한 글입니다.
- 해당 글은 한빛미디어의 스위프트 프로그래밍 3판을 참고하여 작성했습니다.
초기화 과정은 클래스, 구조체, 또는 열거형의 인스턴스를 사용하기 위한 준비 과정으로, 저장 프로퍼티의 초깃값을 설정하는 등의 일을 한다.
이니셜라이저는 특정 타입의 새로운 인스턴스가 생성될 때 호출된다.
struct User {
var name: String = "Hoojeong"
init(){
}
}
let user = User()
위와 같이 User라는 구조체에 대해 인스턴스가 생성될 때 init() 블록이 실행된다. 블록 내에는 프로퍼티의 값을 초기화 하거나, 새 인스턴스를 사용하기 전에 필요한 설정을 하면 된다.
init(매개변수: 데이터 타입, ...) {
프로퍼티 초기화
인스턴스 생성 시 필요한 코드 작성
}
class User {
var name: String
var age: Int
var sex: Character
init(name: String, age: Int) {
self.name = name
self.age = age
sex = "F"
}
}
var user = User(name: "Hoojeong", age: 23)
print(user.name)
print(user.age)
print(user.sex)
Hoojeong
23
F
init() 안에서 매개변수로 프로퍼티를 초기화해도 되고, 그냥 직접 초기화해도 된다.
또한 매개변수를 다르게 해서 여러 개의 init()를 만드는 것도 가능하다.
멤버와이즈 이니셜라이저란?
구조체에서 사용자 정의 이니셜라이저를 구현하지 않으면, 프로퍼티의 이름으로 매개변수를 갖는 이니셜라이저.
struct UserInfo {
var name: String
var age: Int
func introduce() {
print("\(name) \(age)")
}
}
var userInfo = UserInfo(name: "Hoojeong", age: 23)
코드에서 구조체 블록을 보면, 프로퍼티 name, age에 대해 초기화가 이루어지지 않았다.(이니셜라이저도 물론 없고.)
하지만, 인스턴스 생성 코드를 보면 매개변수로 프로퍼티 name와 age의 값을 초기화 하고 있다.
자, 이게 바로 멤버와이즈 이니셜라이저다. 굉장히 간편하지만, 클래스에서는 사용할 수 없다. ^0^
클래스는 참조 타입이기 때문에 더는 참조할 필요가 없을 때 메모리에서 해제된다. 이 과정을 '소멸'이라고 하는데, 소멸하기 직전에 deinit
메서드가 호출된다.
클래스 내부에 deinit 메서드를 구현하면, 소멸 직전 호출되며 클래스 당 하나의 deinit 메서드만을 구현할 수 있다. 또한 매개변수나 반환 값을 가질 수 없다.
class Cat {
var name: String = ""
var age: Int = 0
func introduce() {
print("\(name) \(age)")
}
deinit {
print("extinction")
}
}
var cat: Cat? = Cat()
cat = nil
이때 클래스의 인스턴스는 메모리가 해제되어 '없을 수' 있다. 때문에 옵셔널을 사용해야 한다.
참고로 deinit
은 클래스에서만 사용할 수 있다. 구조체? 어림도 없지