STUDY/Swift & iOS

EnvironmentObject, StateObject

sinawi95 2025. 2. 22. 18:06
728x90

Generated by Grok 3


 

안녕하세요! SwiftUI에서 ContentView를 작성하면서 @EnvironmentObject@StateObject를 사용하는 상황에 대해 궁금하신 것 같아요. 이 두 속성 래퍼(Property Wrapper)는 객체를 관리하고 의존성을 주입하는 데 사용되지만, 목적과 동작 방식에서 차이가 있습니다. 아래에서 차이점을 자세히 설명드릴게요.

 


1. @StateObject

 

  • 정의: @StateObject는 SwiftUI 뷰가 소유하고 관리하는 객체를 생성하고 유지하는 데 사용됩니다. 주로 뷰 내부에서 초기화된 ObservableObject를 저장하며, 뷰의 생명 주기와 연결됩니다.
  • 주요 특징:
    • 뷰가 처음 생성될 때 한 번만 객체를 초기화합니다.
    • 뷰가 재렌더링되더라도 객체가 새로 생성되지 않고 유지됩니다.
    • 객체가 뷰에 "소속"된다는 느낌으로, 뷰가 사라지면 해당 객체도 함께 소멸됩니다.
  • 사용 시기: 뷰가 자체적으로 관리해야 하는 데이터 모델이나 ViewModel을 생성할 때 적합합니다.

2. @EnvironmentObject

 

  • 정의: @EnvironmentObject는 뷰 계층 구조 상위에서 주입된 객체를 하위 뷰에서 사용하는 데 활용됩니다. 뷰가 직접 객체를 생성하거나 소유하지 않고, 외부에서 제공받은 객체를 참조합니다.
  • 주요 특징:
    • 객체는 뷰 외부(예: 앱의 루트나 부모 뷰)에서 생성되고 .environmentObject()로 주입됩니다.
    • 뷰 계층 내 어디서나 접근 가능하며, 객체를 공유하는 데 유용합니다.
    • 객체가 없으면 런타임 크래시가 발생하니 반드시 상위에서 주입해야 합니다.
  • 사용 시기: 여러 뷰에서 동일한 객체를 공유해야 할 때, 특히 앱 전역 상태나 ViewModel을 전달할 때 적합합니다.

주요 차이점 정리


특성@StateObject@EnvironmentObject

객체 생성 뷰 내부에서 생성 뷰 외부에서 생성 및 주입
소유권 뷰가 객체를 소유 뷰는 소유하지 않고 참조만 함
생명 주기 뷰와 함께 생성/소멸 상위에서 관리되며 뷰와 독립적
사용 목적 뷰 전용 데이터 관리 여러 뷰 간 데이터 공유
초기화 필요 여부 직접 초기화 필요 (= TamagochiViewModel()) 초기화 불필요, 외부에서 제공받음
실패 시 동작 해당 없음 객체가 주입되지 않으면 크래시 발생

 


결론

@StateObject: 뷰가 독립적으로 객체를 소유하고 관리할 때.

@EnvironmentObject: 상위에서 객체를 주입받아 뷰 간 공유할 때.