Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

J

[Swift] init 본문

Swift

[Swift] init

yujaehui 2024. 4. 18. 16:02

1. Swift의 init이란?

Swift에서 init은 클래스, 구조체, 또는 열거형의 생성자(Initializer)로, 인스턴스를 초기화하는 역할.

init 메서드는 인스턴스의 모든 저장 프로퍼티를 초기화하고, 초기 상태를 설정함.


2. init의 기본 특징

  1. 모든 저장 프로퍼티 초기화
    • 저장 프로퍼티는 초기화되지 않으면 에러가 발생하게 됨.
  2. 반환 값이 없음
    • init 메서드는 특별히 반환값을 가지지 않음.
  3. 자동 초기화 제공
    • 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