클래스와 구조체 간의 선택
참고 항목
이 콘텐츠는 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.