IT

SwiftUI 상태관리 완전 정리 (@State, @Binding, @ObservedObject, @StateObject 차이)

초코모찌롤 2026. 4. 3. 09:56
반응형
SwiftUI 상태관리 완전 정리 (@State, @Binding, @ObservedObject, @StateObject 차이)

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 구현 능력이 크게 향상됩니다.

반응형