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의 이니셜라이저는 다른 언어에 비해 유연하면서도 안전성을 보장하는 훌륭한 기능입니다.