메모리영역 (힙& 스택) (배열, String)

주현·2023년 10월 30일

JAVA

목록 보기
2/12

자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리를 한다.

JVM의 메모리 공간은 크게 Method(Static) 영역, Stack 영역, Heap 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당 되게 된다.


배열

참조 자료형은 스택메모리에 실제 데이터값이 아닌 힙 메모리에 저장된 객체의 위치를 가르킨다.
따라서 참조 자료형 변수를 복사할시, 실제 데이터의 위치값이 복사
-> int[] b= a; 는 b변수에 a의 실제 데이터의 위치값이 복사
따라서 b[0] =7로 바꾼 것은 실제 데이터의 위치값의 0인덱스를 바꾼 것이므로, 결과값은 둘 다. 7이 나오게 된다.

기본 자료형은 스택 메모리에 실제 데이터 값을 저장하고,
참조 자료형은 스택 메모리에 실제 데이터 값이 아닌 힙 메모리에 저장된 객체의 위치를 저장


String 클래스

String 클래스의 2가지 특징

  • 한번 정의된 문자열은 변경할 수 없다.
  • 문자열 리터럴을 바로 입력해 객체를 생성할 때 같은 문자열끼리 객체를 공유

특징1 . 객체 안의 값을 변경하면 새로운 객체를 생성

String 객체는 내부에 포함된 문자열을 변경할 수 없습니다.
클래스영역에는 String, stack영역에는 참조 변수인 str1에는 실제 데이터의 위치값이, heap영역에는 실제 데이터인 "안녕"이 생성된다.
str2에는 str1 실제 데이터의 위치값이 복자될 것이다. str1 ="안녕하세요"를 잘 봐야한다.
이는 기존 문자열을 수정하는게 아닌, 새로운 String객체를 생성하며, 이 위치를 str1에 저장한다.

특징2 . 리터럴을 바로 입력한 데이터는 문자열이 같을 때 하나의 객체를 공유

문자열 리터럴만 입력해 String 객체를 생성하면 하나의 문자열을 여러 객체가 공유할 수 있음. 이는 다른 클래스에는 없는 특징으로, 특졍 문자열의 객체를 여러 개 만들어 사용할 때 메모리 효율성을 증가시키기 위한 것
new로 생성할 때는 동일한 문자열 객체가 힙 메모리에 있든 말든, 무조건 새로운 객체를 생성함.
문자열 리터럴로 생성할 때는 힙 메모리에 리터럴로 생성된 동일 문자열을 포함 한 객체가 있으면 공유

0개의 댓글