자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.
매개변수의 타입이 기본형(primitive type)일 때는 기본형 값이 복사되겠지만, 참조형(reference type)이면 인스턴스의 주소가 복사된다.
메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값만 얻지만, 참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경 하는 것도 가능하다.
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다.(read & write)
class Data { int x; }
class PrimitiveParamEx{
public static void main(String[] args)
{
Data d = new Data();
d.x = 10;
System.out.println("main() : x =" + d.x);
change(d.x);
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x);
}
static void change(int x) //기본형 매개변수
{
x = 1000;
System.out.println("change() : x = " + x);
}
}
실행결과
main() : x = 10
change() x = 1000
After change(d.x)
main() : x = 10
1. change 메서드가 호출되면서 'd.x'가 change메서드의 매개변수 x에 복사됨
2. change 메서드에서 x의 값을 1000으로 변경
3. change 메서드가 종료되면서 매개변수 x는 스택에서 제거됨
class Data { int x; }
class ReferenceParamEx{
public static void main(String[] args)
{
Data d = new Data();
d.x = 10;
System.out.println("main() : x =" + d.x);
change(d);
System.out.println("After change(d)");
System.out.println("main() : x = " + d.x);
}
static void change(Data d) //참조형 매개변수
{
d.x = 1000;
System.out.println("change() : x = " + d.x);
}
}
실행결과
main() : x = 10
change() x = 1000
After change(d)
main() : x = 1000
이번엔 change메서드를 호출한 후, d.x의 값을 변경했다.
change메서드의 매개변수가 참조형이라서 값이 아니라 '값이 저장된 주소'를 change메서드에게 넘겨주었기 때문에 값을 읽어오는 것뿐만 아니라 변경하는 것도 가능하다.
1. change메서드가 호출되면서 참조변수 d의 값(주소)이 매개변수 d에 복사된다. 이제 매개변수 d에 저장된 주소값으로 x에 접근이 가능하다.
2. change메서드에서 매개변수 d로 x의 값을 1000으로 변경
3. change메서드가 종료되면서 매개변수 d는 스택에서 제거됨
모든 참조형 타입의 값을 '객체의 주소'이므로 그저 정수값이 반환되는 것일 뿐 특별할 것이 없다.
class Data {int x}
class ReferenceReturnEx{
public static void main(String[] args)
{
Data d = new Data();
d.x = 10;
Data d2 = copy(d);
System.out.println("d.x =" + d.x);
System.out.println("d2.x =" + d2.x);
}
static Data copy(Data d)
{
Data tmp = new Data();
tmp.x = d.x;
return tmp;
}
}
실행결과
d.x = 10
d2.x = 10
static Data copy(Data d)
{
Data tmp = new Data(); // 새로운 객체 tmp를 생성한다.
tmp.x = d.x; // d.x의 값을 tmp에 복사한다.
return tmp; // 복사한 객체의 주소를 반환
}
Data d2 = copy(d); // static Data copy(Data d)
"반환타입이 '참조형'이라는 것은 메서드가 '객체의 주소'를 반환한다는 것을 의미한다."