Programer/iOS

[Swift] Class와 Struct 무엇을 써야 할까요? (Class VS Struct)

아즈샤 2018. 7. 5. 11:48
반응형

서론: 데이터는 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/

반응형