인스턴스의 생성과 소멸
이니셜라이저를 정의하면 초기화 과정을 직접 구현할 수 있다.
이니셜라이즈는 func 키워드를 사용하지 않고 init키워드를 사용하여 이니셜라이저 메서드임을 표현한다.
클래스, 구조체, 열거형 등의 구현부 또는 익스텐션 구현부에 위치할 수 있다.
다만 클래스의 지정 이니셜라이저는 익스텐션에서 구현해줄 수 없다.
클래스, 구조체 열거형의 기본적인 형태의 이니셜라이저 예제 코드
class ClassA {
init() {
//초기화 코드
}
}
struct StructA {
init() {
//초기화할 때 필요한 코드
}
}
enum EnumA {
case someCase
init() {
//열거형은 초기화할 때 반드시 case중 하나가 되어야 한다.
self = .someCase
//초기화 코드
}
}
구조체, 클래스의 인스턴스는 처음 생성할 때 옵셔널 저장 프로퍼티를 제외한 모든 저장 프로퍼티에 적절한 초기값을 할당해야 한다.
이니셜라이저를 통해 초기값을 할당하거나 프로퍼티 기본값을 통해 처음의 저장 프로퍼티가 초기화될 때는 프로퍼티 감시자가 호출되지 않는다.
이니셜라이저도 매개변수를 가질 수 있다. 전달인자 레이블 value가 필요하지 않다면 와이들카드 식별자 ( _ )를 사용하여 전달인자 레이블을 없애주면 된다.
int( _ value: Double) {
sq = value
}
초기화 과정에서 값을 지정해주기 어려운 경우 저장 프로퍼티를 옵셔널로 선언할 수 도 있다.
var age: Int?
var name: String
int(name: String {
self.name = name
}
상수로 선언된 저장 프로퍼티는 인스턴스를 초기화하는 과정에서만 값을 할당할 수 있으며, 처음 할당된 이후로는 값을 변경할 수 없다.
기본 이니셜라이저는 저장 프로퍼티의 기본값이 모두 지정되어 있고 동시에 사용자 정의 이니셜라이저가 정의되어 있니 않은 상태에서 제공된다.
구조체는 사용자 정의 이니셜라이저를 구현하지 않응면 프로퍼티의ㅡ 이름으로 매개변수를 갖는 이니셜라이저인 '멤버와이즈 이니셜라이저'를 기본으로 제공한다.
클래스는 멤버와이즈 이니셜라이저를 지원하지 않는다.
이니셜라이저의 초기화를 위임하려면 최소 두 개 이상의 사용자 정의 이니셜라이저를 정의해야 한다.
구조체에서 기본 이니셜라이저를 지키고자 한다면 익스텐션을 사용하여 사용자 정의 이니셜라이저를 구현하면 된다.
실패가능한 이니셜라이저를 선언할 때는 init대신에 init? 키워드를 사용한다.
클로저를 통한 프로퍼티 기본값 설정 예제
class ClassA {
let someProperty: SomeType = {
//
return someValue
}()
}
클로저 뒤에 소괄호가 붙은 이유는 클로저를 실행하기 위해서이다. 소괄호가 없다면 프로퍼티의 기본값은 클로저 그 자체가 된다.
인스턴스의 소멸은 디이니셜라이저를 구현한다. 디이니셜라이저는 클래스의ㅡ 인스턴스에만 구현할 수 있다. 단 하나만 구현할 수 있다.
'프로그래밍 > Spring' 카테고리의 다른 글
spring-boot-starter-security 403 Forbidden 에러 대처 (4) | 2019.03.26 |
---|---|
19. 스위프트의 접근제어 (0) | 2019.02.25 |
17. 스위프트의 프로퍼티와 메서드에 대한 이해 (0) | 2019.02.24 |
16. 구조체와 클래스 (0) | 2019.02.23 |
15. 옵셔널(Optional) (0) | 2019.02.22 |