CLR은 참조 타입(Reference Type)과 값 타입(Value Type)이라는 두 종류의 타입 체계를 지원한다.
프레임워크 클래스 라이브러리상의 거의 대단수의 타입들은 모두 참조 타입이고, 개발자들이 자주 사용하는 값 타입이 그 나머지이다.
참조 타입은 관리되는 힙에 항상 할당되며, C#의 new 연산자가 만들어진 객체의 주소를 반환한다.
참조 타입을 사용할 때에는 반드시 명심해야 할 성능상의 고려사항들이 있는데, 그 중 우선 다음의 사항들을 유념해야 한다.
메모리는 반드시 관리되는 힙에 할당되어야 한다.
힙에 할당되는 각 객체들은 코드상에 선언된 사항들 이외에 추가적인 멤버들을 포함하고 있으며 이들에 대한 초기화가 반드시 이루어지게 된다.
객체에 선언되는 필드들에 관한 메모리 영역은 반드시 모두 0으로 초기화된다.
관리되는 힙으로부터 객체를 할당하면서 가비지 컬렉션이 발생할 수 있다.
만약 모든 타입들이 참조 타입이라면, 응용프로그램의 성능이 극단적으로 하락할 것이다.
특정한 상황에서 값 타입은 참조 타입보다 더 나은 성능을 제공한다. 다음의 질문에 대한 대답이 모두 "예"인 경우, 새로 만드는 타입은 반드시 값 타입으로 선언해야 한다.
새로 만드는 타입이 기본 타입처러 쓰인다. 구체적으로, 필드에서 수정할 내용이 없거나 수정할 수 없는 상태의 단순한 타입이다. 이렇게 변경해야 할 대상이 없거나 변경할 수 없도록 보호된 멤버들만을 포함하는 변경되지 않는 타입(Immutable Type)을 만들었다고 이야기한다. 사실 대부분의 값 타입들에 대해서 소유하는 필드를 모두 readonly로 설정하는 것을 권하는데, 이에 대한 자세한 내용은 7장에서 살펴보려고 한다.
다른 타입으로부터 상속 받을 필요가 없는 타입이다.
다른 타입의 기본 타입으로 쓰이게 할 계획이 없다.
인스턴스의 전체 크기가 약 16바이트 이내로 매우 작다.
인스턴스의 크기가 16바이트보다 크지만 메서드의 매게변수나 반환 타입으로 쓰이는 일이 없음을 확실히 할 수 있다.
값 타임과 참조 타입이 다른 점을 구체적으로 서술한 것이다.
값 타입의 객체는 두 가지 형태로 표현되는데 박싱되지 않은 형태와 박싱된 형태로 이어서 구체적으로 살펴볼 것이다. 참조 타입은 항상 박싱된 형태다.
값 타입을 기본 타입으로 사용하여 새로운 값 타입이나 참조 타입을 정의할 수 없으므로, 값 타입에서 가상 함수를 만들 수 없다. 값 타입에 오는 메서드는 추상 메서드일 수 없으며, 모든 메서드는 암묵적으로 재정의가 불가하도록 선언된 상태가 된다.
값 타입의 모든 필드 멤버들은 처음에 0으로 초기화된다.
값 타입의 변수를 다른 값 타입의 변수로 대입하려고 할 때, 필드 단위로 하나씩 복제가 이루어지게 된다. 그러나 참조 타입의 변수끼리 대입이 발생하면 단순히 메모리 주소만 복제된다.
Uploaded by Notion2Tistory v1.1.0