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

제가 알고있는 차이로는

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]

1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5844까망이3/7/20231605c# 무료 디컴파일러는 어떤게 좋습니까? [1]
5843guest3/7/20231575판매 후 dll 등 에러 [5]
5842kr13/6/20231563publish 할 때 분석기 관련 dll 제외 [5]
5841guest3/3/20231785프로그램 판매 시 - Upgrade 버전 판매 [2]
5840joe3/2/20231789C# 클래스 라이브러리 수정 -> C++에서 참조시 함수 목록 갱신되지 않음. [4]파일 다운로드1
5839guest3/2/20232522윈도우 서비스 프로그램 - FORM 애플리케이션 감시서비스 [8]
5838랄랄라3/1/20231751event 사용 시 두 표현의 차이점이 있을까요? [1]
5837감사...2/28/20231814오라클 DB서버 접속관련 문의 드립니다.(Load Balancing, HA Events) [2]
5836박지범2/27/20231672static instance의 initialize 순서가 보장되나요? [6]
5835주민호2/25/20233527Windows Software Development Kit - 최신버전 1개 남기고 다 삭제하면 안되는지요? [10]파일 다운로드1
5834guest2/24/20231726Python IDE - 비주얼스튜디오 [3]
5833무지남2/23/20231543Async 메서드 그리고 나서 Bool 메서드 [5]
5832김지우2/21/20231752event와 delegate의 차이 , event를 써야하는 이유 [1]
5831이우람2/20/20231842ref 전역변수가 pinned가 될수 있나요? [2]
5830냉수...2/19/20232162C# GridView에 Column별 데이터 추가하는 방법에 대해 [1]
5829수박...2/19/20232225키움 API를 윈폼과 WPF의 네임스페이스 없이 콘솔이나 WinUI3에서 사용할 수 있는 방법이 있나요? [2]파일 다운로드1
5828김재영2/19/20231905장기적으로는 this 구문을 안쓰는게 맞을까요? [2]
5827lee2/18/20231872파이썬 설치 오류 질문입니다 [1]
5826Sy...2/14/20232434Socket 관련 Leak (OverlappedAsyncResult, OverlappedData) 관련 문의 [7]파일 다운로드1
5825박성원2/14/20232030Listview 컨트롤의 화면 전환 시 갱신 속도 [1]
5823검은콩2/13/20232448catch(Exception ex)의 line번호를 쉽게 알 수 없는지요? [7]
5822김지우2/11/20231993책을 보면서 sync, async 이해가 되지 않는 부분이 있습니다. [5]파일 다운로드2
5821검은콩2/9/20231947Async 신뢰성과 소켓데이터 [4]
5820차가워2/8/20231973다른 프로세스 실행 후 포커스 가져오기 [3]
5819취준생2/7/20232098WPF 관련 실무가 궁금합니다. [3]
5818윤길2/7/20231669ObservableCollection 에서 INotifyPropertyChanged 구현해야하나요? [2]
1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...