Swift에서 `init` 키워드

jeongmuyamette·2025년 7월 20일

TIL

목록 보기
68/72
post-thumbnail

Swift에서 init 키워드는 클래스, 구조체, 또는 열거형의 초기화 메서드(Initializer)를 정의하는 데 사용됩니다. 초기화 메서드는 인스턴스를 생성할 때 호출되며, 모든 저장 속성의 초기 값을 설정하고 초기화 과정에서 필요한 작업을 수행합니다.

아래에서 init 키워드에 대해 자세히 설명하겠습니다.


1. 기본 개념

  • init은 초기화 메서드를 정의하는 키워드입니다.
  • 초기화 메서드는 반환값이 없습니다. 즉, return 키워드를 사용하지 않습니다.
  • 초기화 메서드는 클래스, 구조체, 또는 열거형의 인스턴스 생성 시 호출됩니다.

2. 사용 예제

struct Person {
    var name: String
    var age: Int

    // 초기화 메서드
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let person = Person(name: "John", age: 30)
print(person.name)  // 출력: John
print(person.age)   // 출력: 30

설명:

  • init(name: String, age: Int)Person 구조체의 초기화 메서드입니다.
  • self.nameself.age를 사용하여 저장 속성을 초기화합니다.

3. 클래스에서의 초기화

클래스에서는 초기화 메서드를 정의할 때, 상속과 관련된 추가적인 규칙이 있습니다.

예제: 기본 클래스 초기화

class Animal {
    var species: String

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

let animal = Animal(species: "Dog")
print(animal.species)  // 출력: Dog

예제: 상속과 초기화

class Animal {
    var species: String

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

class Dog: Animal {
    var breed: String

    init(species: String, breed: String) {
        self.breed = breed
        super.init(species: species)  // 부모 클래스의 초기화 메서드 호출
    }
}

let dog = Dog(species: "Dog", breed: "Golden Retriever")
print(dog.species)  // 출력: Dog
print(dog.breed)    // 출력: Golden Retriever

설명:

  • super.init(species: species)를 사용하여 부모 클래스의 초기화 메서드를 호출합니다.
  • 클래스의 초기화는 부모 클래스부터 모든 저장 속성을 초기화해야 합니다.

4. 구조체의 자동 초기화

구조체는 모든 저장 속성을 초기화하는 멤버 와이즈 초기화를 자동으로 제공합니다.

struct Rectangle {
    var width: Double
    var height: Double
}

let rect = Rectangle(width: 10.0, height: 5.0)
print(rect.width)  // 출력: 10.0
print(rect.height) // 출력: 5.0

설명:

  • 구조체는 초기화 메서드를 명시적으로 작성하지 않아도 자동으로 제공됩니다.
  • 클래스는 자동 초기화를 제공하지 않으므로 명시적으로 작성해야 합니다.

5. 편의 초기화 (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 person1 = Person(name: "John", age: 30)
let person2 = Person(name: "Jane")

print(person1.age)  // 출력: 30
print(person2.age)  // 출력: 0

설명:

  • convenience 키워드를 사용하여 편의 초기화 메서드를 정의합니다.
  • 편의 초기화 메서드는 반드시 동일 클래스의 다른 초기화 메서드를 호출해야 합니다.

6. 필요한 초기화 메서드

클래스에서 모든 저장 속성을 초기화하지 않으면 필수 초기화 메서드(required initializer)를 정의해야 할 수 있습니다.

예제:

class Vehicle {
    var model: String

    required init(model: String) {
        self.model = model
    }
}

class Car: Vehicle {
    var color: String

    init(model: String, color: String) {
        self.color = color
        super.init(model: model)
    }

    required init(model: String) {
        self.color = "Unknown"
        super.init(model: model)
    }
}

설명:

  • required 키워드는 해당 초기화 메서드를 모든 하위 클래스에서 구현하도록 강제합니다.
  • 하위 클래스는 required 초기화 메서드를 반드시 재정의해야 합니다.

7. 초기화 실패 가능성

초기화 중 특정 조건을 만족하지 못하면 초기화가 실패할 수 있습니다. 이 경우 failable initializer를 사용합니다.

예제:

struct Student {
    var name: String
    var age: Int

    init?(name: String, age: Int) {
        if age < 0 {
            return nil  // 초기화 실패
        }
        self.name = name
        self.age = age
    }
}

let student1 = Student(name: "Alice", age: 20)  // 성공
let student2 = Student(name: "Bob", age: -5)   // 실패

print(student1?.name)  // 출력: Optional("Alice")
print(student2?.name)  // 출력: nil

설명:

  • init?를 사용하여 실패 가능한 초기화 메서드를 정의합니다.
  • 초기화 실패 시 nil을 반환합니다.

8. 요약

  • init은 저장 속성을 초기화하고 인스턴스를 생성할 때 사용됩니다.
  • 구조체는 자동으로 멤버 와이즈 초기화를 제공합니다.
  • 클래스는 초기화 메서드를 명시적으로 작성해야 하며, 상속 시 부모 클래스의 초기화를 호출해야 합니다.
  • convenience 초기화, required 초기화, 그리고 실패 가능한 초기화(init?)를 통해 다양한 초기화 방식을 구현할 수 있습니다.

2개의 댓글

comment-user-thumbnail
2025년 7월 21일

열심히 하는 모습 너무 보기 좋아요 ( *´◡`)੭

1개의 답글