자바의 call by value와 call by reference에 대해서 설명해보겠다.

흔히 C와 C++에서는 주소값을 저장하는 포인터 변수와 레퍼런스 변수를 사용하는데 자바에서는 이러한 개념이 없지 않은가?


결론은

원형 타입(primitive)타입일 때는 call by value가, 객체 타입(Object)타입일 때는 call by reference가 사용된다. 


객체가 넘어가면 Call By Reference로 동작한다고 했다.

그렇다면 다음은 어떻게 동작하겠는가??

public class Test4 {
 
    int a;
    public Test4(int a){
        this.a = a;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test4 t = new Test4(1);
        int i = 5;
        changeInt(i);
        System.out.println(i); // (1)       
        changeTest(t);
        System.out.println(t.a);    // (2)
        changeTestInt(t);
        System.out.println(t.a); // (3)
    }
    public static void changeInt(int a){
        a = 10;
    }
    public static void changeTest(Test4 t){
        t = new Test4(100);
    }
    public static void changeTestInt(Test4 t){
        t.a = 10;
    }
}
 
cs


(1) 5

=> int 형은 primitive 타입이기 때문에 call by value다. 그래서 함수를 지나면 지역변수가 사라지게 된다.

(2) 1

=> 메서드 안에서 new로 객체가 할당되었다. 그리고 외부 변수에 대입해주었다. 

그렇다면 new로 생성한 값 100으로 연결되어 되지 않은가? 하지만 아니다. new로 할당된 객체도 지역이 종료되면 없어진다.

(3) 10

외부에서 주입된 t에 대해서 값을 변경시켜주는 메서드를 실행했다. 값이 바뀐다. 


아무래도 난해했던 것은 (2)이 아닐까 싶다. 










'JAVA' 카테고리의 다른 글

자바 classpath  (0) 2015.11.03
Java finalize  (0) 2015.10.26
List, Map, Set - Collection  (0) 2015.08.29
자바 8 특징  (0) 2015.08.29
volatile 키워드 vs synchronized 키워드  (0) 2015.08.29
Posted by slender ankles
,