Development/C#

[제프리 리처의 CLR via c#] 상수와 필드

오늘도 진이 2021. 7. 23. 13:37

 

2부. 타입 설계

7장. 상수와 필드

상수

  • 상수 - 절대 불변의 값에 대한 기호
    • 상수 기호를 정의할 때에는 그 값이 반드시 컴파일 시점에서부터 알 수 있는 값이어야 한다.
    • 컴파일러는 그 다음 상수의 값을 어셈블리의 메타데이터에 저장한다.
    • 상수의 값에 사용할 수 있는 타입은 컴파일러의 입장에서 기본 타입으로 취급될 수 있는 것으로만 한정된다.(C#의 경우, Boolean, Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, String/C#은 기본 타입이 아닌 상수 변수에 대해 null을 지정하는 것을 허용)
    • 상수 필드는 언제나 타입의 일부로 취급된다.(항상 인스턴스 멤버가 아닌 정적 멤버로서 취급)
    • 상수 값을 선언하는 것은 메타데이터를 새로 만드는 것과 같다.
    • 어려운내용(205-206)
    • C#은 상수 필드에 static 키워드를 붙일 수 없도록 하는데 상수 값이 항상 정적 멤버로 간주되기 떄문이다.
    • 컴파일이 이루어지지 않은 응용프로그램 어셈블리의 값은 영향을 받지 않게 된다.
    • 응용프로그램 측에서 상수의 새로운 값을 받아들이기 위해서는 반드시 같이 다시 컴파일이 이루어져야만 한다.
    • 어셈블리 사이에 값을 공유하기 위한 목적으로 필드를 선언하기 위함이라면 상수 필드는 사용할 수 없다. 대신, readonly 한정자를 사용하여 읽기 전용 필드를 사용할 수 있다.

필드

  • 필드 - 값 타입의 인스턴스 또는 참조 타입에 대한 참조를 저장하는 데이터 멤버
  • 필드 한정자

  • 정적 필드의 경우, 타입 객체의 내부에 필드의 데이터를 할당할 때 동적 메모리를 필요로 하게 되며, 앱도메인 안에 타입을 로드할 때 만들어지게 되고, 또 이러한 작업은 해당 타입을 참조하는 메서드가 JIT 컴파일 과정에서 한 개라도 존재할 때 일어나는 일이다.
  • 인스턴스 필드의 경우 타입을 이용한 인스턴스를 생성했을 때 인스턴스 객체의 내부에 필드의 데이터를 할당하는 과정에서 동적 메모리를 필요로 하게 된다.
  • 필드들이 동적 메모리 안에 저장되기 때문에, 필드의 값은 실행 시점에서만 얻어올 수 있다.
  • 필드들은 상수 필드를 다룰 때 발생하는 버전 관리의 문제를 해결한다. 더 나아가서 필드는 어떤 데이터 타입이라도 저장 가능하므로, 컴파일러의 내장된 기본 타입에 제약을 받을 필요가 없다.
  • CLR은 readonly 필드와 read/writd 필드를 지원한다.
  • readonly 필드로 선언되면 컴파일러는 생성자 메서드를 제외한 그 어떤 경우에도 필드의 값을 수정할 수 없도록 검사하고 제한을 유지한다. 여기서 참고할 것은 리플렉션을 이용할 경우 readonly 필드의 값을 수정할 수 있다는 것이다.
  • C#은 필드에 대한 인라인 초기화 문법을 생성자에서 필드에 대한 초기화를 수행하는 것에 대한 축약 표현으로 간주한다.