Game Tech Blog
C# - Class, Struct 본문
c++,c# 의 class와 strcut에 대한 취급차이가 조금 있는것 같다.
결론적으로 다음과 같다.
[c++]
1. 디폴트 접근 지시자의 차이 class=private,struct=public
[c#]
1. 상속 불가능
2. Data Type에 대한 차이즉할당자리에대한차이?
[1.상속 불가능]
상속 불가에 대해서 c++에서는 아이템 구조체를 만들어서 상속받아 사용했었던 기억이 있어서 c#에서도
구조체를 상속해서 사용해보려는 중에 아래와 같은 경고가 떳다.

구글링을 해본결과, " C#의 모든 구조체는 사용자 정의 또는 .NET Framework에 정의되어 있으므로 상속할 수 없습니다. 구조체는 값 형식이고 모든 값 형식이 봉인되어 있기 때문에 봉인됩니다.
구조체는 인터페이스를 구현할 수 있으므로 구조체 이름 뒤에 콜론 다음에 다른 형식 이름이 표시될 수 있습니다."
라는 답을 얻을 수 있었다.
struct는 value 형식으로 되어있으며 모두 Sealed 되어있기 때문이라고 한다.
추가적으로 struct는 class 의 Base가 될 수 없다고하는데,

마찬가지로 struct는 내부 구조 Value 들이 봉인되어있어서 상속으로 파생시킬 수 없다고 한다.
[2. Data Type 에 대한 차이]
struct = value type
class = reference type 이라고 한다.
즉 값을 전달할 때, struct 는 값을 복사해서 전달하고, class 는 32bit 기준 그 reference를 전달한다고 한다.
한 가지 흥미로웠던 포스팅을 봤는데, 똑같은 배열과 필드를 가지고 struct, class 키워드만 바꿨을때 메모리의 사용량을 측정해보니까

힙 크기가 늘어나지 않는 것을 보았다. 스택을사용하는것
이를 그대로 class 로 바꿔서 해보았는데

힙의 크기가 늘어나는것을 보았다. 이로써, c# 에서는 class , struct 의 할당 위치 차이가 드러난다는것을 알 수 있었다.
여기서 일반적으로 들어난 struct의 힙 할당 케이스를 살펴보면 2가지가 있다고한다.
1. 16byte 를 넘어갈때
2. struct 내부 필드변수로 class 가 있을때 어디로 할당하는지 알아봐야 할 것 같다.
[1. 16byte 를 넘어갈때 ]
이상하게도 난 측정이 안되는 것 같다. 측정을 잘못하고 있을수도 있고...

type0 의 크기가 52byte 로 16byte를 훨씬 뛰어넘었는데도 불구하고 스택을 사용하는것 같다. 공부할때들었던컴파일러맘대로..가작동했는지는모르겠다.
[2. struct 내부 필드 변수로 class 가 있을때]

이것도 결과는 잘 측정이 되지 않았다. 이 예외 사항에 대해서는 조금 더 연구가 필요하거나 물어보고 알아봐야겠다.
[##. struct, class, new]
여기서 궁금증이 생겼다. struct, class 모두를 new 로 할당했는데 왜 구조체는 heap 이 아닌 stack으로 들어갔는가? 였다.
struct 타입은 필드에서 stack 에 할당해서 사용할 수 있지만, 사용하기 위해서는 할당해야한다.
내부 이니셜라이저로 초기화 하고싶지만, struct 구조상 그게 안된다고 한다.
그렇다면 할당해서 사용하려면 type0 의 경우
Type.x = 0;
Type.y = 0;
Type.z = 0;
... 할당의 연속.. 그리고
Type.UpdateLoop; 함수사용
이렇게 되어야하는데, 간단히
Type0 tType = new Type010,20,30,40,50,60,70,80,90,100,110,120; 으로 초기화를 할 수 있다.
그런데 여기서 new 로 struct를 할당했다고 모두 heap에 적재되는건 아니라고한다.
이는msdn에언급되어있다고한다.관련내용을못찾음..
또 예외적인 경우는 class 내부 struct 로 필드변수가 있으면 그 해당 struct 는 스택이 아닌 자신을 포함하는 필드의 자리에 할당이 된다고 한다. 일종의지역성으로도볼수있을것같다.
Value 타입을 = 로 대입시 값복사가 일어난다는건 알고있는 내용이고, 과거 16byte 기준으로 잡았지만, 지금은 24 ~ 28byte 정도로 사이즈를 잡아도 복사할 수 있다는 것 같다.
그렇다면 이제 struct, class 가 있으면 사용 케이스에 대해 고민을 해봐야하는데, 그건 더 고민해보는것으로하고
단순 접근 제어자만 구분하는 c++과는 차이점이 명확해서 새로 공부하는 느낌이었다..
[참고자료]
https://m.blog.naver.com/wow0815/90184259071
C# Stuct구조체를 Class와 비교하며 파헤치기
Stuct 와 Class 차이점. 1. Data Type 차이 - Struct는 값value type으로 stack memory에 생성된다....
blog.naver.com
https://www.csharpstudy.com/CSharp/CSharp-struct.aspx
C# 구조체 - C# 프로그래밍 배우기 Learn C# Programming
Value Type vs Reference Type C#은 Value Type과 Reference Type을 지원한다. C#에서는 struct를 사용하면 Value Type을 만들고, class 를 사용하면 Reference Type을 만든다. C# .NET의 기본 데이타형들은 struct로 정의되어 있
www.csharpstudy.com
https://www.sysnet.pe.kr/2/0/1323
.NET Framework: 331. C# - 클래스 안에 구조체를 포함하는 경우 발생하는 dynamic 키워드의 부작용
글쓴 사람 정성태 techshareratoutlook.com 홈페이지 첨부 파일 부모글 보이기/감추기 C# - 클래스 안에 구조체를 포함하는 경우 발생하는 dynamic 키워드의 부작용 재미있는 질문입니다. ^^ dynamic 변수
www.sysnet.pe.kr
https://stackoverflow.com/questions/15408667/inherit-from-struct
Inherit from struct
I am try to figure out what is the problem whit my code. I have this code: public struct MyStructA { public MyStructAstringstr { myString= str; } public string myString...
stackoverflow.com
https://hijuworld.tistory.com/43
C#/.NET 구조체struct와 클래스class 차이
C#에서 구조체struct와 클래스class가 어떻게 다른지 알아보자. 사용하는데 있어선 차이를 알기 힘들다. 일반적으론 구조체는 함수가 없고 변수들만 저장 가능하고 클래스는 변수이외에 함수도
hijuworld.tistory.com
https://asta8080.tistory.com/5#comment8855844
1. c#에서의 struct 와 class 의 new에 대한 이야기
C++에서는 struct 와 class 의 차이가 멤버들의 기본 접근 제어 지시자private,public,protect를 제외하고는 없습니다. 다만 c#에는 struct이냐? 혹은 class이냐? 에 따라서 값 타입과 참조타입의 개념의 차
asta8080.tistory.com
'IT Study > C#' 카테고리의 다른 글
C# - Boxing, UnBoxing 0 | 2022.04.08 |
---|---|
C# - Enum To String 열거형내용을문자열로변환 0 | 2022.04.05 |
C# - 프로퍼티 0 | 2022.01.11 |
C# - Invoke 0 | 2021.12.29 |
C# - String, Stringbuilder 0 | 2021.02.04 |