본문 바로가기

SwiftUI

[SwiftUI] 데이터 흐름에 대해 알아봅시다 (3/3) (@StateObject 와 @ObservedObject 차이 / @Binding 과 @ObservedObject 차이)

 

 

 

앞선 글에서 SwiftUI 에서 사용하는 프로퍼티 래퍼에 대해 공부했지만 의문이 들었던 점이 몇가지 있어 정리하려합니다.

주관적으로 궁금했던 내용이지만 다른분들께 도움이 되면 좋겠습니다.


1. @StateObject 와 @ObservedObject 는 각각 어떤 상황에서 사용해야하는걸까?

두가지 프로퍼티 래퍼의 공통점은 SwiftUI 뷰에서 데이터의 상태를 관리하고 감시하는데 사용한다는 점입니다.

하지만, 목적과 동작에 대한 차이점이 존재합니다.

 

1-1. @StateObject

SwiftUI 뷰의 수명주기 동안 유지되는 객체입니다. 이 객체는 해당 뷰 내에서 자체적으로 생성되고 관리됩니다.

@StateObject 로 선언된 객체는 뷰의 변경 사항에 따라 새로고침되는 것이 아니라 뷰가 다시 로드될 때까지 유지됩니다.

주로 뷰 간에 데이터 공유 및 상태 관리를 위해 사용됩니다.

예제를 통해 확인해보도록 하겠습니다.

 

위 예제에서는 AppState 클래스에 ObservableObject 프로토콜을 채택하여 사용하고 있습니다.

ParentView, ChildView 두 개의 뷰가 있고 각각 @StateObject 를 사용하여 appState 인스턴스를 생성하고 있습니다.

두 뷰는 서로 다른 인스턴스인 appState 를 사용하므로 두 뷰에서 counter 를 증가시켜도 서로에게 영향을 주지 않는걸 확인할 수 있습니다. 이러한 이유는 @StateObject 는 뷰가 다시 로드될 때까지 유지되기 때문입니다.

 

1-2. @ObservedObject

@ObservedObject 는 다른 객체에서 생성된 상태(= @StateObject 로 만들어진 객체)를 관찰하고,

해당 상태가 변경될 때 뷰를 업데이트하는데 사용됩니다.

 

차이점을 정리하면

1. @StateObject 는 뷰 내에서 생성된 상태를 나타내며 해당 뷰의 수명주기와 함께 유지됩니다. 반면 @ObservedObject 는 외부 객체의 상태를 관찰하고 해당 상태의 변경을 감지하여 뷰를 업데이트 합니다.

2. @StateObject 는 뷰 내에서 자체적으로 생성되고 관리되지만, @ObservedObject 는 뷰 외부에서 생성된 객체를 사용합니다.

3. @StateObject는 뷰의 상태를 유지하고 뷰가 다시 로드될 때까지 유지되므로, 주로 뷰 내에서 상태를 관리하는데 사용 됩니다. 반면 @ObsevedObject 는 외부 데이터 모델과 상호 작용하며 데이터의 변경 사항을 뷰에 반영하는데 사용됩니다.

 


2. @Binding 과 @ObservedObject 는 각각 어떤 상황에서 사용해야하는걸까?

2-1. @Binding 특징

1. @Binding 은 양방향 바인딩을 제공하는 프로퍼티 래퍼입니다. 이를 사용하면 데이터를 읽고 수정할 수 있으며,

데이터 변경 시 뷰가 자동으로 업데이트 됩니다.

2. 주로 뷰 간 데이터 공유 및 상호 작용에 사용됩니다. 부모 뷰에서 자식 뷰로 데이터를 전달하고,

자식 뷰에서 해당 데이터를 수정할 수 있습니다.

3. Binding 은 일반적으로 뷰의 내부 상태를 나타내지 않으며 외부 데이터를 뷰로 가져오거나 다른 뷰와 데이터를 공유할 때 사용합니다.

 

2-2. @ObservedObject 특징

1.  외부 객체의 상태를 관찰하고 해당 상태가 변경될 때 뷰를 업데이트하는데 사용됩니다.

2. 외부 데이터 모델과의 상호 작용에 사용되며 데이터의 변경을 뷰에 반영하기 위해 필요합니다.

 

차이점을 정리하면

1. @Binding 은 값을 읽고, 수정이 가능한 방식으로 양방향으로 데이터를 관리합니다. @ObservedObject 외부 데이터 모델을 관찰하고 해당 데이터 모델의 변경 사항을 뷰에 반영하기 위해 사용하므로 단방향 데이터를 관리하게 됩니다.

2. @Binding 은 주로 뷰 간에 데이터를 전달하고 수정하는데 사용되며 주로 로컬 상태 관리에 적합합니다. @ObservedObject 는 외부 데이터와의 상호 작용 및 데이터 모델 관리에 사용되며, 뷰가 외부 데이터를 효과적으로 업데이트 할 수 있도록 도와줍니다.