Class 와 Struct 의 차이와 이를 언제 쓰는지에 대한 주제는 가장 기본적이면서 중요한 내용이라고 생각합니다.
먼저 각각의 특징을 정리해보겠습니다.
Class
- 공유 개념(참조 타입) - ARC로 메모리 관리
- 상속 가능
- AnyObject 로 타입 캐스팅이 가능
- 여러 개의 변수에 할당한 뒤 값을 변경시키면 할당한 모든 변수에 영향을 줌
- init 안에는 모든 프로퍼티에 대한 초기값이 정의가 되어 있어야 함 (프로퍼티가 옵셔널일 경우 X), 메모리에서 해제되는 시점에 자동으로 호출되는 deinit 존재
- 메모리의 heap 공간에 할당
Struct
- 복사 개념(값 타입)
- 상속 불가능
- Object가 아니기 때문에 AnyObject 로 타입캐스팅이 불가능
- copy-on-write, 대입할 때 복사가 일어나는 것이 아닌, 수정이 발생할 때 값이 복사
- init 을 구현하지 않을 시 기본 initializer 사용
- 메모리의 stack 공간에 할당 (컴파일 단계에서 생성되고 사라지는 시점을 알고있음)
공통점
- 프로퍼티, 메소드를 선언 가능
- init 을 사용하여 초기 값 설정 가능
- extension 사용 가능
- Protocol 채택 가능
차이점이라면 값 타입과 참조 타입 이라는 차이점이 가장 많이 언급됩니다. 나머지 차이점들은 이 항목에 의해서 발생되는 특징이 있습니다.
Cocoa(AppKit) Cocoa Touch(UIKit) 를 다룰 때 AnyObject 를 id 로 받는 경우가 많은데 이 경우 struct 로 만들어진 값을 넘기는 것은 불가능.. 하지만 Any 의 경우는 Struct 로 만들어진 값도 캐스팅이 가능합니다.
다음은 플레이그라운드를 활용해 Class 와 Struct 의 생성 및 대입 속도를 비교해보겠습니다.