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