반응형
SwiftUI 상태관리 완전 정리 (@State, @Binding, @ObservedObject, @StateObject 차이)
SwiftUI에서 가장 많이 막히는 주제는 Navigation이 아니라 사실 상태 관리(State)입니다.
특히 아래 상황에서 검색하게 됩니다.
- 값을 바꿨는데 UI가 안 바뀜
- Binding이 안 먹음
- View가 계속 초기화됨
이 글에서는 실무 기준으로 상태관리 개념을 정리합니다.
1. SwiftUI 상태관리 핵심 구조
SwiftUI는 다음 원리로 동작합니다.
State가 바뀌면 View가 다시 그려진다
따라서 상태를 어디에 두느냐가 모든 것을 결정합니다.
2. @State
View 내부에서 사용하는 가장 기본 상태입니다.
struct ContentView: View {
@State private var count = 0
var body: some View {
Button("\(count)") {
count += 1
}
}
}
- View 내부에서만 사용
- 값이 바뀌면 View 다시 렌더링
👉 가장 단순한 상태일 때 사용
3. @Binding
부모의 상태를 자식이 직접 변경할 수 있게 하는 연결입니다.
struct ParentView: View {
@State private var value = ""
var body: some View {
ChildView(text: $value)
}
}
struct ChildView: View {
@Binding var text: String
var body: some View {
TextField("입력", text: $text)
}
}
- 값을 "공유"하는 것이 아니라 "참조"하는 개념
👉 데이터 흐름: 부모 → 자식 (양방향)
4. @ObservedObject
외부 객체를 관찰하여 변경 시 View를 업데이트합니다.
class ViewModel: ObservableObject {
@Published var count = 0
}
struct ContentView: View {
@ObservedObject var vm = ViewModel()
var body: some View {
Text("\(vm.count)")
}
}
- ObservableObject 필요
- @Published로 변경 감지
👉 ViewModel 패턴에서 사용
5. @StateObject
View에서 객체를 "생성하고 유지"할 때 사용합니다.
@StateObject private var vm = ViewModel()
차이 핵심👇
- @ObservedObject → 외부에서 주입
- @StateObject → 내부에서 생성
👉 View가 다시 생성돼도 객체 유지됨
6. 가장 중요한 차이 정리
| 속성 | 용도 | 생명주기 |
|---|---|---|
| @State | 단순 값 | View 내부 |
| @Binding | 값 전달 | 부모 의존 |
| @ObservedObject | 외부 객체 | 재생성 가능 |
| @StateObject | 객체 생성 | 유지됨 |
7. 실무에서 가장 많이 하는 실수
1) @ObservedObject를 잘못 사용하는 경우
View가 다시 그려질 때마다 객체가 재생성됩니다.
👉 해결: @StateObject 사용
2) @Binding을 값 복사로 착각
Binding은 참조이기 때문에 부모 값이 직접 바뀝니다.
3) State를 너무 많이 사용하는 경우
불필요한 재렌더링 발생
8. 실무 추천 패턴
- View 내부 상태 → @State
- 부모 전달 → @Binding
- ViewModel → @StateObject
- 외부 주입 → @ObservedObject
9. 결론
SwiftUI 상태관리 핵심은 단 하나입니다.
데이터의 "소유권"이 어디에 있는가
- 내가 가진 데이터인가? → @State
- 부모 데이터인가? → @Binding
- 객체인가? → @StateObject / @ObservedObject
이 기준만 명확하면 대부분의 문제를 해결할 수 있습니다.
다음 글에서는 SwiftUI List / ScrollView 실무 문제 해결을 다루면 실제 UI 구현 능력이 크게 향상됩니다.
반응형
'IT' 카테고리의 다른 글
| SwiftUI SafeArea 완벽 이해 (layout 깨짐, NavigationBar 겹침 해결) (0) | 2026.04.03 |
|---|---|
| SwiftUI List / ScrollView 실무 문제 해결 (padding, separator, 성능까지) (0) | 2026.04.03 |
| SwiftUI NavigationStack 완전 정복 (push, pop, 딥링크까지 한 번에 해결) (0) | 2026.04.03 |
| SwiftUI Layout 성능 최적화 완벽 가이드 (0) | 2026.04.03 |
| SwiftUI alignmentGuide와 Custom Layout 완벽 이해 (0) | 2026.04.03 |