init)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을 사용하는 이유init을 사용하면 각각 다른 값으로 설정할 수 있다brand나 year 같은 속성이 꼭 필요하다면 기본값을 줄 수 없으므로, init을 통해 반드시 초기화하도록 강제할 수 있다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) 형태의 생성자를 직접 작성하도록 제안한다
멤버와이즈 이니셜라이저란?
init을 직접 작성하지 않아도, 자동으로 속성을 초기화하는 생성자가 제공된다struct Car {
var brand: String
var year: Int
}
// ✅ 멤버와이즈 이니셜라이저 자동 제공 (자동완성에서 보임)
let myCar = Car(brand: "Hyundai", year: 2022)
init) 실행이 끝나는 시점에 모든 속성이 초기화되어 있어야 한다.nil인 상태로 남아 있으면 컴파일 오류가 발생할 수 있다.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") 형태로 출력된다=== 연산자 (식별 연산자)=== 연산자로 비교할 수 있다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 (같은 인스턴스를 참조)
==은 값 비교, ===은 메모리 주소가 같은지 비교하는 연산자이다nil로 자동 초기화되며, 값이 설정되면 Optional(...) 형태로 출력된다=== 연산자로 비교하며, Xcode에서 자동완성 힌트 제공