함수 호출 방식(Call by value / Call by reference)
* Call-by-value(값으로 호출)
- 값을 인자로 전달받는 함수 호출 방식
- 함수 외부에 선언된 변수에 접근 불가능(오직 값에대한 리턴 값 만 반환받고, 변수를 변화할 수 없다)
- 외부 변수 접근을 위해 Call-by-reference 기반 함수호출을 사용한다
예시) int add(int num1, int num2) return num1 + num2;
* 주소값을 이용한 Call-by-reference(주소 값으로 호출)
- 주소 값을 인자로 전달받아, 함수 외부에 선언된 변수에 접근하는 함수 호출 방식
- 주소 값이 참조하는 영역을 직접 변경하기 때문에 함수 외부 변수 값을 변경할 수 있다.
예시)
void swap(int* ptr1, int* ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
* 참조자를 이용한 Call-by-reference
예시)
void swap(int &ref1, int &ref2)
{
int temp = ref1;
ref1 = ref2;
ref2 = temp;
}
* Call-by-address
- 종종 참조자 기반의 함수 호출과 구분하기 위해 주소 값 함수 호출 방법에 붙이는 명명
- 하지만 구분하지 않고 두 경우 다 Call-by-reference로 사용하도록 한다(아래가 맞는 표현)
- 주소값을 이용한 Call-by-reference
- 참조자를 이용한 Call-by-reference
* 참조자를 이용한 Call-by-reference의 단점
- void func(int val) { ... }
- void func(int &ref) { ... }
- 위와 같이 오버로딩된 함수는 함수의 호출 문장만으로 어떤 함수를 호출 하였는지 파악하기 힘들다
- 즉, 호출 값의 변경이 있었는지 파악을 위해 함수 원형으로 이동해 확인해야 함을 의미
- 이런 단점 해결을 위해 const 키워드를 사용한다.
* const 참조자
- 함수 내에서, 참조자를 통한 값의 변경을 진행하지 않을 경우, 참조자를 const로 선언해 함수 호출 문장만으로 값이 변경되지 않았음을 알 수 있게한다.
- void func(const int &ref) { ... }
- 참조자를 이용한 함수 호출에서 ref 의 값을 변경하지 않겠다. 선언
- const 변수를 참조하려면 const 참조자를 사용한다.
const int num = 20;
int &ref = num; //컴파일 에러 발생
const int &ref = num; //정상 참조 성공
- const 참조자는 상수 참조가 가능하다(변수가 아닌 상수 자체 참조)
const int &ref = 30; //변수가 아님에도 불구하고 상수를 참조할 수 있다.
이는 상수를 참조할 때 '임시변수' 를 만들고, 참조자가 이 임시 변수를 참조하게 하기에 가능
상수 참조 이유: 함수에 인자 전달을 위해 변수를 일일이 선언하기 번거롭기 때문
- 값을 인자로 전달받는 함수 호출 방식
- 함수 외부에 선언된 변수에 접근 불가능(오직 값에대한 리턴 값 만 반환받고, 변수를 변화할 수 없다)
- 외부 변수 접근을 위해 Call-by-reference 기반 함수호출을 사용한다
예시) int add(int num1, int num2) return num1 + num2;
* 주소값을 이용한 Call-by-reference(주소 값으로 호출)
- 주소 값을 인자로 전달받아, 함수 외부에 선언된 변수에 접근하는 함수 호출 방식
- 주소 값이 참조하는 영역을 직접 변경하기 때문에 함수 외부 변수 값을 변경할 수 있다.
예시)
void swap(int* ptr1, int* ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
* 참조자를 이용한 Call-by-reference
예시)
void swap(int &ref1, int &ref2)
{
int temp = ref1;
ref1 = ref2;
ref2 = temp;
}
* Call-by-address
- 종종 참조자 기반의 함수 호출과 구분하기 위해 주소 값 함수 호출 방법에 붙이는 명명
- 하지만 구분하지 않고 두 경우 다 Call-by-reference로 사용하도록 한다(아래가 맞는 표현)
- 주소값을 이용한 Call-by-reference
- 참조자를 이용한 Call-by-reference
* 참조자를 이용한 Call-by-reference의 단점
- void func(int val) { ... }
- void func(int &ref) { ... }
- 위와 같이 오버로딩된 함수는 함수의 호출 문장만으로 어떤 함수를 호출 하였는지 파악하기 힘들다
- 즉, 호출 값의 변경이 있었는지 파악을 위해 함수 원형으로 이동해 확인해야 함을 의미
- 이런 단점 해결을 위해 const 키워드를 사용한다.
* const 참조자
- 함수 내에서, 참조자를 통한 값의 변경을 진행하지 않을 경우, 참조자를 const로 선언해 함수 호출 문장만으로 값이 변경되지 않았음을 알 수 있게한다.
- void func(const int &ref) { ... }
- 참조자를 이용한 함수 호출에서 ref 의 값을 변경하지 않겠다. 선언
- const 변수를 참조하려면 const 참조자를 사용한다.
const int num = 20;
int &ref = num; //컴파일 에러 발생
const int &ref = num; //정상 참조 성공
- const 참조자는 상수 참조가 가능하다(변수가 아닌 상수 자체 참조)
const int &ref = 30; //변수가 아님에도 불구하고 상수를 참조할 수 있다.
이는 상수를 참조할 때 '임시변수' 를 만들고, 참조자가 이 임시 변수를 참조하게 하기에 가능
상수 참조 이유: 함수에 인자 전달을 위해 변수를 일일이 선언하기 번거롭기 때문
댓글
댓글 쓰기