값에 의한 호출
메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값을 복사하여 보낸다.
int a = 1; // 변수가 존재한다면 0x0001 의 주소를 주는게 아닌 1이라는 값을 보낸다.
add(a); // 1을 받음
Java
복사
참조에 의한 호출
메서드 호출 시 사용되는 인자 값의 메모리에 저장되어있는 주소를 복사하여 보낸다.
값이 아닌 주소 자체를 보냄
자바는?
call by value 방식으로 인자값을 받는다.
call by value 예시
public static void main(String[] args) {
String a = "김치";
String b = "호호잇";
System.out.println("before");
System.out.println(String.format("a value : %s", a));
System.out.println(String.format("b value : %s", b));
swap(a,b);
System.out.println("after");
System.out.println(String.format("a value : %s", a));
System.out.println(String.format("b value : %s", b));
}
static void swap(String x, String y){
String tmp = x;
x = y;
y = tmp;
}
result
before
a value : 김치
b value : 호호잇
after
a value : 김치
b value : 호호잇
//분명 위치를 바꿧는데 바뀌지 않았다.
Java
복사
왜 이럴까?
swap() 메서드 호출 시에 사용한 인자 a,b는 sawp메서드 내부의 매개변수 x,y는 서로 다르기 때문이다.
call by reference 예시
public class Main {
String value;
public Main(String value) {
this.value = value;
}
public static void main(String[] args) {
String var1 = "김치";
String var2 = "호호잇";
Main a = new Main(var1);
Main b = new Main(var2);
System.out.println("before");
System.out.println(String.format("a value : %s", a.value));
System.out.println(String.format("b value : %s", b.value));
swap(a,b);
System.out.println("after");
System.out.println(String.format("a value : %s", a.value));
System.out.println(String.format("b value : %s", b.value));
}
static void swap(Main x, Main y){
String tmp = x.value;
x.value = y.value;
y.value = tmp;
}
}
result
before
a value : 김치
b value : 호호잇
after
a value : 호호잇
b value : 김치
Java
복사
변경전
변경후