Java에서 값으로 전달된 배열 또는 참조로 전달된 배열

Mohammad Irfan 2023년10월12일
  1. Java에서 값으로 전달되는 것
  2. Java에서 참조로 전달되는 항목
Java에서 값으로 전달된 배열 또는 참조로 전달된 배열

이 자습서에서는 Java에서 값 또는 참조로 전달된 배열을 소개합니다.

메서드를 호출할 때 해당 인수는 값 또는 참조로 전달할 수 있습니다. 이 두 가지를 논의하기 전에 두 가지 용어를 이해합시다.

  • callee: 다른 메소드에서 호출한 메소드
  • caller: 다른 메소드를 호출하는 메소드

이제 값에 의한 전달과 참조에 의한 전달이 무엇인지 알아보겠습니다.

Java에서 값으로 전달되는 것

인수가 값으로 전달된다고 말할 때 실제 매개변수 값의 복사본이 메모리에 만들어집니다.

호출자와 호출 수신자는 동일한 값을 가진 두 개의 독립 변수를 유지합니다. 수신자가 매개변수 값을 수정하면 호출자의 변경 사항을 볼 수 없습니다.

중요 사항:

  • 수신자는 호출 코드의 원래 요소에 액세스할 수 없습니다.
  • 데이터(파라미터 값)의 사본이 수신자에게 전송됩니다.
  • 전달된 변수의 변경 사항은 최종 값에 영향을 미치지 않습니다.

Java에서 참조로 전달되는 항목

인수가 참조로 전달된다고 말할 때(주소로 전달이라고도 함), 호출하는 함수의 인수 참조를 해당 형식 매개변수에 전달한다는 의미입니다.

이 상황에서 실제 인수의 주소 사본이 만들어집니다. 호출자와 호출자는 매개변수에 대해 동일한 변수를 사용하므로 호출자가 매개변수 변수를 수정하면 호출자의 변수가 변경되는 것을 볼 수 있습니다.

중요 사항:

  • 호출 수신자는 호출 코드의 프로그래밍 요소에 대한 참조를 제공합니다.
  • 값 대신 저장된 데이터의 메모리 주소가 전달됩니다.
  • 값을 변경하면 원본 데이터에 영향을 줍니다.

Java는 값으로 전달됩니다

C++와 달리 Java에서는 인수를 값으로만 ​​전달할 수 있습니다. 그러나 catch가 있습니다. 객체가 인수로 전달되면 해당 참조가 호출 수신자에게 값으로 전달됩니다.

즉, Java는 엄격하게 값으로 전달되지만 객체에 대한 참조로 전달된 것처럼 동작합니다. 이 개념을 더 잘 이해하기 위해 몇 가지 예를 사용하겠습니다.

Java에서 기본 데이터 유형 전달

아래 코드에서 두 개의 정수를 함수에 대한 인수로 전달한 다음 값을 변경합니다.

Java에서는 인수가 값으로 전달되기 때문에 함수는 인수의 별도 복사본을 유지 관리합니다. 인수에 대한 모든 변경 사항은 기본 함수(호출자)가 유지 관리하는 복사본이 아닌 함수 복사본에서만 이루어집니다.

따라서 함수 호출이 완료된 후 값을 인쇄할 때 원래 값을 얻습니다. 아래 예제 코드를 보십시오.

public class SimpleTesting {
  static void JE_function(int n1, int n2) {
    n1 = -232;
    n2 = -90;
  }

  public static void main(String args[]) {
    int JE_numa = 6932;
    int JE_numb = 8934;
    System.out.println("Numbers before function call :" + JE_numa + " and " + JE_numb);
    JE_function(JE_numa, JE_numb);
    System.out.println("Numbers after the JE_function call :" + JE_numa + " and " + JE_numb);
  }
}

출력:

Numbers before function call:6932 and 8934
Numbers after the JE_function call:6932 and 8934

Java에서 배열 전달하기

객체의 경우 객체에 대한 참조는 값으로 인수로 전달됩니다.

아래 코드에서는 Array를 인수로 전달하고 객체(배열)의 값을 인쇄할 때 메모리 위치가 인쇄됩니다. 이것은 객체 변수가 객체가 저장된 메모리의 위치를 ​​저장한다는 사실과 관련이 있습니다.

아래 예제 코드를 보십시오.

public class SimpleTesting {
  static void JE_function(String[] sentence) {
    System.out.println(sentence);
  }

  public static void main(String args[]) {
    String[] sent = {"I", "Love", "Delftstack"};
    JE_function(sent);
  }
}

출력:

[Ljava.lang.String;@442d9b6e

위의 코드를 사용하여 인수로 전달된 배열에 대한 참조를 전달하려고 합니다. 따라서 배열의 값(메모리 위치가 아님)을 변경하면 변경 사항이 호출 대상에 반영됩니다.

아래 예제 코드를 보십시오.

public class SimpleTesting {
  static void JE_function(String[] sentence) {
    sentence[1] = "Visit";
  }

  public static void main(String args[]) {
    String[] sent = {"I", "Love", "Delftstack"};
    System.out.println("Sentence before calling the function");
    for (String word : sent) {
      System.out.println(word);
    }
    JE_function(sent);
    System.out.println("Sentence after calling the function");
    for (String word : sent) {
      System.out.println(word);
    }
  }
}

출력:

Sentence before calling the function
I
Love
Delftstack
Sentence after calling the function
I
Visit
Delftstack

위의 코드에서 볼 수 있듯이 배열의 모든 변경 사항은 메인 블록에 반영됩니다.

두 친구가 프로젝트를 진행하는 것처럼 생각하십시오. 친구 중 한 명이 하는 모든 작업은 전체 프로젝트에 반영됩니다.

이 경우 함수는 메인 블록이 사용하는 것과 동일한 배열을 참조합니다.

관련 문장 - Java Array