Jun's note

[Java] 상수변수를 사용할때의 궁금증 본문

Programming/Java

[Java] 상수변수를 사용할때의 궁금증

junning 2022. 12. 13. 02:14
728x90

1. 배경

프로젝트에서 하던 중에 궁금증이 생겼다.

상수 변수를 내가 하나의 값을 지정해서 사용할지, 랜덤함수를 통해 생성된 임의값을 사용할지 고민했다.

final Long userId1= 1L;
vs
final Long userId2= new Random().nextLong();

이 둘의 차이가 궁금했다.

 

결론'이 둘은 메모리 측면에서 볼때 거의 비슷하다' 이다.

 

 

2. 이유

이는 Long이 참조타입이기때문이다. 참조타입은 heap에 실제값이 저장되고 저장된 메모리 주소값을 stack에 저장한다. 그래서 userId1의 실제값은 heap에서 생성된다.

userId2는 new연산자를 통해 정의했기때문에 당연히 heap에서 생성된다.

즉, userId1과 userId2 두 변수 모두 실제값은 heap에 저장되기 때문에 메모리 측면에서 볼땐 이 둘은 비슷하다.

 

 

만약, 똑같은 값을 가진 참조타입 변수를 선언하면 heap영역에서 실제값이 공유될까?

final Long userId1= 1L;
final Long userId2= 1L;

위 userId1과 userId2는 heap에서 값을 공유하지 않고 서로다른 객체로 생성된다.

 

 

예외로, String 타입은 new연산자로 선언하지 않으면 자바의 String Constant Pool에 의해 동일한 실제 값이 공유된다.

자세한건 메모리 관리에 대해 정리할때 같이 정리할 생각이다!

 

Comments