Blog

[CS]01 Call by reference란 무엇이고 보통 어떻게 쓰이나요?

Author
Summary
Call by reference란?
Category
Study
Tags
CS
Favorite
Memory Date
2023/10/10
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
Call by reference란 무엇이고 보통 어떻게 쓰이나요?
함수에 매개변수로 변수의 주소값(참조값)을 전달하는 방식을 Call by reference 라고 말합니다.
추가개념 우선 어떠한 기능을 구현한 함수에는 매개변수를 통해 기능에서 필요한 값을 입력하고 그 함수에서 사용되어 결과를 변경시키는 역할을 합니다.
Call by value 예시는?
어떤 함수가 호출될 때, 매개변수로 해당 변수의 주소값을 전달하므로 함수 내에서 그 주소값을 이용하여 주소값이 가리키는 실제 변수를 변경하는데 사용 됩니다.
추가질문 어떤방식으로 변경하게 되는지 설명해주실레요?
Java에서는 기본형 데이터 유형인 Long, short, int, char 등 데이터유형이 있고, 참조형 데이터 유형으로 기본형을 제외한 모든것으로 대표적으로 문자열인 String, 배열 등이 있는데 객체 또한 참조형 변수입니다.
프로그램이 실행되면 프로그램을 위한 메모리 공간이 할당되어야하고 로드되어야 합니다.
메모리공간은 단순하게
1. 코드(code) 영역
실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역이라고도 부른다. 한줄씩 코드를 실행시킬 수 있도록 코드가 저장됩니다.
2. 데이터(data) 영역
프로그램의 시작과 동시에 할당되며, 프로그램이 종료되면 소멸되는 영역입니다. 전역변수(global), static 변수, array, 구조체(structure) 등 저장되는 영역입니다.
3. 스택(stack) 영역
함수의 호출과 관계되는 지역 변수와 매개변수, return 값 등이 저장되는 영역
4. 힙(heap) 영역
사용자가 직접 관리할 수 있는 메모리 영역입니다. 메모리 주소 값에 의해서만 참조되고 사용되며, 참조타입(Reference Type)의 실제 값의 저장 공간입니다.
으로 구분됩니다.
우선 기본형 데이터 유형 변수, 참조형 데이터 변수가 선언되어있고, 매개변수로 변수를 받아 +1을 증가시키는 프로그램이 있다고 가정하겠습니다.
기본형 int 변수 a 가 1로, 참조형 배열 int[] 변수 arr의 배열 {1}로 각각 초기화되면 데이터 영역에 저장됩니다.
각각 +1을 증가시키는 함수에 매개변수로 전달될 때, 데이터 영역의 변수의 값은 메모리의 스택이란 공간으로 복사되어 전달됩니다.
기본형 데이터 유형인 a은 스택 영역에 1이라는 복사된 값이 저장됩니다.
참조형 데이터 유형 arr 은 스택 영역에 실제값을 바라보는 주소값이 복사되어 스택에 저장 됩니다. 실제 값인 1은 힙이란 영역에 저장됩니다.
이때 각 변수를 매개변수로 받은 1증가 함수는 스택에서 실행됩니다. 기본형 변수의 값이 복사된 1은 더해 2로 변경되지만 스택영역은 함수가 실행 되고 종료하고 소멸됩니다. 따라서 이후에 다시 a를 출력하는 함수에서는 아직 데이터 영역에 저장되어 있는 처음 상태의 a를 불러와서 출력하게되면서 1을 그대로 보여주게 됩니다.
하지만 참조형 변수인 arr은 증가 함수에서 복사된 주소값이 가리키는 데이터 영역에 있는 실제 값에 +1을 하면서 힙 영역에 저장된 값이 2로 변경됩니다. 함수 호출이 종료되면 스택에서 주소값을 사용하고 소멸하지만 그 다음 줄 코드인 arr의 값을 출력하는 함수에서는 아직 소멸하지 않은 힙 영역에 저장된 2를 출력하게 됩니다.
와 같이 참조값을 전달하면서 변수의 값을 변경하는데 사용되는 것이 Call by reference입니다.