멤버 와이즈 초기화

jeongmuyamette·2025년 7월 20일

TIL

목록 보기
67/72
post-thumbnail

Swift에서 멤버 와이즈 초기화(Memberwise Initialization)구조체(struct)가 자동으로 제공하는 초기화 방식입니다. 구조체의 모든 저장 속성을 초기화하기 위해 별도의 초기화 메서드를 작성하지 않아도 Swift가 기본적으로 제공하는 기능입니다. 이를 통해 구조체의 인스턴스를 쉽게 생성할 수 있습니다.


1. 멤버 와이즈 초기화란?

  • 구조체에서 모든 저장 속성(stored properties)를 초기화하는 초기화 메서드가 자동으로 생성됩니다.
  • 개발자가 초기화 메서드를 직접 정의하지 않아도 사용할 수 있습니다.
  • 각 저장 속성에 값을 전달하여 인스턴스를 생성합니다.

2. 예제: 구조체의 멤버 와이즈 초기화

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 구조체에는 widthheight라는 두 개의 저장 속성이 있습니다.
  • Swift는 자동으로 Rectangle(width:height:)라는 초기화 메서드를 제공하므로, 별도로 init을 정의할 필요가 없습니다.
  • 멤버 와이즈 초기화를 사용하여 widthheight 값을 설정하면서 인스턴스를 생성합니다.

3. 사용 조건

멤버 와이즈 초기화는 다음 조건에서 자동으로 제공됩니다:
1. 구조체에서만 자동으로 제공됩니다. (클래스는 멤버 와이즈 초기화를 제공하지 않습니다.)
2. 초기화 메서드(init)를 명시적으로 정의하지 않았을 때만 사용 가능합니다.


4. 초기화 메서드 정의 시 멤버 와이즈 초기화 제거

멤버 와이즈 초기화는 개발자가 직접 초기화 메서드를 정의하면 자동으로 제공되지 않습니다.

예제:

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:)는 사용할 수 없습니다.

5. 클래스와 멤버 와이즈 초기화

클래스는 멤버 와이즈 초기화를 자동으로 제공하지 않습니다. 클래스의 인스턴스를 생성하려면 반드시 초기화 메서드를 직접 정의해야 합니다.

예제:

class Circle {
    var radius: Double

    // 초기화 메서드 정의
    init(radius: Double) {
        self.radius = radius
    }
}

let circle = Circle(radius: 10.0)
print(circle.radius)  // 출력: 10.0

설명:

  • 클래스에서는 멤버 와이즈 초기화를 제공하지 않으므로, 초기화 메서드(init)를 직접 작성해야 합니다.

6. 멤버 와이즈 초기화와 기본값

구조체의 속성에 기본값(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()과 같이 초기화 시 값을 생략할 수 있습니다.
  • 멤버 와이즈 초기화는 기본값을 포함하여 유연하게 동작합니다.

7. 멤버 와이즈 초기화의 장점

  1. 코드 간결성: 초기화 메서드를 작성하지 않아도 구조체의 저장 속성을 쉽게 초기화할 수 있습니다.
  2. 자동 제공: 구조체를 정의하기만 하면 Swift가 자동으로 초기화 메서드를 제공합니다.
  3. 유연성: 기본값을 설정하면 일부 속성만 초기화하거나 전체 속성을 초기화할 수 있습니다.

8. 멤버 와이즈 초기화를 활용한 구조체 설계

멤버 와이즈 초기화는 간단한 데이터 모델을 설계할 때 유용합니다. 예를 들어:

예제: 데이터 모델 설계

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

9. 클래스와 구조체의 초기화 비교

특징구조체클래스
멤버 와이즈 초기화 제공✅ 자동 제공❌ 직접 정의 필요
기본값 사용 가능✅ 기본값을 활용한 초기화 가능✅ 기본값 활용 가능, 하지만 직접 정의 필요
상속 지원❌ 상속 불가✅ 상속 가능, super.init 필요

10. 요약

  • 멤버 와이즈 초기화는 구조체에서만 자동으로 제공되는 초기화 방식입니다.
  • 구조체의 모든 저장 속성을 초기화하는 메서드를 Swift가 자동으로 생성합니다.
  • 기본값을 제공하거나 초기화 메서드를 정의하면 멤버 와이즈 초기화의 동작이 달라질 수 있습니다.
  • 클래스는 멤버 와이즈 초기화를 제공하지 않으며, 초기화 메서드를 직접 정의해야 합니다.

0개의 댓글