함수의 호출 방식에는 Call by value와 Call by reference가 있다.
"값에 의한 호출" , "참조에 의한 호출" 차이가 있다. 예제를 통해 알아보자,
Call by value
package JAVA;
public class CallByValue {
int value;
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;
System.out.println("Swap() 호출 전: a=" +a+",b=" +b);
swap(a,b);
System.out.println("Swap() 호출 후: a=" +a+",b=" +b);
}
}
값이 그대로 이다. 왜냐하면 swap() 메서드 호출 시에 사용한 인자 a,b와 swap() 메서드내의 매개변수 x,y는 서로 다르기 때문이다.
main()에서 선언 된 변수 a,b는 0x005, 0x001번지에 할당 되었다고 가정한다. 할당 된 메모리 변수에는 각각 10,20이 저장이 된다. 이후 swap()메서드 호출 시에 x,y의 값이 변하고 다시 a,b를 출력을 한다. 따라서 결과 값에 변화가 없다.
따라서 Call by value는 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보낸다.
Call by reference
call by reference는 메서드 호출 시에 사용되는 인자가, 값이 아닌 주소를 넘겨줌으로써 주소를 참조하여 데이터를 변경할 수 있다.
package JAVA;
public class CallByReference {
int value;
public CallByReference(int value) {
this.value = value;
}
public static void swap(CallByReference x, CallByReference y){
int temp = x.value;
x.value = y.value;
y.value = temp;
}
public static void main(String[] args) {
CallByReference a = new CallByReference(10);
CallByReference b = new CallByReference(20);
System.out.println("Swap() 호출 전: a=" +a.value+",b=" +b.value);
swap(a,b);
System.out.println("Swap() 호출 후: a=" +a.value+",b=" +b.value);
}
}
이번에는 a,b 값이 바뀌어서 나왔다.
main에 선언된 CallByReference 타입의 변수 a와 b는 각각 객체를 생성하여 번지에 저장된 10과 20의 주소 값을 저장하게 된다. 이후 swap() 메서드 호출 시에 주소값을 참조하여 연산하기 때문에 데이터가 변한다.
따라서 Call by reference는 메서드 호출 시 사용되는 인자 값의 메모리에 저장되어있는 주소를 복사하여 보낸다.
참고.
'Programming > Back-end Language' 카테고리의 다른 글
[개발환경] Spring boot+React 연동하기 (0) | 2022.03.23 |
---|---|
[Spring] The import org.springframework.boot.test cannot be resolved 해결 방법 (0) | 2022.02.21 |
[JAVA] Servlet 로그인 페이지 만들기 (2) 마지막 (1) | 2022.01.05 |
[JAVA] Servlet 로그인 페이지 만들기 (1) (1) | 2022.01.05 |
[JAVA] 서블릿 경로설정과 Cycle (0) | 2022.01.04 |