Struct는 값타입으로
•
Struct 인스턴스를 할당하거나 전달할 때 해당 값이 복사 된다. 다른 변수나 상수에 할당하면 원본과는 별도의 복제본이 생성된다.
Class는 참조타입으로
•
Class 인스턴스를 할당하거나 전달할 때 실제 객체에 대한 참조(메모리 주소)가 전달 된다. 다른 변수나 상수에 할당할 때 복사본이 생성되지 않으며, 모두 같은 객체를 가리킨다.
상속
•
Struct는 상속을 지원하지 않는다.
•
Class는 상속을 지원하며 하위 클래스(subclass)를 정의하여 기본 클래스(superclass)의 특성과 메서드를 확장하거나 재정의 할 수 있다.
참조 (Reference)
•
Struct는 참조 계수를 사용하지 않으며 값 타입이므로 복사본을 다룬다. 메모리 관리에 대한 걱정이 없다.
•
Class는 참조 계수를 사용하여 메모리를 관리한다. 여러 객체가 동일한 인스턴스를 참조할 수 있고, 참조가 더 이상 없을 때 메모리가 자동으로 해제되는데, 메모리 누수를 방지하고 객체의 수명을 관리하는 데 도움이된다.
가변성(Mutability)
•
Struct는 값이 한 번 생성되면 변경할 수 없는 상수로 선언되어야 하며, 구조체 내의 속성 또한 변경되지 않는다면 상수로 선언해야 한다. 변경 가능한 속성을 갖는 구조체는 메서드 내에서 mutating 키워드를 사용하여 변경할 수 있다.
•
Class는 기본적으로 변경 가능한(mutable)이다. 인스턴스와 속성을 자유롭게 변경할 수 있으며, 필요에 따라 상수로 선언된 프로퍼티를 class내에서 변경할 수 있다.
정체성(Identity)
•
Struct 인스턴스는 값에 따라 동일성을 판단한다. 값이 동일하면 두 구조체 인스턴스가 동일하다고 간주된다.
•
Class 인스턴스는 고유한 식별자(identity)를 가진다. 두 개의 참조가 동일한 객체를 가리키는지 여부를 확인하는 데 사용할 수 있습니다.
Struct 스택 영역
•
구조체는 값 타입이기에 메모리의 스택 영역을 사용
•
스택 영역은 각 스레드가 독립적으로 사용하기 때문에 스레드 안전성을 보장한다.
•
스택 영역은 스택 포인터만 이동시키면 되기 때문에 한 번의 명령으로 할당과 해제가 가능하다.
•
컴파일 타임에 할당할 크기가 결정되기 때문에 메모리를 따로 관리해주지 않아도 된다.
•
운영체제가 새로운 데이터를 할당할 영역을 따로 계산하지 않아도 된다.
Class 힙 영역
•
클래스의 인스턴스는 힙 영역에 저장된다
•
힙 영역에 저장되는 데이터들은 모두 컴파일 타임이 아닌 런타임에 크기가 결정되어 런타임에 추가적인 연산을 요구한다.
•
힙 영역은 한 프로세스의 스레드들이 함께 공유하는 영역이기 때문에 스레드 안전성을 보장하지 않는다.
Class 와 Struct의 차이점 정리
•
Struct는 상속을 받는 것도 시키는 것도 불가능하다.
•
Struct는 Value 타입, Class는 Reference 타입이다.
◦
새로운 Struct에 이미 존재하는 Struct를 할당하면 독립된 공간을 사용하고 값만 같은 Deep Copy가 일어난다.
◦
Class의 경우 Reference 값을 공유하며 같은 리소스를 향하는 Shallow copy(얕은 복사)가 일어난다.
•
Struct는 Stack, Class는 Heap에 저장된다.
•
Struct는 한번 생성되면 변경이 불가능하다. 값을 바꾸려면 새로운 Struct를 생성하는 수 밖에 없다.
◦
mutating func 를 통해 struct의 값을 바꿀 수 있지만, 클래스처럼 프로퍼티 값만 바꿔주는 것이 아니라 아예 새로운 copy를 생성하는 방식이다.
◦
class instance의 경우 let으로 선언해도 가변 프로퍼티를 바꿀 수 있는 위험이 있다.
Stuct가 유연성은 부족하지만 Class보다 더 빠르고, 간단하고, 메모리 누수가 덜하며 쓰레드 안전성을 더 보장한다.
상속을 사용해야 하거나
objective c 코드를 사용해야 할 때를 제외하면 Struct 사용하는 것을 장려한다.