본문 바로가기
카테고리 없음

10. 이니셜라이저(initializer)의 종류와 사용법

by swifttt 2025. 4. 1.

 

Swift에서 이니셜라이저는 인스턴스를 생성할 때 필요한 초기 상태를 설정하는 특별한 메서드입니다. 클래스나 구조체가 인스턴스로 만들어질 때 각 프로퍼티에 초기값을 지정하고, 내부 설정을 마무리하는 역할을 합니다. Swift는 안전성을 위해 모든 저장 프로퍼티가 초기화되었는지를 컴파일 시점에 검사하며, 이를 위해 다양한 초기화 방식이 존재합니다.

1. 기본 이니셜라이저 (Default Initializer)

구조체 또는 클래스가 모든 저장 프로퍼티에 기본값을 가지고 있다면, Swift는 자동으로 이니셜라이저를 생성합니다.

struct User {
    var name: String = "이름 없음"
    var age: Int = 0
}

let user = User()
print(user.name) // 이름 없음

별도로 init 메서드를 작성하지 않아도 사용할 수 있는 기본 생성자입니다.

2. 멤버와이즈 이니셜라이저 (Memberwise Initializer)

구조체는 저장 프로퍼티를 직접 지정하여 초기화할 수 있는 멤버와이즈 이니셜라이저를 자동으로 제공합니다.

struct Book {
    var title: String
    var price: Int
}

let book = Book(title: "Swift 기초", price: 12000)

클래스에서는 자동 제공되지 않으며, 필요한 경우 수동으로 구현해야 합니다.

3. 커스텀 이니셜라이저 (Custom Initializer)

init 키워드를 사용하여 직접 초기화 로직을 구현할 수 있습니다.

struct Rectangle {
    var width: Int
    var height: Int

    init(squareWith size: Int) {
        self.width = size
        self.height = size
    }
}

let square = Rectangle(squareWith: 10)
print(square.width, square.height) // 10 10

self는 현재 인스턴스를 의미하며, 프로퍼티 이름과 매개변수 이름이 같을 경우 반드시 사용해야 합니다.

4. 클래스의 초기화 과정

클래스는 상속이 가능하므로, 초기화 시 조금 더 복잡한 과정을 가집니다.
기본 이니셜라이저 외에도 지정 이니셜라이저(designated initializer)편의 이니셜라이저(convenience initializer)로 구분됩니다.

4-1. 지정 이니셜라이저

클래스의 모든 저장 프로퍼티를 초기화하는 주된 이니셜라이저입니다.

class Person {
    var name: String

    init(name: String) {
        self.name = name
    }
}

4-2. 편의 이니셜라이저

지정 이니셜라이저를 보조하기 위해 사용되며, convenience 키워드를 사용하여 정의합니다.
반드시 같은 클래스 내의 다른 초기화 메서드를 호출해야 합니다.

class Person {
    var name: String

    init(name: String) {
        self.name = name
    }

    convenience init() {
        self.init(name: "이름 없음")
    }
}

5. 이니셜라이저 오버로딩

하나의 타입에 여러 형태의 init을 정의할 수 있으며, 이를 오버로딩이라고 합니다.

struct Point {
    var x: Int
    var y: Int

    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }

    init(value: Int) {
        self.x = value
        self.y = value
    }
}

오버로딩은 상황에 맞는 다양한 방식으로 객체를 초기화할 수 있게 해줍니다.

6. 실패 가능한 이니셜라이저 (Failable Initializer)

조건에 따라 초기화에 실패할 수 있는 경우, init? 형태의 실패 가능한 이니셜라이저를 사용합니다.

struct File {
    var filename: String

    init?(filename: String) {
        if filename.isEmpty {
            return nil
        }
        self.filename = filename
    }
}

let file = File(filename: "")
print(file) // nil

초기화가 실패하면 nil을 반환하게 되며, 반환 타입이 옵셔널이 됩니다.

마무리

Swift의 이니셜라이저는 초기 상태의 안전성과 명확성을 보장합니다.
기본 생성자부터 커스텀, 실패 가능한 이니셜라이저까지 각 방식은 목적에 따라 선택하여 사용할 수 있습니다.
특히 클래스에서는 지정 이니셜라이저와 편의 이니셜라이저의 관계를 잘 이해하고 사용하는 것이 중요합니다.
Swift의 이니셜라이저는 다른 언어에 비해 유연하면서도 안전성을 보장하는 훌륭한 기능입니다.