JJB's gloomy DEV

[Unity/C#] 클래스(Class), 구조체(Struct) - JJB.

by JJB.

C#

클래스(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.

활동하기