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 |