상세 컨텐츠

본문 제목

[Let's discuss] ViewModel은 struct? class? 어떤 걸 사용해야 할까?

iOS 캐기/Swift 캐기

by Atlas 2022. 7. 20. 00:45

본문

728x90
반응형

시나리오 : MVVM 아키텍처 예제를 찾아보던 중  특정 예제에서 struct로 뷰모델을 만드는 걸 보게 되었고, 왜 뷰모델을 struct로 만들었을까? 하는 의문에서 시작!

 

https://ko.wikipedia.org/wiki/모델-뷰-뷰모델

 

모델-뷰-뷰모델 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

위키백과를 통해 뷰모델 설명에서 "공용!" 이라는 표현을 볼 수있다. 

그렇다 뷰모델은 View - ViewModel의 관계에서 상황에따라 (1:N) (N:1) (N:N)를 가질 수 있어 데이터가 공유될 수 있다는 점을 짚고 넘어가자 (View-ViewModel 관계에 대해서는 더 스터디하고 정리해보겠습니다.)

 

ViewModel의 사용목적부터 정의를 해보면,

 

View로부터 독립적이고 , View가 필요로 하는 데이터만을 소유 

이로 인한 기대효과는 유지보수, 재사용성, 테스트 등의 용이성 이 되겠다.

 

그.렇.다.면 

 

class로 사용해야하는 이유 

어떤 데이터가 공유되려면 힙영역에 존재해야한다. 

  -> 뷰모델은 관찰대상임으로 스택영역에 있으면 관찰이 되지 않는다.

 

struct를 뷰모델로 사용하지 못하는 이유 

멀티쓰레딩 환경에서 스택과 스택간의 공유가 되지않는다 (멀티쓰레딩 환경을 고려하지 않아도 된다면?)

 

멀티쓰레드를 사용하게 되면 힙영역을 이용하여 데이터를 주고 받을 수 있다.

(멀티쓰레드에서는 스택영역만 공유되지 않는다.)

 

애플 공식사이트를 통해서도 정보를 얻을 수 있다. 

 

 

간단하게 정리를 해보자면 

struct의 경우 복사의 개념으로 참조하는 값이 바뀌어도 기존 값에는 영향이 없고

class의 경우 공유의 개념으로 참조하는 값이 바뀌면 기존값도 영향을 받기 때문에 이 부분을 염두에 두고 사용해야 한다는 것! 

 

 

마무리

- ViewModel의 사용목적을 다시 꼼꼼히 찾아보면서 + 나의 경험을 비추어 보니 Class로 사용하는게 좀 더 사용목적에 맞을거 같다는 생각이다.

- 관련해서 다른 의견이 있다면 언제든 환영입니다. 미리 감사의 말씀드립니다. 

 

참조사이트: 

https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes

 

Apple Developer Documentation

 

developer.apple.com

관련글 추천!

https://artieee.tistory.com/15

 

[Swift] SwiftUI에서는 왜 뷰에 struct를 사용할까?

시나리오 : 프로젝트 생성시 interface를 SwiftUI로 선택하면 기본 뷰가 struct로 생성되어 있는 것을 확인할 수 있음. 기존에 Storyboard를 선택하고 생성하게 되면 class로 생성되어 있는데 왜 SwiftUI에서

artieee.tistory.com

 

 

반응형

관련글 더보기

댓글 영역