관리 메뉴

공부 기록

[WEEK 1] 함수의 호출 방식 본문

BOOST CAMP - AI Tech

[WEEK 1] 함수의 호출 방식

_JAEJAE_ 2022. 9. 20. 23:17
 

[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 = &num;

    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