개발/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;

💻

 

 

결론!

참조형 변수의 값을 복사하면, 각 변수는 동일한 하나의 인스턴스를 가리킨다. 그러므로 한 변수 값을 변경하면 다른쪽의 변수값도 같이 변경된다.