call by reference, call by value

2020. 11. 9. 11:58Backend/☕️ Java

알아야 할 개념

  • 기본 자료형
    • 해당 변수의 값을 복사해서 전달한다.
  • 참조 자료형
    • 해당 변수가 가진 값이 레퍼런스이므로, 인자로 넘길 때 call by value에 의해 변수가 가진 레퍼런스가 복사되어 전달된다.

Call by reference vs Call by value

(공통) 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다

  1. Call by Value (값에 의한 호출)
    • 함수 호출 시, 인자로 사용되는 변수의 '값'을 복사하여 인자로 전달한다.
    • 함수 안에서 인자의 값이 변경되도, 함수 외부의 변수 값은 변경되지 않는다 (함수 내부 외부 차단된 느낌)
  2. 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'인 객체로 변경되어야한다.

 

출처

- improver.tistory.com/136

- gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-java.html