C#에서 const와 readonly의 차이점
초기화 타이밍:
const
: 변수 선언 시 반드시 초기화 값을 지정해야 합니다. 컴파일 시점에 값이 결정됩니다.readonly
: 변수 선언 시 또는 생성자에서 초기화 값을 지정할 수 있습니다. 런타임 시점에 값이 결정됩니다.
메모리 저장 방식:
const
: 컴파일러에 의해 직접 코드에 값을 저장하므로 별도의 메모리 할당이 필요하지 않습니다.readonly
: 일반 변수와 동일하게 메모리에 할당됩니다.
접근 범위:
const
: 기본적으로 static 특성을 가지므로 클래스 레벨에서 접근 가능합니다.readonly
: 일반 변수와 동일하게 인스턴스 레벨에서만 접근 가능합니다.
사용 시점:
const
: 절대 변하지 않는 값, 예를 들어 상수, Pi 값 등에 사용합니다.readonly
: 초기화 후 변경되지 않도록 해야 하는 값, 예를 들어 파일 경로, 데이터베이스 연결 정보 등에 사용합니다.
사용 예시:
const double PI = 3.1415926535; // 절대 변하지 않는 상수 (컴파일 시점에 결정)
class MyClass
{
private readonly string filePath;
public MyClass(string filePath)
{
this.filePath = filePath; // 생성자에서 초기화 (런타임 시점에 결정)
}
}
결론:
const
는 컴파일 시점에 값이 결정되고 메모리 할당이 없이 코드에 직접 저장되는 반면,readonly
는 런타임 시점에 값이 결정되고 일반 변수와 동일하게 메모리에 할당됩니다.const
는 기본적으로 static 특성을 가지고 클래스 레벨에서 접근 가능한 반면,readonly
는 인스턴스 레벨에서만 접근 가능합니다.const
는 절대 변하지 않는 값에 사용하고,readonly
는 초기화 후 변경되지 않도록 해야 하는 값에 사용하는 것이 좋습니다.
C# const와 readonly 예제 코드
const double PI = 3.1415926535; // 절대 변하지 않는 상수 (컴파일 시점에 결정)
const string FILE_PATH = @"C:\Users\Public\Documents"; // 경로 상수
class Math {
public static double CalculateCircleArea(double radius) {
return PI * radius * radius; // 상수를 사용하여 계산
}
}
readonly 필드 선언:
class Person {
private readonly string name;
private readonly int age;
public Person(string name, int age) {
this.name = name;
this.age = age;
}
public string GetName() {
return name; // readonly 필드 값 반환
}
public int GetAge() {
return age; // readonly 필드 값 반환
}
}
void PrintPersonInfo(Person person) {
const string format = "이름: {0}, 나이: {1}"; // 런타임 상수 (컴파일 시점에 결정되지 않음)
string formattedInfo = string.Format(format, person.GetName(), person.GetAge());
Console.WriteLine(formattedInfo);
}
설명:
- 위 예제 코드에서는
const
와readonly
를 다양한 상황에서 사용하는 방법을 보여줍니다. const
키워드는 절대 변하지 않는 값을 선언하는 데 사용되며, 컴파일 시점에 값이 결정됩니다.readonly
키워드는 초기화 후 변경되지 않도록 해야 하는 값을 선언하는 데 사용되며, 런타임 시점에 값이 결정됩니다.readonly
로컬 변수는 람다 식 또는 메서드 내에서 선언된 변수로, 해당 블록 내에서만 값을 변경할 수 없습니다.
주의:
const
변수는 선언 시 반드시 값을 초기화해야 하며, 후에 값을 변경할 수 없습니다.readonly
변수는 선언 시 또는 초기화 후에 값을 변경할 수 있지만, 일반적으로 변경하지 않는 것이 좋습니다.
C#에서 const 및 readonly의 대체 방법
enum:
- 열거형(enum)은 고정된 값 집합을 정의하는 데 사용되는 사용자 정의 데이터 형식입니다.
- 상수와 유사하지만,
const
키워드를 사용하지 않고 값을 정의할 수 있습니다. - 다음은
enum
을 사용하는 예제입니다.
enum DayOfWeek {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
static 클래스:
- 정적 클래스는 인스턴스를 생성하지 않고 사용할 수 있는 클래스입니다.
- 정적 클래스 내의 필드 및 메서드는 클래스 자체를 통해 직접 접근할 수 있습니다.
- 다음은 정적 클래스를 사용하는 예제입니다.
static class MathUtils {
public static double PI = 3.1415926535; // 상수를 정의
public static double CalculateCircleArea(double radius) {
return PI * radius * radius; // 상수를 사용하여 계산
}
}
프로퍼티:
- 프로퍼티는 클래스의 캡슐화된 데이터에 대한 접근을 제공하는 특수 메서드입니다.
- 프로퍼티에
get
및set
접근자를 정의하여 값을 읽고 쓰도록 할 수 있습니다.
class Person {
private string name;
private int age;
public string Name {
get { return name; } // 프로퍼티 값 반환
set { name = value; } // 프로퍼티 값 설정
}
public int Age {
get { return age; } // 프로퍼티 값 반환
set { age = value; } // 프로퍼티 값 설정
}
}
사용 시 고려 사항:
const
및readonly
는 값을 변경할 수 없도록 하는 데 특화된 키워드입니다.enum
, 정적 클래스 및 프로퍼티는 다른 목적으로 사용될 수 있으며, 상황에 따라 적절하게 선택해야 합니다.const
키워드를 사용해야 하는 경우에는 대체 방법을 사용하지 않는 것이 좋습니다. 컴파일러가 값을 코드에 직접 삽입하여 성능 향상을 제공하기 때문입니다.
- C# static class https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members
c# .net constants