수색…


비고

이것은 "Null Pointer Exception"을 이해하는 데 도움이됩니다. 객체 참조가 null이기 때문에 그 중 하나를 얻지 만 프로그램 코드는 프로그램이 객체 참조에 무언가를 사용하기를 기대합니다. 그러나, 그 자체의 주제에 합당한 ...

메소드 매개 변수로서의 객체 참조

이 주제에서는 오브젝트 참조 의 개념을 설명합니다. 자바 프로그래밍에 익숙하지 않은 사람들을 대상으로합니다. 클래스 정의, 메인 메소드, 객체 인스턴스, 객체에 "on"메소드를 호출하고 메소드에 매개 변수를 전달하는 것과 같은 몇 가지 용어와 의미에 대해 잘 알고 있어야합니다.

public class Person {

  private String name;

  public void setName(String name) { this.name = name; }

  public String getName() { return name; }

  public static void main(String [] arguments) {
    Person person = new Person();
    person.setName("Bob");

    int i = 5;
    setPersonName(person, i);

    System.out.println(person.getName() + " " + i);
  }

  private static void setPersonName(Person person, int num) {
    person.setName("Linda");
    num = 99;
  }
}

Java 프로그래밍을 완벽하게 수행하려면이 예를 머리 위쪽에있는 다른 사람에게 설명 할 수 있어야합니다. 이 개념은 Java가 작동하는 방식을 이해하는 기본입니다.

보시다시피, 우리는 변수 person 객체를 인스턴스화하는 main 을 가지고 있고, 그 객체의 name 필드를 "Bob" 으로 설정하는 메소드를 호출합니다. 그런 다음 다른 메소드를 호출하고 person 을 두 개의 매개 변수 중 하나로 전달합니다. 다른 매개 변수는 5로 설정된 정수 변수입니다.

호출 된 메소드는 전달 된 객체의 name 값을 "Linda"로 설정하고 전달 된 정수 변수를 99로 설정 한 다음 반환합니다.

그래서 무엇이 인쇄 될까요?

Linda 5

그렇다면 왜 person 대한 변경이 main 에서 효력을 발생합니까? 그러나 정수에 대한 변경은 그렇지 않습니다.

호출이 발생하면 main 메소드는 person 에 대한 객체 참조setPersonName 메소드에 전달합니다. setAnotherName 이 해당 객체에 대해 변경 한 사항은 해당 객체의 일부이므로 메소드가 반환 될 때 해당 변경 사항이 해당 객체의 일부가됩니다.

동일한 것을 말하기위한 또 다른 방법 : person 이 객체를 가리키고 (관심이 있다면 힙에 저장 됨). 메소드가 해당 객체에 대해 수행 한 모든 변경은 "해당 객체에서"수행되며 변경하는 메소드가 여전히 활성 상태인지 또는 반환되었는지 여부에 영향을받지 않습니다. 메서드가 반환되면 개체에 대한 모든 변경 내용이 해당 개체에 저장됩니다.

이것을 전달 된 정수와 대조하십시오. 이것은 원시 int (Integer 객체 인스턴스가 아님)이므로 "값을 기준으로"전달됩니다. 즉, 전달 된 원래 정수에 대한 포인터가 아닌 해당 값이 메서드에 제공됩니다. 메소드는 메소드의 자체 목적이지만 메소드 호출이 사용될 때 사용되는 변수에는 영향을 미치지 않습니다.

Java에서는 모든 프리미티브가 값으로 전달됩니다. 객체는 참조로 전달됩니다. 즉, 객체에 대한 포인터가 매개 변수로 가져 오는 메소드에 전달됩니다.

덜 명백한 점은 호출 된 메서드가 객체를 만들고 매개 변수 중 하나로 반환 할 수 없음을 의미합니다. 메소드가 메소드 호출에 의해 직접 또는 간접적으로 작성된 오브젝트를 리턴하는 유일한 f}은 메소드의 리턴 값입니다. 처음에는 어떻게 작동하지 않는지, 어떻게 작동하는지 봅시다.

우리의 작은 예제에 또 다른 방법을 추가해 보겠습니다.

private static void getAnotherObjectNot(Person person) {
  person = new Person();
  person.setName("George");
}

mainsetAnotherName 대한 호출 아래에서이 메서드와 다른 println 호출을 호출 해 봅시다.

getAnotherObjectNot(person);
System.out.println(person.getName());

이제 프로그램은 다음과 같이 출력 할 것입니다 :

Linda 5
Linda

조지가 있었던 물건은 어떻게 된거야? 음, 전달 된 매개 변수는 Linda에 대한 포인터였습니다. getAnotherObjectNot 메소드가 새 객체를 getAnotherObjectNot Linda 객체에 대한 참조가 George 객체에 대한 참조로 바뀌 었습니다. Linda 객체가 (힙에) 여전히 존재하지만, main 메소드는 여전히 그 getAnotherObjectNot 접근 할 수 있습니다. 그러나 getAnotherObjectNot 메소드는 아무런 참조가 없으므로 이후에 아무 것도 할 수 없습니다. 코드의 작성자가 메서드를 사용하여 새 객체를 만들고 다시 전달할 것으로 보이지만 그렇지 않으면 작동하지 않습니다.

그것이 작가가하기를 원하는 것이라면, 그는 다음과 같이 메소드에서 새로 생성 된 객체를 반환해야합니다.

private static Person getAnotherObject() {
  Person person = new Person();
  person.setName("Mary");
  return person;
}

다음과 같이 호출하십시오.

Person mary;
mary = getAnotherObject();
System.out.println(mary.getName());

전체 프로그램 출력은 다음과 같습니다.

Linda 5
Linda
Mary

다음은 두 프로그램이 모두 포함 된 전체 프로그램입니다.

public class Person {
  private String name;

  public void setName(String name) { this.name = name; }
  public String getName() { return name; }

  public static void main(String [] arguments) {
    Person person = new Person();
    person.setName("Bob");

    int i = 5;
    setPersonName(person, i);
    System.out.println(person.getName() + " " + i);
    
    getAnotherObjectNot(person);
    System.out.println(person.getName());
    
    Person person;
    person = getAnotherObject();
    System.out.println(person.getName());
  }
  
  private static void setPersonName(Person person, int num) {
    person.setName("Linda");
    num = 99;
  }
  
  private static void getAnotherObjectNot(Person person) {
    person = new Person();
    person.setMyName("George");
  }
  
  private static person getAnotherObject() {
    Person person = new Person();
    person.setMyName("Mary");
    return person;
  }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow