반응형
Notice
Recent Posts
Recent Comments
Link
- Today
- Total
07-26 03:19
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- Linux
- sigmoid
- 연산자
- Request
- 명령어
- rxswift
- 오블완
- scheduledTimer
- deeplearning
- ios
- struct
- r
- substr
- swiftUI
- SWIFT
- cocoapods
- tapply
- rest api
- barplot
- Observable
- 딥러닝
- 시각화
- MVC
- decode
- Python
- SQL
- 티스토리챌린지
- HTTP
- Optional
- ReLU
Archives
iOS 개발 기록 블로그
[SwiftUI] @StateObject, @ObservedObject, @EnvironmentObject 차이 비교 (chatGPT) 본문
iOS/SwiftUI
[SwiftUI] @StateObject, @ObservedObject, @EnvironmentObject 차이 비교 (chatGPT)
crazydeer 2025. 6. 25. 14:30반응형
@EnvironmentObject, @ObservedObject, @StateObject는 모두 SwiftUI에서 상태를 공유하거나 관찰할 때 사용하는 **속성 래퍼(property wrapper)**입니다. 각각의 목적과 생성/소유 관계에 따라 다르게 사용되며, 아래와 같은 차이점이 있습니다.
🔹 1. @StateObject
뷰에서 직접 생성하고 소유하는 상태 객체
- 초기화도 뷰 내부에서 직접 해야 함 (= SomeObject() 형태).
- 소유권(owner): 해당 뷰가 상태를 “소유”함.
- 의도: 해당 뷰가 객체의 라이프사이클을 책임져야 할 때 사용.
struct MyView: View {
@StateObject var viewModel = MyViewModel() // 여기서 생성
var body: some View {
Text(viewModel.title)
}
}
✅ 한 번만 생성됨 (뷰가 리렌더링돼도 새로 생성되지 않음)
🔹 2. @ObservedObject
외부에서 주입된 상태를 관찰만 함
- 초기화는 외부에서 이루어지고, 이 뷰에서는 단순히 관찰만 함.
- 소유권 없음 → 부모 뷰가 객체를 만들어 넘겨줌.
struct ChildView: View {
@ObservedObject var viewModel: MyViewModel // 외부에서 주입받음
var body: some View {
Text(viewModel.title)
}
}
✅ 부모 뷰에서 관리되는 객체를 하위 뷰에서 감시만 할 때 사용
🔹 3. @EnvironmentObject
앱 전역 또는 여러 뷰 간 공유 상태
- @ObservedObject와 비슷하지만, 전역 공유 컨텍스트에 객체가 있음.
- Environment에 미리 주입되어야 하며, 중간 뷰를 거치지 않고도 접근 가능함.
struct MyView: View {
@EnvironmentObject var viewModel: MyViewModel // 어디선가 inject 되어야 함
var body: some View {
Text(viewModel.title)
}
}
// somewhere in root view:
MyView().environmentObject(MyViewModel())
✅ 여러 뷰가 동일한 객체를 공유할 때, 또는 루트에서 하위 뷰로 전파할 때 유용
🧠 핵심 비교 요약
속성 래퍼소유 여부생성 위치전달 방식적절한 상황 예시
@StateObject | O (직접 소유) | 뷰 내부에서 직접 | 없음 | 처음 만들어 쓰는 뷰 |
@ObservedObject | X (관찰만) | 외부에서 생성 | 인자로 전달받음 | 자식 뷰에서 사용 |
@EnvironmentObject | X (공유 상태) | 외부(루트)에서 주입 | .environmentObject() 사용 | 여러 뷰에서 공유 |
📌 예를 들어
@StateObject var downloadManager = DownloadManager()
이 코드는 DownLoadView에서 DownloadManager를 직접 소유하고 관리하겠다는 뜻입니다.
→ 이 뷰가 downloadManager의 생명주기를 책임진다는 의미예요.
만약 downloadManager가 이미 부모 뷰에서 생성되었다면 @ObservedObject 또는 @EnvironmentObject가 더 적합했을 수 있습니다.
반응형
'iOS > SwiftUI' 카테고리의 다른 글
[SwiftUI] 속성 래퍼(@State 등)와 일반 프로퍼티의 차이와 사용 방법 (0) | 2025.06.26 |
---|---|
[SwiftUI] @ToolbarContentBuilder로 가독성 개선 (0) | 2024.03.14 |
[SwiftUI] 네비게이션바 알 수 없는 여백 없애버리기 (0) | 2024.03.13 |
[SwiftUI] .navigationBarBackButtonHidden() 처리 후 PopSwipeGesture 버그 수정하기 (0) | 2024.03.12 |
[SwiftUI] @Environment(\.presentationMode) 사용해서 간편하게 View dismiss 하기 (0) | 2024.03.11 |