JAVA는 Call by Value
- 우선 JAVA는 항상 Call by Value 이다.
- http://mussebio.blogspot.com/2012/05/java-call-by-valuereference.html
값참조(Call by value)
- 변수의 값을 복사해 함수의 매개변수로 전달하는 것
- 때문에 넘겨받은 함수의 인자값을 아무리 변경해도 외부에서 그 값은 변경되지 않는다
public class Test {
public static void swap(int x, int y) { int temp = x;
x = y;
y = temp;
}
public static void main(String[] args) { int a = 10;
int b = 20;
swap(a,b);
} }
*오해 할만한 것
- 아래의 내용은 p라는 객체를 함수의 인자로 전달했다
함수내에서는 값을 전달받아 그값(객체)의 내부 값을 변경한 것이지
넘겨받은 값을 변경한것은 아니다
public class CallByValue { public static void main(String[] args) { Person p = new Person("wonwoo"); System.out.println("p.name: " + p.name); callByValue(p); System.out.println("p.name: " + p.name); } public static void callByValue(Person p) { p.name = "kevin"; } } class Person { String name; public Person(String name) { this.name = name; } }
- 값참조의 경우 함수의 인자로 값만을 넘기므로 함수내에서
그값을 변경하더라도 변경이 일어나지 않는다
public class CallByValue { public static void main(String[] args) { Person p1 = new Person("wonwoo"); System.out.println("p.name: " + p1.name); callByValue(p1); System.out.println("p.name: " + p1.name); } public static void callByValue(Person p2) { People p3 = new Person("kevin");
p2 = p3;
} } class Person { String name; public Person(String name) { this.name = name; } }
=>
1. 함수 호출시
- p2라는 매개변수에 p1의 주소값을 복사해서 전달한다
2. 함수 호출후
- p3변수에 새로운 객체("Kevin")을 생성하여 그객체의 주소값을 담는다
p2에 p3를 담으므로 p2에는 p3의 주소값이 담긴다
*중요한 점은 p1의 주소값은 그대로이므로 Call By Reference가 아니라는 점이다!
주소 참조(Call by reference)
- 변수를 참조할 수 있는 주소값을 함수의 매개변수로 전달하는 것
- C언어의 *(포인터)
- C언어의 포인터는 주소참조를 제공하므로 그 주소에 접근하여 값을 변경할 수 있다
void swap(*int num1, *int num2){
temp = *num1;
*num1 = *num2;
*num2 = temp;
}
'Language > Java' 카테고리의 다른 글
Java - JRE vs JDK (0) | 2019.01.08 |
---|---|
Java - 상속 super (1) | 2019.01.05 |
Java - Static 이해 (0) | 2018.10.28 |
Java - 초기화 순서 (0) | 2018.10.28 |
Java - 자바 가상머신(JVM: Java Virtual Machine) (0) | 2018.10.28 |