본문 바로가기
iOS/Swift

Struct and class

by BenKangKang 2020. 9. 7.

정리

Swift 의 struct 과 class 는 비슷한 역할을 한다.


Struct

1.Call by value
Stuct는 할당 또는 파라미터로 전달 될 경우 Value Copy 가 일어난다.
공유 변수로 인해 문제를 일으킬 확률이 적다.

2. Stack 메모리 영역에 할당됨
공유 변수가 아니기 때문에 스택 메모리에 할당되며, 컴파일러가 언제 메모리를 할당/헤재할지 정확히 알고 있다.
Data locality: CPU 캐시 히트율이 녿다

3. NSData 로 Serialize 불가
* 그래서

4. 상속 불가능 (프로토콜은 사용 가능)

Array, Dictionary, Struct, Int
다행히도 이러한 overhead를 막기위해서 Array, Dictionary 같이 Swift에서 제공되는 가변길이 컬렉션들은 copy-on-write4 방식의 최적화가 적용되어있다.
하지만 해당 array가 가진 데이터에 추가/삭제 등의 수정을 가하는 순간 실제 heap영역에 저장되어있던 데이터들에 대한 복사가 일어나고 (copy-on-write) 해당 array는 copy되어 새로 할당된 영역의 데이터에 대한 참조를 갖게 된다.

Class

1. Call by reference
Stuct는 할당 또는 파라미터로 전달 될 경우 메모리 주소값이 복사된다.

2. Heap 메모리
런타임에 직접 alloc 하며, referece counting 통해 dealloc 이 필요하다

3. 상속 가능


주요하게 보아야 할 것은 Call by value vs Call by reference 여부이다.

참고: class안에 struct 변수를 property로 정의하는것 가능하며, 반대로 struct의 property중 하나로 class 인스턴스 변수를 갖고있는 것도 가능하다. 이 경우 해당 struct 변수의 copy가 일어날때 class 인스턴스의 주소값만 복사된다.


쓰임새
위의 technical한 차이점들을 종합하여 정리해 봤을 때 어떤상황에 어떻게 써야하는지 간단히 룰을 만들어보면 다음과 같다.
* 상속이 필요하지 않고 모델의 사이즈가 그리 크지 않다면 struct를 사용
* JSON의 필드와 1:1 mapping되는 간단한 모델이 필요하다면 struct를 사용 (JSON대신 다른 데이터 encoder/decoder를 구현가능하지만 Swift에서는 JSON만 제공됨)
* 해당모델을 serialize 해서 전송하거나 파일로 저장할 일이 있다면 class 사용
* 해당 모델이 Obj-C에서도 사용되어야 한다면 class 사용

'iOS > Swift' 카테고리의 다른 글

Properties  (0) 2020.09.09

댓글