Swift
Initializer & Memberwise Initializer
dion_K
2020. 12. 7. 19:30
728x90
안녕하세요:)
이번에는 생성자와 인스턴스 초기화, 구조체가 제공하는 Memberwise Initializer에 대해서 알아보도록 하겠습니다~
1. Initializer (생성자)
- 새로운 인스턴스를 생성하는 것을 초기화라고 합니다. 초기화를 담당하는 것이 생성자입니다.
< Default Initializer >
class Position {
var x = 0.0
var y: Double
var z: Double? // 속성을 옵셔널로 선언, 기본값을 저장하지 않으면 자동으로 nil로 초기화됩니다.
// var z: Double? = nil
init() {
y = 0.0 // Initializer를 추가하고 속성에 기본값을 저장하면 정상적으로 초기화됩니다.
}
}
let p = Position()
class SizeObj {
var width = 0.0
var height = 0.0
init(width: Double, height: Double) {
self.width = width
self.height = height
}
convenience init(value: Double) { // Convenience Initializer, 이렇게 다른 생성자를 호출하는 것을 Initializer Delegation이라고 합니다.
self.init(width: value, height: value)
}
}
- 초기화 코드는 가능하다면 중복을 없애야 하고, 다른 생성자를 호출하는 패턴을 사용한다는 것을 기억합시다.
- 생성자가 다른 생성자를 호출할 수 있는 것은 생성자가 오버로딩을 지원하기 때문입니다.
2. Memberwise Initializer
- 구조체가 자동으로 제공하는 생성자입니다.
- 파라미터의 수가 구조체에 포함된 속성의 수와 동일하고 파라미터 이름과 아규먼트 이름이 속성의 이름과 동일합니다.
struct SizeValue {
var width = 0.0
var height = 0.0
}
let s = SizeValue()
SizeValue(width: 1.2, height: 3.4)
struct First {
let a: Int
let b: Int
let c: Int
}
let f = First(a: 1, b: 2, c: 3)
struct Second {
let a: Int = 0
let b: Int = 1
let c: Int // 초기화되지 않은 c만 초기화함
}
let s = Second(c: 2)
struct Third {
var a: Int = 0
var b: Int = 1
var c: Int
// init(value: Int) { 구조체에서 생성자를 직접 구현하면 멤버와이즈 생성자는 더 이상 제공되지 않습니다.
// a = value
// b = value
// c = value
// }
}
extension Third {
init(value: Int) {
a = value
b = value
c = value
}
}
let t = Third(a: 1, b: 2, c: 3)
< 생성 규칙 >
- 구조체는 모든 속성을 초기화하는 생성자를 제공합니다.
- 파라미터 수는 속성의 수와 동일합니다. 아규먼트 레이블과 파라미터 이름은 속성의 이름과 동일합니다.
- 속성이 let으로 선언되어 있고 기본값을 가지고 있다면 생성자 파라미터 목록에서 제외됩니다.
- 속성이 var로 선언되어 있으면 해당 속성이 파라미터 목록에 포함되지 않는 생성자와 포함되어 있는 생성자를 함께 제공합니다.
728x90