진짜 개발자
본문 바로가기

Language/Java

Java - Call by Value와 Call by Reference

728x90

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