원문 : Choosing Between Class and Struct.

주의 : 번역이 개판이므로 이상하면 원문을 참조하세요.

주의 : 허락받고 번역한 것이 아니므로 언제든 내려갈 수 있습니다.

 

모든 프레임워크 설계자가 설계를 함에 있어서 직면하게 되는 기본적인 결정중 하나는 클래스( 참조형, reference type )로서 타입을 설계할 것이냐 아니면 구조체( 값형, value type )으로서 타입을 설계할 것이냐입니다. 참조형과 값형의 행위의 차이를 잘 이해하는 것은 이 결정을 내리는 데 있어서 핵심적입니다.

 

우리가 고려해야 할 참조형과 값형의 첫 번째 차이는 다음과 같습니다. 참조형은 힙( heap )에 할당되며 garbage-collected 된다는 것입니다. 반면에 값형은 스택( stack )에 생성되거나 그것을 포함하는 타입 내부에 포함( inline in )됩니다. 그리고 값형은 스택이 언와인드( unwind )되거나 그것을 포함하는 타입이 해제될 때 같이 해제됩니다. 그러므로 값형의 할당과 해제는 일반적으로 참조형의 할당과 해제보다는 빠릅니다.

 

다음으로, 참조형 배열은 행 외( out-of-line )에서 할당됩니다. 이는 그 배열의 요소들이 단지 힙에 존재하는 참조형 인스턴스에 대한 참조일 뿐임을 의미합니다. 값형 배열은 인라인( inline )에 할당됩니다. 이는 그 배열의 요소들이 값형에 대한 실제 인스턴스임을 의미합니다. 그러므로 값 형 배열의 할당과 해제는 참조형 배열의 할당과 해제보다 훨씬 빠릅니다. 또한 대부분의 경우에 값형 배열은 더 나은 참조 국부성( locality of reference )을 지닙니다( 역주 : 메모리 주소가 가까워 연산 속도가 빠릅니다 ).

 

다음 차이는 메모리 사용( usage )과 관련이 있습니다. 값형은 참조형이나 값형이 구현하는 인터페이스 중의 하나로 캐스팅될 때 박싱( box )됩니다. 그것들은 다시 값형으로 캐스팅될 때 언박싱( unbox )됩니다. 박싱된 것은 힙에 할당된 오브젝트이며 garbage-collected 됩니다. 너무 많이 박싱과 언박싱을 되풀이하는 것은 힙, garbage collector 에 부정적인 영향을 줄 수 있으며, 극단적으로 응용프로그램의 성능을 저하시킵니다. 반면에 참조형들이 캐스팅될 때는 그러한 박싱이 발생하지 않습니다.

 

다음으로, 참조형 할당은 참조를 복사합니다. 반면에 값형 할당은 전체 값을 복사합니다. 그러므로 큰 참조형에 대한 할당은 큰 값형에 대한 할당보다 빠릅니다.

 

마지막으로, 참조형은 참조로 전달됩니다. 반면에 값형은 값으로 전달됩니다. 참조형 인스턴스에 대한 변경은 그 인스턴스를 가리키는 모든 참조들에 영향을 미칩니다. 값형 인스턴스들은 값으로 전달될 때 복사됩니다. 값형 인스턴스가 변경되면, 그것은 다른 복사본들에 영향을 미치지 않습니다. 복사는 사용자에 의해 명시적으로 이루어지는 것이 아니라 인자로 값이 넘어 가거나 값이 반환될 때 묵시적으로 이루어지기 때문에, 값형이 변경될 수 있도록 하는 것은 많은 사용자들을 혼란스럽게 만들 수 있습니다. 그러므로 값형은 불변성( immutable )을 가져야 합니다.

 

경험적으로 볼 때, 프레임워크 내에 존재하는 대부분의 타입들은 클래스여야 합니다. 그러나 값형의 특징상 구조체를 사용하는 것이 더 적절하게 만드는 특정 상황들이 존재합니다.

 

고려해야 하는 경우 만약 특정 타입의 인스턴스가 작고 보통 빨리 해제되는 경우나 보통 다른 오브젝트에 포함( embedded )되는 경우에는 클래스 대신 구조체를 정의하십시오.

 

피해야 하는 경우 타입이 다음과 같은 특징들을 모두 가지고 있지 않는 한, 구조체를 정의하지 마십시오( 역주 :  ).

    • 논리적으로 기본형( int, double 등 )과 유사하게 단일 값을 표현한다.
    • 인스턴스가 16 바이트 이하의 크기를 가진다.
    • 불변성( immutable )을 가진다.
    • 자주 박싱되지 않아야 할 것이다.

 

다른 경우에는, 타입을 클래스로서 정의해야 합니다.

'Programming > .NET' 카테고리의 다른 글

WPF IScrollInfo  (0) 2019.02.17
[ 8 ] Control Template  (0) 2012.10.24
[ 7 ] Style  (0) 2012.10.22
[ 6 ] WPF Content Model  (0) 2012.10.19
[ 5 ] DataTemplate  (0) 2012.10.17
[ 4 ] DataBinding  (0) 2012.10.14
[ 3 ] Dependency property.  (0) 2012.10.11
[ 2 ] XAML  (0) 2012.10.10
[ 1 ] WPF Architecture.  (0) 2012.10.08
[ 6 ] Proerty, indexer, attribute  (0) 2012.10.05

+ Recent posts