반응형
Notice
Recent Posts
Recent Comments
Link
Today
Total
07-26 03:19
«   2025/07   »
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
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가 더 적합했을 수 있습니다.

 


 

반응형