개발/Java
[Java] 참조형 변수
suniverse
2023. 1. 26. 17:41
✍기본형(Primitive Type) 변수와 참조형(Reference Type) 변수의 차이
- 기본형 변수는 실제값(리터럴)을 저장하며
- 참조형 변수는 실제값이 저장된 인스턴스의 주소값(참조값 = 레퍼런스)을 저장한다.
✍ 기본형 변수와 참조형 변수의 값을 복사(전달)할 때 차이점
1. 기본형 변수의 값을 복사할 경우
- 변수에 저장된 실제 값을 복사(전달)한다. = Pass by reference
- 실제 값을 복사하게 되면 원본 값과 동일한 값이 별도로 생성되어 전달되므로
복사된 값을 변경 하더라도 원본 값과 상관이 없기 때문에 원본값을 변경되지 않는다.
ex)
int x = 10; // 변수 x에 10을 저장
int y = x; // 변수 y에 x의 값을 복사
System.out.println("x = " + x + ", y = " + y); // 출력
y = 99; // y의 값 변경
System.out.println("x = " + x + ", y = " + y); // y 값 변경 후 출력
--> y의 값을 변경하기 전과 후의 결과가 다른 걸 확인할 수 있다.
--> 기본형 변수 y의 값을 변경하더라도 원본데이터 기본형 변수 x의 값은 변경되지 않는다.
2. 참조형 변수의 값을 복사할 경우
- 변수에 저장된 인스턴스 주소값을 복사(전달) = Pass by reference
- 주소 값을 복사하게 되면 원본 값에 저장된 주소와 동일한 주소가 전달되므로
실제 인스턴스 하나를 함께 공우하기 된다.
따라서, 한 쪽에서 인스턴스에 접근하여 저장된 값을 변경할 경우
동일한 주소값을 참조하는 쪽에도 영향을 받게 된다.
--> 즉, 한쪽에서 값을 변경하면 다른쪽의 값도 함께 변경된 효과를 갖는다.
ex)
✍ 1. Num 클래스 만들기
class Num {
int x;
int y;
}
✍ 2. Num 객체 만들기
Num n = new Num();
✍ 참조변수 n에 데이터 저장하기
n.x = 10;
n.y = 10;
System.out.println("n.x의 값: " + n.x + ", n.y의 값: " + n.y);
💻 출력결과
✍ 참조변수 n2에 참조변수 n의 값 복사 하기 --> 즉, 주소값 복사하기
Num n2 = n; // n이 가리키는 주소값을 n2에 복사. 이제 참조형 변수 n과 n2가 가리키는 인스턴스가 동일해졌다.
✍ 그럼 이제 n2.x와 n2.y의 값은 어떻게 출력될까?
System.out.println("n.x의 값: " + n.x + ", n.y의 값: " + n.y);
System.out.println("n2.x의 값: " + n2.x + ", n2.y의 값: " + n2.y);
💻
--> 참조형 변수 n과 n2는 같은 인스턴스를 참조하기 때문에 동일한 데이터가 출력된다.
(위에서 n.x과 n.y에 각각 10을 저장하였음)
그럼 여기서 참조형 변수 n의 값을 바꾸면 어떻게 될까?
✍ 참조형 변수 n의 값 변경하기
n.x = 999;
n.y = 999;
💻
--> n과 n2는 같은 인스턴스를 가리킨다. n의 값을 바꾸어 주었기 때문에 n2의 값도 n과 동일하게 바뀌었다.
✍ n2의 값을 변경해도 결과는 동일하다
n2.x = 500;
n2.y = 500;
💻
결론!
참조형 변수의 값을 복사하면, 각 변수는 동일한 하나의 인스턴스를 가리킨다. 그러므로 한 변수 값을 변경하면 다른쪽의 변수값도 같이 변경된다.