게임엔진/Unity

클래스와 구조체 차이

CodeJB 2023. 7. 3. 17:42

클래스와 구조체 가장 큰 차이

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)이기 때문에 너무 많은 양을 가지게 되면 스택 오버플로우가 발생함
  • 불변 타입으로 대우하려는 경우. 대우한다는건 뭐지
  • 박싱 연산이 자주 발생하지 않는 경우


정리 하자면

 

  1. 컬렉션 등을 멤버로 갖지 않는 적은 크기로서 다른 객체에 포함되곤 하는 데이터셋의 경우가 구조체로 선언하기 가장 적합한 케이스
  2. 당연히 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