모야 : 제가 SwiftUI를 처음 공부하는데요, 막 앞에 @이런게 붙어서 @State, @Binding 그리고 @Environment 이 있어요. 이게 뭔가요? UIKit 공부할 땐, 이런거 본적이 없는데... ㅠㅠ
우노 : 네 SwiftUI를 사용하게 되면, 숨쉬듯이 사용하게 될 개념인데요. 이번엔 @State에 대한 개념을 먼저 잡아볼게요.
공식문서링크입니다.
https://developer.apple.com/documentation/swiftui/state
공식문서에 적힌 글을 먼저 볼까요?
A property wrapper type that can read and write a value managed by SwiftUI.
해석해보면, "SwiftUI에서 관리하는 값을 읽고 쓸 수 있는 속성 래퍼 유형입니다." 정도로 해석할 수 있겠습니다.
여기서 래퍼는 참고로 ShowMeTheMoney의 래퍼가 아닙니다.
여기서 래퍼는 "감싸다" 뜻의 랲 입니다.
"값을 관리할 수 있도록 감싸둔 유형이다" 정도로 의역할 수 있겠네요.
SwiftUI manages the storage of any property you declare as a state. When the state value changes, the view invalidates its appearance and recomputes the body. Use the state as the single source of truth for a given view.
SwiftUI는 선언한 프로퍼티들의 저장소를 관리합니다.
그 "state" 변경된다면, view의 구성된 외형은 폐기하고 다시 계산하여 구성합니다.
"state"는 view에 하나의 원천 소스로 사용해라!
해석해보면, 뭔가 감은 오는데, 설명은 못하겠는 느낌입니다.
추가로 뒤에 적힌 설명을 정리하면, 다음과 같습니다.
공식문서 설명을 듣고 드는 생각은
음... UIKit에서 여태 사용했던 didSet 같은데?
모야 : 맞아요. didSet도 값을 관찰하고 있다가, 값이 변경되면 해당 코드블럭이 실행되죠! 다만 차이가 있다면, didSet은 내부 코드블럭만 실행된다면, state는 view를 다시 아예 만들어버린다는 차이가 있는 것 같습니다.
우노 : 그러면 didSet을 활용하면 되는거 아닌가요? 왜 @State를 사용했을까요?
모야 : ... ? 감도 안잡히는데요?
우노 :
두 개의 차이점에서부터 생각해보면, 이해가 되실겁니다.
SwiftUI에서 View는 struct 이죠.
struct 에서 메소드를 만든 후, 내부의 프로퍼티를 변경하려고하면 "mutating" 임을 선언해야합니다.
우리가 사용했던 didSet은 class 내부에서 사용했다는 점과, @State 는 struct 에서 사용된다는 점이 다릅니다.
그러다보니, struct에서 값이 변경가능하고 이 값이 변경될때마다 로직을(아마 view를 그리는 활동) 변경하고 싶으니,
새로운 @State라는 개념을 도입한거죠.
생성하고나면, 해당 값을 관찰하고 + 값이 변경이 가능하도록 말이죠.
모야 : 오케이, 그러면 struct에서 didSet 역할을 유사하게 한다. 라고 받아들이면, 일단 마음은 편해지네요. 그런데, 위에서 보면 private 하게 사용하라는건 뭔말인가요?
우노 : 네, 이건 추후에 나올 @Binding, @ObservableObject, @EnvironmentObject 개념들과 함께 설명하면 좋을 것 같습니다.
일단 이렇게만 이해해두세요.
@State는 자기가 속한 View에서만 한정되는 값이다.
만약, 공유하거나 다른 view에서 접근하도록 하고 싶다면, @ObservableObject 와 @EnvironmentObject를 사용한다.
다음 글에서 이어서 작성하겠습니다!