-
Swift - Initializer 기초Programming/Swift 2021. 11. 13. 14:15
안녕하세요 BeePeach입니다 :)
오늘은 Initializer(생성자)에 대해서 공부해보도록 하겠습니다.
class, struct, enum의 인스턴스를 사용하기 위한 준비과정을 Initialization(초기화)라고 합니다.
초기화 과정에는 해당 타입이 가지고 있는 모든 stored property가 초기값을 가지도록 해야 합니다.
이러한 초기화 과정을 Initailizer(생성자)에서 구현하면 됩니다.
다시 말하자면 인스턴스를 생성하는 작업을 초기화라고 하고 생성자는 초기화를 담당합니다.
Initialzer
위에서 class와 sturct의 stored property는 인스턴스가 생성될 시점에 반드시 초기값을 가지고 있어야 한다고 했습니다.
초기값은 initializer에서 구현하거나 defaultVlaue를 통해서 설정할 수 있습니다.
Default Value로 초기값을 설정하는 방법은 이전에 우리가 많이 사용했습니다.
혹시 모르니 간단한 예제를 보겠습니다.
이렇게 stored property를 선언할 때 값을 바로 할당해주면 초기값이 설정됩니다.
이제 Position의 모든 stored property가 초기값을 가지고 있습니다.
그러므로 인스턴스를 생성할 수 있습니다.
우리는 지금까지 이렇게 인스턴스를 생성했습니다.
지금까지 작성한 코드를 생각해보면 우리는 생성자를 선언하지 않았는데 인스턴스를 생성하고 있었습니다.
그 이유은 Default Initializer(기본 생성자)가 제공되었기 때문인데 이 부분은 조금 뒤에 설명하겠습니다.
그럼 다시 돌아와서 생성자의 문법을 보겠습니다.
이 문법은 당연히 class, struct, enum안에서 선언해야 합니다. (밖에서 선언하면 안됩니다!)
생김새는 method와 아주 흡사합니다.
차이점은 func와 funcName대신 init 그리고 returnType이 없는 것입니다.
생성자에는 어떠한 코드를 작성해도 문제가 되지않지만 최대한 간단하게 초기화만 구현하는 게 좋습니다.
지금까지는 default value를 이용하여 초기화가 되어 있는 경우를 살펴보았습니다.
그럼 default value가 없는 경우 초기화를 하는 방법을 예시를 통해서 보도록 하겠습니다.
아까 Position의 프로퍼티에는 default value가 있었습니다.
하지만 이번에는 default value가 없습니다.
인스턴스를 사용하려면 초기값이 있어야한다고 했죠??
초기화를 위해 initializer를 선언하고 모든 프로퍼티의 값을 1.0으로 초기화시켰습니다.
여기서 init()으로 선언을 했죠?? 그럼 생성자를 호출할 때는 TypeName()으로 호출하면 됩니다.
아무런 파라미터가 없는 someThing() 메서드를 을 호출할때 someThing()으로 호출하는 것과 유사합니다.
다만 init은 생략하고 dot syntax를 사용하지 않고 TypeName 뒤에 바로 ()와 함께 작성하면 됩니다.
그럼 이해를 돕기 위해 다른 init을 선언해보도록 하겠습니다.
이번에는 value라는 파라미터를 가지는 init을 선언했습니다.
그리고 width와 height 프로퍼티에 value를 할당하면서 초기화를 하고 있습니다.
모든 프로퍼티가 초기값을 가지게 되므로 초기화에 전혀 문제가 없습니다.
여기서 잠깐 보고 가야 할 부분은 self의 생략입니다.
init()에서는 self.width로 자신의 프로퍼티에 접근하고 있습니다.
init(value:)에서는 width로 self를 생략했습니다.
물론 init()에서도 self가 생략이 가능합니다.
이렇게 의미가 모호하지 않을 때는 self를 생략하여 사용할 수 있습니다.
하지만 만약 파라미터 이름과 프로퍼티의 이름이 같은 상황과 같이 모호하게 된다면 self를 생략하면 안됩니다.
위의 예제에서는 init(value:) 생성자를 이용하여 Position의 인스턴스를 생성해보았습니다.
함수 호출식처럼 () 안에 argumentLabel을 적어서 호출하면 됩니다.
그럼 우리가 입력한 값으로 초기화가 된 것을 확인할 수 있습니다.
Default Initializer
아까 설명드리지 않은 Default Initializer(기본 생성자)에 대해서 알아보도록 하겠습니다.
맨 처음 봤던 예제에서 모든 속성에 default value가 있을 때 Position()으로 인스턴스를 생성했습니다.
이는 Initializer(생성자)를 사용한 것인데 우리는 생성자를 정의하지 않았습니다.
그런데 어떻게 사용할 수 있었을까요??
Swift에서는 모든 프로퍼티가 default value를 가지고 있고 생성자를 하나도 선언하지 않았다면 Default Initializer(기본 생성자)를 제공합니다.
기본 생성자는 class와 struct에 제공됩니다.
기본 생성자를 이용하면 인스턴스의 프로퍼티 값들은 모두 default value로 초기화가 됩니다.
이러한 코드를 따로 작성하지 않고 자동으로 제공해줍니다.
기본 생성자의 제공조건에서 init을 하나도 정의하지 않았을 때 라는 조건이 있습니다.
만약 init을 하나라도 정의한다면 더 이상 제공되지 않습니다.
예제를 살펴보면 init(value:)를 정의를 하니 기존에 사용하던 init()을 사용하지 못하는 것을 확인할 수 있습니다.
Memberwise Initializer
Memberwise Initialier (멤버와이즈 생성자)는 struct에 제공되는 생성자입니다.
Struct에 init을 하나도 정의하지 않았다면 기본적으로 제공됩니다.
기본 생성자와의 차이점은 프로퍼티가 기본값을 가지지 않아도 제공이 됩니다. (당연히 기본값을 가지고 있어도 제공이 됩니다.)
그리고 생성자의 파라미터가 프로퍼티의 개수, 이름과 일치하도록 하여 제공됩니다.
예제를 살펴보도록 하겠습니다.
먼저 공부했던 기본 생성자를 이용하여서 기본값으로 초기화하는 생성자도 제공하는 것을 확인할 수 있습니다.
그리고 Line11을 보면 우리는 생성한 적이 없지만 init(width:height)가 제공되는 것을 확인할 수 있습니다.
그리고 우리가 원하는 값으로 프로퍼티를 초기화하는 것도 확인할 수 있습니다.
그리고 기본 생성자와 마찬가지로 init을 하나라도 정의한다면 제공하지 않습니다.
Memberwise initializer는 class에는 제공되지 않고 struct에만 제공된다는 점을 꼭 기억해주면 됩니다.
오늘은 생성자에 대한 아주 기본적인 것에 대해서 공부를 해봤습니다.
별로 어려워 보이지 않죠??
하지만 class는 상속을 제공합니다.
그리고 상속을 이용한 class의 초기화 과정은 생각보다 복잡합니다.
다음 포스팅에서는 이에 대해서 다뤄보도록 하겠습니다!
참고자료
여러분의 새로운 도전을 응원합니다 | KxCoding
Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기
kxcoding.com
https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
Initialization — The Swift Programming Language (Swift 5.6)
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 t
docs.swift.org
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Initializer - Two Phase Initialization (1) 2021.12.06 Swift - Initializer Delegation (0) 2021.11.28 Swift - Inheritance (상속) (0) 2021.11.11 Swift - Subscript (0) 2021.11.07 Swift - Method (0) 2021.11.06