변하지 않는 값. (변하는 값인 "변수"와 반대)
값을 바꾸는 것을 방지하기 위하여 사용한다. (=값 고정)
class User {
public readonly string id;
public User(string userId) {
id = userId; // 생성자에서 1회 설정 가능
}
}
각 User 객체마다 다른 id를 주고, 그 후에는 절대 바뀌지 않게 하고 싶은 상황이다. 이건 const론 불가능하고 readonly를 사용해야 한다.
공통된 데이터나 기능을 공유하고 싶을 때
- static은 클래스 전체에서 단 하나만 존재한다. 그래서 모든 객체가 공통으로 사용하는 데이터를 저장하거나, 객체 없이 바로 사용할 수 있는 함수를 만들 때 유용하다.
객체를 만들지 않고도 사용 가능하게 하기 위해
프로그램 전체에서 상태를 저장해야 할 때
- static 변수는 프로그램이 실행되는 동안 한 번만 메모리에 올라가고, 프로그램이 끝날 때까지 유지된다. 그래서 설정값이나 카운터처럼 전역적인 값을 저장하는 데 적합하다.
static은 메모리 상에서 공간을 이미 할당을 받는다. (정적)
(따라서 메모리 관리 주의해야 함)
일반 멤버변수는 static 함수에 접근할 수 없다.
-> static 함수는 지역변수와 static 멤버변수를 사용할 수 있다.

-> const로 컴파일 타임 상수라서 static 메소드에서 바로 접근 가능.
-> readonly int numeber2 = 2;는 static 메소드에 접근하려면 인스턴스가 필요하다.
해결 방법
1. readonly도 static 선언하기
static readonly int number2 = 2;
2. 객체 생성하기
class Program {
public readonly int number2 = 2;
static void Main(string[] args) {
Program p = new Program(); // 객체 생성
Console.WriteLine(p.number2); // 이제 접근 가능
}
}
| 구분 | static 메서드에서 접근 가능? | 인스턴스 필요 여부 | 값 확정 시점 |
|---|---|---|---|
const | ✅ 가능 | ❌ 없음 | 컴파일 타임 |
readonly | ❌ 인스턴스 필요 (→ 오류 발생) | ✅ 필요함 | 런타임 |
static readonly | ✅ 가능 | ❌ 없음 | 런타임 |