적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift] Initialization + Convenience init 이란?

hongssup_ 2022. 12. 8. 16:55
반응형
Swift에서는 super class에서 상속받은 프로퍼티들을 포함하여, 모든 저장 프로퍼티가 초기 값을 가질 수 있도록 Class 유형에 대해 두 가지 종류의 초기화를 정의한다. 그 두가지가 바로 흔히 init으로 사용하는 기본 Designated init, 그리고 Convenience init.
init 에서는 모든 저장 프로퍼티가 반드시 초기화되어야하는데, Convenience init은 init의 파라미터 중 일부를 임의의 기본값으로 설정해서 오류가 나지 않도록 도와주는 보조 이니셜라이저.
* init의 보조이기 때문에 미리 선언한 init을 활용해서 사용해야 한다. 

 

 

convenience init 딱히 필요성을 잘 모르겠어서 왜 쓰나 싶었다. 

custom collectionView cell 만들때 필수로 추가해줘야하는 override init / required init 말고 내가 init을 직접 만들어서 사용해야 할 일이 딱히 없없다.

class 생성할 때 모든 프로퍼티를 init을 통해 초기화해준다고 하는데 사실 그것도 그냥 보통 처음에 프로퍼티 선언할때 초기화까지 같이 해줘서 딱히 init() 쓸 이유가 없었음. 옵셔널로 프로퍼티 설정해줘도 되는데 굳이 convenience init으로 임의 초기화 해줘야할 이유가 있을까..?

앞으로도 딱히 쓸 일이 있을지는 모르겠지만 그냥 기초문법이니 참고용으로만 알아두겠다.

혹여나 추후 쓸 일이 생기게 된다면 활용 예시를 추가해보겠음. 

 

Initialization

Initialization is the process of preparing an instance of a class, structure, or enumeration for use. This process involves setting an initial value for each stored property on that instance and performing any other setup or initialization that’s required before the new instance is ready for use.

초기화는 클래스, 구조체, 열거형 인스턴스를 사용하기 위해 준비 작업을 하는 단계이다. 저장 프로퍼티들의 초기값을 설정하고, 새 인스턴스를 사용하기 전에 필요한 다른 설정 또는 초기화를 수행하는 작업을 한다. 

 

Initializers

set the initial value of a stored property from within an initializer

struct Fahrenheit {
    var temperature: Double
    init() {
        temperature = 32.0
    }
}

Default property values

프로퍼티의 선언과 동시에 값을 할당하면 그 값을 초기 값으로 사용할 수 있다. 

If a property always takes the same initial value, provide a default value rather than setting a value within an initializer.

struct Fahrenheit {
    var temperature = 32.0
}

Customizing Initialization Parameters

다음과 같이 파라미터를 넣어 초기화를 해줄 수도 있다.

struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
}

Optional Property Types

초기화 시에 프로퍼티의 초기 값이 정해지지 않았거나, 나중에 값이 없어도 로직 상에 문제가 없을 경우, 프로퍼티를 옵셔널 타입으로 선언해 사용할 수도 있다. 이 경우 옵셔널 프로퍼티는 자동으로 nil 값으로 초기화된다. 

struct Fahrenheit {
    var temperature: Double?
}

Designated Initializers and Convenience Initializers

Swift에서는 super class에서 상속받은 프로퍼티들을 포함하여, 모든 저장 프로퍼티가 초기 값을 가질 수 있도록 Class 유형에 대해 두 가지 종류의 초기화를 정의한다. 그 두가지가 바로 Designated init (줄여서 init) 그리고 Convenience init.

init 에서는 모든 저장 프로퍼티가 반드시 초기화되어야함. 

Convenience init 은 일부 프로퍼티 값이 없더라도 에러가 뜨지 않도록 임으로 값을 지정해주는 보조 이니셜라이저

*init 보조이기 때문에 미리 선언한 init 활용해서 사용해야 한다. 

class Student {
    var name: String
    var age: Int
    var gender: String
    
    init(name: String, age: Int, gender: String) {
        self.name = name
        self.age = age
        self.gender = gender
    }
    
    convenience init(name: String, age: Int) {
        self.init(name: name, age: age, gender: "none")
    }
}

 

 

 

 

 

참고 : https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

728x90
반응형