C언어 포인터를 학습하고 나서 swap 함수로 값을 넘기는 것과 주소를 넘기는 것을 비교해보면서 원하는 결과가 어떻게 도출되는지를 확인해볼 수 있다.
swap 함수와 swap_p함수를 같이 넣어서 call by value, call by reference 를 각각 처리하는 걸 비교해볼 수 있게 했다.
#define _CRT_SECURE_NO_WARNINGS
// swap() 함수 내에서는 x, y 값이 변경 되었지만,
} |
값에 의한 전달(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 { |
실행 결과 ==> 원하던 결과가 아님을 알 수 있다. 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 { System.out.println("Before swapping, a = " + a.value + ", b = " + b.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
'C++ > C++ 문법' 카테고리의 다른 글
C언어 중첩 구조체(Nested structure) (0) | 2019.11.20 |
---|---|
C언어 구조체(Struct) 이해 및 C++ 구조체 예제 (0) | 2019.11.19 |
C언어/C++ 배열 포인터, 포인터 배열, 응용 (0) | 2019.11.16 |
C언어 포인터 이해 (0) | 2019.11.15 |
C언어 strcmp, strcpy_s, strcat_s (0) | 2019.11.14 |