J
[Swift] init 본문
1. Swift의 init이란?
Swift에서 init은 클래스, 구조체, 또는 열거형의 생성자(Initializer)로, 인스턴스를 초기화하는 역할.
init 메서드는 인스턴스의 모든 저장 프로퍼티를 초기화하고, 초기 상태를 설정함.
2. init의 기본 특징
- 모든 저장 프로퍼티 초기화
- 저장 프로퍼티는 초기화되지 않으면 에러가 발생하게 됨.
- 반환 값이 없음
- init 메서드는 특별히 반환값을 가지지 않음.
- 자동 초기화 제공
- Swift는 프로퍼티에 초기값이 있거나, 모든 프로퍼티가 초기화 가능한 경우 자동 초기화 메서드를 제공.
3. 기본 문법
struct Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let person = Person(name: "Alice", age: 30)
print(person.name) // "Alice"
print(person.age) // 30
4. 초기화의 다양한 유형
기본 이니셜라이저 (Default Initializer)
저장 프로퍼티에 기본값이 있으면 자동으로 기본 생성자를 제공.
struct Rectangle {
var width = 10 // 기본 값 존재
var height = 20 // 기본 값 존재
}
let rect = Rectangle() // 기본 생성자(따로 값을 넣어주지 않아도 됨)
print(rect.width) // 10
print(rect.height) // 20
사용자 정의 이니셜라이저 (Custom Initializer)
사용자가 직접 원하는 형태로 초기화를 구현할 수 있음.
struct Circle {
var radius: Double
var area: Double
init(radius: Double) {
self.radius = radius
self.area = 3.14 * radius * radius
}
}
let circle = Circle(radius: 5)
print(circle.radius) // 5
print(circle.area) // 78.5(계산되어 출력)
구조체의 멤버와이즈 이니셜라이저
구조체는 모든 저장 프로퍼티를 매개변수로 가지는 기본 멤버와이즈 이니셜라이저를 제공.
struct Point {
var x: Int
var y: Int
// Struct는 init이 존재하지 않아도 가능
}
let point = Point(x: 10, y: 20) // 멤버와이즈 이니셜라이저
print(point.x) // 10
print(point.y) // 20
클래스의 지정 이니셜라이저 (Designated Initializer)
클래스에서는 반드시 모든 저장 프로퍼티를 초기화하는 지정 이니셜라이저를 제공해야 함.
class Person {
var name: String
var age: Int
// Class는 저장 프로퍼티의 기본 값이 존재하지 않을 경우, init이 필수
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let person = Person(name: "Bob", age: 40)
print(person.name) // "Bob"
print(person.age) // 40
클래스의 편의 이니셜라이저 (Convenience Initializer)
편의 이니셜라이저는 지정 이니셜라이저를 간단히 호출할 수 있는 추가적인 초기화 메서드.
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
convenience init(name: String) {
self.init(name: name, age: 0) // 지정 이니셜라이저 호출
}
}
let person = Person(name: "Alice") // age 값은 따로 넣어주지 않아도 됨
print(person.name) // "Alice"
print(person.age) // 0
실패 가능한 이니셜라이저 (Failable Initializer)
초기화가 실패할 수 있는 경우, init?를 사용하여 초기화 실패를 처리할 수 있음.
struct Person {
var name: String
var age: Int
init?(name: String, age: Int) {
guard age >= 0 else { return nil } // 나이가 음수면 초기화 실패
self.name = name
self.age = age
}
}
let validPerson = Person(name: "Bob", age: 30)
print(validPerson?.name) // "Bob"
let invalidPerson = Person(name: "Bob", age: -5)
print(invalidPerson?.name) // nil(초기화 실패)
필수 이니셜라이저 (Required Initializer)
서브클래스에서도 반드시 구현해야 하는 이니셜라이저는 required 키워드를 사용.
class Person {
var name: String
required init(name: String) {
self.name = name
}
}
class Employee: Person {
required init(name: String) {
super.init(name: name)
}
}
5. 초기화와 상속
서브클래스에서의 초기화
서브클래스는 상위 클래스의 모든 저장 프로퍼티를 초기화하거나, 상위 클래스의 초기화 메서드 호출이 필수.
class Animal {
var name: String
init(name: String) {
self.name = name
}
}
class Dog: Animal {
var breed: String
init(name: String, breed: String) {
self.breed = breed
super.init(name: name) // 상위 클래스의 초기화 메서드 호출
}
}
let dog = Dog(name: "Buddy", breed: "Golden Retriever")
print(dog.name) // "Buddy"
자동 상속
상위 클래스의 지정 이니셜라이저가 재정의되지 않고, 서브클래스가 추가적인 저장 프로퍼티를 가지지 않는 경우에는 상위 클래스의 이니셜라이저가 자동 상속.
6. 초기화와 프로토콜
프로토콜에서도 초기화 요구 사항을 정의할 수 있음.
protocol Initializable {
init(value: Int)
}
class MyClass: Initializable {
var value: Int
required init(value: Int) {
self.value = value
}
}
7. 초기화와 클로저를 활용한 기본값 설정
초기화 중 특정 프로퍼티를 초기화하는 데 클로저를 사용할 수 있음.
struct Rectangle {
var width: Int = {
return 10 * 2
}()
var height: Int = {
return 20 * 2
}()
}
let rect = Rectangle()
print(rect.width) // 20
print(rect.height) // 40
'Swift' 카테고리의 다른 글
[Swift] #available (0) | 2024.05.19 |
---|---|
[Swift] map (0) | 2024.04.19 |
[Swift] weak, unowned (0) | 2024.04.18 |
[Swift] self / Self (0) | 2024.04.18 |
[Swift] associatedtype (0) | 2024.04.18 |