
Swift에서 멤버 와이즈 초기화(Memberwise Initialization)는 구조체(struct)가 자동으로 제공하는 초기화 방식입니다. 구조체의 모든 저장 속성을 초기화하기 위해 별도의 초기화 메서드를 작성하지 않아도 Swift가 기본적으로 제공하는 기능입니다. 이를 통해 구조체의 인스턴스를 쉽게 생성할 수 있습니다.
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
Rectangle 구조체에는 width와 height라는 두 개의 저장 속성이 있습니다.Rectangle(width:height:)라는 초기화 메서드를 제공하므로, 별도로 init을 정의할 필요가 없습니다.width와 height 값을 설정하면서 인스턴스를 생성합니다.멤버 와이즈 초기화는 다음 조건에서 자동으로 제공됩니다:
1. 구조체에서만 자동으로 제공됩니다. (클래스는 멤버 와이즈 초기화를 제공하지 않습니다.)
2. 초기화 메서드(init)를 명시적으로 정의하지 않았을 때만 사용 가능합니다.
멤버 와이즈 초기화는 개발자가 직접 초기화 메서드를 정의하면 자동으로 제공되지 않습니다.
struct Rectangle {
var width: Double
var height: Double
// 사용자 정의 초기화 메서드
init() {
width = 0.0
height = 0.0
}
}
let rect = Rectangle() // 사용자 정의 초기화 메서드 사용
// let rect = Rectangle(width: 10.0, height: 5.0) // 오류: 멤버 와이즈 초기화가 제거됨
init() 초기화 메서드를 직접 정의하면 Swift는 더 이상 멤버 와이즈 초기화를 제공하지 않습니다.Rectangle()만 사용할 수 있으며, Rectangle(width:height:)는 사용할 수 없습니다.클래스는 멤버 와이즈 초기화를 자동으로 제공하지 않습니다. 클래스의 인스턴스를 생성하려면 반드시 초기화 메서드를 직접 정의해야 합니다.
class Circle {
var radius: Double
// 초기화 메서드 정의
init(radius: Double) {
self.radius = radius
}
}
let circle = Circle(radius: 10.0)
print(circle.radius) // 출력: 10.0
init)를 직접 작성해야 합니다.구조체의 속성에 기본값(default value)를 설정하면, 멤버 와이즈 초기화에서 해당 속성을 생략할 수 있습니다.
struct Rectangle {
var width: Double = 10.0 // 기본값 제공
var height: Double = 5.0
// 멤버 와이즈 초기화는 여전히 사용 가능
}
let rect1 = Rectangle() // 기본값 사용
print(rect1.width) // 출력: 10.0
print(rect1.height) // 출력: 5.0
let rect2 = Rectangle(width: 15.0) // 일부 속성만 초기화
print(rect2.width) // 출력: 15.0
print(rect2.height) // 출력: 5.0
Rectangle()과 같이 초기화 시 값을 생략할 수 있습니다.멤버 와이즈 초기화는 간단한 데이터 모델을 설계할 때 유용합니다. 예를 들어:
struct User {
var username: String
var age: Int
var isActive: Bool = true // 기본값 제공
}
let user1 = User(username: "Alice", age: 25)
print(user1.isActive) // 출력: true
let user2 = User(username: "Bob", age: 30, isActive: false)
print(user2.isActive) // 출력: false
| 특징 | 구조체 | 클래스 |
|---|---|---|
| 멤버 와이즈 초기화 제공 | ✅ 자동 제공 | ❌ 직접 정의 필요 |
| 기본값 사용 가능 | ✅ 기본값을 활용한 초기화 가능 | ✅ 기본값 활용 가능, 하지만 직접 정의 필요 |
| 상속 지원 | ❌ 상속 불가 | ✅ 상속 가능, super.init 필요 |