Microsoft MVP성태의 닷넷 이야기
const와 readonly의 명확한 차이가 이게 맞나요? [링크 복사], [링크+제목 복사],
조회: 11368
글쓴 사람
김민아
홈페이지
첨부 파일
 

제가 알고있는 차이로는

1. const는 정적 취급이고 readonly는 인스턴스 취급이다. (readonly에 static을 선언하면 정적 취급)
2. const는 변수 선언과 동시에 값을 할당해야 하지만 readonly는 선언만 해놓은 후 생성자 내부에서 값을 몇 번이고 바꿀 수 있다.
3. const는 기본 자료형(int, string, enum)에 대해서만 사용할 수 있고 readonly는 모든 타입으로 사용할 수 있다.
4. const는 메소드 내부에서도 선언할 수 있는데 메소드에서 지역변수로 사용하게 되면 스택 메모리에 할당되며 클래스 필드로 사용하게 되면 힙에 할당된다.

그리고 정말 죄송하지만 부가적인 질문 하나가 더 있는데..
구조체 필드로써 선언한 값 형식은 스택, 참조 형식은 참조가 스택에 있고 그 주소를 찍고 들어가 보면 힙메모리에 객체가 저장되어 있는 건 알겠는데
구조체에서 const로 선언한 값 형식의 필드도 스택에 올라가는 게 맞나요..?








[최초 등록일: ]
[최종 수정일: 3/9/2022]


비밀번호

댓글 작성자
 



2022-03-09 12시59분
4번의 경우 const 지역 상수는 스택 메모리에 할당되지 않습니다. 또한 클래스 필드로 사용해도 힙에 할당되지 않습니다. 마찬가지로 구조체에서 const로 선언한 경우 스택에 올라가지 않습니다.

참고로, 이런 식의 궁금증들은 .NET Reflector나 ildasm.exe 등을 이용해 C# 컴파일러가 IL 코드로 어떻게 변환하는지 살펴 보시면 됩니다. 가령, 4번 질문의 경우, const를 지역 (변수가 아닌) 상수로 정의해도 C# 컴파일러가 출력한 DLL/EXE를 IL 코드 수준에서 보면 const 정의가 누락되는 것을 볼 수 있습니다.

또한, const로 정의한 필드가 구조체든 클래스든 개별 인스턴스의 메모리에 올라오지 않는 것은, 해당 필드를 IL 코드로 보면 static으로 정의되는 것을 통해 유추할 수 있습니다.
정성태
2022-03-09 01시33분
[김민아] 늦은 시간에 정말 감사합니다 앞으로 리플렉터로 변환 과정을 확인해 봐야겠네요!!
[guest]

... 46  47  48  49  50  51  52  53  54  55  56  57  58  59  [60]  ...
NoWriterDateCnt.TitleFile(s)
1153이상헌6/8/201317261죄송합니다;; 또다시 의문점이 생겨 질문드립니다. [1]
1152이상헌6/8/201316636넷두이노 플러스 펌웨어 다운로드가 안되네요;;; [1]
1151황기동6/5/201317574무선 패킷 전송관련 질문 [1]
1147이진권6/2/201317874c# 윈폼 facebook과 연동2 [1]
1144황은영5/29/201322075원격지 서버에서 COM+ 호출이 되지 않습니다. [7]
1143김선희5/28/201323000윈도우 8, 익스플로러 10, 64bit->32bit [1]
1142백지훈5/15/201317906음성인식 TTS 관련해서 질문드립니다 ㅜㅜ [2]파일 다운로드1
1141나그네5/10/201318141안녕하세요..전자세금 관련하여.. 보다보다 여기까지 왔습니다. [4]
1140이성환5/8/201318178제네릭과 배열 관련 기초 질문입니다. [11]
1139양영석5/3/201316637페이스북 로그인 관련하여.... [1]
1137김민현4/30/201316477Binary 구조체에 대한 Linq query 관련 질문입니다. [3]파일 다운로드1
1136박상영4/25/201317764ksc5601에서 지원하지않는 확장문자 찾는방법 [3]
1135sequ...4/16/201333560c# dll c++ 에서 사용하기 (event 사용) [17]
1134이성환4/12/201317908volatile 키워드 관련 질문입니다. [3]파일 다운로드1
1133서광석4/8/201320925vb.net 2010에서 배포시 문제점 확인 방법에 대한 질문드립니다 [1]
1131헤딩3/28/201323156IIS 처리 성능을 높이고 싶으면 풀의 proecss 수를 계속 늘리면 될까요? [1]
1130박재율3/27/201317513WCF 서비스가 종종 죽는데 도움좀 부탁드립니다 ㅠ [1]
1129이상민3/21/201321918안녕하세요...IE Embedded Smart Client가 Windows8에서 정상동작을 하지 않습니다. [8]
1125박홍균3/19/201315265안녕하십니까. visual studio 에서 TFS 접속 관련으로 궁금한 점 여쭤봅니다.
1124궁금이3/18/201318351IIS 서버 이중화 구성시 데이터 베이스 트랜잭션 관리에 관해서... [1]
1127궁금이3/19/201315594    답변글 [답변]: IIS 서버 이중화 구성시 데이터 베이스 트랜잭션 관리에 관해서...(정성태님 봐주세요)
1122김시현3/11/201316962 Xamarin 에 관련하여 질문드립니다. [4]
1121롬메달2/14/201317476Assembly.Load로 얻은 객체안에서 제3의 어셈블리를 참조할때의 문제입니다. [8]
1120Lyn2/12/201316939안녕하세요. 블로그에 기술관련글을 꾸준히 포스팅 하실 수 있는 원동력이 궁금합니다. [1]
1119박진영2/4/201340060닷넷 DLL 실행 에러 (보호된 메모리를 읽거나 쓰려고 했습니다..) [2]파일 다운로드1
1118C#조으다1/29/201318612공유기 관리 페이지에 접근시 윈도우 인증창이 뜹니다. [4]
... 46  47  48  49  50  51  52  53  54  55  56  57  58  59  [60]  ...