레퍼런스 타입
레퍼런스 타입 이름 그대로 참조형입니다. 프리미티브 타입의 경우 변수에 직접적으로 값이 들어가는 반면 참조형 타입은 간접적으로 들어갑니다. 값 그 자체가 아니라 주소를 가지게 됩니다. 객체를 근간에 둔 타입입니다. 자바의 정석에서는 원시형은 8개라고 직접적으로 말해주고 있지만 참조형은 그 8개를 제외한 나머지라고 언급하고 있습니다. 대표적으로 배열, 열거, 클래스, 인터페이스 등이 레퍼런스 타입에 속합니다.
저장 위치
원시 타입이 stack 영역에 저장된 것과 달리 레퍼런스는 heap 영역에 저장이 됩니다.
int a = 10;
String s = "hello world";
int a = 10의 경우 간단하죠. a라는 변수에 10이라는 값이 stack 영역에 저장됩니다. String s는 레퍼런스 타입입니다. String 클래스의 s를 선언하고 그 값을 hello world라고 표현하고 있습니다. 이때 살짝 복잡해지는데요. s 라는 변수 자체는 stack 영역에 선언됩니다. 아까는 heap에 저장된다고 했는데 이게 무슨 일일까요?? heap에 저장되는 값은 "hello world"라는 값 자체가 저장됩니다. 그러고 stack 영역에 있는 s가 heap 영역의 주소값을 담게 됩니다.
그림이 있으니 더 혼란스럽군요.. 왜 그렸지..ㅠㅠ heap 영역에 hello world라는 문자열이 0x38이라는 주소에 저장이 되고 stack 영역의 s가 0x38 주소값을 가지고 있는 것을 표현하고 싶었습니다. 그 0x38로 가면 hello world 문자열에 접근할 수 있다는 것을 작대기로 표현해봤습니다.
메서드 호출이 끝나면 사라질 변수들은 stack에 저장이 되고 그게 아닌 경우에는 heap에 저장된다고 합니다. 지금 다루기에는 이른 것 같아서 스택 오버플로우에 이에 관한 질문과 답변이 있으니 링크만 걸어두겠습니다. stackoverflow.com/questions/22779145/java-primitive-data-type-on-stack-or-heap/22779205
참고
자바의 정석
programmers.co.kr/learn/courses/5/lessons/138