다음을 통해 공유


클래스와 구조체 중에서 선택

비고

이 콘텐츠는 프레임워크 디자인 지침: 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용구 및 패턴, 2판에서 Pearson Education, Inc.의 권한으로 다시 인쇄됩니다. 이 버전은 2008년에 출판되었으며, 이후 세 번째 에디션에서 완전히 수정되었습니다. 이 페이지의 일부 정보는 오래된 것일 수 있습니다.

모든 프레임워크 디자이너가 직면하는 기본 디자인 결정 중 하나는 형식을 클래스(참조 형식) 또는 구조체(값 형식)로 디자인할지 여부입니다. 참조 형식 및 값 형식의 동작에 대한 차이점을 잘 이해하는 것이 이 옵션을 선택하는 데 중요합니다.

참조 형식과 값 형식 간의 첫 번째 차이점은 참조 형식이 힙에 할당되고 가비지 컬렉터에 의해 수집되는 반면, 값 형식은 스택에 할당되거나 포함된 형식 내에서 인라인으로 할당되며, 스택의 해제나 포함된 형식의 할당 취소 시 할당이 해제된다는 것입니다. 따라서 값 형식의 할당 및 해제는 일반적으로 참조 형식의 할당 및 해제보다 리소스 비용이 적게 듭니다.

다음으로 참조 형식의 배열은 외부 할당됩니다. 즉, 배열 요소는 힙에 있는 참조 형식의 인스턴스를 참조하는 것입니다. 값 형식 배열은 인라인으로 할당됩니다. 즉, 배열 요소가 값 형식의 실제 인스턴스입니다. 따라서 값 형식 배열의 할당 및 할당 취소는 참조 형식 배열의 할당 및 할당 취소보다 훨씬 저렴합니다. 또한 대부분의 경우 값 형식 배열은 참조의 지역성을 훨씬 더 잘 보여 줍니다.

다음 차이점은 메모리 사용과 관련이 있습니다. 값 형식은 참조 형식 또는 구현하는 인터페이스 중 하나로 캐스팅될 때 포장됩니다. 값 형식으로 다시 캐스팅할 때 언박싱됩니다. 상자는 힙에 할당되고 가비지 수집되는 객체이기 때문에, 과도한 박싱 및 언박싱 작업은 힙과 가비지 수집기, 궁극적으로는 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 반면 참조 형식이 캐스팅되기 때문에 이러한 boxing은 발생하지 않습니다. (자세한 내용은 Boxing 및 Unboxing 참조).

다음으로 참조 형식 할당은 참조를 복사하는 반면 값 형식 할당은 전체 값을 복사합니다. 따라서 큰 참조 형식의 할당은 큰 값 형식의 할당보다 저렴합니다.

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

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

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

❌ 형식에 다음 특성이 모두 없는 한 구조체를 정의하지 마십시오.

  • 기본 형식(intdouble등)과 유사한 단일 값을 논리적으로 나타냅니다.

  • 인스턴스 크기는 16바이트 미만입니다.

  • 변경할 수 없습니다.

  • 자주 포장할 필요는 없습니다.

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

Microsoft Corporation의 일부 저작권 2005, 2009. 모든 권리 보유.

프레임워크 디자인 지침에서 Pearson Education, Inc.의 권한으로 재인쇄 : 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용구 및 패턴, Krzysztof Cwalina 및 Brad Abrams의 제2판, Microsoft Windows 개발 시리즈의 일환으로 Addison-Wesley Professional이 2008년 10월 22일 출판했습니다.

참고하십시오