728x90

C언어 포인터를 학습하고 나서 swap 함수로 값을 넘기는 것과 주소를 넘기는 것을 비교해보면서 원하는 결과가 어떻게 도출되는지를 확인해볼 수 있다.


swap 함수와 swap_p함수를 같이 넣어서 call by value, call by reference 를 각각 처리하는 걸 비교해볼 수 있게 했다.


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void swap(int x, int y) { // int &x, int &y 로 변경해 보면 결과가 어떻게 나오는지 확인해보라.
    int tmp = x;
    x = y;
    y = tmp;

    printf("swap 함수 내 결과 : ");
    printf("x = %d, y = %d ", x, y);
    printf("&x = %p, &y = %p\n", &x, &y);


  

    // swap() 함수 내에서는 x, y 값이 변경 되었지만,
    // 정작 main() 함수에서는 a, b 값이 그대로 인 것을 확인할 수 있다
    // 오직 swap() 함수 내의 지역 변수에서만 유효함을 확인할 수 있다
}

void swap_p(int *x, int *y) { // 함수의 매개변수는 포인터 타입으로 선언
    int tmp = *x; // 역참조 연산자(*)를 사용하여 포인터가 가리키는 주소에 저장된 값을 tmp 에 저장
    *x = *y;
    *y = tmp; // tmp 를 포인터가 가리키는 주소에 저장된 값에 저장

    printf("swap 함수 내 결과 : ");
    printf("x = %d, y = %d ", *x, *y); // 값 출력
    printf("&x = %p, &y = %p\n", x, y); // 주소 출력


  

}

int main() {
    int a = 2;
    int b = 3;

    printf("swap 이전 값 출력 : ");
    printf("a = %d, b = %d ", a, b);
    printf("&a = %p, &b = %p\n", &a, &b);

    //scanf("%d%d", &a, &b);

    //swap(a, b); // 값을 넘겨준다(call-by-value)

    swap_p(&a, &b); // 주소를 넘겨준다.(call-by-reference)

    printf("swap 이후 값 출력 : ");
    printf("a = %d, b = %d ", a, b);
    printf("&a = %p, &b = %p\n", &a, &b);

    return 0;
}


값에 의한 전달(call by value)
값에 의한 전달 방법은 인수로 전달되는 변수가 가지고 있는 값을 함수 내의 매개변수에 복사하는 방식이다.
이렇게 복사된 값으로 초기화된 매개변수는 인수로 전달된 변수와는 완전히 별개의 변수가 된다.
따라서 함수 내에서의 매개변수 조작은 인수로 전달되는 변수에 아무런 영향을 미치지 않다.


참조에 의한 전달(call by reference)
참조에 의한 전달 방법은 인수로 전달된 변수의 값을 복사하는 것이 아닌, 원본 데이터를 직접 전달하는 것이다.
C언어에서는 이러한 작업을 포인터를 사용하여 인수로 전달된 변수의 주소값을 전달한다.
하지만 C++에서는 이러한 작업을 참조자(reference)를 사용하여 전달할 수 있다.



Java

Java는 기본형(primitive) 데이터 외에는 모두 참조형(reference) 데이터다.

기본형은 call by value 이고 객체는 call by reference 이다.


구글링을 해보면 Java 는 call by value 다, call by reference 다 의견이 분분하다.

https://www.tutorialspoint.com/Call-by-value-and-Call-by-reference-in-Java 를 참조하면 도움이 될 것 같다.


public class Tester {

    public static void main(String[] args) {
        int a = 30;
        int b = 45;
        System.out.println("Before swapping, a = " + a + ", b = " + b);

        swap(a, b);
       
        System.out.println("\nAfter swapping, a = " + a + ", b = " + b);
    }

    public static void swap(int x, int y) {
        System.out.println("\nBefore swapping(Inside), x = " + x + ", y = " + y);

        int tmp = x;
        x = y;
        y = tmp;
        System.out.println("After swapping(Inside), x = " + x + ", y = " + y);
    }

}

실행 결과 ==> 원하던 결과가 아님을 알 수 있다. swap 메소드에 넘기는 것이 value 이기 때문이다.

Before swapping, a = 30, b = 45
Before swapping(Inside), x = 30, y = 45
After swapping(Inside), x = 45, y = 30
After swapping, a = 30, b = 45


public class Tester {

    public static void main(String[] args) {
        IntWrapper a = new IntWrapper(30);
        IntWrapper b = new IntWrapper(45);


        System.out.println("Before swapping, a = " + a.value + ", b = " + b.value);

        swap(a, b);

        System.out.println("After swapping, a = " + a.value + ", b = " + b.value);
    }

    public static void swap(IntWrapper x, IntWrapper y) {
        System.out.println("Before swapping(Inside), x = " + x.value + ", y = " + y.value);

        int tmp = x.value;
        x.value = y.value;
        y.value = tmp;
        System.out.println("After swapping(Inside), x = " + x.value + ", y = " + y.value);
    }
}

class IntWrapper {
    public int value;

    public IntWrapper(int value) {
        this.value = value;
    }
}

실행 결과 ==> reference 로 받은 다음, 그 내부 변수를 서로 변경하는 방법으로 처리

Before swapping, a = 30, b = 45
Before swapping(Inside), x = 30, y = 45
After swapping(Inside), x = 45, y = 30
After swapping, a = 45, b = 30

블로그 이미지

Link2Me

,