함수를 호출하는 방법으로는 Call By Value
, Call By Reference
2가지가 있습니다.
Java에서는 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');
}
addPerson의 sixhustle주소값이 updatePerson의 person변수에 복사
되고, addPerson의 persons주소값이 updatePerson의 persons변수에 복사
됩니다.2-1) 새로운 변수 newPerson을 생성합니다.
2-2) person이 newPerson을 바라보게 합니다.
2-3) persons의 0번째 index가 가리키는 곳의 name을 'newList'로 변경합니다.
2-2), 2-3) 코드가 newPerson의 값이 person이 바라보는 메모리에 대입된다고 착각했습니다.
즉, person이 바라보는 0x03의 값이 name: newList, age: 100으로 변경된다고 착각했습니다.
하지만, 해당 코드는person이 newPerson의 메모리를 바라보는 것
입니다.
결과적으로 각각의 변수가 가리키는 메모리와 가지는 값은 아래의 표와 같습니다.
method name | variable name | memory | name | age |
---|---|---|---|---|
addPerson | joon | 0x00 | "newList" | 8 |
addPerson | lissung | 0x01 | "lissung" | 8 |
addPerson | miniyoung | 0x02 | "miniyoung " | 8 |
addPerson | sixhustle | 0x03 | "sixhustle" | 8 |
updatePerson | person | 0x04 | "newPerson" | 100 |
updatePerson | newPerson | 0x04 | "newPerson" | 100 |
int a=1; 값을 함수의 인자 값으로 넘긴다면, a의 주소값을 넘기는 형태입니다.
따라서,기존 a의 값이 변합니다.