기존 C언어에서는 Class라는 구분이 없이 Struct를 사용했다고 한다. 그렇기에 기존 C와 호환을 위해 Stuct를 사용한다.
하지만 단순히 이러한 이유가 아닌 메모리 관리에 용이하다는 부분에서 계속 사용되고 있다.
‘구조체 형식’은 데이터와 관련 기능을 캡슐화할 수 있는 값 형식이다. 구조체 형식은 struct 키워드를 사용하여 정의한다.
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바이트 미만일 경우를 추천하는데, 왜 그런지는 아래 글에서 자세히 설명해주고 있다.
어떤 글들을 보다보면 16바이트 이상을 사용하면 struct라도 힙에 할당된다는 얘기도 있지만, 그 또한 아래 글에서 실험을 통해 아니라는걸 알려주고있다.
C# - 구조체의 크기가 16바이트가 넘어가면 힙에 할당된다?
Struct와 Class의 큰 차이는 물론 상속에 대한 처리 및 그 사용성도 있지만 타입(값, 참조)에 따른 메모리 할당 방식의 차이가 가장 크게 느껴진다.
하지만 아직 언제 사용하면 좋을지 감은 잘 오지 않고, 그나마 힌트가 된 글을 보면 '반복문 안에 임시객체`에서 사용될 수 있다는 포인트다.