[Unity/C#] 클래스(Class), 구조체(Struct) - JJB.
by JJB.클래스(Class)와 구조체(Struct)
클래스와 구조체의 차이가 무엇인지, 상황에 따라 어떤 것을 선택해야 하는지에 대한 내용입니다.
클래스(Class)
- 참조 타입(Boxing, Unboxing 발생하지 않음)
- 상속 가능
- new 로 객체 생성 후 사용
- 힙 메모리 할당
구조체(Struct)
- 값 타입(Boxing, Unboxing 발생 가능)
- 상속 불가능(Interface의 경우 사용은 가능 하나 주의를 해야 합니다. 외부에서 interface 캐스팅을 해서 사용할 경우 Boxing 이 발생하므로 원하는 값이 나오지 않을 수 있습니다)
- new 로 생성하지 않고 사용 가능
- 생성자를 사용하는 경우 모든 필드의 값을 초기화해줘야 함
- 스택 메모리 할당 (단, Class의 멤버 변수로 사용될 때에는 해당 위치의 메모리에 상주하게 됩니다.)
그래서 어떤 걸 써야 하나?
마이크로소프트 공식 문서에 의하면, 16byte 이상이 되면 Class를 사용하라고 권고하고 있습니다. (한 번에 복사할 수 있는 바이트 수가 16byte 까지 가능하다고 합니다.)
구조체의 경우 반환을 하거나 매개변수로 넘겨줄 때, 값 자체를 모두 복사하고 새롭게 할당이 됩니다. 그러나 코드 블록을 벗어나면 해제가 되므로 GC의 먹이가 되지는 않습니다.
클래스의 경우 힙에는 실제 객체가 할당되어 있고, 스택에는 힙 메모리의 주소를 가지고 있게 되는데 만약 Reference Count가 0이 되면 GC의 먹이가 될 수 있습니다.
그래서 저의 결론은 아래와 같이 사용하면 좋을 것 같습니다.
1. 16byte 이하일 경우 Struct, 이상일 경우 Class 사용
2. 전달을 자주 해야 하는 상황이라면 Class 사용
(추가적으로 글을 쓰기 전 사전 조사를 위해 구글링을 해보았는데, 구조체가 16byte가 넘어가면 힙 영역에 올라간다는 내용의 글이 간간이 보였는데 사실이 아니라고 합니다)
블로그의 정보
JJB's gloomy DEV
JJB.