클래스와 구조체 간의 선택

참고 항목

이 콘텐츠는 Pearson Education, Inc.의 허가를 받아 프레임워크 디자인 지침: 재사용 가능한 .NET 라이브러리에 대한 규칙, 관용어 및 패턴, 2판에서 재인쇄되었습니다. 이 버전은 2008년에 게시되었으며 이후 3판에서 완전히 개정되었습니다. 이 페이지의 정보 중 일부는 최신 정보가 아닐 수 있습니다.

모든 프레임워크 디자이너가 직면하는 기본 디자인 결정 중 하나는 형식을 클래스(참조 형식)로 설계할지 아니면 구조체(값 형식)로 설계할지 여부를 나타냅니다. 이 선택을 위해서는 참조 형식과 값 형식의 동작 차이를 잘 이해해야 합니다.

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

다음으로, 참조 형식의 배열은 라인 외부에 할당됩니다. 즉, 배열 요소는 힙에 있는 참조 형식의 인스턴스에 대한 참조일 뿐입니다. 값 형식 배열은 인라인으로 할당됩니다. 즉, 배열 요소는 값 형식의 실제 인스턴스입니다. 따라서 값 형식 배열의 할당 및 할당 취소는 참조 형식 배열의 할당 및 할당 취소보다 훨씬 비용이 적게 듭니다. 또한 대부분의 경우 값 형식 배열은 훨씬 더 나은 참조 위치를 나타냅니다.

다음 차이점은 메모리 사용량과 관련이 있습니다. 값 형식은 참조 형식이나 해당 형식이 구현하는 인터페이스 중 하나로 캐스팅될 때 boxing됩니다. 값 형식으로 다시 캐스팅되면 unboxing됩니다. 상자는 힙에 할당되고 가비지 수집되는 개체이기 때문에 너무 많은 boxing 및 unboxing은 힙, 가비지 수집기 및 궁극적으로 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 대조적으로, 참조 형식이 캐스팅되면 그러한 boxing이 발생하지 않습니다. (자세한 내용은 boxing 및 unboxing 참조).

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

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

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

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

❌ 형식이 다음 특성을 모두 갖지 않는 한 구조체를 정의하지 마세요.

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

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

  • 이는 변경이 불가능합니다.

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

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

Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Pearson Education, Inc의 동의로 재인쇄. 출처: Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 작성자: Krzysztof Cwalina 및 Brad Abrams, 출판 정보: Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

참고 항목