자바의 대원칙 : 자바는 항상 변수의 값을 복사해서 대입한다.
자바에서 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해서 대입한다는 것
기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입
기본형인 경우, 변수에 있는 실제 사용되는 값을 복사해서 대입
참조형인 경우, 변수에 있는 참조(메모리 주소)값을 복사해서 대입
잘 기억해두도록 하자! (잊지말자)
Primitive Type
int, long, double, boolean 처럼 변수에 값을 직접 넣을 수 있는 데이터 타입
int a = 10;
boolean isCheck = true;
float b = 4.5f;
int a = 10;
int b = a;
변수 a에 10이 들어가 있음
변수 b에 a에 들어가 있는 값을 복사하여 b에 넣는다.
a = 20;
따라서 a에 값을 변경해도 b에 있는 값 자체가 변하지 않는다.
public static void main(String[] args) {
int a = 10;
System.out.println("a = " + a);
change(a);
System.out.println("a = " + a);
}
static void change(int x) {
x = 20;
}
메서드 호출할 때 사용하는 매개변수(파라미터)도 결국 변수다.
변수 a가 change 메서드를 호출하면서 파라미터 x에 값을 복사하여 넣어준다.
따라서 메서드 안에서 값을 변경하여도 변수 a의 값은 변하지 않는다.
호출 후
a = 10
a = 10
Reference Type
기본형을 제외한 나머지를 의미한다.
데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형이라고 한다.
Student student1;
Car car;
참조형은 들어있는 참조값 그대로 사용이 불가능하다.
.(점, dot)을 통해서 참조(주소)값을 가리켜서 접근한다.
Data dataA = new Data();
Data dataB = dataA;
Data 객체를 만들고 참조형 변수 dataA에 해당 객체의 참조값(메모리 주소)를 넣는다.
.(점, dot)을 통해 참조변수 dataA가 가리키고 있는 참조값에 접근하여 데이터를 확인한다.
Data 타입의 참조변수 dataB에 dataA가 참조하고 있는 메모리 주소값을 복사하여 대입한다.
그렇게 되면 dataB 안에 값은 dataA와 같은 Data 객체의 메모리주소 값을 가지고 있기 때문에 둘 다 같은 위치를 가리키게 된다.
위에서 말했듯, 메서드 호출도 마찬가지
메서드를 호출할 때 사용하는 매개변수(파라미터)도 결국 변수
참조형 변수를 파라미터로 넘기는 것도 결국 변수 안의 값을 복사하여 대입한다.
public static void main(String[] args) {
Data dataA = new Data();
dataA.value = 10;
System.out.println("메서드 호출 전: dataA.value = " + dataA.value);
change(dataA);
System.out.println("메서드 호출 후: dataA.value = " + dataA.value);
}
static void change(Data dataX) {
dataX.value = 20;
}
메서드 호출할 때 사용하는 매개변수(파라미터)도 결국 변수다.
메서드 안에서 매개변수를 통해 메모리 위치를 접근하여 값을 변경하게 된다면 결국 객체의 값이 변경된다.
따라서, 메서드를 호출한 뒤에 dataA의 value값을 콘솔로 출력하면 값이 변경된다.
호출 후
메서드 호출 전 : dataA.value = 10;
메서드 호출 후 : dataA.value = 20;
메서드로 참조형 데이터를 전달하면, 참조값이 복사되어 전달된다.
참조형 변수에 아직 가리키는 대상이 없다면 null이라는 값을 넣을 수 있다.
null은 값이 존재하지 않은, 없다는 뜻
기본형은 null을 할당할 수 없다.
참조형은 null을 할당할 수 있다.
참조값 없이 객체를 찾아가면 발생하는 문제
개발자를 가장 많이 괴롭히는 예외
아무도 참조하지 않은 인스턴스가 있으면 JVM의 GC(가비지 컬렉션)가 더이상 사용하지 않은 인스턴스를 판단하여 자동으로 메모리에 제거해준다.