생성자(Initialization)는 클래스, 구조체, 열거형에서 인스턴스를 준비하기 위한 과정이다.
생성자 초기화 - init()
생성자 초기화는 인스턴스의 저장 프로퍼티의 값을 초기화 하는 것을 의미한다.
✅ 클래스나 구조체의 저장 프로퍼티는 무조건 생성될 때 함께 초기화 되어야 한다.
init() {
// perform some init here
}
생성자는 특정타입의 새로운 인스턴스가 생성될 때 호출된다.
가장 간단한 모양은 생성자가 매개변수가 없는 인스턴스 메서드 같이 선언된 것으로 init 키워드를 사용하여 정의한다.
위의 코드는 가장 기본적인 어떤 인자도 받지 않는 생성자이다.
someClass라는 클래스의 init() 내부에서 name, age, nationality를 초기화 할 수 있다.
생성자 초기화 - Default Property Values
저장 프로퍼티에 직접 초기값(Default Value)를 지정하면 Property Observer 호출 없이 값이 바로 설정된다.
위의 코드는 기존의 someClass를 Default Property Values를 사용하여 변경한 것이다.
옵셔널 값이 아닌 저장 프로퍼티에 초기값을 지정해주면 init() 메소드를 생성하지 않아도 된다.
생성자 초기화 - Customizing init
1️⃣ Initialization Parameters
만약 Seongil의 정보 뿐 아니라 다른 사람의 정보도 필요하다면 모든 학생들의 정보를 각각의 클래스 마다 지정하기에는 부담스러울 것이다. 이럴 땐 init() 메소드에서 초기화 해야하는 저장 프로퍼티의 값을 인자로 받아와 초기화 할 수 있다.
기존의 someClass를 peopleClass로 변경해서 name, age, nationality를 각각의 인스턴스마다 설정할 수 있도록 변경했다.
여기서 self는 클래스나 구조체의 인스턴스 자신을 가리킨다. 즉, 인스턴스 자체 접근 시 사용되는 참조값이다.
self는 생략이 가능하다.
결과를 출력해보면 각각의 인스턴스에 저장되어있는 정보를 출력한다.
만약 성씨를 포함한 풀네임을 알고 싶으면 astName인자를 받아오는 생성자를 만들어 주면 된다.
✅ 인자가 있는 생성자는 여러 개 만들 수 있다.
2️⃣ Argument Label
init() 메소드에서도 아래와 같이 인자에 _를 사용할 수 있다.
근데 굳이 Argument Label을 사용해야할까 싶다.
개인적으로 인자의 명칭은 확실하게 표기하는 것이 좋다고 생각하기 때문.
3️⃣ Optional Property Types
저장 프로퍼티에 값이 없을 수 있는 경우가 있을 수 있다. 이럴 땐 프로퍼티를 옵셔널 타입으로 선언하면 된다.
옵셔널 타입으로 선언 된 프로퍼티는 자동으로 nil 값으로 초기화 된다.
기존 peopleClass에서 국적을 옵셔널 타입으로 선언했다.
국적을 초기화하지 않으면 nil 값을 출력하고, 국적을 Korea로 초기화하면 아래와 같이 옵셔널 값으로 출력한다.
옵셔널 값이 아니라 실제 값을 사용하고 싶으면 옵셔널 언래핑을 해주면 된다.
4️⃣ Constant Propertes
저장 프로퍼티는 var, let 두가지 프로퍼티가 있다.
let은 상수 프로퍼티여서 값이 정해지면 변경할 수 없다. 이는 초기화에서도 동일하게 작동하는데,
name 프로퍼티를 let 프로퍼티로 변경하고 초기화 이후 다시 name을 변경하려고 하면 오류가 발생한다.
'Swift > Swift 기본기' 카테고리의 다른 글
13. 생성자 (Initialization) - 3 (0) | 2023.08.02 |
---|---|
12. 생성자 (Initialization) - 2 (0) | 2023.08.01 |
10. 제네릭 (Generic) (0) | 2023.07.31 |
09. 프로퍼티 (Properties) (0) | 2023.03.18 |
08. 클래스과 구조체 (Classes and Structures) (0) | 2023.03.18 |