Search

Class 와 Struct의 차이점 (박선구)

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 사용하는 것을 장려한다.