클래스와 구조체 가장 큰 차이
1. 클래스는 힙 메모리에 할당된다 vs 구조체는 스택 메모리에 할당된다.
=> 클래스는 GC관리 대상 / 구조체는 GC관리 대상이 아니다.
2. 클래스는 상속이된다. vs 구조체는 상속이 안된다.
잘못된 사실
1. 구조체에 선언된 필드의 총 사이즈가 16이 넘으면 힙에 할당된다는데 이는 잘못된 사실이다.
2. 구조체에 클래스 타입을 필드로 가진다고 해서 "구조체" 자체가 힙에 할당되는 것은 아니다. 단지, 클래스 타입의 필드는 그 인스턴스만 힙에 있고 그 인스턴스를 가리키는 포인터 값은 구조체 내에 존재하며 따라서 스택에 구조체가 유지된다는 사실에는 변함이 없다.
언제 클래스? 언제 구조체?
Choosing Between Class and Struct - Framework Design Guidelines
Learn how to decide whether to design a type as a class, or to design a type as a struct. Understand how reference types and value types differ in .NET.
learn.microsoft.com
Docs 닷넷 문서에 따르면 아래의 경우를 만족하는 경우에 구조체를 쓰고 아니라면 클래스를 사용하는 것을 권장한다.
- 논리적으로 단일 값을 표현하는 경우
- 객체 내의 멤버 변수가 Primitive Type(int, float, bool..)
- 16바이트 이하의 크기를 가진 경우
- "16바이트 이하"인 이유는 x86 인텔 CPU의 경우 128비트 크기의 SSE 레지스터를 xmm0 ~ xmm7까지, 64비트인 경우 추가로 xmm8 ~ xmm15를 가지고 있는데, 바로 이 레지스터를 사용하기 때문에 128비트, 즉 16 바이트 크기에 대해서는 레지스터 하나로 처리할 수 있어 구조체의 권장 크기가 됨.( 32비트 : 4바이트 / 64비트 : 8바이트 / 128비트 : 16바이트)
- 근데 CPU와Memory의 I/O는 64비트이기 때문에 성능상의 큰 의미가 있을지는 모르겠다. 쨋든 CPU내부적으로는 레지스터 하나의 mov명령어로 데이터를 옮길 수 있으니 빠르긴 하겠지.
- 스택은 크기가 제한적(일반적으로 1MB)이기 때문에 너무 많은 양을 가지게 되면 스택 오버플로우가 발생함
- 불변 타입으로 대우하려는 경우. 대우한다는건 뭐지
- 박싱 연산이 자주 발생하지 않는 경우
정리 하자면
- 컬렉션 등을 멤버로 갖지 않는 적은 크기로서 다른 객체에 포함되곤 하는 데이터셋의 경우가 구조체로 선언하기 가장 적합한 케이스
- 당연히 Call By Reference 형식으로 메모리를 참조해야하는 경우엔 클래스, Value타입으로 값이 복사돼도 문제없으면 Struct
유니티에서는 position, color, quaternion, rotation, scale등이 구조체로 구현 되어있다.
'게임엔진 > Unity' 카테고리의 다른 글
제네릭 한정자 in,out 공변성과 반공변성 (0) | 2023.07.03 |
---|---|
제네릭 타입 추론 (0) | 2023.07.03 |
List를 사용할 때 Reserve해야하는 이유 (0) | 2023.07.03 |
MONO / IL2CPP / AOT/ JIT (0) | 2022.05.22 |