오진이 블로그

[제프리 리처의 CLR via C#] 참조 타입과 값 타입 본문

Development/C#

[제프리 리처의 CLR via C#] 참조 타입과 값 타입

오늘도 진이 2021. 4. 15. 17:14

2부. 타입 설계

5장. 기본, 참조, 값 타입

참조 타입과 값 타입

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