IOS개발: SWIFT/6. Swift UI로 UI 개발하기

SwiftUI 데이터 바인딩: StateObject, ObservableObject

_Blue_Sky_ 2024. 9. 14. 14:45
728x90

SwiftUI 데이터 바인딩: StateObject와 ObservableObject 심층 분석

SwiftUI에서 데이터 바인딩은 뷰와 데이터를 연결하여, 데이터가 변경될 때마다 뷰가 자동으로 업데이트되는 중요한 기능입니다. 이를 위해 주로 사용되는 프로퍼티 래퍼가 @State, @Binding, @ObservedObject, @StateObject 입니다. 오늘은 그 중에서도 @ObservedObject@StateObject에 대해 좀 더 자세히 알아보고, 예시를 통해 차이점을 명확히 설명해 드리겠습니다.

ObservableObject 프로토콜

먼저 ObservableObject 프로토콜에 대해 알아볼까요? 이 프로토콜을 채택한 클래스는 SwiftUI에서 관찰 가능한 객체가 되어, 해당 객체의 프로퍼티 값이 변경될 때마다 SwiftUI는 자동으로 뷰를 다시 그립니다. 즉, 데이터와 UI를 연결하는 중요한 역할을 수행합니다.

class User: ObservableObject {
    @Published var name = "John Doe"
    @Published var age = 30
}
 

위 예시에서 User 클래스는 ObservableObject를 채택하고 있으며, nameage 프로퍼티는 @Published 속성을 사용하여 변경 사항을 SwiftUI에 알립니다.

@ObservedObject와 @StateObject

@ObservedObject

  • 외부에서 생성된 객체 관찰: 다른 곳에서 생성된 ObservableObject 인스턴스를 뷰에서 참조하고 싶을 때 사용합니다.
  • 뷰 라이프사이클에 독립적: 뷰가 사라지더라도 객체는 계속 유지됩니다.
  • 부모-자식 뷰 간 데이터 공유: 부모 뷰에서 ObservedObject를 생성하고 자식 뷰에서 이를 참조하여 데이터를 공유할 수 있습니다.
struct ContentView: View {
    @ObservedObject var user = User()

    var body: some View {
        Text("Hello, \(user.name)!")
    }
}
 

위 예시에서 ContentViewUser 객체를 @ObservedObject로 선언하여 관찰하고 있습니다. user.name의 값이 변경되면 뷰가 자동으로 업데이트되어 "Hello, [새로운 이름]!"으로 표시됩니다.

@StateObject

  • 뷰 내부에서 생성된 객체 관찰: 뷰 내부에서 ObservableObject 인스턴스를 생성하고 싶을 때 사용합니다.
  • 뷰 라이프사이클과 동일: 뷰가 사라지면 객체도 함께 소멸됩니다.
  • 해당 뷰 내부에서만 사용: 다른 뷰에서는 해당 StateObject에 접근할 수 없습니다.
struct ContentView: View {
    @StateObject private var user = User()

    var body: some View {
        Text("Hello, \(user.name)!")
    }
}
 

위 예시에서 user 객체는 ContentView 내부에서 생성되고, @StateObject로 선언되어 뷰의 라이프사이클과 동일하게 관리됩니다.

언제 어떤 것을 사용해야 할까요?

  • @ObservedObject:
    • 다른 뷰에서도 사용해야 하는 데이터를 관리할 때
    • 뷰 사이에서 데이터를 공유해야 할 때
    • 뷰의 라이프사이클에 독립적인 데이터를 관리해야 할 때
  • @StateObject:
    • 해당 뷰에서만 사용하는 데이터를 관리할 때
    • 뷰의 라이프사이클과 함께 생성하고 소멸시켜야 할 때
    • 데이터 소유권을 명확히 하고 싶을 때

결론

@ObservedObject@StateObject는 SwiftUI에서 데이터 바인딩을 구현하는 데 필수적인 도구입니다. 각각의 특징을 잘 이해하고 적절하게 사용하면 더욱 효율적이고 안정적인 SwiftUI 앱을 개발할 수 있습니다.

핵심 정리:

  • ObservableObject는 SwiftUI에서 관찰 가능한 객체를 만드는 프로토콜입니다.
  • @ObservedObject는 외부에서 생성된 ObservableObject 인스턴스를 뷰에서 참조할 때 사용합니다.
  • @StateObject는 뷰 내부에서 ObservableObject 인스턴스를 생성하고 관리할 때 사용합니다.
  • 각 프로퍼티 래퍼의 특징을 이해하고, 사용하는 상황에 맞게 적절하게 선택해야 합니다.
728x90