const, readonly 그리고 static

이정은·2025년 5월 15일

C#

목록 보기
1/8

상수

변하지 않는 값. (변하는 값인 "변수"와 반대)
값을 바꾸는 것을 방지하기 위하여 사용한다. (=값 고정)



const - 컴파일 상에서

readolny - 런타임 상에서

  • (상수처럼 보이지만, 런타임에서 결정되어야 하는 값 = 읽어온 다음에 고정)

const와 readonly 차이

  • 객체 생성마다 다른 값을 줘야 할 때 readonly를 사용하는 것을 보면 차이점을 알 수 있다.
class User {
    public readonly string id;

    public User(string userId) {
        id = userId; // 생성자에서 1회 설정 가능
    }
}

각 User 객체마다 다른 id를 주고, 그 후에는 절대 바뀌지 않게 하고 싶은 상황이다. 이건 const론 불가능하고 readonly를 사용해야 한다.









static


  • 공통된 데이터나 기능을 공유하고 싶을 때
    - 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✅ 가능❌ 없음런타임

0개의 댓글