본문 바로가기
iOS/Swift

Struct와 Class, Closure

by 헤콩 2020. 12. 24.
반응형

Java를 사용할 때는 Class로 객체를 만들어 사용했었는데, Swift를 사용하면서 알게 된 점은 Swift에서는 Struct와 Class가 모두 있다는 것이었습니다. 그러다 보니 어떤 차이점이 있을지 궁금해서 알아보게 되었습니다.

 

Struct와 Class 공통점

  • 프로퍼티와 메서드를 구조화해서 묶어둔 형식
  • 하나의 사용자 지정 타입을 만드는 것
  • 이니셜라이저 init을 정의해서 초기상태 지정 가능
  • 새로운 기능 추가를 위한 Extension 사용 가능
  • Protocol 사용 가능

 

Struct와 Class 차이점

먼저, Struct는 value 타입으로 할당이나 파라미터 전달 시에 value copy가 일어납니다. 항상 새로운 변수로 copy가 일어나는 점 때문에 멀티스레드 환경에서 공유 변수로 인해 문제를 일으킬 확률이 적습니다.

그리고 Stack Memory에 할당되기 때문에 속도가 빠르고, 컴파일 타임에 컴파일러가 언제 메모리를 할당/해제할지 정확히 알고 있습니다. Protocol은 사용 가능하나 상속은 불가능 하고, NSData로 Serialize가 불가능합니다.

또한, JSON 데이터를 사용할 때 Codable 프로토콜을 이용해서 손쉽게 JSON ↔️ Struct 변환이 가능합니다. (Swift4 이상)

 

반대로 Class는 Reference 타입으로 할당이나 파라미터 전달 시에 객체를 가리키고 있는 메모리 주소값만 복사됩니다. 따라서 Heap Memory 영역에 할당되어 메모리 관리할 때 신경써줘야 합니다.

NSData로 Serialize가 가능하고, Codable은 사용이 불가능합니다.

상속이 가능하고, 런타임에 타입 캐스팅을 통해 클래스 인스턴스에 따라 여러 동작이 가능합니다.

또한, 상수와 변수가 같은 인스턴스를 참조하고 있는지 비교하기 위한 식별 연산자(===)가 사용이 가능합니다.

 

참고로 Class 안에 Struct 변수를 프로퍼티로 정의하는 것이 가능하며, Struct의 프로퍼티로 Class 인스턴스 변수를 가지고 있는 것도 가능합니다. 이 경우, 해당 Struct 변수의 copy가 일어날 때 Class 인스턴스의 주소값만 복사됩니다.

 

정리

- 상속이 필요하지 않고 모델의 사이즈가 그리 크지 않다면 Struct 사용

- 해당 모델을 Serialize해서 전송하거나 파일로 저장할 일이 있다면 Class 사용

- 해당 모델이 Obj-C에서도 사용되어야 한다면 Class 사용

반응형

댓글