본문으로 바로가기

초기화랑 생성자란?

초기화는 인스턴스를 생성하는 과정

- 각 저장속성에 대한 초기값을 설정하여 인스턴스를 사용 가능한 상태로 만드는것

  (열거형은 case중에 한가지를 선택하여 생성)

- 초기화할때 인스턴스의 모든 저장속성이 값을 갖게 하는것이 생성자의 역할

 

생성자 구현

- 초기화 방법

  1. 저장속성의 선언과 동시에 값 저장

  2. 저장속성을 옵셔널로 선언 (초기값 없어도 nil로 초기화)

  3. 생성자에서 값 초기화

      - 1, 2번방식으로 초기화시 이니셜라이저를 구현 하지 않아도

         기본생성자가 자동으로 생성됨

// 1. 선언과 동시에 초기값 지정
class Num {
    var num1 = 1
    var num2 = 1
    var num3 = 1
    
//    init() { } 자동으로 기본 생성자 제공
    
}
// 2. 저장속성 옵셔널로 선언
class Num {
    var num1: Int?
    var num2: Int?
    var num3: Int?
    
//    init() { } 자동으로 기본 생성자 제공
    
}
// 3. 생성자에서 값 초기화
class Num {
    var num1: Int
    var num2: Int
    var num3: Int
    
    init(num1: Int, num2: Int, num3: Int) {
        self.num1 = num1 // 생성자의 파라미터로 받아온 값을
        self.num2 = num2 // 자기 자신의(self) 프로퍼티 값으로 초기화
        self.num3 = num3
    }
    
}

let num1 = Num(num1: 1, num2: 2, num3: 3) // () <- 생성자

생성자의 오버로딩

생성자도 오버로딩을 지원한다

class Num {
    var num1: Int = 1
    var num2: Int = 1
    var num3: Int = 1
    
    // 생성자도 오버로딩을 지원함
    init() { } // 프로퍼티에 기본값 있을때만 기본생성자 사용가능
               // 생성자를 생성시 초기값이 있어도 기본생성자를 자동으로 제공해주지 않는다
    
    init(defaultNum: Int) {
        self.num1 = defaultNum
        self.num2 = defaultNum
        self.num3 = defaultNum
    }
    
    
    init(num1: Int, num2: Int, num3: Int) {
        self.num1 = num1 // 생성자의 파라미터로 받아온 값을
        self.num2 = num2 // 자기 자신의(self) 프로퍼티 값으로 초기화
        self.num3 = num3
    }
    
}

let num1 = Num() // 기본생성자
let num2 = Num(defaultNum: 2)
let num3 = Num(num1: 1, num2: 2, num3: 3)

구조체의 멤버와이즈 이니셜라이저

구조체는 저장속성에 기본값이 있든 없든 멤버와이즈 이니셜라이즈를 제공해준다

(개발자가 직접 생성자 구현시 제공x)

struct Num {
    var num1: Int
    var num2: Int
    var num3: Int
    
    // 생성자 구현 안해도 자동으로 멤버와이즈 이니셜라이저 제공
}

let num = Num(num1: Int, num2: Int, num3: Int)