: 객체의 주소를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 등이 있다.

- 변수들은 모두 Stack 메모리 영역에 생성됨
-> primitive type 변수들은 값을 직접 가짐
-> 참조 타입 변수들은 주소를 저장함
메모리 사용 영역(Runtime Data Area)
메소드 영역
: 바이트코드 파일을 읽은 내용이 저장되는 영역
힙 영역
: 객체가 생성되는 영역
- 객체의 주소는 메소드 영역과 스택 영역의 상수와 변수를 통해 참조
스택 영역
: 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역
- 메소드 호출이 끝나면 프레임 자동 제거
- 프레임 내부에는 로컬 변수 스택이 있음
-> 여기에서 기본 타입 변수와 참조 타입 변수가 생성, 제거됨
참조 타입 변수의 ==, != 연산
: 참조 타입 변수의 값은 객체의 주소이므로 ==, != 연산은 주소를 비교하는 것이 된다.
Null, NullPointerException
: 참조 타입 변수는 아직 주소를 저장하고 있지 않다는 뜻으로 null을 가질 수 있다.
- null도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.
NullPointerException
: 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려 할 때 발생


- 일부러 참조 타입 변수에 null을 사용하기도 함
-> 프로그램에서 더 이상 객체를 사용할 수 없게 할 때
쓰레기 객체
어떤 변수에서도 객체를 참조하지 않으면 해당 객체는 프로그램에서 사용할 수 없는 객체가 된다.
-> 자바는 이러한 객체를 쓰레기 객체로 인식하고 garbage collect를 실행시켜 자동으로 제거한다.
String 타입
: 자바의 문자열은 String 객체로 생성된다.
- 문자열 리터럴이 동일하다면 객체를 공유
- 동일한 리터럴이지만 생성자로 객체를 생성했을 경우 다른 주소 참조
- == 을 통해 객체 주소 비교
- str1.equals(str2)를 통해 문자열 리터럴 비교
- charAt(index)를 통해 인덱스 문자 추출
- replace()를 통해 대체한 새 문자열 리턴
-> 기존 문자열도 존재. 참조 주소가 다른 새 문자열 리턴
- substring(start), substring(strat, end)로 문자열 자르기
- indexOf()로 주어진 문자열이 시작되는 인덱스 리턴
- split()으로 주어진 문자를 기준으로 분리
Array 타입
객체를 참조하는 배열
- 기본 타입 배열은 배열 각 항목에 값을 저장
- 참조 타입 배열은 배열 각 항목에 객체의 주소를 저장
배열 복사
: System.arraycopy(원본 배열, start, 새 배열, 새 배열 start, 복사 항목 수);
main() 메소드의 String[] 매개변수 용도
- 윈도우 명령 프롬프트/맥OS 터미널에서 프로그램 실행 시 요구하는 값이 있을 수 있음
- Sum을 예를 들면 'java Sum 10 20'
- 공백으로 구분된 10, 20은 문자열로 취급되며 String[]배열의 항목 값으로 구성됨. main()호출 시 매개값으로 전달됨
열거 타입
: 요일, 계절 등 한정된 값을 갖는 타입
- 열거 타입을 사용하기 위해서는 열거 타입 이름으로 소스파일을 생성하고 한정된 값을 코드로 정의해야 함