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