C# Structure(구조체)는 언제 사용하면 좋은가요?

안녕하세요. :smile:

Structure에 대해 질문 드리고자 합니다.
저는 구조체를 단 한번도 사용해 본 적이 없는데요. 책이나 관련 글을 읽더라도 언제 사용해야 하면 좋을지 제대로 이해하지 못했습니다.

부끄럽지만 오랫동안 C# Structure 존재에 대해 알고는 있었지만 애써 외면했던 것 같습니다.
이번 기회에 C# 구조체를 언제 사용하고 어떻게 사용하시는지 여기 회원님들 조언과 생각을 듣고 싶습니다.

읽어주셔서 감사합니다!

좋아요 2

임시객체에 사용하시면 됩니다. 저같은 경우는 web api 통신시 request 모델을 작성할 때 쓰고 있습니다.

임시 객체로 역시 반복문 안에서 생성되는 여러 객체들이 있는데 거기에도 사용하면 될 듯 합니다.

특히 반복문에서 임시객체에 사용해야하는 이유는 class 형태일 경우 heap에 계속해서 임시 객체가 생성되고 gc가 처리해야합니다. 하지만 struct로 처리한다면 gc가 관여할 필요없이 scope내에서 제거됩니다. 물론 struct로 했을때 기존에 class를 사용할 때 쓰던 방식으로 참조를 전달하고 사용하면 값이 꼬일 수 있으니 이런 부분은 주의해야합니다.

좋아요 3

저는 Size나 Rectangle등 값을 의미하는 작은 단위에 구조체를 사용합니다.

좋아요 3

구조체를 잘 쓸 일이 없는 것이 당연한데, Call-by-reference 타입의 자료들을 위주로 다루기 때문입니다. 함수를 호출할 때 자료 구조를 인자로 전달하는 것은 주로 그 함수가 해당 자료 구조의 데이터를 "대신 변경"하기를 바라고 작성하는 알고리즘을 주로 포함하기 때문이고, 함수 호출때마다 값을 복사하는 동작을 의도하지는 않기 때문인 경우가 또 많은 것 같아요.

좋아요 4

@dimohy 님 말씀대로…
ㅎㅎㅎ 보통 많이 쓰는 곳은 데이터 묶음에 쓰죵
개체 지향성이 필요 없는 (상속성 같은거 필요 없는) Data context로써 묶을때 (Size, Rectangle 등등) ?

구조체는 개체가 아닌 데이터(?) 같은 느낌이라 이야기하면 이해하기 더 편하시려나

아니면 다른분들 말씀처럼 구조체가 갖는 특징이 필요하거나

좋아요 3

@Vincent @dimohy @rkttu @SangHyeon.Kim 답변 모두 감사드립니다.

조언 참고하여 사용해보고 후기 꼭 남기도록 하겠습니다. :smile:

좋아요 2

관련된 확인안하고 당연히 스택에 존재할 것이라는 것을 좀 더 명확히 알 수 있는 내용입니다.

https://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=0&detail=1&wid=12619

좋아요 3

성태님의 글입니다.

.NET Framework: 1052. 왜 구조체는 16 바이트의 크기가 적합한가? (sysnet.pe.kr)

좋아요 3

ㅋㅋㅋㅋㅋㅋ내용 대박이네요… 16바이트가 넘어가면 힙이라…ㅎㅎ

하지만 한가지… 구조체는 스택에도 힙에도 할당이 가능한 타입이라 알고있는데 왜 무조건 스택이라고 말씀하셨는지 조금 의문이 드는 부분이네요. 제가 잘못알고있었던건지…;;

쉬운 예제로 int형은 valuetype을 상속받는 int32 구조체인데 class안에 선언되는 int 필드던 속성이던 힙에 할당되고, 또한 제네릭으로 선언된 List 이런거는 힙에 연달아 생성되는것으로 알고 있는데…아닌가 ㅠ

좋아요 2

구조체가 참조 형식에 포함되면 할당이 가능한 타입이라는 것은 맞지만, 그 기준을 구조체라고 하기에는 좀 그렇고 "값 타입"이라고 해야 합니다.

언급하신 int 형의 예에서처럼, class Test { int a; } 라는 타입은 int가 값 타입임에도 불구하고 Test 인스턴스 자체는 힙에 올라가므로 int의 내용이 힙에 저장되는 것입니다. 마찬가지로 구조체 역시 참조형 내의 필드로 들어가면 그것이 저장되는 위치는 힙이라는 것은 맞습니다.

코딩으로 봤을 때는 클래스 안에 구조체 필드가 있는 것은 특수한 경우가 아니지만, 어쨌든 기본적인 속성으로 정의하자면 구조체(및 값 형식)은 스택에 올라갈 수 있고 참조 형식은 힙에 올라간다고 쉽게 분류를 합니다.


답변하신 내용 중에 약간 딴지를 걸자면 ^^ "int 필드던 속성이던 힙에 할당되고"에서 필드는 힙에 할당되는 것이 맞지만, "속성(property)"는 get/set 메서드에 불과하므로 내부 매칭이 되는 필드가 없다면 힙과는 무관한 멤버입니다.

좋아요 4

헉! 답변해주셔서 감사합니다!!

네 저도 기본적으로는 stack에 할당되는 것이 구조체 및 값 형식이지만, ref struct가 나온 후로는 그냥 struct보다는 ref struct가 무조건 스택에 할당되는 것이라고 표현해야 처음 아시는 분들이 헷갈리지 않을 수 있을까 한 의도 였습니다. 제가 바로… ‘class 안에 int가 있을 경우 그것도 stack에 들어간다’ 고 알고 있었다가 정보를 수정한 케이스라…저와 같은 케이스가 안 생기길 마음에 명시적으로 표현하고 싶어서 저렇게 표현했습니다.

혹시 무례를 범했다면 정말 죄송합니다! ㅠㅠ

그리고 또한 field와 property에 대해서 개념을 짚어주셔서 감사합니다. property도 내부적으로는 backing field를 통해 값을 저장한다고 알고는 있었지만… 표현을 정확히 못하고 있었습니다. 덕분에 오늘도 잘못 알고있던 정보를 수정할 수 있었습니다.

매번 감사드립니다!!

무례라니요… 좋은 의견입니다. ^^ 책을 쓸 때 늘 고민이지만, 도대체 어디까지 설명해야 하나… 싶을 때가 있습니다. 감안해서, 다음 번 내용 개정에서 제 책에도 반영을 해보겠습니다.

좋아요 1

오…감사합니다!!
동생이 C# 공부 시작한다 그래서 시작하세요 시리즈 사줬습니다 ㅎㅎ
좋은 책 출간해주셔서 감사합니다!!

관련된 내용이라 댓글로 첨부합니다. 정성태님 글입니다

C# - struct/class가 스택/힙에 할당되는 사례 정리

https://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=0&detail=1&wid=12624

좋아요 1

오…다시 한 번 정리하고 점검하는 계기가 되었습니다. 링크올려주신 디모이님과 작성해주신 정성태님 감사드립니다.!!