BIBI BLOG

SwiftUI가 Struct를 사용하여 뷰를 정의하는 이유 본문

iOS/Swift

SwiftUI가 Struct를 사용하여 뷰를 정의하는 이유

BIBI⭐️ 2025. 2. 22. 15:25
728x90

SwiftUI가 Struct를 사용하여 뷰를 정의하는 이유

SwiftUI는 Apple이 만든 최신 UI 프레임워크로, UIKit과는 다른 방식으로 동작합니다. 그중 가장 큰 차이점 중 하나는 View를 클래스가 아니라 Struct(구조체)로 정의한다는 점입니다.

이 글에서는 SwiftUI에서 Struct를 사용하는 이유그로 인한 장점을 쉽게 설명하고, 예제 코드를 통해 개념을 더욱 명확하게 알아보겠습니다.


1. Struct가 Class보다 빠르고 가볍다! (성능 & 효율성)

Struct는 Class보다 가볍고 빠른 데이터 타입입니다.

Class는 메모리에 객체(Instance)를 저장하고, 새로운 객체를 만들 때마다 추가적인 관리 비용이 발생합니다.
Struct는 단순한 데이터 묶음이기 때문에, 생성하고 제거하는 과정이 훨씬 효율적입니다.

📌 예제 코드

struct ContentView: View {
    var body: some View {
        Text("Hello, SwiftUI!")
    }
}

✅ ContentView는 가벼운 Struct이므로, SwiftUI가 필요할 때 빠르게 만들고 없앨 수 있습니다.
수천 개의 뷰도 문제 없이 빠르게 생성할 수 있습니다.


2. Struct는 값 타입이라 안정적이다! (Value Semantics)

Struct는 값 타입(Value Type)이기 때문에, 같은 Struct라도 복사본을 만들면 서로 영향을 주지 않습니다.
반면, Class는 참조 타입(Reference Type)이기 때문에 하나의 객체를 여러 변수가 공유하면 예상치 못한 상태 변화가 발생할 수 있습니다.

📌 예제: Struct 복사하기

struct CounterView: View {
    var count: Int

    var body: some View {
        Text("Count: \(count)")
    }
}

let view1 = CounterView(count: 1)
var view2 = view1
view2.count = 2

print(view1.count) // 1
print(view2.count) // 2

✅ view1과 view2는 서로 독립적인 값이므로, view2의 count를 바꿔도 view1은 그대로입니다.
✅ 이 특성 덕분에, SwiftUI는 안전하게 뷰를 업데이트할 수 있습니다.


3. 상태 관리(State Management)에 적합하다! (Immutability & State)

Struct의 속성은 기본적으로 불변(immutable)입니다.
즉, 뷰를 직접 수정하지 않고 상태(State)를 따로 관리하면, SwiftUI가 변경 사항을 감지하여 필요한 부분만 업데이트할 수 있습니다.

📌 예제: @State를 활용한 상태 관리

struct StateExampleView: View {
    @State private var isOn: Bool = false

    var body: some View {
        Toggle("Toggle me", isOn: $isOn)
    }
}

✅ @State 속성을 사용하면 값을 변경할 때마다 SwiftUI가 자동으로 화면을 갱신합니다.
✅ Struct는 직접 값을 변경할 수 없지만, 상태(State) 관리 변수를 활용하면 깔끔한 코드가 됩니다.


4. Struct는 더 유연한 UI 설계를 가능하게 한다! (Composition over Inheritance)

✅ Struct는 상속(Inheritance)을 지원하지 않지만, 대신 구성(Composition)을 활용하여 더 모듈화된 UI를 만들 수 있습니다.

📌 예제: 뷰 컴포넌트 분리하기

struct HeaderView: View {
    var body: some View {
        Text("Header")
            .font(.largeTitle)
    }
}

struct ContentView: View {
    var body: some View {
        VStack {
            HeaderView()
            Text("Content")
        }
    }
}

✅ HeaderView와 ContentView를 각각 독립적인 Struct로 분리하면, 재사용성이 증가하고 코드가 깔끔해집니다.


5. SwiftUI는 선언형(Declarative) UI 방식이다!

SwiftUI는 UIKit처럼 하나하나 수동으로 UI를 그리는 방식이 아니라,
👉 "이렇게 보이면 된다"라고 선언하는 방식(Declarative UI)입니다.

이 방식은 Struct와 잘 어울립니다.

✅ Struct는 상태를 기반으로 화면을 "그려주기만" 하면 되기 때문입니다.

📌 예제: 선언형 UI 방식

struct DeclarativeView: View {
    var body: some View {
        VStack {
            Text("Welcome to SwiftUI")
                .font(.headline)
            Text("This is a declarative UI framework")
        }
    }
}
 

✅ 코드의 흐름이 "어떻게 그릴지"보다 "어떤 상태에서 어떻게 보일지"를 선언하는 방식입니다.
✅ SwiftUI는 Struct 기반의 선언형 UI가 최적화된 방식입니다.


Struct의 추가적인 장점!

💡 1. 더 안전한 멀티스레드 환경(Thread Safety)
👉 값 타입이기 때문에 여러 스레드에서 접근해도 안전합니다.

💡 2. Swift 언어 자체가 Struct 중심
👉 Swift는 Struct 사용을 권장하며, 기본적으로 값 타입이 더 효율적입니다.

💡 3. 메모리 관리가 쉬움
👉 Struct는 ARC(자동 참조 카운팅)가 필요 없음메모리 관리 부담이 적음


그럼 Class는 언제 사용해야 할까?

SwiftUI에서는 대부분 Struct가 적합하지만, 특정 경우에는 Class도 필요합니다.

클래스를 사용하는 경우

1️⃣ 뷰 모델(ViewModel)을 만들 때

  • ObservableObject를 사용하려면 Class가 필요합니다.
  • State 변화를 감지하고 공유할 때 유용합니다.

2️⃣ 상속이 필요한 경우

  • Struct는 상속을 지원하지 않으므로, 클래스를 사용해야 할 때가 있습니다.

3️⃣ Objective-C와 연동이 필요한 경우

  • Struct는 Objective-C와 호환되지 않으므로, 필요하면 Class를 사용해야 합니다.

📌 예제: ObservableObject를 활용한 상태 관리

class CounterModel: ObservableObject {
    @Published var count = 0
}

struct CounterView: View {
    @ObservedObject var model: CounterModel

    var body: some View {
        VStack {
            Text("Count: \(model.count)")
            Button("Increment") {
                model.count += 1
            }
        }
    }
}

✅ CounterModel은 Class 기반의 ObservableObject이며,
✅ CounterView는 이 상태를 감지하여 화면을 업데이트합니다.


결론: Struct가 SwiftUI에 적합한 이유!

빠르고 가벼운 구조
값 타입이라 안정적
상태 관리가 쉬움
컴포넌트화가 간편함
선언형 UI 방식과 잘 어울림

SwiftUI의 Struct 기반 설계는 더 직관적이고 효율적인 UI 개발을 가능하게 합니다! 🚀✨

👉 더 자세한 자료
📌
Why does SwiftUI define views using Struct?
📌 Hacking with Swift - Struct vs Class in SwiftUI
📌 Apple 공식 문서 - Struct vs Class

728x90
Comments