-
메소드(함수) 호출 방식 Call by Value & Call by ReferenceJAVA 2021. 6. 18. 17:45
Call by value
Class CallByValue{ public static void swap(int x, int y){ int temp = x; x = y; y = temp; } } public static void main(String[] args){ int a = 1; int b = 2; System.out.println("swap() 호출전: a= " +a+ ", b = " + b); // a = 1, b = 2 swap(a,b); System.out.println("swap() 호출 후 : a = " + a + ",b = " + b); //a = 1, b = 2 }
출력결과 값이 바뀌지 않았다.
왜그럴까?
main()에서 선언된 각각의 변수 a, b는 메모리의 0x0001 ,0x0005 번지에 할당이 된다.
할당된 메모리 변수에는 1, 2라는 값이 저장된다.
swap(a,b)를 호출시 a,b는 할당된 메모리 주소가 아닌 메모리에 담겨져 있는 값만 복사되어
swap() 메서드 내부의 매개변수 x와 y의 메모리 주소에 담겨지게 된다.
call by value는 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보낸다.
Call by reference
메서드 호출 시에 사용되는 인자가, 값이 아닌 주소(Address)를 넘겨줌으로써, 주소를 참조(Reference)하여
데이터를 변경할 수 있다.
Class CallByReference{ int value; 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(1); CallByReference b = new CallByReference(2); System.out.println("swap() 호출 전 : a = " + a.value + ",b = " +b.value); // a = 1, b = 2 swap(a,b); System.out.println("swap() 호출 전 : a = " + a.value + ",b = " + b.value); //a = 2, b = 1 } }
Call by Reference 의 경우 값이 의도대로 바뀐걸 볼 수 있다.
main() 에서 선언 된 CallByReference 타입의 변수 a 와 b는 각각 객체를 생성하여 0x0001, 0x0005에 저장된 1과 2의 주소 값을 저장한다.
swap() 메서드 호출 시에 인자 a와 b는 메모리에 저장된 주소 값을 복사하여 매개변수 x와 y의 메모리에 저장한다.
swap 메서드는 1 과 2가 저장된 주소를 참조하여 연산하기 때문에,
원본 데이터가 변한다.
call by reference는 메서드 호출 시 사용되는 인자 값의 메모리에 저장되어 있는 주소(Address)를 복사하여 보낸다.
728x90반응형'JAVA' 카테고리의 다른 글
인터페이스 (interface) (0) 2021.07.11 추상클래스(abstract class) (0) 2021.07.03 [JAVA]Map.Entry 인터페이스 (0) 2021.06.08 [JAVA] 자료구조 - HashMAP (0) 2021.06.08 [Java]JDK와 JRE (0) 2021.05.30