Struct vs Class

먼저 struct와 class의 차이점을 짚고 넘어가야 할 것 같다.
가장 먼저 떠오르는건 struct는 상속이 불가능하다는 것. 하지만 protocol로 어느정도 대체가 가능하다.
다음은 struct는 value type이고 class는 reference type 이라는 것. 하지만 ViewModel을 만들때 이것의 차이로 문제가 발생할까?

Control Identity

swift에서는 class 보다 struct를 권장한다. 다만 common한 종류의 data를 표현할때! 즉, Identity를 컨트롤할 필요가 없을때에 한정하여 struct를 선택하고 그렇지 않을 경우에는 class를 사용하는 것이 맞는 것 같다.
reference type의 특징인 instance의 동일성을 보장해야하는 경우에는 class를 사용해야하는 것이다.

reference type의 예측불가능함

일반적인 ViewController 하나에 ViewModel하나를 사용하는 경우에는 Identity를 컨트롤할 필요가 없기때문에 딱히 문제가 발생하지 않는다.
하지만 Struct로 만든 ViewModel이 reference type의 인스턴스를 갖고있는 경우에는?
해당 인스턴스의 identity를 컨트롤해야하는 경우가 생길때 우리가 예측할 수 없는 문제가 생길 수 있다.
( -> ViewController에서 ViewMode의 메소드를 이용하여 값을 업데이트할때 value type이면 원하는 값이 아닐 수 도 있다?)
ViewModel을 공유해야 한다거나 특정 로직을 공유하는 경우가 생기면 그럴때마다 Identity에 대한 컨트롤이 필요해지고 이러한 상황들을 고려하여 ViewModel은 struct보다 class를 선택하는게 프로젝트에 유연함을 더하는 방법이다.

결론

ViewController 하나에 ViewModel 하나를 사용하는 경우에는 여러 조건을 따져서 struct를 선택할 수 도 있음. 그러나 ViewModel을 공유하거나 추후 개발단계에서 확장을 고려하였을때 class가 맞는 선택일 확률이 높다.

추가

ViewModel은 Model에 저장된 Data의 바인딩이 주목적이므로 자료의 공유가 빈번하게 일어나기 때문에 class로 구현했을때의 장점인 포인터를 넘기는 방법을 사용하면 더 효율적이라는 말도 있다.

댓글남기기