SwiftUI/SwiftUI 문법

[SwiftUI] @Published, @ObservedObject 알아보기

hyunjuntyler 2023. 5. 20. 14:26

시작하기에 앞서...

이 글은 @Published, @ObservedObject 을 아주~ 간단하게 설명한 글이다. 기본적인 것부터 알아두고 심도있게 들어가는것이 맞는 것 같다. (Combine 프레임워크, ViewModel... 등 공부가 필요하다)

@Published

우선 @Published 에 대해서 간단하게 설명해보자. 우선 단어에 답이 있다. Publish 라는 단어의 뜻은 출판, 발행하다라는 뜻이 있다. @Published 를 통해 선언한 변수는 어딘가에 발행하거나 알려주는 그런 역할을 한다는 느낌? 을 가지면 좋다.

그렇다면 한번 코드를 통해 예시를 보자. 아래와 같이 Count 라는 class 를 만들어 주었다. 이 클래스는 count 라는 변수를 선언하고, plus() 라는 함수는 count 라는 변수에 1 을 더해주는 기능을 한다.

자 count 라는 변수 앞에 @Published 를 붙여줘서 count 가 변경될 때 마다 어딘가에 알려주고 싶다. count 를 감시해주는 @Published 를 붙여보자.

오... 그렇다면 이 친구를 어떻게 다른 뷰에 전달할 수 있을까?

@ObservedObject

여기서 @ObservedObject 가 등장한다. 말그대로 관찰해준다는 뜻이다. 그리고 변경이 된다면 뷰를 업데이트 시켜준다. 그렇다면 그냥 다른뷰에 @ObservedObject 를 붙여서 한번 봐볼까?

Xcode 에서 아주 친절하게도 ObservableObject 가 필요합니다. 라는 오류 문구를 보여줬다. @ObservedObject 를 사용하려면 @Published 를 사용하고 있는 classObservableObject 프로토콜(약속)을 준수해야 한다! 그래서 ObservableObjectclass 에 넣어준다.

그렇게 되면 다른 뷰에서 @ObservedObject 로 감시할 Count() 를 선언해주고, 그 안의 count 변수를 가져올 수 있게 되었다.

그렇다면 class 를 만들어줄때 만든 plus() 함수를 버튼에 사용해보겠다.

plus 라는 버튼을 누르게 된다면 count1 을 더해주고, 이를 관찰하여 값이 변경되면 자동으로 뷰를 업데이트 시켜줘서 올라간 count 를 보여준다. 마치 앞에서 배운 @State 와 유사한 역할을 해준다.

 

결론

@Published@ObservedObject 는 한 세트이며, 사용할 때에는 ObservableObject 프로토콜을 준수해야 한다. @Published 는 선언한 변수를 알리고 @ObservedObject 는 그 알려진 변수를 받아서 뷰를 업데이트 시켜준다.