이전 걸음에서 Call by Value에 대해서 배웠습니다. 그럼 이런 개념이 하나만 있다고 하면 이런 Call by Value라는 말을 만들지 않았겠죠? 뭔가 상반되는 개념이 존재를 하기 때문에 이전 걸음에서 배운 Call by Value가 있던 것입니다. 그럼 이번에는 Call by Value와 반대의 개념인 것을 같이 보도록 하겠습니다.
Call by Value의 상반되는 개념은 현재 배운 것에서 좀 더 공부가 되면 더 이해를 하고 활용을 할 수 있지만 어차피 메소드를 현재 공부를 하고 있기 때문에 이해를 하신다면 추후에 나오는 부분에서도 적용을 하고 활용을 할 수 있을 것입니다. 지금 볼 개념은 기본 자료형이 아닌 참조 자료형이거나 또는 배열 같은 자료형일 때 사용되는 메소드 개념입니다. Call by Value와 마찬가지로 매개변수의 내용인 것은 꼭 알고서 이해를 하셔야 합니다. 이 글을 끝까지 보신다면 확인을 하실 수 있습니다.
Call by Reference 입니다. Call by Reference은 호출을 하면 참조를 한다는 의미 입니다. 이 Call by Reference 같은 경우에는 return을 하지 않아도 같은 것을 바라보고 참조를 하고 있기 때문에 참조 자료형이나 배열인 경우 그 안에 값을 바꾸게 되면 그대로 바뀐 값이 적용이 되게 됩니다. 추후 main메소드에 확인을 하면 return 없이도 값이 바뀐 것을 확인을 할 수 있습니다. 이 글을 끝까지 읽는다면 Call by Reference에 대해서 이해하고 활용을 할 수 있습니다.
Call by Reference 란?
Call by Reference란 메소드를 호출시 매개변수를 참조 자료형 또는 배열이 전달 되면 그 자체를 참조를 하기 때문에 메소드 안에서 값의 변경이 일어나게 되면 굳이 return을 하지 않아도 값이 변경이 됩니다. 값의 변경이 바로 이루어지기 때문에 잘 알고 있다고 하면 굳이 리턴을 하지 않고 메소드를 만들 수 있습니다.
위에 사진처럼 바위는 내가 보거나 다른 사람이 봐도 똑같이 바위입니다. Call by Reference도 같은 개념으로 이해를 하시면 됩니다. 같은 것을 서로 바라봐서 뭔가 변경이 가해지면 다른 바라보는 사람도 변경되게 보이게 됩니다.
※ Call by Reference는 return을 하지 않아도 값이 변경 된다.
Call by Reference 예제
public class CallByreferenceTest {
static void abc(int[] a) {
a[0] = 10;
a[1] = 20;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a= new int[3];
abc(a);
System.out.println(a[0]+","+a[1]+","+a[2]);
}
}
위의 소스를 분석을 하면 main메소드에서 int 배열 3크기에 객체를 생성하고 abc 메소드에 배열을 넘겨줍니다. 그러면 abc메소드에서 매개변수 a를 가지고 0번 인덱스에 10을 대입 1번 인덱스 20을 대입을 하게 됩니다. 이렇게 배열이 넘어오게 되면 Call by Reference가 되어서 리턴을 하지 않아도 매개변수와 main메소드에 있는 배열 변수는 같은 배열 객체를 바라보기 때문에 하나를 같이 조정하는 효과가 나타납니다. 그렇기 때문에 굳이 return을 하지 않아도 main메소드에서 출력을 하면 10, 20 ,0이 나오게 됩니다.