TIL: 초기화(init)

Royce·2025년 3월 19일

Swift 문법

목록 보기
23/63

초기화(init)

  • Swift에서 초기화(Initialization)는 새로운 인스턴스를 만들 때 속성(Property)에 초기 값을 설정하는 과정이다
  • 구조체(struct), 클래스(class), 그리고 열거형(enum) 모두 초기화 과정이 필요하다

기본값을 이용한 초기화

  • 속성에 기본값을 설정하면, 따로 생성자(init)를 만들지 않아도 인스턴스를 생성할 수 있다
struct Car {
    var brand = "Unknown"  // 기본값 설정
    var year = 2024        // 기본값 설정
    
    func showInfo() {
        print("이 차는 \(brand) 브랜드이고, 출시 연도는 \(year)년 입니다.")
    }
}

// 인스턴스 생성 (기본값을 사용)
var myCar = Car()  // 기본값을 가진 인스턴스 생성

myCar.showInfo()  // "이 차는 Unknown 브랜드이고, 출시 연도는 2024년 입니다."

이니셜라이저(init)를 사용한 초기화

  • 가본값 없이, 초기화할 때 값을 받아서 설정하는 방법
struct Car {
    var brand: String
    var year: Int
    
    // 생성자 (이니셜라이저)
    init(brand: String, year: Int) {
        self.brand = brand
        self.year = year
    }
}

// 인스턴스 생성 (초기 값을 직접 전달)
var car1 = Car(brand: "Hyundai", year: 2022)  // 간편한 형태
var car2 = Car.init(brand: "BMW", year: 2023)  // 정식 문법 사용

Car.init(...)을 사용할 수 있는 이유

  • init(...)은 생성자를 호출하는 정식 문법이다
  • 일반적으로 Car(...) 형태로 많이 사용하지만, Car.init(...)을 명시적으로 사용해도 동일하게 동작한다

init을 사용하는 이유

1. 각각의 인스턴스를 다른 값으로 초기화할 수 있도록 하기 위해

  • 기본값이 있으면 모든 인스턴스가 같은 값을 갖지만, init을 사용하면 각각 다른 값으로 설정할 수 있다

2. 필수적인 속성들을 설정하지 않으면 에러 발생

  • brandyear 같은 속성이 꼭 필요하다면 기본값을 줄 수 없으므로, init을 통해 반드시 초기화하도록 강제할 수 있다

Xcode 자동완성에서 어떻게 알려줄까?

1. 생성자가 없는 경우 (에러 발생)

struct Car {
    var brand: String
    var year: Int
}

// ❌ 에러 발생: 'Car' initializer is missing required arguments 'brand' and 'year'
let myCar = Car()  
  • Xcode 오류 메시지

    ‘Car’ initializer is missing required arguments ‘brand’ and ‘year’

  • 해결 방법:
    Xcode의 자동완성 기능이 init(brand: String, year: Int) 형태의 생성자를 직접 작성하도록 제안한다


2. 구조체는 기본적으로 자동완성 제공 (멤버와이즈 이니셜라이저)

멤버와이즈 이니셜라이저란?

  • 구조체에서는 init을 직접 작성하지 않아도, 자동으로 속성을 초기화하는 생성자가 제공된다
  • 이를 멤버와이즈 이니셜라이저(Memberwise Initializer)라고 한다
struct Car {
    var brand: String
    var year: Int
}

// ✅ 멤버와이즈 이니셜라이저 자동 제공 (자동완성에서 보임)
let myCar = Car(brand: "Hyundai", year: 2022)

초기화의 핵심 개념 요약

1. 모든 저장 속성(변수)은 초기화해야 한다.

  • 클래스와 구조체의 모든 속성은 초기값이 설정되지 않으면 오류가 발생한다.
  • 초기화를 하지 않으면, Xcode에서 “Property ‘x’ not initialized” 같은 오류를 표시한다.

2. 초기화 과정이 완료되지 않으면 인스턴스를 사용할 수 없다.

  • 생성자(init) 실행이 끝나는 시점에 모든 속성이 초기화되어 있어야 한다.
  • 일부 속성이 nil인 상태로 남아 있으면 컴파일 오류가 발생할 수 있다.

3. 클래스, 구조체, 열거형은 단순한 설계도일 뿐이다.

  • Car, Person 같은 타입을 선언해도, Car()처럼 초기화하지 않으면 실제 데이터가 존재하지 않는다.
  • 따라서 초기화를 반드시 거쳐야 해당 타입을 사용할 수 있다.

옵셔널 속성과 초기화

  • 옵셔널 속성은 초기값을 설정하지 않아도 자동으로 nil로 초기화 된다
struct Person {
    var name: String?  // 옵셔널 속성
    var age: Int
    
    init(age: Int) {
        self.age = age  // age 속성만 초기화
    }
}

// 인스턴스 생성 (name을 초기화하지 않음)
var person1 = Person(age: 25)

print(person1.name)  // 출력: nil
print(person1.age)   // 출력: 25

// 옵셔널 값 설정 후 출력
person1.name = "Royce"
print(person1.name)  // 출력: Optional("Royce")

설명

  • name 속성은 옵셔널(String?)이므로 자동으로 nil이 설정된다
  • print(person1.name)을 실행하면 nil만 출력된다
  • person1.name = "Royce"로 값을 설정하면, Optional("Royce") 형태로 출력된다

클래스의 === 연산자 (식별 연산자)

  • 클래스는 참조 타입(Reference Type) 이므로, 같은 인스턴스를 가리키는지를 === 연산자로 비교할 수 있다
class Animal {
    var species: String
    
    init(species: String) {
        self.species = species
    }
}

let animal1 = Animal(species: "Dog")
let animal2 = Animal(species: "Dog")
let animal3 = animal1  // animal1을 참조하는 새로운 변수

print(animal1 === animal2)  // false (다른 인스턴스)
print(animal1 === animal3)  // true (같은 인스턴스를 참조)

Xcode 자동완성:

  • === 연산자를 사용할 때 Xcode는 “Compare object identity using ‘===’ instead of ‘==’” 라는 자동완성 힌트를 제공한다
  • ==은 값 비교, ===은 메모리 주소가 같은지 비교하는 연산자이다

정리

  1. 모든 속성은 초기화되어야 하며, 초기화가 완료되지 않으면 오류 발생
  2. 구조체는 기본적으로 멤버와이즈 이니셜라이저를 제공하여 자동완성된다
  3. 옵셔널 속성은 nil로 자동 초기화되며, 값이 설정되면 Optional(...) 형태로 출력된다
  4. 클래스는 참조 타입이므로 === 연산자로 비교하며, Xcode에서 자동완성 힌트 제공
profile
iOS 개발자 지망생

0개의 댓글