BIBI BLOG
SwiftUI가 Struct를 사용하여 뷰를 정의하는 이유 본문
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
'iOS > Swift' 카테고리의 다른 글
Swift Style Guide: 애플 스타일로 작성하는 방법:Part 1📝 (1) | 2025.02.26 |
---|---|
Swift 6의 새로운 동시성(Concurrency) 기능 이해하기 🚀 (0) | 2025.02.24 |
[Swift] @frozen 속성: 더 안정적이고 빠른 코드 만들기 (0) | 2025.02.20 |
[Swift 6.0] Protocol Extensions: 더 강력해진 POP 🚀 (0) | 2025.02.18 |
Swift 네이밍 규칙 (0) | 2023.11.08 |