Foundation/Computer Science

[CS] Java에서 Call By Value와 Call By Reference

개발왕 금골드 2021. 4. 6. 13:12
반응형

안녕하세요 골드입니다.

오늘은 Call by value와 Call by reference라는 개념에 대해서 알아보도록 하겠습니다. 또한 Java에서는 이 개념들이 어떻게 동작하는지까지 알아보겠습니다. 먼저 개념부터 간단하게 알아보겠습니다.

 


Call By Value

call by value는 값에 의한 호출이라는 뜻입니다. 값에 의한 호출이란, 메서드에 인자를 넘길 때, 그 값을 복사해서 넘기는 형태를 말합니다. 메서드 내에서는 복사된 값으로 새로운 작업을 하기 때문에, 원래의 값은 변경되지 않습니다.

 

Call By Reference

call by reference는 참조에 의한 호출이라는 뜻입니다. 참조에 의한 호출이란, 메서드에 인자를 넘길 때, 값이 아닌 객체를 참조하는 주소를 넘기는 형태를 말합니다. 객체를 참조하는 주소를 받았기 때문에, 메서드 내에서 새로운 연산이 수행된다면 원래의 값에 영향을 끼치게 됩니다. 

 

Java -> Call By Value

Java언어는 결과적으로 call by value 형식입니다. 객체를 메서드로 넘길 때 객체를 참조하는 지역변수의 실제 주소를 넘기는 것이 아니라, 그 지역변수가 가리키고 있는 힙 영역의 객체를 가리키는 새로운 지역변수를 생성하고 전달합니다. 새로운 지역변수를 통해 같은 객체를 가리키도록 하고 있습니다.

main 함수에서 swap 함수를 호출하면서 num 변수를 전달하였습니다. num 변수는 heap에 생성되어 있는  primitive type이 아닌 객체 참조형 변수입니다. 

 

위 그림과 일치하는 동작을 보이는 코드입니다. List를 하나 생성하였고 main에서 0번째 index 값을 1로 선언하였습니다. list 객체를 swap함수에 전달하고 0번째 index를 2로 바꾼 후 main에서 다시 print하였을 때 결과는 2가 나옵니다. 결과적으로 main과 swap에 list 객체는 heap 내에 동일한 주소값을 참조하고 있습니다.

 

여기서 개념이 헷갈릴 수 있습니다.

동일한 주소값을 참조하여 객체의 프로퍼티에 접근은 가능하지만 원본 객체 자체를 변경할 수는 없습니다. 확인해보겠습니다.

 

primitive type int형 변수의 wrapper class Integer형 변수를 선언하였습니다. Integer는 객체 참조형입니다. swap함수에서 Integer형 변수 num의 값을 변경하였지만, main에서 다시 print했을 때 값에 변화가 일어나지 않았습니다. 이유는 java에서 wrapper class에 해당하는 클래스들은 모두 immutable이기 때문입니다. immutable이란 불변이라는 뜻입니다. 그렇기 때문에 heap에 있는 같은 객체를 참조하고 있는 경우라고 하더라도 새로운 연산이 적용되는 순간 새로운 객체가 heap 내에 새롭게 할당됩니다. 이렇기 때문에 위 코드에서 Integer형 변수는 swap 함수에서 값을 바꾸더라도 main함수에 있는 num변수에 영향을 미치지 않는 것입니다.

 


여기까지 골드였습니다.

감사합니다.

반응형