Call by reference란?
직역하면 참조에 의한 호출을 말합니다.
메서드 호출 시 인자로 변수의 실제 메모리 주소를 전달하는 방식입니다.
즉, 메서드 내부에서 값을 바꾸면, 원본의 값도 변경되는 것이 특징입니다.
Call by reference, 어떻게 쓰이나?
주로 C++ 언어에서 지원되고 Java에서는 사용되지 않습니다.
함수에 변수를 전달할 때, 그 변수의 메모리 주소를 전달합니다. 이 주소를 통해 함수는 원본 변수에 직접 접근하고 변경할 수 있습니다. 따라서, 함수 내에서 변수를 변경하면, 원본 변수에도 그 변경이 반영됩니다.
Java에서는? : Call by value
Java에서는 call by value 만을 사용합니다. call by value는 실제값과 인수로 전달한 값이 메모리 측면에서 실제 서로 동일하지 않고 값만 복사하여 전달하는 방식을 의미합니다.
즉, Call by Value 방식으로 메소드의 인자를 전달한 경우 메소드 내에서 받은 값을 수정하면 값을 복사하여 전달했던 것이므로, 원본 데이터나 객체에 영향을 주지 않습니다.
Call by Value, 어떻게 쓰이나?
Java의 경우, 기본형 변수와 참조형 변수일때의 유형이 다릅니다.
[기본형 변수]
- 실제 데이터 값을 스택 메모리에 직접 값을 저장하여 변수를 생성할 때 해당 변수에 할당된 메모리 공간에 값 자체가 저장됩니다.
- 값이 스택 메모리에 직접 저장되기 때문에 변수를 통하여 직접 값을 읽고 쓸 수 있습니다.
[참조형 변수] - 힙 메모리에 할당된 객체나 배열 등의 메모리 위치를 가리키는 참조값(주소값)을 변수를 통하여 스택 메모리에 저장합니다.
- 즉 변수에 저장된 값 자체는 특정 데이터의 메모리 위치를 가리키는 참조값(주소값) 입니다.
- Java에서 "Call by Value"는 메소드에 인자를 전달할 때 그 인자의 실제 값이나 참조값(주소값)의 복사본을 전달한다는 것을 의미합니다. 이는 기본형과 참조형 모두에 적용됩니다. 값의 수정이 일어나더라도 값의 복사본이 전달된 것이기 때문에 원본 변수에는 영향을 주지 않습니다.
각 방식에 대한 장 단점이 있다면?
Call by value의 경우
- 데이터 값을 복사해서 함수로 전달하기 때문에 원본의 데이터가 변경될 가능성이 없다.
- 인자를 넘겨줄 때마다 메모리 공간을 할당해야해서 메모리 공간을 더 잡아먹는다.
Call by reference의 경우
- 참조에 의한 전달로 호출자와 호출 수신자의 값이 완전히 같기 때문에 메모리 공간 할당 문제에서 유리하다.
- 원본 값이 변경될 수 있는 위험이 있다.
'CS' 카테고리의 다른 글
3. HTTP 기본 (0) | 2024.04.05 |
---|---|
URI와 웹 브라우저 요청 흐름 (2) | 2024.04.04 |
인터넷 네트워크 (0) | 2024.04.04 |
브라우저의 주소 표시줄에 url을 입력하면 어떤 일이 벌어질까? (1) | 2024.04.04 |
[CS] 트랜잭션과 무결성에 대하여 (2) | 2024.01.09 |