함수가 호출될 때, 일반적으로 메모리 내에서 함수를 위한 별도의 임시 공간이 생성됩니다. 이 공간은 주로 스택 프레임이라고 불리며, 함수 호출 시 할당되는 메모리 블록으로 사용됩니다.
스택 프레임에는 함수에서 사용되는 지역 변수 및 기타 관련 정보가 저장됩니다. 함수가 실행을 마치고 종료되면 해당 스택 프레임은 메모리에서 해제됩니다. 함수 호출 방식에는 주로 값에 의한 호출인 (call-by-value)와 참조에 의한 호출(call by referece)이 있습니다.
Call By Value (값에 의한 호출)
함수 호출 시에 전달되는 변수의 값의 복사하여 함수의 인자로 전달합니다. 이러한 경우, 복사된 값은 함수 내부에서 지역적으로 사용되는 특성을 가지며, 함수 내부에서 해당 값이 변경되더라도 외부의 변수의 값은 변경되지 않습니다
JAVA와 같은 언어에서는 DATATYPE에 따라 호출 방식이 다르며 원시 자료형일 때는 값에 의한 호출이 이루어집니다.
참조 자료형인 경우에는 참조에 의한 호출이 이루어지고 원시 자료형은 함수 호출 시 해당 값이 복사되어 전달되므로 값에 의한 호출이 이루어지고, 참조 자료형은 객체 또는 배열의 참조가 전달되므로 참조에 의한 호출이 이루어집니다. 이 경우에는 내부에서 참조된 객체나 배열을 수정하면 외부에서도 해당 변경사항이 반영됩니다.
장단점
- 장점 - 복사하여 처리하기에 안전
- 단점 - 복사로 인한 메모리 사용량 증가
// 함수 정의
void changeValue(int x) {
x = 10; // 매개변수의 값을 변경
}
int main() {
int num = 5;
std::cout << "Before calling the function: " << num << std::endl;
// 함수 호출
changeValue(num);
std::cout << "After calling the function: " << num << std::endl;
return 0;
}
// int 형 변수를 값에 의해 전달받으며 매개 변수로 전달된 값을 변경하며, 호출 후에는 변수의 값은
// 변경되지 않습니다
Call By Reference(참조에 의한 호출)
함수 호출 시에 변수의 참조를 전달하는 방식으로 함수가 호출될 때마다 메모리 공간 안에서 함수를 위한 별도의 임시 공간이 생성되며, 이것이 스택 프레임이 됩니다.
함수의 내부에서 전달된 래퍼런스(참조)는 원본 변수를 이용하여 조작할 수 있습니다. 따라서 함수 내부에서 인자 값이 변경되면, 해당 변수의 값도 변경됩니다. 이런 방식은 큰 데이터 구조를 다루거나 함수 호출 시에 많은 양의 데이터를 복사하는 것을 피하기 위해 사용됩니다. 하지만 이 방식을 사용할 때는 주의점이 있습니다. 함수가 원본데이터를 변경할 수 있기에 원하지 않는 부작용이 발생할 수 있기에 주의해야 합니다.
장단점
- 장점 - 직접 참조로 인한 빠른 속도
- 단점 - 직접 참조로 인해 원래값 영향받는 문제
public class CallByReference {
// 함수 정의
public static void changeValue(int[] arr) {
arr[0] = 10; // 배열의 첫 번째 요소의 값을 변경
}
public static void main(String[] args) {
int[] array = {5};
System.out.println("Before calling the function: " + array[0]);
// 함수 호출
changeValue(array);
System.out.println("After calling the function: " + array[0]);
}
}
// 코드에서 changeValue()는 int 형을 사용해 전달받으며 첫 번째 요소의 값을 변경하며,
// 호출된 후에는 원본 배열의 값도 변경됩니다.
'JAVA' 카테고리의 다른 글
JPA를 이용한 복합키(Composite Key) 매핑 (0) | 2024.01.02 |
---|---|
SOLID (0) | 2023.11.11 |
Pubilc과 Private (1) | 2023.11.01 |