[Swift] class/struct 를 언제 사용할까
Class
언제 Class 사용할까? - 번역
Data Model 을 저장하고 다룰때 Class로 구현할지 Structure로 구현할지 고민하는 경우
공식문서에서는 다음과 같이 설명하고 있다.
Reference Apple Development Article - Choosing Between Structures and Classes
-
- 기본적으로 구조체를 사용해라. (Use structures by default.)
- Objective-C 하고 상호운영성(interoperability)이 필요할 때 클래스를 사용해라.
- 데이터의 identity 를 다뤄야 할 필요가 있다면 클래스를 사용해라.
- 기능 구현을 공유하고 싶다면, (클래스 간의 상속이 아니라) 구조체를 프로토콜과 함께 사용해라.언제애플 공식 문서에서는 아래와 같은 가이드라인을 제시했다.
Choose Structures by Default
일단 Structure를 써보세요
일반적인 Data를 나타낼때는 Structure를 쓰는게 좋다.
Swift Structure는 protocol을 adopt(채택) 해서 쓸 수 있다.
Use Classes When You Need Objective-C Interoperability
Objective-C로 짜인 무언가와 연관되어있다면 Class를 사용하세요
많은 Objective-C Framework들이 데이터 저장을 위한 subclass 목적으로 class를 제공한다.
Use classes when you need to control the identity of the data you’re modeling
동일성 제어가 필요하다면 클래스를 사용하세요
Modeling중인 Data가 담고있는 정보의 Identity를 우리가 직접 제어해줄 필요가 없다면, structure를 사용
Use Structures and Protocols to Model Inheritance and Share Behavior
Model 의 상속이나 sharing을 위해서는 구조체를 프로토콜과 함께 사용하세요
데이터의 identity 를 다뤄야 할 필요가 있다면 클래스를 사용하세요
Model 의 상속이나 sharing을 위해서는 Stucture + Protocol를 사용해라
⭐️ 값 타입과 참조 타입
값타입 (value type) : Structure, Enum, Tuple
참조타입(reference type) : Class, Closure
값타입과 참조타입은 메모리에 저장되는 방식에서 차이가 있다.
📌 값타입인 struct는 stack에 실제 데이터 저장 참조타입인 class는 heap에 실제 데이터가 저장 → stack에는 heap 영역의 메모리주소가 저장 따라서, 값타입은 값(실제 데이터)이 복사되어 전달되고, 참조타입은 값을 복사 하지 않고 참조(heap 영역의 주소)가 전달된다.
- Value Type 은 데이터의 새로운 복사본을 생성 ➡️ 깊은 복사 (Deep Copy)
- Reference Type 은 원본 데이터를 참조 ➡️ 얕은 복사 (Shallow Copy)
- 따라서 새로운 인스턴스의 값을 변경하면 데이터가 참조하고 있는 원본의 데이터도 함께 변경됩니다.
즉 , Struct를 사용하는 경우
- 일반적인 Data를 나타낼때는 Structure를 쓰는게 좋다.
- 연관된 몇몇의 값들을 모아서 하나의 데이터타입으로 표현하고 싶을 때,
- 다른 객체 또는 함수 등으로 전달될 때 참조가 아닌 복사를 원할 때,
- 자신을 상속할 필요가 없거나 자신이 다른 타입을 상속받을 필요가 없을 때,
- 원본 데이터를 보존해야할 때
표로 만들어보자면
| Class | struct |
| Objective-C 상호 운용성이 필요할 때 | 기본적으로 구조체 선택 |
| 동일성 제어가 필요할 때 | 동일성 제어가 필요하지 않을 때 |