2013-04-07 1 views
4

나는이 웹 사이트뿐 아니라 프로그래밍에 새로운 브랜드이기 때문에 무엇이든 망가 뜨리면 나를 용서해주십시오. 나는 여기에 내 코드를 올바르게 게시하는 방법을 알아내는 시간을 가지고있다.언제 'void'메서드가 매개 변수에 영향을 미치며 언제 원래 개체에 영향을 줍니까?

package tester; 
import java.util.*; 
public class Mainclass2 { 
    public static void main(String[] args) { 

     int y = 3; 
     int[] x = {1, 2, 3, 4}; 

     editnumbersArray(x); 
     editnumbersNotArray(y); 

     System.out.println(x[2]); **//now this was changed from 3 to 9...** 
     System.out.println(y); //but this one went unchanged. 

    } 

    //this accepts 'x[]' into the 'a[]' parameter. 
    public static void editnumbersArray(int[] a){ 
     a[2] = 9; **//<---why does this one CHANGE the actual x[2] instead of just a[2]?** 
    } 

    //this accepts 'y' into the 'a' parameter. 
    public static void editnumbersNotArray(int a){ 
     a = 9; **//<--while this one only changes 'a' instead of 'y'?** 
    } 

} 

제 질문은 기본적으로 주석으로 입력되어 있습니다. 다른 메서드로 전달 된 int가 변경되지 않으면 메서드에 전달 된 배열이 원래 배열 (x [])의 값을 변경하는 이유는 무엇입니까? 나는 그것이 단순한 답이라고 확신하지만, 나의 연구를했을 때 무엇을 검색해야하는지 알 수 없었다. 나는 이것이 무엇을 부르는 지 알지 못하므로 내가 찾은 모든 것이 잘못된 길로 인도되었다. 어떤 도움을 주셔서 감사합니다 !!

수정 : 주소와 유추 해 줘서 고마워! 그것은 당신이 나에게 설명 할 수있는 가장 좋은 방법입니다. 그래서 기본적으로 매개 변수에 배열을 전달할 때 실제 값이 아닌 참조를 전달합니다. 따라서 내 메서드 내에서 조정할 때 배열이 참조하는 모든 내용이 변경됩니다. 이것도 목록에서 발생하는 것으로 나타났습니다. 그래서 목록은 실제로 값으로 전달되지 않습니까? 배열/목록 자체가 기본적으로 상관없이 내 방법 내에서 이름을 무엇을, 편집을 위해 전달되지 않는 것처럼 보인다 (이 경우에는 [].)이 페이지는 정말 정리

편집http://javadude.com/articles/passbyvalue.htm. 그리고 중복 된 질문을 게시하는 것에 대해 유감스럽게 생각합니다. 문제는 내가 무엇을 묻기 위해 노력하는지 알지 못했다는 것입니다. 나는이 용어가 "값에 의한 전달/참조"라는 말을 결코 들어 본 적이 없었으므로 이제 알겠습니다.

+1

이 질문에 대한 더 나은 답변 중 하나는 이미 여러 가지 형식으로 질문되었습니다. http://stackoverflow.com/a/9404727/680925 – Perception

+0

[Java가 "참조로 전달"인가요? ] (http://stackoverflow.com/questions/40480/is-java-pass-by-reference) – delnan

답변

9

모든 인수가 값에 의해 전달되므로 매개 변수 자체의 값을 변경하면 Java의 인수에 영향을주지 않습니다. 그러나이 방법 살펴 :

public static void editnumbersArray(int[] a){ 
    a[2] = 9; 
} 

그 할당 매개 변수의하지 변화 값을한다. a의 값은 동일한 배열에 대해 여전히 동일한 참조입니다. 어레이의 내용을 으로 변경합니다.

내가 집 주소를 종이에 쓰면 어떻게 될지 상상해보십시오. 당신이 그 종이에 한 일은 중요하지 않습니다. 그것은 제가 살았던 곳에서는 변하지 않을 것입니다. 그러나 주소를 방문하여 현관 문을 그린 경우 종이 조각을 전혀 변경하지 않고도 으로 변경됩니다.

그것은 다른 개념을 구별하는 것이 매우 중요합니다 :

  • 변수 명명 된 저장 위치입니다; 의 값을 항상이고 기본 값 (예 : int) 또는 참조를 보유합니다. 위의 예에서, 종이 조각은 변수와 같았습니다.
  • 참조은 개체로 이동할 수있는 값입니다. 그것은 대상 자체가 아닙니다. 그것은 종이 조각의 주소와 같습니다.
  • 개체에는 다른 변수가 들어 있습니다. 동일한 객체에 대한 참조 인 값을 가진 여러 변수가있을 수 있습니다. 그것은 내보기에있는 집과 같습니다. 여러 주소로 주소를 쓸 수는 있지만 집은 하나뿐입니다.

배열은 다른 변수의 컨테이너 역할을하는 객체입니다. 따라서 a의 값은 배열에 대한 참조 일뿐입니다.

+0

위대한 상상력을 위해 +1 : D – Maroun

+1

너희들은 방금 내 마음을 날려 버렸다. 그 말이 너무 의미가 있습니다, 감사합니다! 희망을 갖고 언젠가는 당신들처럼이 사이트에 대한 답변을 제공 할 수있을 것입니다. 지금 나는 심지어 하하를 '투표'할 수 없다. – Ryan

+1

@RyanKlassy : 누구나 어딘가에서 시작해야하며이를 이해하는 것이 Java에서 가장 중요한 초기 단계 중 하나입니다. 갑자기 * 모든 것이 더 잘 이해 될 수 있습니다 - 한 변수의 값을 다른 변수, 가비지 수집 등에 할당하는 것이 무엇을 의미합니까? –

1

자바는 모든 것을 가치로 전달합니다 (검색 대상). 기본적으로 이것은 매개 변수의 복사본을 만들어 메서드에 전달한다는 의미입니다. 이는 = 연산자를 사용하여 무언가가 가리키는 것을 변경할 수 없다는 것을 의미합니다.

그 이유는 (int a) 버전이 변경되지 않습니다.

그러나 Object 또는 배열의 경우 Object 또는 Array의 복사본을 만들지 않으며 Object 또는 Array에 대한 참조 사본을 만듭니다. 즉, 두 변수가 있습니다. 원래 변수는 on이고, 예를 들어, (int[] a) 변수는 메모리에서 같은 지점을 가리 킵니다. 두 변수 중 하나를 변경하면 다른 변수에도 영향을 미칩니다.

값으로 전달, 참조로 전달 및 값으로 전달 참조는 자세한 정보를 검색하려는 유형입니다.

관련 문제