추천, 2024

에디터의 선택

값 별 호출과 참조 별 호출 간의 차이점

C ++과 Java에서는 함수 또는 메소드를 호출하는 두 가지 방법이 있습니다. 첫 번째는 "value by call"이고 두 번째는 "call by reference"입니다. 값으로 호출 메소드는 변수 값만 함수 코드에 전달하며 해당 함수 안에있는 변수 값에 변경 사항이있는 경우 해당 변수의 원래 값에는 영향을 미치지 않습니다. 참조 메소드에 의한 호출에서는 변수 자체를 인수로 전달하고 변수 값의 변경은 해당 변수의 원래 값에도 영향을줍니다. 두 메소드의 주된 차이점은 value 메소드 호출은 변수 값을 전달하고 참조 호출은 해당 변수의 주소를 전달한다는 것입니다.

비교 차트 :

비교의 근거Call_By_Value참조로 호출
기본
변수 사본이 전달됩니다.변수 자체가 전달됩니다.
효과변수 사본의 변경은 기능 밖의 변수의 원래 값을 수정하지 않습니다.변수의 변경은 함수 밖의 변수의 값에도 영향을줍니다.
매개 변수 호출function_name (variable_name1, variable_name2, ...);function_name (& variable_name1, & variable_name2, ...);
// 객체의 경우
object.func_name (object);
수신 매개 변수function_name 유형 (type variable_name1, type variable_name2, ...)
{. . }
function_name (type * variable_name1, type * variable_name2, ..) {}을 입력하십시오. . }
// 객체의 경우
function_name (class_type object_name)을 입력하십시오.
{. . }
기본 전화원시 타입은 "값으로 호출"을 사용하여 전달됩니다.객체는 "참조로 호출"을 사용하여 암시 적으로 전달됩니다.

값별 호출 정의

함수 / 메소드에 원시 데이터 유형 (정수, 문자 및 문자열)을 전달하면 "값"만 함수 코드로 전달됩니다. 이 함수는 인수 값을 함수 코드의 '형식 매개 변수'에 복사합니다. 함수 코드에서 형식 매개 변수를 수정하면 함수를 호출하는 데 사용 된 인수의 원래 값이 수정되지 않습니다.

간단히 말해서, 함수 / 메소드가 'value by call'접근 방식에 의해 호출되면; 변수의 사본이 기능 코드로 전달됩니다. 함수 코드가 변수 사본의 값을 변경하면 변수의 원래 값은 변경되지 않습니다.

이것을 간단히 이해하는 예를 보도록하겠습니다.

 // Java 클래스 체크의 예 {void change (int i, int j) {i = i * i; j = j / 2; system.out.println ( "함수 내부의 매개 변수 값"); system.out.println ( "인수 'a'의 값을 받아들이는 'i'값"+ i); system.out.println ( "인수 'b'의 값을 받아들이는 'j'값"+ j); }} class call_by _value {public static void main (string args []) {int a = 12, b = 20; check C = new check (); system.out.println ( "함수 호출 전에 'a'와 'b'의 값"+ a + ""+ b); C. 체인지 (a, b); // 값으로 호출합니다. system.out.println ( "함수 호출 후 'a'와 'b'의 값"+ a + ""+ b); }} // 함수 호출 전에 'a'와 'b'의 출력 값 12 20 'a'의 값을 받아들이는 'i'의 함수 값 내부의 매개 변수 값 'a'의 값을 받아들이는 'j'의 값 144 인수 'b'10 함수 호출 후 'a'와 'b'의 값 12 20 

참조로 호출 정의

참조로 호출 메소드는 인수의 참조 / 주소를 함수 코드에 전달합니다. 인수의 주소가 함수 Z 드로 전달되면 해당 주소를 승인하는 형식 매개 변수는 '포인터'변수가됩니다. 이제 함수 코드가 인수의 주소를 얻었으므로 인수 값의 수정은 인수의 원래 값을 수정합니다.

C ++과 Java에서는 객체를 함수 / 메소드에 전달하는 것이 매우 일반적이며 객체는 항상 참조에 의해 전달됩니다. 함수 / 메서드 내에서 개체에 대한 변경 사항은 해당 함수 / 메서드를 호출하는 데 사용되는 개체에 영향을줍니다.

다음 단편은 '참조로 호출'하는 올바른 방법을 보여줍니다.

 // C ++ 클래스의 예제 swap {void swap (int * x, int * y) {int temp; temp = * x; * x = * y; * Y = 임시; }} int main {int a = 10, b = 20; cout << "함수 호출 전에 a, b 값"<< a << ""< 

이제, '참조에 의한 호출'접근 방식에 의해 암시 적으로 전달되는 '객체'를 인수로 전달하여 '참조에 의한 호출'을 논의합시다.

 클래스 검사 {int a, b; check (int x, int b) {//이 constrtuctor를 통해 초기화 된 객체 a = x; b = y; } void exchange (check ob) {ob.a = a * 2; ob.b = b / 2; }} class main_class {public static void main (string args []) {체크 C = 새로운 체크 (20, 40); // 객체 초기화. system.out.println ( "함수 호출 이전의 'ob.a'및 'ob.b'값 + ob.a +" "+ ob.b); C. 교환 (C); // 참조로 호출하십시오. system.out.println ( "함수 호출 이전의 'ob.a'및 'ob.b'값 + ob.a +" "+ ob.b); }} // 함수 호출 전 'ob.a'및 'ob.b'값 출력 20 40 함수 호출 후 'ob.a'및 'ob.b'값 40 20 

가치에 의한 호출과 참조에 의한 호출 간의 주요 차이점

  1. 'call by value'접근법을 사용하여 인수를 전달하면 해당 변수의 복사본 만 전달되므로 해당 변수 사본의 값에 대한 변경 사항은 해당 변수의 원래 값에 영향을 미치지 않습니다. '참조로 호출'접근법에서 변수 자체가 인수로 전달되므로 변수를 변경하면 원래 변수의 값이 수정됩니다.
  2. 전달 된 인수가 원시 데이터 유형 인 경우에는 단순히 '값으로 호출'하지만 인수 또는 객체의 참조 / 주소가 전달되면 함수는 'call by reference'메소드에 의해 호출됩니다.
  3. 'call by value 접근법'에서 전달 된 인수는 변수의 이름 일 뿐이지 만 'call by reference'접근법에서는 전달 된 인수가 '&'기호의 변수 이름이거나 그 이름으로 전달되는 객체입니다.
  4. 'call by value'접근법에서 인수의 매개 변수를받는 것은 데이터 유형과 함께 변수 이름입니다. '참조에 의한 호출'접근에서 수신 매개 변수는 항상 데이터 유형과 함께 포인터 변수이고 객체의 경우 클래스 유형과 함께 객체 이름입니다.

결론:

C ++과 Java는 전달되는 것에 따라 두 가지 접근법을 모두 사용합니다. 변수의 값만 전달하려면 '값으로 호출'접근법을 사용하고 변수의 원래 값의 변경 사항을 보려면 '참조로 호출'접근 방식을 사용하십시오.

Top