- 번지를 통해 객체를 참조함
- 배열, 열거, 클래스, 인터페이스를 말함
* 기본 타입 vs 참조 타입
- 차이점: 저장되는 값
· 기본 타입(byte, char, short, int, long, float, double, boolean)
→ 실제 값을 변수 안에 저장
· 참조 타입(배열, 열거, 클래스, 인터페이스)
→ 메모리의 번지를 변수 안에 저장
ex)
기본타입 변수
int age = 25;
double price = 100.5;
참조타입 변수
String name = "xxx";
String hobby = "xxx";
- 메서드 영역
: JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
: 코드에서 사용되는 클래스(~.class)들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메서드 코드, 생성자코드 등을 분류해서 저장
- 힙 영역
: 객체와 배열이 생성되는 영역
: 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조함
: 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 JVM이 이것을 쓰레기 취급하고
쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 제거함
- JVM 스택 영역
: 메서드를 호출할 때마다 프레임을 추가(push)하고 메서드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행함
char v1 = 'A';
if( v1 == 'A'){
// v2 , v3은 if 블록 내부가 실행되고 있을 때만 스택 영역에 존재하고
// if블록 빠져나가면 소멸됨
int v2 = 100;
double v3 = 3.14;
}
boolean v4 = true;
: 기본타입변수는 스택 영역에 직접 값을 가지고 있음
: 참조 타입 변수는 스택 영역에 힙 영역의 객체 주소를 가짐
: 기본 타입 변수의 ==, !=연산은 변수의 값이 같은지, 아닌지를 조사함
: 참조 타입 변수들 간의 ==, !=연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용됨, 참조 타입 변수의 값은 힙 영역의 객체 주소이므로 ==,!= 연산은 결국 번지 값을 비교하는 것
: 동일한 객체를 참조하고 있다면 true, 아니면 false
null- 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있음
NullpointerException- 이 예외(Exception)는 참조 타입 변수를 잘못 사용하면 발생
: null을 가지고 있을 경우에는, 참조 객체가 없으므로 변수를 통해 객체를 사용할 수 없음
: 만약 null상태에서 있지도 않은 객체의 데이터(필드)나 메서드를 사용하는 코드를 실행하면 NullPointerException이 발생함
int[] intArray = null;
intArray[0] = 10; //NullPointerException
NullPointerException해결방법 - 참조 변수를 추적해서 객체를 참조하도록 수정하는 것
[선언] String 변수 = "문자열";
: 문자열은 String 객체로 생성되고 변수는 String 객체를 참조함
일반적으로 변수에 문자열을 저장할 경우에는 문자열 리터럴을 사용하지만,
new 연산자를 사용해서 직접 String 객체를 생성시킬 수도 있음
- new 연산자(객체 생성 연산자)
: 힙 역역에 새로운 객체를 만들 때 사용하는 연산자
String name1 = "abc1";
String name2 = "abc2";
String name3 = new String("abc3");
동일한 문자열 리터럴로 String 객체를 생성했을 경우 == 연산의 결과는 true,
new 연산자로 String 객체를 생성했을 경우 == 연산의 결과는 false
== 연산자는 변수에 저장된 객체의 번지가 동일한지 검사하기 때문
name1과 name2는 동일한 문자열 리터럴로 생성된 객체를 참조하기 때문에
name1 == name2의 결과는 true가 나옴
name3는 new 연산자로 String객체를 별도로 생성했기 때문에
name1 == name3은 false가 나옴
- 내부 문자열을 비교하고 싶을 때에는 String변수.squals()메서드를 사용해야함
- 참조를 잃은 String객체는 Garbage Collector를 구동시켜 메모리에서 자동 제거함