Swift

인스턴스 생성 및 소멸

GREEN.1229 2020. 12. 28. 18:21

안녕하십니까. 그린입니다!

오늘 포스팅에서는 인스턴스의 생성 및 소멸에 관해 나눠보겠습니다.

 

지금까지 클래스나 구조체를 생성 시 이니셜라이저를 통해 기본적인 인스턴스를 생성했습니다.

초기화 되는 과정이죠. 그런데 이번 주제에서는 초기화 과정에서 초기값을 설정하고 소멸시키는걸 알아보겠습니다.

 

1. 인스턴스 생성

 -. 이니셜라이저를 정의하여 초기화 과정을 통해 초기값을 직접 할당할 수 있습니다.

     즉 이니셜라이저가 초기값을 지정하는 메서드입니다!

 -. init 키워드를 사용합니다. 클래스/구조체/열거형 함수 안 혹은 익스텐션으로 구현할 수 있습니다.

    (클래스에선 익스텐션으로 구현할 수 없습니다.)

class TestClass {
    init() {
    //초기값 구현
    }
}

1-1) 프로퍼티 기본값

 -. 클래스.구조체 등 전역 프로퍼티의 기본값을 이니셜라이저를 통해 초기값을 할당해 줄 수 있습니다. (기본값을 할당합니다.)

struct Test {
    var testData: Int
    
    init() {
    	testData = 10 // 초기값 할당
    }
}

let test: Test = Test()
print(test.testData) // 10 출력

1-2) 이니셜라이저 매개변수

 -. 클래스.구조체 등 정의 시 이니셜라이저도 여러 매개변수를 가질 수 있습니다.

struct Test {
    var testData: Int
    
    init(first firstNumber: Int) {
        testData = firstNumber
    }
    
    init(value secondNumber: Double) {
    	testData = secondNumber
    }
}

let first: Test = Test(first: 10) // 초기값 10 저장
let second: Test = Test(value: 20) // 초기값 20 저장

1-3) 옵셔널 프로퍼티 타입

 -. 인스턴스 사용되는 동안 값을 가지지 않아도 되는 저장 프로퍼티가 있으면 옵셔널로 선언 가능

 -. 값을 주지 않는다면 nil로 선언됨

class Test {
    var firstNum: Int
    var secondNum: Double?
    
    init(firstNum: Int) {
    	self.firstNum = firstNum
    }
 }
let test: Test = Test(firstNum: 10)
test.secondNume = 20

1-4) 상수 프로퍼티

 -. 프로퍼티를 변수가 아닌 상수로 선언해준다면 초기값 설정 후 프로퍼티로 접근하여 다른 값으로 변경할 수 없습니다.

class Test {
    let num: Int
    
    init(num: Int) {
    	self.num = num
    }
}
let test: Test = Test(num: 10) // 초기값 상수 10 저장
test.num = 20 // 오류

1-5) 기본 이니셜라이저 / 멤버와이즈 이니셜라이즈

 -. 함수 내에서 기본적으로 값을 저장해주는 기본 이니셜라이저 (프로퍼티에 기본값이 저장되어있어야 함)

 -. 프로퍼티 기본값으로 초기화하여 인스턴스 생성

 -. 멤버와이즈 이니셜라이저란??? 프로퍼티 이름으로 매개변수를 갖는 이니셜라이저 !!!

 -. 사용자 정의 이니셜라이저를 구현하지 않는다면 멤버와이즈 이니셜라이저가 기본으로 구현됨

    (클래스는 멤버와이즈 이니셜라이저 지원 안됨)

struct Test {
    var first: Int = 10
    var second: Int = 20
}

1-6) 초기화 위임

 -. 이니셜라이저가 다른 이니셜라이저에게 일부 초기화를 위임할 수 있습니다.

     (클래스는 상속을 사용함으로 초기화 위임 지원되지 않습니다.)

 -. self.init을 사용

1-7) 실패 가능한 이니셜라이저 (Failable initializer)

 -. init? 키워드를 사용

 -. 열거형에서 주로 사용

class Test {
    var num: Int
    
    init?(num: Int) {
     //조건 구현
    }
}

1-8) 함수 사용한 프로퍼티 기본값 설정

 -. 클로저 뒤 소괄호를 붙임

 -. 클로저를 실행한 결과값이 프로퍼티의 기본값이 됩니다.

class Test {
    let num: NumType = {
        //인스턴스 생성 반환
        return someNume
    }()
}

 

2. 인스턴스 소멸

 -. 디이니셜라이저를 통해 구현

 -. 메모리에서 소멸되기 직전에 호출됨

 -. deinit 키워드 사용 

 -. 클래스의 인스턴스에서만 구현 가능

 -. 한 클래스에서 하나의 디이니셜라이저만 구현 가능

 -. 매개변수를 갖지않고 소괄호도 붙이지 않습니다. 

 -. 자동 호출됨으로 별도 코드로 호출할 수 없습니다.

 

이상으로 인스턴스의 사용자 정의 생성 혹은 기본 이니셜라이저 더 나아가 멤버와이즈 이니셜라이저까지

생성에 대해 알아봤으며, 인스턴스 소멸에 대해 알아봤습니다.

Swift 문법에서 인스턴스의 생성은 빠질 수 없는 부분이라 꼭 다시 되새기며 학습해보면 좋을것 같습니다.

해당 포스팅의 학습 내용의 출처는 스위프트 프로그래밍 3판 (야곰 지음) 교재에서 학습한 내용입니다!!

감사합니다 :D