C# Struct와 Class의 차이. 그리고 왜 사용할까?

Justin·2022년 7월 15일
0

C#

목록 보기
3/7

❓ 왜 사용할까?

기존 C언어에서는 Class라는 구분이 없이 Struct를 사용했다고 한다. 그렇기에 기존 C와 호환을 위해 Stuct를 사용한다.

하지만 단순히 이러한 이유가 아닌 메모리 관리에 용이하다는 부분에서 계속 사용되고 있다.

❔ Struct(구조체)란?

‘구조체 형식’은 데이터와 관련 기능을 캡슐화할 수 있는 값 형식이다. 구조체 형식은 struct 키워드를 사용하여 정의한다.

Struct는 Class와 유사하게 변수 선언, 함수 선언 등이 가능하지만 몇가지 차이점으로 인해 다르게 사용해야한다.

💨 Struct 와 Class 차이점

상속 여부
Class는 상속이 가능하지만, 구조체는 상속이 불가능하다.

형식의 차이
Struct는 값 타입(ValueType)이지만 Class는 참조(Reference Type)이다.

프로그램 공부를 하다보면 값 타입, 참조 타입이라는 말을 자주 듣게 되는데 간단하게 말하면 메모리가 저장되는 공간이 다른 것이다.

🕳 값, 참조 그리고 스텍과 힙

값 타입의 경우 스텍이라는 메모리 영역에 할당 되고, 참조 타입은 힙에 할당하는 값의 주소를 가지고 있는다.(값 자체가 아닌 값을 가르키는 주소이기에 참조타입이라함)

🟦 값, 참조에 차이점 예시

같은 구조를 가진 Struct와 Class가 있다.

사용을 할 때 부터 값 형식은 이미 스텍에 할당 되어있기에 바로 변수로 불러와 사용이 가능하지만, Class는 new 키워드를 통해 힙 영역에 할당하고, 그 주소값을 참조하고 있어야한다.

위에서 정의해준 변수에 원하는 값들을 채워 넣고, 두 번째 구조체, class(tinyMonster2, bossMonster2)를 정의하여 값들을 복사 해준뒤, hp값만 변경하여 두 개의 값들을 모두 출력 해보고자 한다.

tinyMonster의 경우는 기존에 값은 건들지 않고, tinyMonster의2의 값만 변경되었지만

bossMonster의 경우 기존의 값 까지 모두 변경된걸 볼 수 있다. 위에서 계속 언급한대로 구조체(값 타임)는 스텍에 저장되며 새로 변수에 값을 넣을경우 값이 복사가 되는 것이지만

클래스(참조 타입)는 같은 값을 가르키게 되는 것이기에 bossMonster2의 값을 바꿔도 기존 bossMonster값이 바뀌게 된다.

🎃 가비지 컬렉터

C#의 특성상 힙에 할당된 메모리는 가비지 컬렉터라는 녀석이 사용하지 않는 애들을 정리 해주는데, 이때 처리해야할 양이 많으면 프로그램 동작 속도가 느려지거나 아예 멈추기도 한다.(*스텍은 사용 후 종료됨)

그렇기에 굳이 힙에 할당하지 않아도 되는 건 스텍 메모리에서 사용하면 프로그램 속도 향상에 도움이 될 수 있다.

하지만 스텍 메모리만 사용하자니 스텍 메모리는 제한이 있어 많이 사용할 경우 스텍오버플로우가 발생할 수 있으니 적절히 균형있게 사용하는게 좋다.

⁉ 어느정도 까지 구조체를 사용하는게 좋을까?

'적절히 균형있게'는 어느정도 인지 찾아보면 MSDN에서는 16바이트 미만일 경우를 추천하는데, 왜 그런지는 아래 글에서 자세히 설명해주고 있다.

MSDN

C# - 왜 구조체는 16 바이트의 크기가 적합한가?

여담 16바이트 이상은 힙에 할당?

어떤 글들을 보다보면 16바이트 이상을 사용하면 struct라도 힙에 할당된다는 얘기도 있지만, 그 또한 아래 글에서 실험을 통해 아니라는걸 알려주고있다.

C# - 구조체의 크기가 16바이트가 넘어가면 힙에 할당된다?

🌐 결론

Struct와 Class의 큰 차이는 물론 상속에 대한 처리 및 그 사용성도 있지만 타입(값, 참조)에 따른 메모리 할당 방식의 차이가 가장 크게 느껴진다.

하지만 아직 언제 사용하면 좋을지 감은 잘 오지 않고, 그나마 힌트가 된 글을 보면 '반복문 안에 임시객체`에서 사용될 수 있다는 포인트다.

도움 받은 질답 링크

profile
인디 게임을 만들며 공부하고 있습니다.

0개의 댓글