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 Type0(10,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
https://www.csharpstudy.com/CSharp/CSharp-struct.aspx
https://www.sysnet.pe.kr/2/0/1323
https://stackoverflow.com/questions/15408667/inherit-from-struct
https://hijuworld.tistory.com/43
https://asta8080.tistory.com/5#comment8855844
'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 |