c#에서 readonly와 const는 '상수타입'이라는 공통점이 있다!
반면에 차이점은 readonly는 런타임 상수이고, const는 컴파일 상수이다!
readonly
- 런타임 상수이다. (exe 또는 dll을 사용할 때 변수의 값을 가져온다.)
- 모든 자료형에 사용할 수 있으며, 생성과 동시에 초기화할 필요가 없다.
- 단, 생성자 단계에서 단 1번의 할당을 통해 초기화할 수 있다.
- 메모리 영역은 Heap 이다.
- 지역변수에서 사용이 불가능하다.
const
- 컴파일 타입 상수이다. (컴파일 시 const 변수의 값을 가져온다.)
- 내장자료형 (정수형, 실수형, Enum, String)에 대해서만 사용할 수 있다.
- 변수 선언과 동시에 값을 할당 해야 한다.
- 메모리 영역은 Stack 이다. 단, 앞단에 static을 선언하면 Heap에 저장이 가능하다.
-> const는 메모리 영역이 Stack에 저장되기 때문에 접근이 빠르다는 장점이 있다. 하지만 컴파일 상수여서 const 변수가 바뀌는 경우 해당 프로젝트 뿐만 아니라 참조 받거나 영향 받는 모든 프로젝트를 재컴파일 해야 하는 단점이 있다..!
반면 readonly는 생성시 선언하지 않아도 생성자에서 초기화하여 사용할 수 있기 때문에 유연하며, 실제 프로젝트 사용하는 단계에서 변수의 값을 가져오는 장점이 존재한다.
그러므로 확장성 좋고(재컴파일 안해도 되는) 생성자에 따른 값도 변경할 수 있는 readonly를 되도록 활용하는게 좋을 수 있다.
원 넓이를 구할 때 (반지름 x 반지름 x PI )이다.
여기서 PI(3.14)는 고정적인 값이므로 변하면 안되는 값이다. 그래서 변수를 선언할 때 const 키워드를 넣어 상수화 해주는 것이 좋다.
안녕하세요, C#공식 문서(https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/const#remarks)에 보면 "static 한정자는 상수 선언에는 허용되지 않습니다."라고 나와있는데요, 블로그 내용 중 "메모리 영역은 Static 이다. 단, 앞단에 static을 선언하면 Heap에 저장이 가능하다." 라는 부분에에 오류가 있는 것 같아서 댓글 남깁니다. 혹시 const 변수 앞에 키워드로 static을 쓰는게 아닌, 클래스에 적용한다는 내용의 의도로 작성하셨는지는 모르겠지만 제가 잘 몰랐던 내용이거나 C#버전에 따라 다른 내용일 수 있으니 한번 확인해주시면 감사하겠습니다.