Study/JAVA

Array(2)

so.so 2021. 2. 15. 15:36

Call by value

(swap : 교환하다. 2개의 값을 교환시키는 함수)

public class Main{
    static void swap(int n, int m){
        int temp = n;
        n = m;
        m = temp;
    }
    public static void main(String[] args){
        int a = 10, b = 20;
        System.out.format("before: a = %d, b = %d\n", a, b);
        
        swap(a, b); //a, b의 값만 전달됨 - call by value
        System.out.format("after : a = %d, b = %d\n", a, b);
    }
}

 

-> swap함수를 이용하여 2개의 값을 교환시키도록 구성하였는데, 값이 교환되지 않음

before: a = 10, b = 20
after : a = 10, b = 20

 

-> call by value 형태로 구성되어 main()내에서 a, b의 값인 10, 20만 복사되었음

- 즉, a와 b의 변수 공간에 대한 어떠한 정보도 전달된것이 없음

 

Call by reference-value

 

-> 배열명은 reference value

-> 클래스 객체는 reference value

 

- swap1(), swap2() 함수들은 레퍼런스 값을 인자로 받았기에

- 레퍼런스가 가리키는 공간을 직접 접근하여 데이터의 수정을 진행하고 있음

- 그래서 main()에서도 실질적인 값의 교환이 반영된 것을 확인할 수 있음

 

public class Main{
    static class Point {int x, y;}
    
    static void swap1(int[] p){ //인자로 reference value를 받음
        int temp = p[0];
        p[0] = p[1];
        p[1] = temp;
    }
    
    static void swap2(Point p){ //인자로 reference value를 받음 
        int temp = p.x;
        p.x = p.y;
        p.y = temp;
    }
    
    public static void main(String[] args){
        int[] a = new int[2]; //new는 reference value를 만들어냄
        
        a[0] = 10;
        a[1] = 20;
        
        swap1(a);
        System.out.format("after: a[0] = %d, a[1] = %d\n", a[0], a[1]);
        
        Point p1 = new Point();
        p1.x = 10;
        p1.y = 20;
        System.out.format("\nbefore: x = %d, y = %d\n", p1.x, p1.y);
        
        swap2(p1);
        System.out.format("after: x = %d, y = %d\n", p1.x, p1.y);
    }
}

 

after: a[0] = 20, a[1] = 10

before: x = 10, y = 20
after: x = 20, y = 10