C#에서 const와 readonly는 immutable values를 선언할 수 있게 한다.
Const
const선언은 소스코드에만 존재하고, compiled output에는 없다. const reference는 실제 값으로 대체된다.
const property와 몇가지 예를 살펴보자.
Access Modifiers와 Types
string과 bool, int, float과 같은 primitive type, enum.
public class CircleCalculator
{
public const double E = 2.71;
private const double Pi = 3.14;
public double GetCircumference(double radius) => 2 * Pi * radius;
public double GetAccurateCircumference(double radius)
{
const double accuratePi = 3.14159265359;
return 2 * accuratePi * radius;
}
}
할당 과 가변성
const field 또는 local const는 compile시, 계산된다. 코드 작성 시, 값이 할당되면 변경되거나 runtime시 계산할 수 없다.
runtime동안 존재하지 않으므로, immutable한 것을 쉽게 이해할 수 있다.
GetCircumference() 함수에서 compiler는 compile시, 2와 Const field 값을 알기 때문에 하나의 숫자로 compiled된다.
Static과 유사성
const는 static reference처럼 동작한다. class instance 별 다른 값을 갖는 변수와 다르게, const는 전체 class instances에 같은 값으로 공유된다. object or instance 생성 없이 class name을 사용해 constant에 직접 접근할 수 있다.
Console.WriteLine(CircleCalculator.E);
어셈블리 간 참조
어셈블리A가 어셈블리B를 참조한다. 어셈블리B의 constant field 값을 변경하고 recompile하면, 어셈블리A는 자동으로 수정된 값을 받지 않는다. 어셈블리A에서 수정된 값을 보려면 마찬가지로 recompile해야한다.
Readonly Modifier
변수처럼 동작하고, runtime에 heap memory 공간을 차지한다.
Access Modifiers와 Types
모든 type의 모든 public/private field에 사용 가능하다. local에는 사용 못한다.
public class TaxCalculator
{
public readonly decimal _countryVAT;
public readonly decimal _euroToDollarConversionRate = 1.08M;
private readonly MathCalculator _calculator = new MathCalculator();
public TaxCalculator(decimal countryVAT)
{
_countryVAT = countryVAT;
}
public decimal CalculateCountryVatInEuro(decimal productValue)
=> _calculator.Multiply(productValue, _countryVAT);
public decimal CalculateCountryVatInDollars(decimal productValue)
=> CalculateCountryVatInEuro(productValue) * _euroToDollarConversionRate;
}
할당과 가변성
readonly fields의 할당은 runtime 시 발생한다. 따라서, 모든 readonly fields는 mutable로 시작해서, 값을 할당하는 순간 immutable로 바뀐다.
어셈블리 간 참조
어셈블리A가 어셈블리B를 참조한다. 어셈블리B의 readonly field 값을 변경하고 recompile하면, 어셈블리A는 자동으로 수정된 값을 받는다.
Const와 Readonly의 차이점
const | readonly |
source code에만 존재 | source code와 compiled output에 존재 |
enums, string, primitive data type public/private class fields, member locals |
any data type for public or private class fields |
compile-time evaluation | runtime evaluation |
항상 immutable | 값이 할당되기 전까지 mutable |
class instance 간에 같은 값을 갖는다. | 모든 instances 간데 같은 값을 갖을 수도 있고, instance 특정값을 갖을 수도 있다. |
다른 assembly의 const를 사용하는 경우, 값 수정 시 양쪽 모두 recompile해야한다. | 다른 assembly의 const를 사용하는 경우, 값 수정 시 reference assembly만 recompile하면 된다. |
Const와 Readonly 어떤 것을 사용할까?
일반적으로, 다음의 경우에는 const가 적합하다.
- field가 string, enum 또는 primitive type일 때
- 모든 class instances에 같은 값이 필요할 때
- class instance 생성 없이 접근할 때
반대로, 다음의 경우 readonly가 적합하다.
- field가 어떤 type이든 될 수 있을 때
- 값이 runtime에 동적으로 초기화될 때
- class instances별로 다른 값이 필요할 때
- recompile 없이, 다른 assembly의 값이 수정되어야 할때
'C#' 카테고리의 다른 글
C#] SOLID 원칙 2. Open Closed Principle (OCP 원칙) (1) | 2024.01.23 |
---|---|
C#] Virtual Method (0) | 2024.01.23 |
C#] File - 사용 중인 파일 확인 방법 (IOException, HResult) (0) | 2024.01.18 |
C#] 식별자/변수명 네이밍 규칙, convention (0) | 2024.01.12 |
C#] Deprecated Method 표시, 미사용 함수 표시 (0) | 2024.01.09 |
댓글