Call by value

Sixhustle·2021년 1월 1일
1

Java

목록 보기
10/10

함수를 호출하는 방법으로는 Call By Value, Call By Reference 2가지가 있습니다.

Java에서는 Call By Value 방식으로 함수를 호출하고 있고, 이 방식을 위주로 공부해봤습니다.


Call by value

Java에서는 name 변수를 함수의 인자 값으로 넘긴다면, name의 주소 값을 복사하여 넘기는 형태입니다.

아래의 코드에서 함수/변수/메모리의 관계를 이미지로 그려봤습니다.
아래의 3단계로 이미지를 확인하시면 됩니다.
1) 함수 및 변수 선언
2) 값 변경
3) 값 확인

public Person {
   private String name;
   private Integer age;
}

public void addPerson() {
   // 1)
   Person joon = new Person("joon", 8);
   Person lissung = new Person("lissung", 8);
   Person miniyoung = new Person("miniyoung", 8);
   Person sixhustle = new Person("sixhustle", 8);

   List<Person> persons = new ArrayList();
   persons.add(joon);
   persons.add(lissung);
   persons.add(miniyoung);
   persons.add(sixhustle);
   
   // 2)
   updatePerson(sixhustle, persons);
   
   // 3)
   log.info("{}", sixhustle.getName());
   log.info("{}", sixhustle.getAge());
   log.info("{}", joon.getName());
  
}

public void updatePerson(Person person, List<Person> persons) {
   // 2-1)
   Person newPerson = new Person('new', 100); 
   
   // 2-2)
   person = newPerson; 
   
   // 2-3)
   persons.get(0).setName('newList'); 
}

1) 함수 및 변수 선언

addPerson method

  • joon, lissung miniyougn, sixhustle 4개의 Person변수가 생성되고, 각각의 변수는 memory의 주소값을 바라보고 있습니다.
  • persons 리스트는 위 4개의 변수를 순서대로 담고 있습니다.

memory

  • joon, lissung, miniyoung, sixhustle에 대한 값을 저장하고 있습니다.

updatePerson method

  • 매개변수인 person, persons에는 updatePerson method를 호출할 때 대입하는 변수의 주소값이 복사됩니다.
  • 코드상으로는 addPerson의 sixhustle주소값이 updatePerson의 person변수에 복사되고, addPerson의 persons주소값이 updatePerson의 persons변수에 복사됩니다.

2) 값 변경

updatePerson method

2-1) 새로운 변수 newPerson을 생성합니다.
2-2) person이 newPerson을 바라보게 합니다.
2-3) persons의 0번째 index가 가리키는 곳의 name을 'newList'로 변경합니다.

착각했던 Point

2-2), 2-3) 코드가 newPerson의 값이 person이 바라보는 메모리에 대입된다고 착각했습니다.
즉, person이 바라보는 0x03의 값이 name: newList, age: 100으로 변경된다고 착각했습니다.
하지만, 해당 코드는 person이 newPerson의 메모리를 바라보는 것입니다.


값 확인

결과적으로 각각의 변수가 가리키는 메모리와 가지는 값은 아래의 표와 같습니다.

method namevariable namememorynameage
addPersonjoon0x00"newList"8
addPersonlissung0x01"lissung"8
addPersonminiyoung0x02"miniyoung "8
addPersonsixhustle0x03"sixhustle"8
updatePersonperson0x04"newPerson"100
updatePersonnewPerson0x04"newPerson"100

Call by reference

int a=1; 값을 함수의 인자 값으로 넘긴다면, a의 주소값을 넘기는 형태입니다.
따라서, 기존 a의 값이 변합니다.


References

0개의 댓글