📚
기본형 매개변수와 참조형 매개변수 / 참조형 반환타입
May 24, 2023
매개변수의 타입이 기본형일 때는 값이 복사되어서 변수의 값을 읽는 것만 가능하다. 참조형일 때는 인스턴스의 주소가 복사되어서 변수의 값을 읽고 변경할 수 있다.
기본형 매개변수
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);
}
}
- 호출한 메소드에 기본형 매개변수가 선언되어 있는 경우 인자(d.x)의 값을 복사하여 넘겨준 것
- 호출한 메소드에서 값을 1000으로 변경하더라도 호출한 메소드의 매개변수 값만 변경 될 뿐, 인자로 넘겨준 변수는 영향을 받지 않는다.
참조형 매개변수
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);
}
}
- 호출된 메소드에 참조형 매개변수가 선언되어 있는 경우 값이 저장된 주소를 호출된 메소드에 넘겨준다.
- 호출된 메소드의 매개변수가 넘겨받은 인자와 같은 주소값을 가리키고 있기 때문에 호출된 메소드에서 값을 변경하게되면 그 주소값을 가지고 있는 변수의 값이 변경된다.
참조형 반환타입
class Data { int x; }
class ReferenceReturnEx {
public static void main(String[] args)
{
Data d = new Data();
d.x = 10;
Data d2 = copy(d); //1
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; //2
return tmp; //3
}
}
- copy메소드에서 생성한 객체를 main메소드에서 사용하려면 copy메소드 내에서 생성한 객체의 주소를 반환해주어야 한다. 그렇지 않으면 copy메소드가 종료되면서 생성한 객체의 참조가 사라지기 때문이다.
- 반환타입이 참조형이라는 것은 메소드가 객체의 주소를 반환한다는 것을 의미한다.
- copy메소드를 호출하면서 참조변수의 d의 값이 매개변수 d에 복사된다.
- 새로운 객체를 생성한 다음, d.x에 저장된 값을 tmp.x에 복사한다.
- copy메소드가 종료되면서 반환 된 tmp의 값은 main메소드의 d2에 저장된다.
- d2로 새로운 객체를 다룰 수 있다.