Call by Reference VS Call by Value

Bong2·2022년 3월 1일
0

JAVA

목록 보기
10/16

Call by Reference

주소를 전달하는 방식

  • 함수가 호출 될때 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성(함수 종료시 사라짐)
  • 참조에 의한 호출방식으로 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달
  • 함수 안에서 인자의 값이 변경되면, 함수 호출시에 있던 변수들도 값이 바뀜

Call by Value

값을 전달하는 방식

  • 함수가 호출될 때 메모리 공간 안에서는 임시의 공간이 생성 -> 함수가 종료되면 해당 공간은 사라진다.
  • 함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달
  • 복사된 인자는 함수 안에서 지역적으로 사용하는 변수

자바는 어디에 해당되는가

JAVA의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 (기본 자료형/ 참조 자료형) 함수 호출 방식이 달라짐!

  • 기본 자료형 : call by value 로 동작(int,short 등등)
  • 참조 자료형 : call by reference 로 동작 (Array, Class instance)
public class SwapTest {
    public static void swap(int a, int b) {
        int tmp = a;
        a = b;
        b = tmp;
    }
 
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
 
        System.out.println(a + " " + b);
        swap(a, b);
        System.out.println(a + " " + b);
        
    }
}

기본 자료형 a,b는 Call by Value로 동작하기 때문에 Swap을 해도 값이 제대로 바뀌지 않는다.
swap이라는 메서드에서는 값을 복사하여 새로운 지역변수에 저장한다. main의 변수 a,b를 사용하는 것이 아니라 자신이 새롭게 만든 지역 변수에 main의 변수이름과 값을 복사해서 사용하므로 swap되지 않는다.

class Person{
	int age;
    String name;
    public Person(int age,String name){
    	this.age=age;
        this.name=name;
    }
}
public void method_test(){
	Person person=new Person(12,"Nick");
    System.out.println("Before Call : age =" + person.age+" name : "+person.name);
    method_2(person);
    System.out.println("After Call : age =" + person.age+" name : "+person.name);
}

public void method_2(Person person){
	person.age=22;
    person.name="Ann";
    System.out.println("age =" + person.age+" name : "+person.name);
}
  • 결과는 해당 Person의 값이 22,Ann 으로 바뀌어서 결과가 출력

Class는 참조 타입(Heap Memory영역에 생성된 객체의 주소값을 참조)이다. method_test에서 method_2로 넘겨준 건 Person의 주소값이고 method_test가 가지고 있는 주소값과 동일하므로 객체의 상태를 수정하면 같이 수정된다.

profile
자바 백엔드 개발자로 성장하자

0개의 댓글

관련 채용 정보