[C#] const와 readonly 둘 다 읽기 전용인데, 뭐가 다를까?
2022. 3. 21. 17:08ㆍLanguages/C#
*이 글은 <이것이 C#이다> 책을 바탕으로 공부한 글입니다.
const
const float range = 5f; // 공격 사거리
컴파일러는 상수에 지정된 값을 실행파일 안에 기록해둔다. 이 말은 상수는 프로그램이 실행되기 전부터 이미 값이 정해져 있다는 의미가 된다. (컴파일 타임에 이루어짐)
그렇기 때문에 변수와 달리, 상수는 프로그램 실행 중(런타임)에는 그 값을 절대로 바꿀 수 없다.
이러한 const 상수는 다음과 같은 특징들을 가진다.
1. 선언 시, 반드시 값을 할당해야 한다.
// const float range; 컴파일 오류
const float range = 5f;
2. 자동으로 정적 변수(static) 속성을 가진다.
class Monster
{
public const float range = 5f;
}
class Main
{
static void Main(string[] args)
{
float range = Monster.range;
}
}
readonly
class Monster
{
private readonly float range; // 읽기 전용 필드
public Monster(float range)
{
this.range = range;
}
}
읽기만 가능한 필드다. 클래스나 구조체의 멤버로만 존재할 수 있으며, 생성자 안에서 초기화가 가능하다.
생성자 안에서 한 번 값을 지정하면, 그 후로는 값을 변경할 수 없는 것이 특징이다.
즉, const와 달리 런타임 중에 생성되어 값을 변경할 수 있는 기회가 한 번은 있는 셈이다.
readonly 상수는 다음과 같은 특징들이 있다.
1. 선언 시, 값을 할당하지 않아도 된다.
readonly float range;
2. static 상수로 만들 경우에는 static 생성자를 통해 초기화할 수 있다.
const와 달리, 자동으로 static 속성을 가지지 않는다.
class Monster
{
public readonly static float range;
static Monster()
{
range = 10f;
}
}
728x90
반응형
'Languages > C#' 카테고리의 다른 글
[C#] 확장 메소드 (Extension Method) (0) | 2022.03.21 |
---|---|
[C#] 중첩 클래스(Nested Class)와 분할 클래스(Partial Class) (2) | 2022.03.21 |
[C#] 부모 클래스와 자식 클래스 사이의 형변환을 해 보자! (is, as) (0) | 2022.03.21 |
[C#} new 와 sealed 키워드 (0) | 2022.03.21 |
[C#] 부모 클래스를 가리키는 Base 키워드와 생성자 (0) | 2022.03.20 |