> Java > java지도 시간 > 본문

Java는 값 또는 참조로 객체를 전달합니까?

Barbara Streisand
풀어 주다: 2024-11-21 06:14:10
원래의
403명이 탐색했습니다.

Does Java Pass Objects by Value or Reference?

Java: 값에 의한 전달 vs. 참조에 의한 전달

Java에서는 객체 전달 메커니즘에 대한 오해가 자주 발생합니다. 이 기사에서는 두 코드 조각의 차이점을 자세히 살펴보고 Java 매개변수 전달 동작의 기본 원칙을 조명합니다.

코드 A와 코드 B

코드 A:

Foo myFoo;
myFoo = createfoo();

public Foo createFoo() {
   Foo foo = new Foo();
   return foo;
}
로그인 후 복사

코드 B:

Foo myFoo;
createFoo(myFoo);

public void createFoo(Foo foo) {
   Foo f = new Foo();
   foo = f;
}
로그인 후 복사

Java의 매개변수 전달 이해

일반적인 믿음과는 달리 Java는 참조가 아닌 값에 의한 전달을 활용합니다. 이는 객체가 인수로 전달되면 원본에 대한 직접 참조가 아닌 해당 참조의 복사본이 생성됨을 의미합니다.

코드 A 설명

첫 번째 줄에서 myFoo는 선언되었지만 할당되지 않았습니다. 두 번째 줄에서는 myFoo에 할당된 새 Foo 개체를 반환하는 createFoo 메서드를 호출합니다. 이 할당은 메소드 내에서 생성된 객체와 다른 새 객체를 생성합니다.

코드 B 설명

반대로, 코드 B는 myFoo 참조를 createFoo 메소드에 대한 인수로 전달합니다. 메소드 내에서 새로운 Foo 객체가 생성되어 foo 매개변수에 할당됩니다. 이어서 foo는 메소드 내의 지역 변수인 a에 할당됩니다. 이 재할당은 원래 참조 myFoo가 아닌 로컬 참조 foo를 효과적으로 수정합니다.

명확성을 위한 예

개념을 설명하려면 다음 클래스를 고려하세요.

public class Foo {
   private String attribute;

   public void setAttribute(String attribute) {
      this.attribute = attribute;
   }
}
로그인 후 복사

메인 클래스:

public class Main {
   public static void main(String[] args) {
      Foo f = new Foo("f");
      changeReference(f); // Attempt to change reference
      modifyReference(f); // Attempt to modify object attribute
   }

   public static void changeReference(Foo a) {
      Foo b = new Foo("b");
      a = b;
   }

   public static void modifyReference(Foo c) {
      c.setAttribute("c");
   }
}
로그인 후 복사

메인 메소드 이후 Foo의 인스턴스를 생성하고 이를 f에 할당하고, 다른 객체에 대한 참조를 재할당하려고 시도하는 ChangeReference를 호출합니다. 그러나 이는 f 참조를 변경하지 않습니다.

반대로,modifyReference는 f와 동일한 객체인 c가 참조하는 객체의 속성을 수정합니다. 이는 참조 전달이 객체 자체가 아니라 참조의 복사본을 생성한다는 것을 보여줍니다.

결론

Java의 값에 의한 전달 접근 방식은 원래 객체가 해당 범위 외부에서 의도치 않게 수정되지 않도록 보호하여 객체 불변성을 보장합니다. 이 원칙은 캡슐화를 촉진하고 강력하고 예측 가능한 코드 생성을 촉진합니다.

위 내용은 Java는 값 또는 참조로 객체를 전달합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