본문 바로가기

Swift_Grammar

[Swift_Grammar] Initialization

 

초기화란 새로운 인스턴스를 사용할 준비를 하기 위해

저장 프로퍼티의 초깃값을 설정하는 등의 일을 말한다.

 

초기화(Initializer)는 

init 키워드를 사용하여 정의하며

하단 예제 코드와 같은 모양을 가지고 있다.

init

class SomeClass {
    init() {
        ...
    }
}

struct SomeStruct {
    init() {
        ...
    }
}

enum SomeEnum {
    case someCase
    init() {
        self = .someCase
    }
}

 

구조체와 클래스의 인스턴스는 처음 생성할 때

Optional한 프로퍼티를 제외한 모든 저장 프로퍼티에 

초깃값을 지정해주어야 한다. 

 

만약 값을 꼭 가지고 있지 않아도 되는 속성이 있다면 

Optional 처리를 해줘서 기본값을 nil로 설정해 줄 수 있다.

 

init을 정의하여 초깃값 지정 & Optional한 초깃값 지정

struct Score {
    var math: Int
    var english: Int
    var history: Int
    var bonusScore: Int? // 보너스 점수를 가지고 있지 않은 사람도 있을수 있음.
    
    init() {
        math = 0
        english = 0
        history = 0
    }
}

let myScore = Score()
print(myScore.math) // 0
print(myScore.bonusScore) // nil

 

따로 사용자 정의 Initializer를 정의해주지 않으면

기본 Initializer를 사용한다. ( 모든 기본값이 설정되어있을때만 )

기본 init

struct Score {
    var math: Int = 0
    var english: Int = 0
    var history: Int = 0
}

let myScore = Score()
print(myScore.math) // 0

 

구조체에서는 특별하게 사용자 정의 Initializer를 구현하지 않으면 

아래와 같이

프로퍼티의 이름으로 매개변수를 갖는 MemberWiseInitializer를 기본으로 제공한다.

MemberWiseInitializer

struct Score {
    var math: Int = 0
    var english: Int = 0
    var history: Int = 0
}

let myScore = Score(math: 10, english: 20, history: 30)

 

Initializer를 따로 정의해 매개변수를 받는 초기화 과정을 직접 구현할 수 있고

 Initializer는 곧 반환값이 없는

새로운 인스턴스를 생성하는 메서드가 된다.

매개변수를 받는 init을 정의하여 초깃값 지정 

struct Score {
    var math: Int
    var english: Int
    var history: Int
    
    init(math: Int, english: Int, history: Int) {
        self.math = math
        self.english = english
        self.history = history
    }
}

let myScore = Score(math: 50, english: 60, history: 70)
print(myScore.math) // 50

 

 

변하지 않을 속성이라 생각해여 상수로 선언을 하는 경우가 있을텐데

이때 그 상수는 인스턴스를 초기화하는 과정에서만 초깃값을 할당할 수 있다.

class Person {
   let name: String
   
   init(name: String) {
       self.name = name
   }
}

let kim = Person(name: "kim")
kim.name = "park" // error 초기화 후에 변경 불가능

 

deinit

클래스의 인스턴스는 DeInitializer를 구현할 수 있다.

DeInitializer는 Initializer와 반대로 소멸시키는 역할을 한다.

메모리에서 해제되기 직전 처리해야 할 코드를 작성해주면 된다.

class VC {

    .
    .
    .
	
    deinit {
        /*
        ex) VC가 dismiss 되면 deinit이 호출될것이고 
            dismiss 되어 VC가 메모리에서 해제되기 직전에 
            처리해야 할게 있다면 이곳에서 처리한다
        */
    }
}

 

'Swift_Grammar' 카테고리의 다른 글

[Swift_Library] ProgressHUD  (0) 2021.01.14
[Swift_Grammar] Method  (0) 2021.01.06
[Swift_Grammar] Property  (0) 2020.12.31
[Swift_Grammar] 구조체와 클래스  (0) 2020.12.30
[Swift_Grammar] Optional  (0) 2020.12.28