JAVA/java 이론

[자바JAVA] call by value & call by reference/ 값에 의한 참조 & 주소에 의한 참조

자바칩 프라푸치노 2020. 10. 9. 07:22

오늘은 C언어에서 call by value와 call by reference와 같은 개념을 자바에서 배워보도록 하겠습니다.

 

<call by value>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package sec02_exam;
 
public class PrimitiveParamEx {
//c언어에서 call by value를 의미. 호출한 곳에 전혀 영향을 끼치지 않는다.
    public static void main(String[] args) {
        Data d = new Data();
        d.x=10;
        System.out.println("main(): x = " + d.x);
        PrimitiveParamEx.change(d.x);//값에 의한 복사 
        System.out.println("change(d.x) 메서드 호출 후 ");
        System.out.println("main(): x = " + d.x);
    }
 
    public static void change(int x) {
        x = 1000;
        System.out.println("change(): x = " + x);
        return;
    }
    
 
    static class Data{
        int x;
    }
}
 
cs

여기서 d.x 에 10을 대입하고

change(d.x)를 호출 했습니다.

이떄 change안에 x는 지역변수로 1000이 대입되고 있기 떄문에

메서드 내에서만 1000이라는 값을 가지고 메서드가 끝나면 값이 다시 d.x의 원래 값인 10이 됩니다.

호출한 곳에 전혀 영향을 끼치지 않는 것입니다.

 

<실행결과>

 

<call by reference>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package sec02_exam;
 
public class ReferenceParamEx {
//c언어에서 call by reference를 의미. 
    public static void main(String[] args) {
        Data d = new Data();
        d.x=10;
        System.out.println("main(): x = " + d.x);
        ReferenceParamEx.change(d);//주소에 의한 복사 
        System.out.println("change(d.x) 메서드 호출 후 ");
        System.out.println("main(): x = " + d.x);
    }
 
    public static void change(Data d) {
        d.x = 1000;
        System.out.println("change(): x = " + d.x);
        return;
    }
    
 
    static class Data{
        int x;
    }
}
 
cs

 

이번에는 call by reference입니다.

주소에 의해서 값이 변하기 때문에 

위와 다르게 값이 변합니다.

 

동일하게 d.x =10을 대입하구요

그다음에는 change메서드를 호출하는데 

값 자체를 매개변수로 넣어서 호출하는 것이 아니라 Data클래스의 객체 d를 넣고 있습니다.

그러니까 주소를 넣고 있는 것이죠.

그래서 그 주소에 있는 값을 change메서드에서 바꿨으니 당연히 원래 객체에서 값이 바뀌게 되어있습니다.

<출력결과>

 

728x90