서론: 데이터는 Class로 설계하는 것이 정석인가?
- 저는 예전에는 JAVA를 즐겨 사용했기 때문에 OOP에 익숙해져있었습니다.
- Swift로 개발을 할 때에도 대부분 Class를 사용해서 구현을 했습니다. 데이터를 설계할 때 정석처럼 느껴져왔기 때문이죠. (상속을 통한 모듈화)
- 하지만 최근 Class보다 Struct를 더 사용해야한다는 것을 알게 되었고, 더 나아가 Functional Programing(FP), Reactive까지 알게되었습니다.
본론: 그럼 Class 와 Struct 는 뭐가 다를까?
- Struct는 Class 보다 비교적 작고 비교가능합니다. ( = Value Type 입니다.)
이러한 특징은 여러 참조가 같은 인스턴스를 가르키고 있는 Class보다 더 안전합니다.
특히, Struct는 멀티쓰레딩 프로그래밍에서 여러 쓰레드에서 작업을 한다하더라고 값 복사 형식으로 전달 되기 때문에, 다른 곳에서 값이 변하는 것을 걱정하지 않아도 됩니다.
- Class는 상속으로 인해 불필요한 큰 Super Class를 상속을 할 수 있습니다.
Class는 Super Class의 단일 상속으로 불필요한 기능들을 상속받고, 불필요한 관계를 형성하게 됩니다.
그로인해 Class는 동적할당이나 해제, 래퍼런스 카운팅을 통해 많은 리소스를 소모하게됩니다.
그리고 인해 Swift는 Protocol 를 사용하여 Struct를 사용하는 것을 추천하고 있습니다. (물론, Protocol는 Class, Struct, Enum 모두 사용 가능합니다.)
(이러한 Swift의 특징은 OOP를 사용하는 것 보다 POP를 통해 Value Type를 사용 하는 것이 더 효율적입니다.)
- 그러면 Swift에서는 효율이 좋은 Struct만 써야 할까?
다음과 같은 경우에는, Class를 사용하는 것이 더 유리합니다.
- 값 복사나 값 비교가 상식적으로 필요하지 않는 경우 (예: Window)
- 라이프 타임이 외부 효과에 따라 묶여있는 경우 (예: Temporary File)
- 연결된 외부 상태와 싱크를 위한 경우 (예: CGContext)
좀 더 예를 들자면 UI 화면에서 테이블 뷰와 컬랙션 뷰를 둘 다 지원하고 싶다면, 데이터를 Class로 묶어서 싱글턴으로 싱크할 수 있습니다.
결론: 이제는 Class만 아닌 Struct를 고민해야 할 때
사실 Class를 써야 할지, Struct를 써야 할지 고민을 할 때에는 값 복사, 값 비교를 사용할 것인지 아닌지를 생각하며 결정해야합니다.
(또한 여러가지 의견이 있겠지만, 너무나 애매해서 고민이 된다면 Struct를 쓰는 것이 좋다고 생각합니다.)
즉, 현실세상에서의 영향을 생각하며, Struct 로 구현할 것인지 Class로 구현할 것인지 결정해야 합니다.
참고링크
https://stackoverflow.com/questions/24232799/why-choose-struct-over-class
https://academy.realm.io/kr/posts/protocol-oriented-programming-in-swift/
https://academy.realm.io/kr/posts/letswift-swift-performance/
'Programer > iOS' 카테고리의 다른 글
[FP] 함수 & 고차함수 vs 클로저 (0) | 2018.07.12 |
---|---|
[FP] Functional Programing 용어 정리 (0) | 2018.07.10 |
[Tip] iOS 세미나, 밋업 정보 (0) | 2018.06.04 |
[Tip] Apple MDM / 엔터프라이즈 계정 관련 (0) | 2018.02.05 |
[Tip] iOS 기기 고유 식별 값을 사용하고 싶을 때 (UUID, App Groups) (0) | 2017.11.06 |