Unity C# 클래스와 구조체의 차이점

2020. 2. 2. 17:20유니티/자료

 - 클래스와 구조체의 차이점 - 

클래스와 구조체는 데이터 타입생성기 라는 점에서는 유사하지만 아래와 같은 차이점이있다

*  구조체(struct)는 클래스를 상속을 할 수 없다. 다만 Interface는 상속가능

  - 상속을 할 수 없으므로 멤버의 액세스 지정자에 protected를 사용할 수 없다.

 

*  클래스(class)는 Reference타입 구조체(struct)는 Value타입

*  클래스(class) 객체는 힙(heap)에 할당되지만 구조체(struct) 객체는 스택(stack)에 할당된다.(타입차이에 따른 메모리 할당)

 

- 하지만 구조체로 선언을 했어도 객체를 힙영역에 메모리를 할당할 때가 있다.

 

1. 모든 필드의 합이 16byte를 넘는 경우이다.

2. 구조체안에 클래스 타입을 필드로 가질 경우이다.

 

C#에서는 위의 두경우와 상속이 필요한 경우가 아닌 경우라면 구조체로 선언해서 스택(stack) 메모리 영역을 사용하기를 권장한다. 스택은 기본적으로 가비지 컬렉션의 대상이 아니다. 선언한 함수가 종료되면 그때그때 해제가 되기때문에 heap영역을 사용하는 것보다 좋은점이 많다고 생각된다. 가비지 컬랙션이 자동으로 메모리를 해제시켜주긴 하지만 많은 오버해드가 발생할 수가 있다. 가비지 컬랙션에 동작원리를 알면 이해가 갈 것이다. 

되도록 16바이트가 넘지 않는다면 구조체를 사용하는 버릇을 들이는 것이 좋다.

 

* 구조체는 new로 생성하지 않아도 바로 사용할 수 있다(stack 사용)

 

클래스와 다르게 구조체는 바로 사용할수있다 (Stack에 저장하기 때문)

클래스는 new 연산자를 이용하여 메모리 할당을 해줘야 멤버변수에 접근이 가능하다

 

- 메모리 생성

 

Value타입의 경우 메모리가 자동으로 생성되는 이유는 내부에서 new연사자를 자동으로 호출하기 때문이다. 

int Test; 라는 구문은 int Test = new int();와 같이 해석된다.

결론적으로 값타입과 참조타입은 둘다 new연산자를 이용해서 메모리를 생성한다.

 

 

구조체는 언제 사용하면 좋을까?

 

구조체는 간단하다는 면에서 여전히 쓸모가 있는데,

단순한 타입을 만들기 위해 생성자를 정의하고 변수가 필요할 때마다 new를 호출하는 것은 무척 번거로우며

고작 8바이트밖에 안되는 메모리를 힙에 할당하여 가비지 컬렉터를 괴롭힐 필요가 없다.

좌표에 대한 특별한 동작이 필요하지도 않으므로 꼭 필요한 메서드도 없다.

이런 단순한 타입을 정의할 때 구조체가 딱 어울린다!