• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

리터럴에 대해 궁금증이 생겨 질문드립니다.

23.03.21 09:32 작성 23.03.21 10:09 수정 조회수 474

2

평소에는 머신코드로 작성된 실행파일의 형태로 존재하겠지만, 그 실행파일을 실행명령을 내려 운영체제가 RAM위에 올리게 되면 (RAM에 올리게되는 방식은 운영체제 프로그램별로, 컴파일러 프로그램별로 각각 상이함.)

결국 main함수에서 소스코드로 써 내려간 명령코드들,
프로그램 내부에서 사용하기 위해 선언 한 변수, 혹은 상수(const 변수), 그외의 리터럴값들 등등이 RAM위에 올라가게되고 CPU와 RAM의 상호작용으로 프로그램이 실행되고.

보통 일반적으로 CPU가 RAM의 각 메모리주소 속 데이터를"복사"해서 레지스터에 임시저장시킨뒤 거기서 명령코드를 디코딩해서 해석한대로 명령코드들을 수행하는구나 라고 C언어 강의 첫주차에서 배웠던것이 기억나는데요.

첫주차 강의를 들으며 제가 이해한 바로는,
예컨대 int a = 42; 라는 코드를 프로그램이 수행하는 방식은

1. a 라는 변수명에 할당되는 특정 메모리주소와 그 메모리주소의 공간에는 4byte라는 공간을 만들어 두게 될 것이고

2. 42라는 리터럴 값 역시도 접미사가 붙지는 않았지만, 컴파일러가 컴파일 하는 과정에서 적절히 특정 정수형 자료형의 리터럴값으로 처리하여, RAM위에 올라간 다음

 

3. a = 42; 라는 대입연산자를 수행하게 되면

42라는 값을 지시하는 메모리주소의 값을 CPU의 레지스터가 복사하여 임시저장하고있다가, 그것을 a라는 메모리주소에 대입시킨다 라고 이해하고 있습니다.

질문드리고 싶은것은

Q1)이번 5.2 강의에서 교수님께서 i = 1024; 라는 코드에서

1024와 같은 리터럴 값들은 메모리 공간을 부여받지 못하기 때문에 data object가 아니다 라고 말씀하셨는데..

리터럴 값들은 프로그램이 실행될 때, RAM에 올라가지 않는건가요?

 

Q1-2) 만약 리터럴 값들을 운영체제가 메모리에 올려주지 않는다면
i = 1024; 와 같이 대입연산자의 명령을 CPU가 처리할 때, "어디서" 1024라는 리터럴값을 복사해서 레지스터에 임시저장해두었다가 a라는 메모리주소에 대입할 수 있는걸까요?

Q2)
const라는 제한자를 이용하여 선언 및 초기화시킨 상수는 메모리 주소도 메모리 공간도 가지고 있다. 그래서 l value이다.
그런데 앞선 다른 5.2강의 질문들에서
object 들은 항상 l-value이지만,
l-value들은 항상 object가 아니다 라는점 확인했습니다.
그렇다면 초기화 이후 값을 변경할 수 없는 상수는 object가 맞는걸까요?
아직 l-value와 object의 차이가 감이 안잡혀서 질문드렸습니다.

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.03.21

안녕하세요, 답변 도우미 Soobak 입니다. 😀

우선, 처음 언급해주신 이전 학습 내용에 대한 설명은 전반적으로 정말 잘 이해하고 계신 것 같습니다 !! 👍👍

질문 1.) 이번 5.2 강의에서 교수님께서 i = 1024; 라는 코드에서 1024와 같은 리터럴 값들은 메모리 공간을 부여받지 못하기 때문에 data object가 아니다 라고 말씀하셨는데.. 리터럴 값들은 프로그램이 실행될 때, RAM에 올라가지 않는건가요?
-> 아닙니다. 😊
설명 중 "리터럴 값들은 메모리 공간을 부여 받지 못하기 때문에 data object가 아니다." 라는 부분에서,
"메모리 공간을 부여 받는다는 것"" R-value 는 메모리 공간을 부여 받은 data-object 가 아니므로, R-value 에 다른 R-value 를 대입할 수 없다." 라는 맥락에서의 "값을 변경하고 대입할 수 있는 메모리 공간" 으로 이해하시는 것이 적절할 것 같습니다. (해당 강의의 8:09 부분에서 교수님께서 L-value (메모리 공간을 대표하는 변수명) 와 R-value (값 자체) 의 차이점에 대해서 설명하시는 부분 참고)

