메서드를 호출할 때 인자를 넘겨주는 방법을 말한다.
값에 의한 호출이라고 한다. 값을 메모리에서 복사해서 사용하기 때문에 원래의 값이 보존되지만 복사하는 만큼 다른 메모리를 사용하기 때문에 메모리 사용량이 늘어나게 된다.
참조에 의한 호출이라고 한다. 값을 복사하지 않고 직접 참조하는데 메모리에서 복사하는 과정이 없기 때문에 빠르고 Call By Value 보다 메모리를 덜 사용한다. 하지만 직접 참조하는 만큼 원래 값이 영향을 받는 단점이 있다.
Java는 Pointer가 없기 때문에 기본적으로 Call By Value이다. 하지만 Java의 자료형은 원시 자료형과 참조 자료형이 있기 때문에 헷갈릴 수 있다. 관련 내용을 찾아 볼 때 이 부분 때문에 많이 헷갈렸는데 결론을 먼저 말 하자면 Call By Value이다. 참조 자료형 타입을 사용할 때도 말이다.
기본적으로 스택 영역에 생성이되고 int
long
float
double
와 같은 자료형을 말한다. 원시 자료형은 Call By Value로 동작하게 된다.
스택 영역에 생성되지만 힙 영역에 있는 메모리를 가리키고 있다. 이 부분이 헷갈리는 부분인데 힙 영역에서 메모리 주소 값을 전달해서 Call By Reference로 보일 수 있지만 정확히는 주소 값 자체를 복사해서 전달하는 것이지, 그 자체를 전달하는 게 아니기 때문에 Call By Reference가 아니게 된다. 때문에 결과적으로 참조 자료형 마찬가지로 Call By Value로 동작한다고 볼 수 있다.