Jupyo's Daily Story
@StateObject 본문
@StateObject 는 객체의 상태를 관리하고, 뷰가 그 상태를 감시하며 자동으로 UI를 업데이트하는 데 사용되는 중요한 프로퍼티 래퍼입니다. 특히 새로운 객체를 생성하고 해당 객체의 수명 주기를 뷰가 소유할 때 사용됩니다. @StateObject 는 SwiftUI가 객체의 생명 주기를 관리할 수 있게 해주며, 뷰가 다시 랜더링될 때 객체가 재생성되지 않도록 합니다.
@StateObject란 무엇인가?
@StateObject 는 SwiftUI에서 클래스 타입의 상태를 관리할 때 사용하는 프로퍼티 래퍼입니다. 이는 주로 ObservedObject 프로토콜을 채택한 클래스를 감시하며, 해당 객체의 상태가 변경될 때 UI를 자동으로 업데이트하는 역할을 합니다.
특징
- 뷰가 객체를 소유하고 그 객체의 상태를 관리합니다.
- 객체의 생명 주기가 뷰와 함께 유지되며, 뷰가 다시 랜더링될 때 객체가 재생성되지 않습니다.
- 뷰가 사라지면 객체도 함께 메모리에서 해제됩니다.
@StateObject 사용 이유
@StateObject 는 새로운 객체를 처음으로 생성할 때 사용됩니다. @ObservedObject 와 혼동할 수 있지만, @StateObject 는 뷰가 객체를 소유하는 경우에만 사용해야 하며, 객체를 전달받아 감시하는 경우에는 @ObservedObject 를 사용합니다.
- @StateObject: 뷰에서 생성된 객체를 관리합니다.
- @ObservedObject: 다른 곳에서 전달받은 외부 객체를 감시할 때 사용합니다.
사용 예시
아래 예시는 @StateObject 를 사용해 ViewModel 객체를 뷰에서 직접 생성하고 관리하는 코드입니다.
import SwiftUI
import Combine
class CounterViewModel: ObservableObject {
@Published var count = 0
func increment() {
count += 1
}
}
struct ContentView: View {
@StateObject private variable viewModel = CounterViewModel()
var body: some View {
VStack {
Text("Count: \(viewModel.count)")
.padding()
Button(action: {
viewModel.increment()
}) {
Text("Increment")
}
}
}
}
- CounterViewModel: ObservableObject 를 채택한 클래스이며, @Published 프로퍼티인 count 가 변할 때 뷰가 자동으로 업데이트됩니다.
- ContentView: @StateObject 를 사용해 viewModel 을 생성하고, 이를 통해 count 를 증가시키는 로직을 구현합니다.
@StateObject 를 사용하면 viewModel 은 뷰가 처음 생성될 때 한 번만 초기화되며, 뷰가 다시 렌더링되더라도 객체는 재사용됩니다.
@StateObject와 @ObservedObject 의 차이
프로퍼티 래퍼 | 사용 시점 | 객체 생성 및 소유 여부 |
@StateObject | 뷰에서 객체를 직접 생성하고 관리할 때 사용 | 뷰가 객체를 생성하고 소유 |
@ObservedObject | 외부에서 전달받은 객체를 감시할 때 사용 | 객체가 다른 곳에서 생성됨 |
메모리 관리
@StateObject 는 객체의 생명 주기를 SwiftUI가 관리하도록 도와주며, 뷰가 사라질 때 객체도 함께 메모리에서 해제됩니다. 이는 메모리 누수를 방지하고 객체가 불필요하게 오래 살아남는 것을 막아줍니다.
SwiftUI의 상태 관리에서 @StateObject 의 역할
@StateObject 는 SwiftUI의 반응형 시스템에서 중요한 역할을 합니다. 클래스 기반의 데이터를 상태로 관리할 때, 해당 클래스 객체의 수명 주기를 관리하고, 객체의 상태 변화에 따라 UI를 자동으로 업데이트합니다.
SwiftUI에서는 뷰가 상태에 의해 정의되며, 이 상태는 데이터의 변화를 UI에 반영하게끔 설계되어 있습니다. 이를 위해 클래스 타입의 데이터는 @StateObject 나 @ObservedObject 로 감시되며, 상태 변화에 따른 UI 업데이트가 자동으로 처리됩니다.
주의사항
- @StateObject 는 객체를 처음으로 생성하고 관리할 때 사용됩니다. 이미 생성된 객체를 다른 뷰에서 받아서 사용할 때는 @ObservedObject 를 사용해야 합니다.
- @StateObject 로 관리하는 객체는 뷰가 다시 렌더링될 때 재생성되지 않으며, 처음 한 번만 생성됩니다.
결론
@StateObject 는 SwiftUI에서 클래스 기반 상태를 관리하는 데 중요한 도구로, 뷰가 직접 객체를 생성하고 그 생명 주기를 관리할 때 사용됩니다. 이를 통해 SwiftUI에서는 객체의 상태 변화에 따라 UI가 자동으로 업데이트되며, 효율적으로 상태를 관리할 수 있습니다.
요약 정리
- @StateObject 는 클래스 기반 객체를 생성 및 관리할 때 사용하는 프로퍼티 래퍼입니다.
- 뷰의 생명 주기에 따라 객체가 관리되며, 뷰가 사라지면 객체도 해제됩니다.
- 반응형 UI를 구현하는 데 필수적인 상태 관리 도구로, 객체의 상태가 변경될 때 UI를 자동으로 업데이트합니다.
'SwiftUI' 카테고리의 다른 글
@ObservedObject (0) | 2024.09.21 |
---|---|
@Binding (2) | 2024.09.16 |
ObservableObject (0) | 2020.10.15 |
@State (0) | 2020.10.15 |
@EnvironmentObject (0) | 2020.10.14 |