공부 기록
[WEEK 1] 함수의 호출 방식 본문
[C++] Call by Value, Call by Reference, Call by Pointer
<Call by Value(값에 의한 호출)>
: 함수에 인자를 넘길 때 값을 복사해서 넘긴다.
함수 내의 인자값을 변경할 때 호출자에게 영향을 주지 않는다.
예제 코드
# include <iostream>
using namespace std;
void swap(int x, int y){
int tmp = x;
x = y;
y = tmp;
}
int main(){
int a = 1, b = 2;
cout << "[before swap] a: " << a << ", b: " << b << endl;
swap(a, b);
cout << "[after swap] a: " << a << ", b: " << b << endl;
return 0;
}

<Call by Reference(참조에 의한 호출)>
: 함수에 인자를 넘길 때 참조형 변수를 넘긴다.
함수 내의 인자값을 변경할 때 호출자의 값도 변경된다.
예제 코드
#include <iostream>
using namespace std;
void swap(int &x, int &y){
int tmp = x;
x = y;
y = tmp;
}
int main(){
int a = 1, b = 2;
cout << "[before swap] a: " << a << ", b: " << b << endl;
swap(a, b);
cout << "[after swap] a: " << a << ", b: " << b << endl;
return 0;
}

<Call by Pointer(포인터에 의한 호출)>
: 함수에 인자를 넘길 때 포인터를 넘긴다.
함수 내의 인자값을 변경할 때 호출자의 값도 변경된다.
예제 코드
#include <iostream>
using namespace std;
void swap(int *x, int *y){
int tmp = *x;
*x = *y;
*y = tmp;
}
int main(){
int a = 1, b = 2;
cout << "[before swap] a: " << a << ", b: " << b << endl;
swap(&a, &b);
cout << "[after swap] a: " << a << ", b: " << b << endl;
return 0;
}#### 예제 코드

Pointer VS Reference
- Pointer
: 포인터는 메모리의 주소를 가지고 있는 변수이다.
주소 값을 통한 메모리 접근을 한다. (간접 참조)
- Reference
: 레퍼런스 = 참조자. (C++ 문법)
참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름이다.
변수명을 통해서 메모리를 참조한다. (직접 참조)
#include <cstdio>
int main(){
int num = 10;
int &num_ref = num;
int *num_ptr = #
printf("num 주소: %d\nnum_ref 주소: %d\nnum_ptr 주소: %d\n", &num, &num_ref, &num_ptr);
printf("num 값: %d\nnum_ref 값: %d\nnum_ptr 값: %d\n", num, num_ref, *num_ptr);
return 0;
}

위 코드의 결과를 보면 알 수 있듯이 reference는 num과 아예 같은 값이고 pointer는 num의 주소를 갖고 있는 변수이다.
- Call by Pointer VS Call by Reference
: 포인터에 의한 호출은 매개변수로 함수 인자를 전달할 때 메모리 소모가 일어나고 값 복사가 발생한다.
반면에 참조에 의한 호출은 메모리 소모가 없고 값 복사 또한 발생하지 않는다.
[Python] Call by Object Reference
<Call by Object Reference(객체 참조에 의한 호출)>
: 객체의 주소가 함수로 전달되는 방식이다.
전달된 객체를 참조하여 변경할 때 호출자에게 영향을 준다.
하지만 새로운 객체를 만들 경우 호출자에게 영향을 주지 않는다.
def add_value(arr):
arr.append(1) # 기존 객체의 주소값에 [1] 추가
arr = [2, 3] # 새로운 객체 생성
val = [0]
add_value(val)
print(val)
[0, 1]
def swap_value(x, y):
tmp = x
x = y
y = tmp
# a리스트의 전역 변수 값을 직접 변경
def swap_offset(offset_x, offset_y):
tmp = a[offset_x]
a[offset_x] = a[offset_y]
a[offset_y] = tmp
# a리스트 객체의 주소값을 받아 값을 변경
def swap_reference(arr, offset_x, offset_y):
tmp = arr[offset_x]
arr[offset_x] = arr[offset_y]
arr[offset_y] = tmp
a = [1, 2, 3, 4, 5]
print("before: ", a)
swap_value(a[1], a[2])
print("after: ", a)
before: [1, 2, 3, 4, 5]
after: [1, 2, 3, 4, 5]
print("before: ", a)
swap_offset(1, 2)
print("after: ", a)
before: [1, 2, 3, 4, 5]
after: [1, 3, 2, 4, 5]
print("before: ", a)
swap_reference(a, 1, 2)
print("after: ", a)
before: [1, 2, 3, 4, 5]
after: [1, 3, 2, 4, 5]
'BOOST CAMP - AI Tech' 카테고리의 다른 글
[WEEK 1] Object-Oriented Programming (0) | 2022.09.23 |
---|---|
[WEEK 1] Pythonic code (2) | 2022.09.23 |
[WEEK 1] Python - collections 패키지 (0) | 2022.09.22 |
[WEEK 1] 자료구조 (2) | 2022.09.21 |
[WEEK 1] Python 특징 (0) | 2022.09.20 |
Comments