Game Tech Blog

C# - Class, Struct 본문

IT Study/C#

C# - Class, Struct

jonghow 2021. 11. 11. 23:03
반응형

c++,c# 의 class와 strcut에 대한 취급차이가 조금 있는것 같다.

 

결론적으로 다음과 같다.

[c++]

1. 디폴트 접근 지시자의 차이 (class = private, struct = public) 

 

[c#]

1. 상속 불가능

2. Data Type에 대한 차이(즉 할당 자리에 대한 차이?)

 

[1.상속 불가능]

상속 불가에 대해서 c++에서는 아이템 구조체를 만들어서 상속받아 사용했었던 기억이 있어서 c#에서도 

구조체를 상속해서 사용해보려는 중에 아래와 같은 경고가 떳다.

 

[이미지0] 상속 불가능?

구글링을 해본결과, " 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 키워드만 바꿨을때 메모리의 사용량을 측정해보니까 

 

[이미지 1] struct 타입 구성 및 할당

힙 크기가 늘어나지 않는 것을 보았다. (스택을 사용하는 것)

이를 그대로 class 로 바꿔서 해보았는데

[이미지 2] class 구성 및 힙 할당

힙의 크기가 늘어나는것을 보았다. 이로써, c# 에서는 class , struct 의 할당 위치 차이가 드러난다는것을 알 수 있었다.

 

여기서 일반적으로 들어난 struct의 힙 할당 케이스를 살펴보면 2가지가 있다고한다.

1. 16byte 를 넘어갈때

2. struct 내부 필드변수로 class 가 있을때 어디로 할당하는지 알아봐야 할 것 같다.

 

[1. 16byte 를 넘어갈때 ] 

이상하게도 난 측정이 안되는 것 같다. 측정을 잘못하고 있을수도 있고... 

[이미지2] 구조체, 구조체 크기, 메모리 사용량

type0 의 크기가 52byte 로 16byte를 훨씬 뛰어넘었는데도 불구하고 스택을 사용하는것 같다. ( 공부할때 들었던 컴파일러 맘대로.. 가 작동했는지는 모르겠다. )

 

[2. struct 내부 필드 변수로 class 가 있을때]

[이미지3] 구조체 내부 클래스, 크기, 메모리 사용량

이것도 결과는 잘 측정이 되지 않았다. 이 예외 사항에 대해서는 조금 더 연구가 필요하거나 물어보고 알아봐야겠다.

 

[##. 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

 

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 키워드의 부작용

글쓴 사람 정성태 (techsharer at outlook.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 MyStructA(string str) { 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
Comments