자바에서 data type은 primary type, reference type으로 나뉜다.
두 자료형의 차이야 많겠지만 primary type의 경우 메모리에서 스택에 생기고 reference type의 경우 힙에 생긴다 정도로 기억하고 사용하고 있었다.
이런 기초를 잊어버리고 사용하다보니 이해가 안되는 코드를 만나버렸다.
class Sample{
public static void main(String[] args) {
//test용 자료들
int number = 10;
int[] numbers = new int[]{1,2,3};
//#1. primary type 파라미터, 반환값 없음
primaryConsumer(number);
System.out.println(number);
//! 결과(파라미터값에 변화가 없다)
// 10
//#2. reference type 파라미터, 반환값 없음
referenceConsumer(numbers);
Arrays.stream(numbers).forEach(number -> System.out.print(number+","));
//! 결과(파라미터값에 변화가 있다)
// 11,12,13,
}
private static void primaryConsumer(int a){
a+=100;
}
private static void referenceConsumer(int[] numbers) {
for(int i=0;i<numbers.length;i++){
numbers[i] +=10;
}
}
}
분명 return문이 없지만 클래스 바깥에 있는 자료의 값이 바뀌었다. 이점에 대해서 궁금해하던 중 reference type의 특징을 떠올려 보고 이해하게 되었다.
바로 reference type은 힙 영역에 생긴다는 것. 그말은 다른 클래스에서 파라미터로 받는 값은 힙에 있는 값을 받은 것이고 힙 내용을 수정하기 때문에 다른 클래스에서도 값이 바뀐대로 사용할 수 있다는 것이다.
그동안 Arrays.sort(List<> list); 메소드 왜그런지도 모르고 썼는데 드디어 알게되니 아주 개운하다.
모르고 계속 사용했으면 언젠가는 String 활용하다 크게 고통받았을 것 같은 느낌이다.