공통점
- 값을 저장하기 위해 프로퍼티 정의
- 기능 실행을 위해 메서드 정의
- 프로퍼티에 접근하도록 서브스크립트 정의
- 이니셜라이저 정의(구조체는 멤버와이즈)
- 익스텐션 확장 가능
- 프로토콜 채택 및 준수 가능
차이점
- 구조체 상속 X
- 타입캐스팅은 클래스 인스턴스만 허용
- 디이니셜라이즈는 클래스에만 활용
- ARC도 클래스에만 활용
값 타입 vs 참조 타입
이 둘의 가장 큰 차이는 "무엇이 전달되느냐"이다.
- 값 타입은 전달될 값이 복사
- 값 타입 데이터를 함수 파라미터로 전달하면 메모리에 전달인자를 위한 인스턴스가 새로 생성, 값이 복사되어 들어간다.
- 참조 타입은 참조(주소)가 전달
- 기존 인스턴스의 참조만 전달한다. 변수에 할당 될 때도 마찬가지다.
- 클래스 인스턴스끼리 참조가 같은지 비교할 때는 식별 연산자(===, !==)
구조체와 클래스 선택
- 다음 조건 중 하나 이상에 해당한다면 구조체를 사용하는 것을 권장
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며, 참조하는 것보다 복사하는 것이 합당할 때
- 다른 타입으로 상속받거나 자신을 상속할 필요가 없을 때
- 대다수 사용자 정의 타입은 클래스로 구현할 일이 많다.