Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

Jupyo's Daily Story

@StateObject 본문

SwiftUI

@StateObject

JangJupyo 2020. 10. 15. 18:30
728x90
반응형

@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