구조체와 클래스?
- 구조체와 클래스는 프로그래머가 용도에 맞게 코드블럭을 만들 때 용이합니다.
- 구조체와 클래스는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질 수 있습니다. 새로운 사용자정의 데이터 타입을 만들어 주는 것입니다.
구조체와 클래스의 공통점
- 프로퍼티와 메서드를 사용해서 구조화된 데이터와 기능 을 가진다.
- 새로운 사용자 지정 타입 을 만들어 준다.
- 초기화(initializer)
init
를 정의해서 초기 상태를 설정할 수 있다.
- 확장(extention) 할 수 있다.
- 프로토콜(protocol) 사용이 가능하다.
- 서브스크립트(subscript) 사용이 가능하다.
- 프로퍼티값에 접근하고 싶다면
.
을 사용
구조체와 클래스의 차이점
1. Struct
- 값 타입(Value Type)
- call by value: 할당 또는 파라미터 전달 시 value copy가 일어난다.
- Value 이기에 multi-thread 환경에서 공유 변수로 인한 문제를 일으킬 확률이 적다.
- Stack memory 영역에 할당 (속도가 빠름). 그러나 일정 크기 이상의 struct일 경우 heap 저장됨!
- scope based lifetime: comfile time에 compiler가 언제 메모리를 할당/해제할지 정확히 알고 있다.
- data loclity: CPU 캐쉬 히트율이 높다.
- 상속 불가능 (protocol은 사용 가능)
- AnyObject로 타입캐스팅이 불가
2. Class
- 참조 타입(Reference Type)
- call by reference: 할당 또는 파라미러 전달 시 객체를 가리키고 있는 메모리 주소값이 복사됨
- Heap memory 영역에 할당 (속도가 느림)
- 런타임에 직접 allocate하며 reference counting을 통해 deallocate가 필요
- memory fragmentation등의 overhead가 존재
- 상속 가능
- 런타임에 타입캐스팅을 통해 클래스 인스턴스에 따라 여러 동작이 가능
- deinitializer 존재
구조체를 사용하는 것이 유리한 경우
- 연관된 값들의 집합을 캡슐화하는 것만이 목적 일 때
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때
- JSON의 필드와 1:1 mapping되는 간단한 모델이 필요할 때 (JSON대신 다른 데이터 encoder/decoder를 구현가능하지만 Swift에서는 JSON만 제공됨)
Enum
- enum은 관련 값의 그룹에 대한 일반적인 유형을 정의
- 각 case는 그 자체가 고유의 값
- protocols 확장을 통해 케이스를 전부 가져올 수 있음(CaseIterable)
- Associated Values
- Raw Values
- 동일한 유형의 기본 값으로 미리 지정할 수 있음
+) 값의 존재 유무에 대한 Error를 확인하는 곳이 enum은 컴파일 단계에서 알 수 있고, struct, class에서 static 상수를 만들 경우 런타임에서 확인이 가능하다.
-> enum은 instance를 생성하지 않고 값에 접근하기 떄문