1. 값 타입 (struct, enum)

 - new 예약어를 통해 할당시킨 값 타입은 스레드 스택 메모리에 저장되므로, 스레드가 종료될 시 스택의 순서대로

   삭제 된다. (GC의 오버헤드가 없다)

 - = 연산시 필드 값이 모두 복사 동작을 한다. 일반적으로 16Byte 넘을 시 참조 타입(Class)으로 사용을 권한다. (Call by Value

 - System.ValueType으로 부터 항상 상속된다. (System.ValueType은 결국 System.Object로부터 상속되지만 Equals 메     서드를 재정의 함.)

 - 값 타입을 기본 타입으로 사용하여 새로운 값 타입이나 참조 타입을 정의 할 수 없다.

   (암묵적으로 seald라고 보면 된다.)

 - 런타임 중 NullReference Exception이 발생하지 않는다.

    (값 타입은 기본적으로 필드 멤버들은 모두 0으로 초기화 하기 때문 하지만 선언만 하고 정의를 안 할 시 컴파일러가

    오류 처리 해줌)

 

2. 참조 타입 (class)

 - new 예약어를 통해 할당시킨 참조 타입은 GC의 관리 메모리(힙 메모리)에 저장되며, 더 이상 사용을 안 할 시 GC가

   삭제한다.

 - = 연산 시 참조 타입의 포인터만 저장시킨다. (Call by Reference

 - System.Object로부터 상속된다.

 - 가상 함수, Base Class 등 상속시키거나 상속받을 수 있다.

 - 런타임 중 NullReference Exception이 발생한다.

 

코드 작성 시 struct를 쓰면 더 좋은 상황

 - 변경하지 않는 구조 일 경우 (Immutable Type)

 - 다른 타입으로부터 상속받을 필요가 없는 타입일 경우

 - 타른 타입의 기본 타입으로 쓰이게 하지 않을 경우

 - 인스턴스의 전체 크기가 약 16byte 미만일 경우

 - 함수의 매개변수나 반환 타입으로 사용할 일이 별로 없는 경우

 

 

 

'Program > C#' 카테고리의 다른 글

const 상수  (1) 2020.12.20
값타입의 박싱과 언박싱  (1) 2020.12.14
네임스페이스와 어셈블리  (1) 2020.12.05
타입에 대하여2  (0) 2020.12.02
타입에 대하여1  (1) 2020.11.29

+ Recent posts