SwiftUI에서는 상태를 관리하기 위해 @StateObject
와 @ObservedObject
라는 두 가지 속성을 사용합니다. 그러나 이 둘의 차이를 명확히 이해하지 않으면 의도하지 않은 동작이 발생할 수 있습니다. 이번 글에서는 이 두 개념을 비교하고, 적절한 예제와 함께 설명하겠습니다.
@StateObject: 뷰가 직접 생성하고 관리하는 객체
@StateObject
는 SwiftUI에서 뷰의 생명주기 동안 유지해야 하는 객체를 생성할 때 사용됩니다.
class ArticleFetcher: ObservableObject {
@Published var articles: [String] = []
}
struct ArticleListView: View {
@StateObject private var articleFetcher = ArticleFetcher()
var body: some View {
List(articleFetcher.articles, id: \ .self) { article in
Text(article)
}
}
}
위 코드에서는 articleFetcher
객체가 @StateObject
로 선언되었기 때문에 ArticleListView
가 다시 렌더링되더라도 동일한 인스턴스를 유지합니다.
@ObservedObject: 외부에서 주입받는 객체
반면, @ObservedObject
는 다른 뷰에서 생성된 객체를 전달받아 사용하는 경우에 적합합니다.
struct ArticleListView: View {
@ObservedObject var articleFetcher: ArticleFetcher
var body: some View {
List(articleFetcher.articles, id: \ .self) { article in
Text(article)
}
}
}
이제 부모 뷰에서 객체를 생성하여 전달하면 됩니다.
struct ContentView: View {
@StateObject private var articleFetcher = ArticleFetcher()
var body: some View {
ArticleListView(articleFetcher: articleFetcher)
}
}
언제 사용해야 할까?
- 뷰에서 직접 생성하는 객체는
@StateObject
- 부모에서 생성한 객체를 자식 뷰에서 사용할 때는
@ObservedObject
이 차이를 이해하면 SwiftUI에서의 상태 관리를 보다 효과적으로 할 수 있습니다.