상수는 불변의 값이다.
C#의 경우 기본 타입을 상수로 정의할 수 있다.
기본 타입은
Bool, Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, String 등이 있다.
상수의 특성
1. 컴파일 타임에서 정의가 된다.
2. 컴파일러는 해당 어셈블리의 메타데이터 안에 정의된 상수 기호를 검색하여 상수의 실제 값을 추출한 후 IL코드에 직접 첨부한다.
(외부 dll에서 정의된 상수 값도 컴파일러가 해당 응용프로그램을 컴파일 시 외부 dll의 어셈블리의 메타데이터의 상수 기호를 검색하여 응용프로그램의 IL 코드 직접 첨부한다.)
3. 상수값에 대해서 따로 메모리 추가, 삭제를 하지 않는다.
주의해야 하는 코드를 보겠다.
외부에서 생성한 DLL 코드
DLL을 사용하는 응용프로그램
위의 응용프로그램을 컴파일 해보겠다.
이처럼 dll을 참조하여 사용시 응용프로그램은 참조할 dll을 응용프로그램의 경로에 복사시킨다.
그럼 저 경로의 TestDll.dll만 바꿔보겠다.
위의 작업 후 DLLTestConsole을 실행하면 어떤 값이 나올까?? 우리 예상은 15이다 참조할 dll의 const 값이 15이기 때문이다.
위의 결과가 나온다. 이는 2번에서 설명한 응용프로그램에서의 IL코드가 재갱신되지 않았기 때문이다.
자 그럼 응용프로그램을 컴파일 후 실행해보겠다.
이처럼 외부 dll에서 제공하는 const값은 참조하는 응용프로그램과의 혼동을 유발시킬 수 있다.
그래서 dll 개발 시 가능하면 const는 절대 불변의 값(Ex. PI = 3.141592...)만을 사용하는 것을 추천한다.
추 후 런타임에서 정의되는 상수 readonly도 포스팅하겠다.
결론
1. 상수는 컴파일 타임에서 해당 응용프로그램의 IL 코드로 생성된다.
2. 상수는 컴파일 타임에서 메모리를 이미 잡고 있기 때문에 런타임에서 사용하는 메모리와는 무관하다.
3. DLL을 배포하는 코드를 작업 시 가능하면 const는 사용하지 않는다. 정말 필요할 때 (PI = 3.141592, ushort max = 65535 등..)만 사용 하자.
'Program > C#' 카테고리의 다른 글
값타입의 박싱과 언박싱 (1) | 2020.12.14 |
---|---|
값 타입, 참조 타입 (0) | 2020.12.13 |
네임스페이스와 어셈블리 (1) | 2020.12.05 |
타입에 대하여2 (0) | 2020.12.02 |
타입에 대하여1 (1) | 2020.11.29 |