안타깝게도 자바에서 객체의 실제 메모리 주소를 직접적으로 얻는 것은 불가능하다.
일단 자바는 가비지 컬렉션을 사용한다. 자바 가상 머신과 가비지 컬렉터가 메모리 관리와 객체 생명주기를 처리한다. 그렇기에 자바에서는 메모리 주소를 숨기고 객체에 대한 참조만을 제공한다. (애초에 설계부터 객체의 메모리 주소나 포인터를 프로그램에서 접근할 수 없도록 설계했다는 말이다.)
참조 예시
String str1 = new String("funczun");
String str2 = str1; // str2가 str1을 참조
* str1, str2 모두 같은 객체를 참조하고 있지만, 메모리 주소에 직접 접근하지 않고 참조 변수를 통해 객체를 사용한다.
가비지 컬렉션 (Garbage Collection)
가비지 컬렉션은 메모리 관리 방법 중 하나로, 프로그래머가 동적으로 할당한 메모리 영역 중 더이상 쓰이지 않는 영역을 자동으로 찾아내어 해제하는 기능을 수행한다. (말 그대로 쓰레기를 수집해 제거한다.)
이러한 자동 메모리 관리를 따르는 이유는, 메모리 관리의 복잡성을 제거하고 안전한 프로그래밍을 보장하기 위함이다. 자바는 포인터를 사용하지 않고, 모든 객체는 참조를 통해 접근된다. 객체의 실제 메모리 주소를 얻을 수 없기 때문에 메모리 관리와 관련된 위험이 줄어든다는 해석이다.
요약해서, 메모리 관리의 추상화로 얻는 이점은 두 가지다.
1. 메모리 관리에 신경쓸 필요가 없다.
2. 메모리 누수나 잘못된 메모리 접근을 피할 수 있다.
분명 자바에서 객체의 실제 메모리 주소를 '직접적으로' 얻는 것이 불가능하다고 했다. 그렇다면 메모리 주소를 다루기 위한 편법이 존재할지도 모른다는 생각이 들었다.
실제로, sun.misc.Unsafe 클래스를 사용하면 이론적으로 메모리 주소를 다룰 수 있다고 한다. 그러나 sun.misc.Unsafe 사용은 자바의 표준 API에서 벗어난 위험한 방식이며, 이식성과 안전성 측면에서 절대로 사용하지 않는 것이 좋다고 한다.
이외에도 네이티브 코드 (JNI)를 통해 C나 C++ 같은 네이티브 언어와 상호작용하는 방식으로 메모리 주소를 직접적으로 다룰 수 있다고 한다. 하지만 이 역시 자바 프로그램의 이식성과 안전성 측면에서 심각하게 저하시킬 수 있으니 시도하지 않는 것이 좋아 보인다.
'프로그래밍 > 배웠어, 자바' 카테고리의 다른 글
[Java] Scanner, BufferedReader (0) | 2025.01.06 |
---|---|
[Java] if 문, switch 문, 삼항 연산자 (0) | 2025.01.03 |
[Java] ==, equals() /문자열 비교 정복하기 (1) | 2024.12.27 |
[Java] 주요 연산자 알아보기 (0) | 2024.12.23 |
[Java] 기본 변수 한 장 정리 (1) | 2024.12.20 |