[Java] 자바의 메모리관리 부제:Java에서 String과 new String()의 차이는 뭘까?
자바의 메모리 관리와 JVM, 그리고 가비지 컬렉터
자바를 설치하면 내 컴퓨터(윈도우 OS) 안에 자바 플랫폼이 만들어진다.
자바 플랫폼에는 크게 두 가지가 들어있다.
-
JVM (Java Virtual Machine) : 자바 프로그램을 실행하는 가상 머신
-
Java API 라이브러리 : 자바에서 제공하는 클래스, 메소드 등이 들어있는 기능 모음 (보통
.jar확장자 파일로 제공됨)
JVM과 메모리 구조
JVM은 자바 프로그램을 실행하기 위해 메모리를 관리하는 역할을 한다. JVM 안에는 크게 세 가지 구역이 있다.
-
메서드 영역 (Method Area) : 클래스 정보, 메타데이터, static 변수 등이 올라가는 공간
-
스택 영역 (Stack Area) : 메서드 실행 시 필요한 지역 변수, 매개변수 등이 저장되는 공간
-
힙 영역 (Heap Area) :
new키워드로 생성한 객체(인스턴스)가 올라가는 공간
자바 프로그램의 main() 메소드가 실행되면, 그 코드는 스택 메모리에 올라간다.
스택은 한 줄씩 실행되며 결과를 저장하거나 관리하는 구조다.
힙(Heap)의 필요성
예를 들어, String 클래스 같은 기능은 처음에는 하드디스크 속 .jar 파일 안에 압축된 상태로 저장되어 있다.
이걸 실제로 사용하려면 메모리(RAM)에 올려서 펼쳐놔야 한다.
그런데 String 클래스는 프로그램 실행 중에 몇 번이고 계속 쓰일 수 있다.
따라서 자바 개발자들은 “한 번 펼쳐놓고 계속 쓸 수 있는 공간이 필요하다”라고 생각했고, 그 공간이 바로 힙(Heap) 이다.
new 키워드와 메모리 할당
new 키워드를 쓰면 클래스가 힙에 올라간다.
하지만 힙에 올린 것만으로는 의미가 없다. 반드시 참조할 수 있는 주소(레퍼런스) 가 필요하다.
예시를 보자:
// 객체만 힙에 올림 (주소 참조 불가)
new String();
// 객체를 힙에 올리고, 스택에서 참조 가능하게 만듦
String str = new String("java programming");
-
위에서
str은 스택에 저장된 변수이고, -
new String("java programming")으로 만들어진 실제 객체는 힙에 올라간 상태다. -
str은 힙에 있는 객체의 주소를 참조하고 있는 것이다.
힙에 올라간 것을 우리는 객체(Object) 또는 인스턴스(Instance) 라고 부른다.
메소드 호출과 사용법
힙에 올라간 객체를 꺼내 쓰려면 .(점) 연산자를 사용한다.
이걸 메소드 호출이라고 부른다.
String str = new String("java programming");
// 0번째 글자 꺼내기
char result = str.charAt(0);
System.out.println("charAt 실행 결과: " + result);
즉, 스택의 변수(str) → 힙의 객체 주소 → 객체의 기능(charAt 메소드) 이런 식으로 접근이 이루어진다.
가비지 컬렉터(Garbage Collector)
자바는 메모리를 직접 해제할 필요가 없다.
C언어나 C++처럼 free() 같은 명령어를 쓰지 않아도 된다.
JVM 안에는 가비지 컬렉터(GC) 라는 관리자가 있어서, 더 이상 사용하지 않는 객체(참조할 수 없는 객체)를 자동으로 치워준다.
쉽게 말해, 힙의 땅을 정리해주는 부동산 관리인 같은 역할을 한다.
비유로 정리하기
-
하드디스크의
.jar파일 → 책이 창고에 꽂혀 있는 상태 -
new키워드 → 책을 책상(힙 메모리) 위에 펼쳐놓는 행동 -
참조 변수 (
String str) → 책상의 책 위치를 가리키는 포스트잇 주소 -
메소드 호출 (
str.charAt(0)) → 책을 펼쳐서 특정 페이지(기능)를 보는 것 -
가비지 컬렉터 → 책상을 정리하는 관리인
정리
-
JVM은 자바 프로그램을 실행하는 가상 머신
-
JVM 안의 메모리 구조는 메서드 영역 / 스택 / 힙
-
new키워드로 객체를 힙에 올리고, 참조 변수를 통해 접근 -
힙의 객체는 가비지 컬렉터가 관리 → 필요 없어지면 자동 정리
자바의 메모리 관리 구조를 이해하면, 코드가 메모리에서 어떻게 동작하는지 그림으로 설명할 수 있다.
앞으로는 “스택에서 실행하다가 힙으로 객체를 올리는 순간”을 이해하는 것이 핵심이다.
댓글
댓글 쓰기