본문 바로가기

Java

[Java] Call by value ? & Call by Reference ?

 

📌 Call by Value와 Call by Reference

Call by Value는 메서드의 인자를 전달할 때 '값을 전달하는 방식'
  • 값에 의한 호출
  • 메서드가 호출될 때 메모리 공간 안에서는 임시의 공간이 생긴다. 그리고 메서드가 종료되면 해당 공간은 사라진다.
  • 메서드 호출 시 전달되는 변수의 값을 복사하여 메서드의 인자로 전달한다. 이 때문에 원본의 값은 변하지 않는다.
  • 복사된 인자는 메서드 안에서 지역적으로 사용하는 지역 변수이다.
  • Java의 경우 메서드에 전달되는 인자의 데이터 타입에 따라서 호출 방식이 달라진다.
    • 기본 자료형 : call by value로 동작 (int, short, long, float, double, char, boolean)
    • 참조 자료형 : call by reference로 동작 (Array, Class Instance)
자바의 기본형 (Primitive Type)의 경우는 Call by Value

 

Call by Reference는 '주소를 전달하는 방식'
  • 메서드가 호출될 때 메모리 공간 안에서는 메서드를 위한 별도의 임시 공간이 생성된다. 메서드 종료 시 사라짐
  • Call by Reference 참조에 의한 호출 방식은 메서드 호출 시 인자로 전달되는 변수의 Reference를 전달한다.
  • 메서드 안에서 인자의 값이 변경되면, 메서드 호출 시에 있던 변수들도 값이 바뀐다.
찾아보기 전까지 Java 어떤 방식인지 모르고 있었지만, 확인해본 결과 Java는 Call by Value라는 것을 깨달았다.

 

👉 Call by Value

  • a, b는 기본 자료형의 변수 이기 때문에 값이 바뀌지 않고 출력되는 것을 볼 수 있다. (a, b는 Call by Value)

 

👉 Call by Value

👉 a와 b를 참조형인 Integer를 이용하여 객체를 생성하면 Call by Reference로 될 거 같아서 해보았지만 바뀌지 않았다.

이유는 Call by Reference는 맞지만 메서드 호출을 할 때 새로운 reference를 만들어 호출하게 만든다는 점이다.

swap 메서드에서도 해당 객체를 가리키지만 다른 reference 값으로 가리킨다는 것이다. 

 

👉 Call by Reference

객체를 만들어서 참조 변수인 a, b를 넘기면 Call by reference는 맞다. 하지만 같은 객체를 가리키는 새로운 reference 값이 생긴다고 했다. 그래서 그 새로운 참조 변수 값으로 값을 바꿔놓는 것이다.

 

JAVA에서 Call by reference는 해당 객체의 주소 값을 직접 넘기는 게 아닌 객체를 보는 또 다른 주소 값을 만들어서 넘기다는 사실을 꼭 기억하자. 

 

  • 위와 같은 이유들로 Java에서 인자로 넘길 때는 주소 값이란 값을 복사하여 넘기는 것이므로 call by value라고 할 수 있다.
  • Call by value의 경우, 데이터 값을 복사해서 함수로 전달하기 때문에 원본의 데이터가 변경될 가능성이 없다. 하지만 인자를 넘겨줄 때마다 메모리 공간을 할당해야 해서 메모리 공간을 더 잡아먹는다.
  • Call by reference의 경우 메모리 공간 할당 문제는 해결했지만, 원본 값이 변경될 수 있다는 위험이 존재한다.

'Java' 카테고리의 다른 글

[Java] 배열(Array) 특징 & 사용법  (0) 2023.05.10
[Java] 추상 클래스 & 인터페이스  (0) 2022.06.03
[Java] Enum ? 열거형 (Enumeration)  (0) 2022.05.27
[Java] 객체지향 5원칙 SOLID  (0) 2022.05.24
[Java] static, final, static final  (0) 2022.05.13