실제로, 리터럴 값들 역시 메모리 공간에 할당되고, 프로그램이 실행되는 동안 해당 메모리 주소를 참조하여 사용됩니다. 일반적으로, 리터럴 값들은 '읽기 전용(Read-only)' 메모리 영역인 '데이터 영역' 혹은 '코드 영역' 에 저장되며, 해당 영역에 대한 참조를 통해 프로그램이 리터럴 값을 참조하고 사용할 수 있게 됩니다.

해당 부분에 대해서는 섹션 12 <Storage Classes, Linkage and Memory Management> 에서 보다 더 자세하게 학습하시게 되며, 만약 지금 해당 부분이 너무 궁금하시다면, 강의 12.1 메모리 레이아웃 훑어보기1:59 부분의 'TEXT segment, DATA segment, BSS segment, Heap, Free, Stack, Command-line arguments and environment variables' 에 대한 부분을 살펴보시면 이해하시는 데에 도움이 되실 것 같습니다.

 

질문 1-1.) 만약 리터럴 값들을 운영체제가 메모리에 올려주지 않는다면 i = 1024; 와 같이 대입연산자의 명령을 CPU가 처리할 때, "어디서" 1024라는 리터럴값을 복사해서 레지스터에 임시저장해두었다가 a라는 메모리주소에 대입할 수 있는걸까요?
-> 질문 1에서 답변드린 내용을 바탕으로, 리터럴 값들 역시 메모리 레이아웃에 올라가게 됨을 설명드렸으니, 위 답변을 참고하시면 이해하실 수 있으실 것 같습니다. 😊

 

질문 2.) const라는 제한자를 이용하여 선언 및 초기화시킨 상수는 메모리 주소도 메모리 공간도 가지고 있다. 그래서 l value이다. 그런데 앞선 다른 5.2강의 질문들에서 object 들은 항상 l-value이지만, l-value들은 항상 object가 아니다 라는점 확인했습니다. 그렇다면 초기화 이후 값을 변경할 수 없는 상수는 object가 맞는걸까요?
-> 질문해주신 강의 5:07 부분의 교수님 설명을 참고해보시면, Data object 의 판단 기준은 "어떤 데이터가 메모리 안에 존재하고 있다면, 그것이 Data object 이다." 와, 10:31 부분 교수님 설명, "L-value 를 판단하는 기준은 '메모리 공간을 차지하고 있는가? 차지하고 있지 않은가?" 이므로, l-value 는 항상 Data object 라고 설명드리는 것이 적절한 것 같습니다. 질문자님의 질문에 있어서, "object 들은 항상 l-value이지만, l-value들은 항상 object가 아니다" 는 부분에 대해서는 "l-value 는 r-value 가 될 수도 있고, l-value 일 수도 있다" 는 내용과, 위 질문-1 과 질문-1.1 에 대한 '리터럴' 의 내용에 대해서 혼동하신 것으로 생각됩니다.


만약, 제가 질문의 의도를 잘못 이해하였거나, 추가적인 궁금증이 있으시다면 편하게 또 질문글 남겨주시면 감사하겠습니다.

이전 학습내용들도 모두 꼼꼼하게 학습하신 것이 느껴지고, 추가적인 궁금증을 갖고 질문 해주시는 부분들이 참 인상깊고, 멋있으시다고 느껴집니다. 앞으로도 계속 화이팅하시길 바랍니다. 😀 화이팅!

 

 

 

이상우님의 프로필

이상우

질문자

2023.03.21

알려주신대로 섹션12부분을 참고하였고, 실제로 답변내용도 친절하게 알려주셔서 제가 어려움을 겪었던 부분의 해결 + 아직 몰랐던 지식까지도 다 잡을 수 있었던 것 같습니다.
친절한 답변 감사드립니다.

Soobak님의 프로필

Soobak

2023.03.21

다행이네요! 감사하다고 말씀해주셔서 저 또한 감사드립니다 😀
추가적인 궁금사항이 있으시면 언제든지 또 편하게 질문글 남겨주세요! 화이팅!