참조 변수는 값이 저장되어있는 주소를 저장하고 있는 변수다. 따라서 매개변수의 타입이 참조형이라면
인스턴스의 주소가 복사된다. 참조형 변수를 사용하면 값을 읽는 것은 물론 변경까지 가능하다.
기본형 매개변수를 사용할 때
class Data {int x;}
class Practice {
public static void main(String[] args){
Data d = new Data();
d.x = 10;
change(d.x);
System.out.println(d.x); // (ㄱ)
}
static void change(int x){
x = 1000;
System.out.println(x); // (ㄴ)
}
}
Data 객체 참조변수 d를 생성하고
d.x를 인수로 넣은 change 메소드를 호출해 d.x를 매개변수 x에 저장하고 x를 1000으로 바꾼다.
결과: (ㄴ) 1000, (ㄱ) 10
d.x의 값이 변경된 것이 아니라 단지 change메소드의 매개변수 x의 값이 변경되었다. 또한 호출 스택에서 메소드의 작업이 끝나면
할당받은 메모리를 반환하고 호출스택에서 제거되기 때문에, change 메소드가 끝나면 x에 할당된 메모리가 지워져 값이 없어진다.
이처럼 기본형 매개변수는 값을 읽어오는 기능만을 할 뿐 변경할 수는 없다.
참조형 매개변수를 사용할 때
class Data {int x;}
class Practice{
public static void main(String[] args){
Data d1 = new Data();
d1.x = 10;
change(d1);
System.out.println(d1.x); //(ㄱ)
}
static void change(Data d2){
d2.x = 1000;
System.out.println(d2.x); //(ㄴ)
}
}
Data 타입의 참조변수 d1, 그리고 d1이 가리키는 인스턴스 생성 후 d1.x를 10으로 초기화했다.
d1를 인수로 넣은 change 메소드를 호출한다. 이때 매개변수인 Data 참조형 변수 d2에 d1의 값이 저장된다.
그런데 d1은 참조변수기 때문에 인스턴스의 주소를 담고있다. 따라서 d2는 d1이 가리키는 인스턴스와 같은 인스턴스를
가리키게 되는 것이다. 그러므로 d2.x = 1000; 이 실행됐을 때 d1.x의 값도 1000이 된다.
결과: (ㄴ) 1000, (ㄱ) 1000
배열도 객체와 같이 참조변수를 통해 데이터가 저장된 곳에 접근하는 방식이므로, 매개변수에 배열을 쓰면 같은 결과를 얻는다.
class Pratice{
public static void main(String[] args){
int[] arr = {3,2,1,4};
//메소드를 이용한 구조화
printArr(arr); //3,2,1,4
sortArr(arr);
printArr(arr); //1,2,3,4
}
static void printArr(int[] arr){ //배열을 참조형 매개변수로 사용
for(int i:arr)
System.out.print(i+",");
System.out.println();
}
static void sortArr(int[] arr){ //배열을 참조형 매개변수로 사용
for(int i=0;i<arr.length-1;i++)
for(int j=0;j<arr.length-1-i;j++)
if(arr[j]>arr[j+1]) {
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
'JAVA' 카테고리의 다른 글
자바 - 변수의 초기화 (0) | 2022.08.04 |
---|---|
생성자(Constructor), this (0) | 2022.08.02 |
스태틱 메소드와 인스턴스 메소드 (0) | 2022.08.02 |
JVM의 메모리 구조 (0) | 2022.08.02 |
객체지향 프로그래밍 - 변수와 메소드 (0) | 2022.08.02 |
객체지향 프로그래밍 - 객체 배열 (0) | 2022.08.02 |