ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인스턴스 생성 및 소멸
    Swift 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

    'Swift' 카테고리의 다른 글

    메모리 구조 & ARC  (0) 2021.01.11
    Concurrent Programming  (0) 2021.01.07
    JSON 데이터 다루기  (0) 2020.12.23
    고차함수와 함수형 프로그래밍  (0) 2020.12.18
    제네릭  (0) 2020.12.13
Designed by Tistory.