개발삽질기/iOS

CS193P 2021 3편 정리(1) : MVVM, Struct & Class, Generic, Function

세밍_ 2023. 7. 2. 13:12
728x90
반응형

https://www.youtube.com/watch?v=--qKOhdgJAs&list=PLpGHT1n4-mAsxuRxVPv7kj4-dQYoC3VVu&index=3 

이번 시간에는 MVVM이 뭔지, Struct,Class, Generics, Function에 대해서 배웠다. 

1. MVVM이란?

스위프트UI를 사용하는 것은 곧 MVVM을 사용하는 것이라고 할 수 있다고 한다.

(유아이킷은 MVC)를 사용한다. 

MVVM은 Model - View - ViewModel로 이루어 져 있는데,

Model은 데이터와 로직을 구성한다. 

View는 화면을 나타내는 것으로, 화면의 변화는 항상 View가 확인하게 된다. 

데이터의 흐름은 Model에서 View로 흐르고, View는 body var을 통해 화면이 어떻게 보일지 선언하기 때문에 이런 종류의 코딩을 선언적이라고 말한다. 

그런데 만약 model의 변경사항이 있다면 어떻게 View가 알수 있을까? 좀 전에 데이터는 model에서 view로 흐른다고 했으니까, model의 변경사항을 view가 알아차리기 쉽지 않다. 그래서 model이 바뀔때마다 view는 매번 화면을 다시 그려야 하는 낭비가 초래될 것이다. 

그 중간에서 ViewModel이 역할을 한다. ViewModel은 model의 변화를 알아차리고, Model이 변화하였다는 것을 알리는 역할을 한다. 

만약에 view에서 사용자의 상호작용으로 데이터의 변경이 있어야 할 경우에도 view가 viewModel에 데이터를 변경하려는 호출을 하고, ViewModel이 Model에 데이터의 변경을 반영한다. 

 

2. Struct & Class

Stuct와 Class 모두 var와 let을 가질 수 있고, var 계산이 가능하며, 함수를 내부에서 사용할 수 있고, init을 사용할 수 있다. 

Struct와 Class와 다른 점은 

Struct는 값 타임인 반면에 Class는 참조 타입이라, Struct를 복사하면 복사되고 메모리가 새롭게 할당되지만, Class는 포인터를 통해 가르켜지게 된다. 그래서 복사한 Struct에 값을 변경하면 기존 Struct는 기존의 값이 유지되지만, Class는 변경된 값이 기존 Class에도 함께 변경된다. 그래서 Class는 참조 카운팅을 사용해서 힙 영역에서 얼마나 많이 참조되었는지를 살펴본다.

그런 특성으로 Struct는 함수 지향 프로그래밍이고, Class는 계속 공유하기 때문에 객체 지향 프로그래밍이다.

(ViewModel이 하나를 계속 공유하기 때문에 이것또한 클래스 기반)

그리고 Stuct는 상속이 안되고, Class는 상속이 가능하다. 

Stuct는 init 함수를 만들어주지 않아도 poperty 별로 init 할 수 있는 free init 함수가 생기지만 class는 무조건 사용자가 init을 만들어줘야 한다. 그런데 struct에도 사용자 정의 init을 만들 수 있는데, 이때는 모든 free 이니셜라이저가 사라지게 되는데, 이 경우 모든 property를 초기화 하지 않으면 오류가 생기게 된다. 

struct가 기본적으로 immutable한 구조체이기 때문에, struct의 property를 변경하는 행위는 본질적으로 그냥 struct를 새로 만드는 것과 다를 바 없다. 

Struct는 그 자체로 데이터구조라고 볼 수 있지만 Class는 공유가능한 환경이라고 볼 수 있다. 

내가 어제까지 본 것이 대부분 Stuct 구조였는데

View모델은 항상 Class가 되어야 한다. 

 

3. Generics : don't care

스위프트는 함수형 언어이기 때문에 입력자 등이 어떤 형식인지 중요한데, 그 중요성을 신경쓰고 싶지 않을때 generic을 사용한다.

그리고 generic을 사용한다면 꼭 struct나 class 명 뒤에 제너릭을 사용한다고 <>로 명시해줘야 한다.

 

4. Function as Type

Zstack에 Content를 넣었던 것처럼, Funtion을 인수로 사용할 수 있다. 

이때 inline 함수를 Clousure이라고 한다.

728x90
반응형