센로그

[C#] Class vs Struct 본문

게임/Unity, C#

[C#] Class vs Struct

seeyoun 2023. 6. 29. 14:38

◆ Class (클래스)

- reference 타입 (매개변수로 전달시 참조로 전달)

=> 영역에 할당

=> 힙에 할당되어, 가비지 콜렉터가 관리해줘야 하므로 상대적으로 성능은 안좋음

=> 대신 메모리 측면에서 상대적으로 자유로움

 


Struct (구조체)

- value 타입 (매개변수로 전달시 기본적으로 복사본이 전달(참조시 ref 필요))

=> 스택 영역에 할당 (클래스의 멤버인 경우 클래스의 일부로 힙에 할당)

=> 스택에 할당되어, 가비지 콜렉터가 관리하지 않아도 되므로 성능이 상대적으로 좋음

=> 대신 메모리가 한정되어 있음 (과도하게 커지면 stack overflow)

 


여담

  • C#에서는 struct를 만들 때도 new를 사용한다.
    따라서 객체가 할당된 메모리 영역이 어디인지 확인하려면 선언부에 가서 class인지 struct인지 살펴봐야 한다는 것~
  • C#에서 struct의 경우 기본적으로 스택 영역에 할당되고, 클래스 멤버인 경우에는 클래스의 일부로써 힙에 할당된다!

 

※ 스택(Stack) vs 힙(Heap)

기본적으로 value 타입은 스택 영역에,  reference 타입은 힙 영역에 할당된다.

스택 영역은 주로 지역 변수 할당을 위한 메모리 공간이다.
함수A를 호출하면 A의 지역변수들이 스택 프레임 형식으로 스택에 할당되고, 스택 포인터가 올라간다.
A가 반환되면 그만큼 스택 포인터가 내려간다.
구조상 메모리 해제를 하려면 위에서부터 해제해야 한다는 특성이 있다. (LIFO 방식)

힙 영역은 동적 할당을 위한 메모리 공간이다.
생명 주기가 로컬 이상으로 필요한 객체 할당에 쓰인다. (전역 변수 등)
LIFO 방식으로 해제하는 것이 아닌, 가비지 콜렉터에 의해 해제된다.

※ 스택 영역 접근은 힙 영역 접근에 비해 빠르다.
또 C#에서는 가비지 콜렉터를 사용하여 더이상 사용되지 않는 메모리를 해제하는데, 힙 영역은 가비지 콜렉터의 관리 대상인 반면 스택 영역은 관리 대상이 아니다.
따라서 스택 영역을 사용하는 것이 비교적 성능이 좋다고 할 수 있다.

 

참고)

https://ryeggg.tistory.com/71

https://kukuta.tistory.com/385

Comments