Programmer:)

[C#] Struct vs Class (구조체 vs 클래스) 본문

공부(개발)/c#

[C#] Struct vs Class (구조체 vs 클래스)

ryeggg 2022. 4. 2. 19:05
반응형

구조체

-기본적으로 public

-스택 영역에 생성

-스택에 할당되기 때문에 가비지컬레션에 관리되지않아 성능면에서 상대적으로 좋음

-하지만 메모리 크기면에서 한정적임

-자신의 크기만큼 스택공간을 할당하게 되므로 크기가 클수도 메모리 사용량도 늘어남

(메모리 크기 제약이 있으므로 과도하게 커지면 스택오버플로우 발생)

-일반적으로 함수는 없고 변수 저장으로 사용 (그렇다고 함수를 못만드는것은 아님)

-값타입 ( 함수를 호출해서 객체를 전달하면 원본과 다른 복사본이 생성됨)

-때문에 이 객체의 멤버변수를 변경해도 해당 함수의 스택 영역에 복사된 객체의 변수만 변경될 뿐 원본은 영향받지 않음.

-상속불가

 

 

클래스

-기본적으로 private

-힙 영역에 생성

-힙에 할당되기 때문에 메모리 크기에서는 좀 더 자유로움

-하지만 가비지 컬렉션의 영향을 받기 때문에 성능에 영향이 있을 수 있음.

-참조타입 ( 객체를 전달했을 때 그 객체는 항상 원본과 동일함)

-때문에 생성한 객체를 다른 함수에 전달 했을 때 멤버 변수의 값을 변경하면 원본의 변수도 변경되며 전달받은 함수가 종료되어도 객체는 계속 유효함

 

#구조체로 선언했어도 객체를 힙영역에 할당해야 할 때가 있다.

-모든 필드의 합이 16byte를 넘는 경우

-구조체안의 클래스타입을 필드로 가질 경우

 

#구조체로 선언했을경우 위 2가지경우가 아니라면 스택메모리 영역을 사용하기를 권장

-기본적으로 스택은 가비지 컬렉션의 대상이 아니므로 선언한 함수가 종료되면 그때그때 해제가 되기 때문에 

힙영역을 사용하는 것보다 좋은점이 많다. 

 

#클래스보다는 구조체를 자주 이용하는 게 가비지컬렉션의 호출빈도를 줄이고 힙 할당/해제 보다 스택 할당/해제가 훨씬 빠른 특성 등으로 봤을 때 성능상으로 큰 장점을 가지고 있으므로 적극적인 사용을 권장.

 

#용량이 커지면 주소만 전달하는 클래스보다 더 느려지므로 판단을 잘 해야함.

 

#구조체로 사용하기에 적합한 경우

-객체 내 멤버변수가 primitive type (int, float, bool 등)으로 이루어져 있는 경우

-크기가 작으며 값이 변하지 않는 경우

-boxing이 자주 일어나지 않는 경우

 

 

 

반응형

'공부(개발) > c#' 카테고리의 다른 글

[C#] Stack vs Heap (스택 vs 힙)  (0) 2022.04.10
[C#] Boxing Unboxing ( 박싱과 언박싱)  (0) 2022.04.03
C# 람다식(Lambda Expression)  (0) 2020.02.20
C#델리게이트(Delegate)  (0) 2020.02.20
Lerp(선형 보간 함수)  (0) 2020.02.20
Comments