Featured image of post [C#] 클래스와 구조체 간의 선택

[C#] 클래스와 구조체 간의 선택

모든 개발자에 있어서 코드에 대한 기본적인 결정 사항 중 하나는 클래스(참조 형식)를 사용해서 표현할 것인지 아니면 구조체(값 형식)를 사용해서 표현할 것인지를 결정하는 것이다. 클래스 및 구조체 동작의 차이점을 이해하는 것은 이를 선택하는 데 매우 중요하다.

클래스와 구조체의 차이점

클래스 및 구조체의 첫 번째 차이점은 클래스는 힙에 할당이 되고 GC에 의해 수집이 된다는 것이다. 반면 구조체는 스택에 할당되거나 포함하는 형식(클래스 또는 구조체)에 인라인으로 할당되며, 스택이 해제되거나 포함하는 형식이 할당 취소될 때 같이 해제됩니다. 따라서 구조체의 할당 및 해제는 클래스의 할당 및 해제보다 일반적으로 비용이 저렴하다.

두 번째로 클래스의 배열은 아웃 오브 라인(out-of-line)으로 할당됩니다. 즉, 클래스 배열의 요소는 힙에 있는 클래스의 인스턴스를 참조하는 것입니다. 구조체 배열은 인라인(in-line)으로 할당됩니다. 즉, 구조체 배열의 요소는 구조체의 실제 인스턴스입니다. 따라서 구조체 배열의 할당과 해제는 클래스 배열을 메모리에 할당하거나 해제하는 것보다 훨씬 저렴합니다. 또한 대부분의 결우 클래스 배열은 참조 집약성(locality of reference)이 훨씬 낫습니다.

다음 차이점은 메모리 사용량과 관련이 있습니다. 값 형식은 참조 형식 또는 구현하는 인터페이스 중 하나로 캐스팅할 때 boxed 된 형태로 변환되어 캐스팅합니다. 값 형식으로 다시 캐스팅할 때 unboxed가 이루어진 뒤 캐스팅합니다. 상자는 힙에 할당되고 가비지 수집되는 개체이기 때문에 너무 많은 boxing 및 unboxing은 힙, 가비지 수집기 및 궁극적으로 응용 프로그램의 성능에 부정적인 영향을 미칠 수 있습니다. 이와 대조적으로 참조 형식이 캐스팅될 때 이러한 boxing이 발생하지 않습니다. 자세한 내용은 Boxing 및 Unboxing을 참조하세요.

다음으로 클래스의 할당은 참조를 복사하는 반면 구조체 할당은 전체 값을 복사합니다. 따라서 많은 양의 클래스의 할당은 많은 양의 구조체의 할당보다 저렴합니다.

마지막으로 클래스는 참조로 전달되는 반면 구조체은 값으로 전달 됩니다. 클래스의 인스턴스를 변경 하면 인스턴스를 가리키는 모든 참조에 영향을 줍니다. 구조체의 인스턴스는 값으로 전달 될 때 복사 됩니다. 구조체의 인스턴스를 변경 하는 경우 해당 복사본에 영향을 주지 않습니다. 복사본은 사용자에 의해 명시적으로 생성되지 않지만 인수로 전달 되거나 반환 값이 반환 될 때 암시적으로 만들어지므로 변경할 수 있는 구조체는 여러 사용자에 게 혼란을 수 있습니다. 따라서 구조체는 변경할 수 없습니다.

결론

일반적으로 프레임 워크에서 대부분의 형식은 클래스여야 합니다. 그러나 값 형식의 특성으로 인해 구조체를 사용 하는 것이 더 적합 한 경우도 있습니다.

형식의 인스턴스가 작고 일반적으로 수명이 짧고 다른 개체에 일반적으로 포함 되는 경우 클래스 대신 구조체를 정의 하는 것이 좋습니다.

형식에 다음과 같은 특징이 모두 없는 경우에는 구조체를 정의 하지 마십시오.

  • 논리적으로 보았을때 기본 형식(int, double, 등)과 비슷하거나 단일 값을 나타내는 경우
  • 인스턴스 크기는 16 바이트 미만인 경우
  • 변경할 수 없는 경우
  • 자주 boxing 하지 않아도 되는 경우

다른 모든 경우에는 형식을 클래스로 정의 해야 합니다.

Licensed under CC BY-SA 4.0