Choosing Between Structures and Classes?
Apple 공식 문서
https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes
Choosing Between Structures and Classes | Apple Developer Documentation
Decide how to store data and model behavior.
developer.apple.com
디폴트로 Structures를 선택하자!
1. 구조체(struct)를 사용하는 경우
- 간단한 데이터를 담는데 사용합니다.
- 값을 복사해서 사용하고 싶을 때 사용합니다.
- 다른 타입을 상속받거나 확장할 필요가 없을 때 사용합니다.
- 값을 전달할 때 복사되는 값 의미론을 원할 때 사용합니다.
2. 클래스(class)를 사용하는 경우
- 복잡한 데이터 구조를 만들고 싶을 때 사용합니다.
- 여러 개의 인스턴스가 데이터를 공유해야 할 때 사용합니다.
- 다른 타입을 상속받거나 확장하거나 다형성을 구현해야 할 때 사용합니다.
- 참조를 전달하여 값이 공유되는 참조 의미론을 원할 때 사용합니다.
구조체는 값 복사로 전달되기 때문에 메모리 사용 면에서 일반적으로 더 효율적입니다.
반면, 클래스는 더 많은 유연성과 기능을 제공하며 복잡한 객체 모델을 관리하고 상속 및 동적 디스패치를 사용할 때 유용합니다.
구조체는 간단한 데이터를 다룰 때 사용하고, 클래스는 복잡한 데이터와 객체 지향 프로그래밍에 적합합니다.
간단한 값 복사를 원한다면 구조체를, 데이터의 공유와 상속 및 다형성을 원한다면 클래스를 선택하면 됩니다.
요약하면!!
클래스는 계층적인 관계와 공유 데이터에 적합하고, 구조체는 단순한 값 전달과 독립적인 데이터에 적합합니다.

3. 대표적인 차이점
| 클래스 | 구조체 |
| 참조 타입 (Reference Type) |
값 타입 (Value Type) |
| 힙 영역 (Heap) |
스택 영역 (Stack) |
| 편의 생성자 (Convenience init) |
멤버와이즈 이니셜라이저 (Member-wise Initializer) |
- 상속: 클래스는 다른 클래스로부터 상속을 받을 수 있지만, 구조체는 상속을 지원하지 않습니다. 클래스는 단일 상속만 가능합니다.
- 참조 타입 vs 값 타입: 클래스는 참조 타입(Reference Type)이며, 구조체는 값 타입(Value Type)입니다. 클래스 인스턴스는 참조를 통해 전달되고 공유되며, 구조체는 복사를 통해 전달되고 독립적으로 사용됩니다.
- 메모리 관리: 클래스는 Automatic Reference Counting (ARC)를 통해 메모리 관리가 이루어지고, 구조체는 별도의 메모리 관리를 요구하지 않습니다.
- Identity 연산자: 클래스는 동일성 비교를 위해 '===' 및 '!==' 연산자를 사용할 수 있지만, 구조체는 이러한 연산자를 사용할 수 없습니다.
4. 대표적인 공통점
둘 다 사용자 정의 타입이기 때문에,
값을 저장하는 프로퍼티나 기능을 제공하는 메서드를 정의해서 사용할 수 있습니다.
- 속성과 메서드: 클래스와 구조체는 속성(프로퍼티)와 메서드를 가질 수 있습니다.
- 초기화: 둘 다 초기화를 통해 인스턴스를 생성할 수 있습니다.
- 확장(Extension): 확장을 통해 클래스와 구조체에 기능을 추가할 수 있습니다.
- 프로토콜(Protocol) 준수: 클래스와 구조체는 프로토콜을 준수하여 필요한 기능을 구현할 수 있습니다.