JAVA

[ JAVA ] JVM에 저장된 데이터 위치 값 확인

Jerry_JH 2022. 1. 22. 21:59
728x90

 

JAVA에서는 개발자가 생성 혹은 선언한 데이터(변수)들은 JVM 메모리영역에 저장된다.

 

JVM 메모리영역에서도 

참조형 변수는 힙 영역

기본형 변수는 스택 영역에 저장된다.

 

참조형 변수

  • 클래스가 인스턴스화 되어 생성된 객체 
  • 문자열 리터럴을 이용해서 값을 대입하거나, new 연산자를 사용해서 생성
  • 예시 : String, Date 클래스가 있다.
    • java에 있는 모든 클래스의 첫 글자는 대문자이기 때문에 참조형도 대문자로 시작한다.
    • 반대로 기본형은 소문자로 시작한다.
    • 만약 사용자가 클래스를 만들때 이름은 소문자로 했다면 참조형은 소문자로 될 수도 있다.

         (하지만, 관례에 맞지않는 네이밍룰이므로 올바른 방법은 아니다.)

기본형 변수

  • 자바에서 기본적으로 제공하는 데이터형
  • 예시 : int , long, byte, float, char 등
  • 숫자형, 불리언형, 주소 반환형으로 구분된다.

 


실제로 기본형, 참조형 변수가 저장되는 주소 값이 다른지 실험을 해보았다.

 

메모리 주소를 보기 위해서는 System.identityHashCode([변수명]) 함수를 이용했다.

※ 실제 메모리에 해당 값이 있는지는 알 수 없다. 

 

 

기본형부터 살펴보았다. 

long varLong1 = 32L;
long varLong2 = 32L;
// long 형이라고 명시하기 위해 L추가
int varInt1 =32;

System.out.println("varLong1 : "+ System.identityHashCode(varLong1));
System.out.println("varLong2 : "+ System.identityHashCode(varLong2));
System.out.println("varInt1 : "+ System.identityHashCode(varInt1));

 

이 코드를 가지고 결과값을 보면 이러한 값이 나온다.

varLong1, varLong2이 동일한 형태, 동일한 값을 가지고 있기 때문에, 32L값이 있는 주소명을 가지고 있는 것이다.

 

varInt1 과 varLong1은 같은 값인데도 불구하고 메모리 주소값이 다른 것을 볼 수 있다.

즉, 32(long)과 32(int)는 다른 값이라고 판단한 것이다.


int varInt2 = (int) varLong2;
long varLong3 = (long) varInt1;
System.out.println("varInt2 : " + System.identityHashCode(varInt2));
System.out.println("varLong3 : " + System.identityHashCode(varLong3));

이번에 varInt2에 형변환을 하여 32를 넣고, varLong3에는 32(int)를 형변환하여 주소를 살펴보았다.

 

결과값은 이러했다. 

int형으로 변환한 varInt2는 valInt1 과 메모리 주소가 같은 것을 볼 수 있다.

반대로 변환한 varLong3는 valLong2, 1 과 메모리 주소가 같다. 

즉, 형변환을 하여 해당 형태의 해당 값이 메모리에 있다면 그 주소값으로 연결을 시킨 것이다.

 


참조형 변수도 실행을 해보았다.

String str1 = String.valueOf(varLong1);
String str2 = String.valueOf(varInt1);
String str3 = String.valueOf(varLong1);
System.out.println("str1 : "+System.identityHashCode(str1));
System.out.println("str2 : "+System.identityHashCode(str2));
System.out.println("str3 : "+System.identityHashCode(str3));

String 형태로 변환만 하여서 넣어 보았는데, str1 이랑 str3은 동일한 varLong1 변수를 넣었는데도 서로 다른 주소값을 가르키고 있었다. 


이것으로 보아 기본형은 동일한 형태, 동일한 값을 가지고 있으면 메모리의 그 값을 넣어두고 공유를 하면서 사용하고,

 

참조형은 동일한 형태, 동일한 값인데도 서로 다른 메모리에 넣어서 공유하지 않고, 독단적으로 사용한다는 것을 볼 수 있다. 

 

 

728x90