struct와 class의 차이점




1) Type차이



구조체는 값 타입(value)

=> 스택메모리에 생성된다.


클래스는 참조 타입(reference)

=> 힙 메모리에 생성된다.


힙과 스택차이점


값타입과 참조타입 관련 예제


구조체는 함수안에서 1로 변경을 해도 외부 Main에서 값이 변경되지 않는다. 복사된 데이터는 원본 데이터가 아니기 때문에 복사된 값을 수정하면, 스택에 복사된 값을 변경하게 되는것이다. 

(복사본에 입력된 값들은 함수가 끝나면 사라짐)


 클래스는 참조타입으로 힙의 주소를 전달하기 때문에 값이 아닌 같은 주소가 참조된다. 

그래서 Main으로 출력했을 때, 값이 변경되지 않고 원본값을 출력한다.

(변경된 데이터들은 함수가 종료되어도 남아있음)




  

2) 클래스와 비슷하면서도 다른 구조체


a. 구조체는 생성자를 선언할 수 있으나 반드시 파라미터가 있어야한다.

b. 구조체는 상속이 불가능하다.

c. 구조체는 필드선언 시 const또는 static으로 선언한 경우에만 초기화가 가능하다.

d. new연산자를 사용하지 않고 인스턴스화 할 수 있다.




메모리절약은 클래스, 속도는 구조체


인스턴스한다면 가비지 컬렉션(속도)

구조체는 스택에 바로 할당되기 때문에 가바지컬렉터션이 발생 하지 않고, 클래스는 인스턴스를 생성할 때 마다 힙에 메모리 할당하기 때문에 값을 폐기하기 위해서는 가바지컬렉션이 필요하다. 


많은 양의 변수를 가지고 있는 구조체는 NO(메모리)

참조형식인 클래스는 값들을 가리키는 주소만 스택에 저장하지만 구조체는 가지고있는 변수들의 값들을 모두 스택에 저장되기 때문에 그 크기만큼 스택의 위치 역시 커지게 된다. 하지만 스택은 크기가 제한적이기 때문에 너무 많은 양을 가지게 되면 스택 오버플로우가 발생할 수 있는 위험이 있다. 


구조체는 언제 사용할까?


상황에 맞게 사용해야 하는 구조체

변수의 크기가 작거나, 수명이 짧고, 자주 할당되는 객체는 구조체로 만들어 주는게 좋다.

유니티에서는 position, color, quaternion, rotation, scale등이 구조체로 구현 되어있다.



학습참고

1) https://vaert.tistory.com/111

2) https://m.blog.naver.com/PostView.nhn?blogId=wow0815&logNo=90184259071&proxyReferer=https%3A%2F%2Fwww.google.com%2F

3) https://nowonbun.tistory.com/84 

4) https://ronniej.sfuh.tk/c-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EC%B2%B4-vs-%ED%81%B4%EB%9E%98%EC%8A%A4/


struct

단순 데이터 컨테이터용으로 50개의 struct를 사용해봅시다.


struct는 메모리를 많이 사용합니다.


A->B->C 로 값을 전달하면, 총 150 개의 struct 가 생성되게 됩니다.


레퍼런스와 관련된 처리가 없으므로 더 빠를 수 있습니다.


구조체는 스택에 할당되고, 자신을 호출한 함수가 종료되면 즉시 사라집니다.

GC를 유발하지 않고 빠르게 동작합니다.


오히려 더 느려질 수도 있습니다.


단일 struct 오브젝트의 크기가 너무 커지거나, 너무 긴 리스트에 넣고 쓰면, 복사하는 시간이 길어집니다. 이때 class 형보다 처리 시간이 더 길어질 수 있습니다.


변수가 2~3개 뿐인 단순한 데이터 컨테이너라면 struct 를 사용하는게 빠릅니다.

일반적인 경우에는 class 를 쓰세요.

반응형

'프로그래밍언어 > C#' 카테고리의 다른 글

C#) 키워드 간단 정리  (0) 2019.09.24
C#) List / LinkedList (List.AddRange)  (0) 2019.06.05
C#) 쓰레드(Thread), 프로세스  (0) 2019.02.22
C#) 리플렉션 Reflection  (0) 2019.02.20
C#) Action과 Func (람다식)  (0) 2019.02.16

+ Recent posts