call by reference와 call by value는 그림으로 보면 이렇게 된다
call by value는 값만 복사가 되기 때문에 원본의 값이 변경이 되지 않는다.
call by reference는 주소값이 전달이 되기 때문에 두 번째 참조 변수가 해당 객체의 값을 변경하면 첫 번째 참조 변수가 가르키는 객체의 값도 변경이 된다.
다음 예제를 봐보자
int a = 5;
int b = 10;
add(a, b); //call by value
System.out.println(a+", "+b);
단순히 이렇게 값만 전달해주면 add메소드에서 a를 + 5하고, b를 +10 해도 원본의 a, b의 값은 변하지 않는다.
즉 add 연산이 끝나고 프린트를 해도 a = 5, b = 10이 출력이 된다.
하지만 아래와 같은 경우를 보자
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Ex //사용자 정의 데이터 타입 { int a; int b; } Ex in = new Ex(); in.a = 10; in.b = 20; System.out.println(in.a+", "+in.b); add(in); //call by reference System.out.println(in.a+", "+in.b); private void add(Ex in) { in.a = 100; in.b = 200; System.out.println(in.a+", "+in.b); } Colored by Color Scripter |
위 같은 경우는 참조 변수를 전달해준다. 참조 변수를 전달해주는 것은 참조 변수가 담고 있는 인스턴스에 대한 정보(주소, 참조하는 애)를 주기 때문에 원 값이 흘러가게 된다.
따라서 add 연산후 a는 100, b는 200이 될 수 있다.
이것이 call by value와 call by reference의 차이점이다.
반응형
그리드형
'java' 카테고리의 다른 글
java 오류 could not open java lib amd64 jvm.cfg 해결 (10) | 2018.11.26 |
---|---|
자바 컬렉션 프레임워크(Collection Framework)Map 컬렉션(HashMap, Hashtable) (0) | 2017.08.21 |
자바 2차원 배열 여러가지 예제 (0) | 2017.08.21 |
자바 컬렉션 프레임워크(Collection Framework)Set 컬렉션(HashSet) (0) | 2017.08.18 |
자바 컬렉션 프레임워크(Collection Framework)소개 및 List 컬렉션(Array List, Vector, LinkedList) (0) | 2017.08.18 |