해결된 질문
작성
·
121
·
수정됨
0
java 백엔드 개발자입니다.
수업을 듣는 도중, 실제 물리 주소에 할당되지 않은 VMS 위치에 어떻게 접근하여 값을 할당하는지 이해가 잘 되지 않습니다.
다른 질문을 읽어보면서 유추하건데, 제가 java 언어만 얕게 사용할 줄 알아서 C와 포인터에 대한 이해가 부족해서 그런것 같다는 생각이 들기도 합니다.
C언어에서는, 실제 물리 메모리에 할당되지 않은 VMS 위치에 직접 접근하여 값을 할당할 수 있는 걸까요? 그게 강사님께서 말씀하신 포인터의 권력인걸까요?
작년 말쯤 강사님께서 java에 대해 학습하시는 영상을 유튜브로 본 적이 있는데, java에서도 그러한 환경과 상황이 나올 수 있는 것일까요? 일반적인 웹 어플리케이션 개발을 하는 환경에서는 들어보지 못한 상황과 에러라서 궁금해서 질문 남깁니다!
+ 유튜브 영상으로 올려주시는 조언과 공학 지식들을 잘 듣고 있습니다. 항상 좋은 내용들을 쉽게 전달해주셔서 감사합니다.
답변 1
1
물리주소가 할당되지 않았다면 page fault 오류가 발생합니다. 가상 메모리는 논리적으로 제공되는 연속된 메모리 공간입니다. 이 공간이 실제 메모리와 연결(mapping)된 것인지 여부는 OS가 결정하고 관리합니다. Java에서 new연산을 통해 새로운 인스턴스를 할당하면 메모리를 사용하게 됩니다. 이렇게 메모리가 가상 메모리 공간에서 확보되면 실제 메모리와 연결 됩니다. 물론 이 과정은 OS나 JVM이 담당합니다.
즉, 가상 메모리 공간이 4GB가 할당되어 있다는 것은 논리적으로 범위가 그렇다는 것이지 실제로 메모리를 4GB만큼 소모하지 않습니다. 그 중 일부가 실제 메모리와 연결되는 것은 new 연산 등을 통해 확보했을 때로 제한됩니다. 그런데 C언어에서는 그 주소만 알면 언제든제 제한 없이 접근이 가능합니다. 이 때문에 절대 권력이라 하는 것이고요.
그러나 Java에서는 이러한 개념 자체가 없습니다. 참조자가 있긴 하지만 참조자가 가리키는 대상 인스턴스를 변경하는 정도는 가능하지만 주소 상수를 특정해 임의의 영역을 인스턴스로 참조하는 것이 불가능합니다. 즉, 포인터 같은 절대권력이 아예 존재하지도 않는 것입니다. 따라서 메모리 오남용에 따른 접근제어 오류는 발생하지 않습니다.
사람마다 의견이 다를 수 있습니다만...저는 Java를 제대로 잘 구사하고 싶다면 C언어를 다루는 능력도 필요하다고 생각합니다. 다른 형태로 말하면 CS(컴퓨터 구조, 운영체제)이론에 대해 깊이 알 수록 Java를 더 제대로 이해 할 수 있는 것이라 하겠습니다. 참고하시기 바랍니다. 😄
답변 감사합니다. Java의 GC의 역할까지도 다시 생각해볼 수 있는 계기가 되었습니다. 기회가 될때마다 CS 지식을 조금씩 더 보충해나아가야겠네요!