Java의 가치 이전 이해:
코드 1:
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin") SChange(buffer) } 공공 정적 무효 SChange (StringBuffer str) { str= new StringBuffer("huang") } }코드 2:
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin") SChange(buffer) } public static void SChange (StringBuffer str) { //str= new StringBuffer("huang") str.append(" huang") }위의 코드 1과 코드 2를 각각 설명하기 위해 두 개의 그림을 사용하겠습니다.
원래 상태
코드 1 다이어그램:
코드 2 이해:
코드 1에서 복사 참조는 새 개체를 가리킵니다. 그러나 원본 객체는 변경되지 않습니다.
코드 2에서는 복사 참조가 원본 개체를 변경합니다.
이것이 Java의 값 전달입니다.
C++에서 두 가지 전송 유형의 차이점은 다음과 같습니다.
C++ 값 전달, 참조 전달 및 포인터 메서드의 경우 다음 코드를 사용하여 테스트를 직접 이해하고 실행합니다.
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1; } void ByRef(int& a) { a = a + 1 } void ByPointer(int* a) { *a = *a + 1; } int main(int argv, char** args) { int v = 1; ByRef(v); // 참조로 전달 ByPointer(&v); // 값으로 전달 int* vp = &v:cout << v << std::endl; cout << typeid(vp).name() << std::endl; // std::cout << typeid(&vp).name() << std::endl; std::cout << "끝" << std::endl }첫 번째는 값으로 전달되고, 두 번째 함수는 참조로 전달되지만, 후자의 두 함수는 동일한 함수가 Call by reference로 한 번, Call by value로 한 번 호출됩니다.
왜냐하면:
ByPointer(vp); vp가 변경되지 않으면 변경할 수 없습니다. 값으로 전달
ByPointer(&v) 변경 v. 참조로 전달(전달된 것이 실제로 v의 주소이고 ByPointer가 v의 주소를 변경할 수 없으므로 이것이 값으로 호출이라고 말할 수 있습니다. 설명이 필요 없는 것처럼 들리지만 v의 주소는 순수 데이터입니다. 호출자에게는 v만 있고 실제로 ByPointer 함수에 의해 v가 변경되었습니다. 행동을 고려하는 것이 평가 전략의 본래 의도이며, 모든 것을 가치로 추상화하고 문제를 데이터의 관점에서 고려한다면 청중을 혼란스럽게 하는 평가 전략의 개념을 도입할 필요는 없습니다. )
nob: 위의 이해가 인식됩니다. 보충 포인터 메서드는 두 가지 방법으로 사용할 수 있습니다. 값 전달: 포인터 전달, 참조 전달: typeid(x).name()을 사용하는 경우 &v와 vp를 보면 둘 다 Point 유형이므로 두 가지 성능이 동일한 결과라는 것을 알 수 있습니다. 나를 이렇게 생각할 수도 있겠지
ByValue(&v);
, C++에서 다양한 유형의 매개변수를 전달하면 컴파일이 직접 전달되지 않습니다.
요약:
그래서 값으로 전달하거나 참조로 전달하는 경우 메모리에 어떻게 들어가는지 확인하면 된다고 생각합니다.
메모리 공유는 참조 전달을 의미하고, 메모리 복사는 값 전달을 의미합니다(몇 가지 특별한 경우는 먼저 제쳐두고).
이 경우:
C/C++: 기본적으로 값으로 전달, 참조로 전달, 포인터는 별도로 이해됩니다. (포인터는 값으로 전달하거나 참조로 전달하는 것으로 이해될 수 있으며 결과는 동일합니다.)
JAVA: 기본 데이터 유형은 값으로 전달되고 객체도 값으로 전달됩니다(이 객체의 참조 복사).
C#: 값 유형별로 값 전달, 참조 유형별로 참조로 전달, ref/out에 대한 특별한 이해
JAVA와 C#의 문자열은 겉으로는 값으로 전달하는 것처럼 보이지만 실제 구현은 가상 머신에 따라 다릅니다.