call by reference, call by value
2020. 11. 9. 11:58ㆍBackend/☕️ Java
알아야 할 개념
- 기본 자료형
- 해당 변수의 값을 복사해서 전달한다.
- 참조 자료형
- 해당 변수가 가진 값이 레퍼런스이므로, 인자로 넘길 때 call by value에 의해 변수가 가진 레퍼런스가 복사되어 전달된다.
Call by reference vs Call by value
(공통) 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다
- Call by Value (값에 의한 호출)
- 함수 호출 시, 인자로 사용되는 변수의 '값'을 복사하여 인자로 전달한다.
- 함수 안에서 인자의 값이 변경되도, 함수 외부의 변수 값은 변경되지 않는다 (함수 내부 외부 차단된 느낌)
- Call by Reference (주소에 의한 호출)
- 함수 호출 시, 인자로 사용되는 변수의 '레퍼런스(주소)'을 복사하여 인자로 전달한다 (해당 변수를 가르킨다 --> 변수의 뿌리를 변경시키는 느낌 ↔️ call by value의 경우 뿌리가 아닌 잎만 바꾼 느낌. 잎을 바꾼다고 뿌리가 변하진 않는다.)
- 함수 안에서 인자의 값이 변경되면, 인자로 전달된 변수의 값도 함께 변경된다.
class Person {
private string rank;
public Person(String rank) {
this.rank = rank;
}
public void setName(String rank){
this.rank = rank;
}
public String toString() {
return this.rank;
}
}
public class Test {
public static void assignNewRank(Person p) {
p = new rank('captain');
}
public static void changeRank(Person p) {
p.setRank('captain');
}
public static void main(String[] args) {
Person p = new Person('major'); // 객체 p의 인스턴스화 => rank = 'major'할당
assignNewRank(p); // assignNewRank()메서드 내에서만 rank가 captain이 된다.
System.out.println(p); // 출력: major
changeName(p);
System.out.println(p); // 출력: captain
}
}
- changeRank 메서드 내에서는 객체 p의 단순 상태 (rank 속성을 captain으로) 가 변경될 수 있다.
- Java가 call by reference를 지원한다면, assignNewRank()메서드 이후에 p 참조변수가 가리키는 객체가 rank속성이 'captain'인 객체로 변경되어야한다.
출처
- gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-java.html
'Backend > ☕️ Java' 카테고리의 다른 글
다양한 의존객체 주입 (constructor-arg, property) (0) | 2020.11.19 |
---|---|
Spring container Lifecycle (0) | 2020.11.18 |
Spring 기본 환경 세팅/ Maven이란? (0) | 2020.11.16 |
예시를 통한 추상 클래스 이해 (0) | 2020.11.16 |
클래스, 객체 , 인스턴스 개념 (0) | 2020.11.09 |