면접 질문중 자바는 Call By Value와 Call By Reference중 어떤 것이냐는 질문도 있었다는 걸 들었다..
사실 이런 부분까지 생각해 본 적은 없었다.. 자바는 어떤걸까? 일단 두개가 뭔지 알고 가자
- Call by value ?
- 일단 정의하자면 Call by value는 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보낸다.
보통 call by 들을 설명할 땐 swap을 많이 사용한다고 한다.
public class ValueTest{ 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); System.out.println(" a = " + a + ", b = " + b); } }
이때 실행 시엔 어떤 값이 나올까?
답은 a = 10, b = 20이다.(물론 x,y는 20,10으로 바뀌어있다.)
이때 분명 호출 해서 인자를 넘겼는데 왜 이렇게 나오는 걸까?
이는 메소드가 호출될때 swap 내부에 새로운 변수a,b(x,y)가 생성되고 원래의 값만 복사하여 넘기기때문이다.
이는 a,b와 메소드 호출 시의 x,y가 다른 인스턴스라는 소리다. - Call by reference ?
- Call by reference는 메서드 호출 시 사용되는 인자 값의 메모리에 저장되어있는 주소(Address)를 복사하여 보낸다.
이도 예제를 보도록 하자
public class ReferenceTest{ int value; ReferenceTest(int value) { this.value = value; } public static void swap(ReferenceTest x, ReferenceTest y) { int temp = x.value; x.value = y.value; y.value = temp; } public static void main(String[] args) { ReferenceTest a = new ReferenceTest(10); ReferenceTest b = new ReferenceTest(20); swap(a, b); System.out.println("a = " + a.value + ", b = " + b.value); } }
이때는 어떤 값이 나올까? 우리가 원하는데로 a=20, b=10이 나오게 된다. 참조변수를 이용해 호출할 땐 이처럼 값이 바뀌게 된다.
허나 자바는 기본 자료형에 해당하는 변수를 넘길때는 값을 넘기고 변수가 레퍼런스타입인 경우 그 변수가 가지는 값이 레퍼런스 주소값으로 전달 된다고 한다.
사실 이는 예전 변수를 배울때 배웠던 것이다.
기본형 변수는 변수 자체 값을 기억하고
참조형 변수는 변수 값이 기억된 위치의 주소를 기억하기 때문이다.