본문 바로가기

Java/이론

[Java] Call By Value, Call By Reference

2024. 11. 29 17:25 공부일지 작성

 

 

public class PMain4 {

public static void test(int a, int [] b, int [] c) {

System.out.println("b" + b);//

System.out.println("c" + c);//

System.out.println(a + "a");// 

System.out.println(b[0] + "b");//

System.out.println(c[0] + "c");//

System.out.println("------------------------");

a = 100;

b[0] = 100;

c= new int[] { 100, 200};

System.out.println("b" + b);//

System.out.println("c" + c);//

System.out.println(a + "a");//

System.out.println(b[0] + "b");//

System.out.println(c[0] + "c");//

 

}

public static void main(String[] args) {

int a = 10;

int[]b = {10,20};

int[]c = {10,20};

System.out.println("b" + b);//

System.out.println("c" + c);//

System.out.println("-------------------");

test(a,b,c);

System.out.println("-------------------");

System.out.println("a" + a);//

System.out.println(b[0] + "b");//

System.out.println(c[0] + "c");//

}

}

 

다음과 같은 코드에서

 

주석이 담긴 부분은 

 

어떻게 출력될까요?

 

b[I@139a55

c[I@1db9742

-------------------

b[I@139a55

c[I@1db9742

10a

10b

10c

------------------------

b[I@139a55

c[I@106d69c

100a

100b

100c

-------------------

a10

100b

10c

 

정답은 이렇게 됩니다.

 

 

 

b[I@139a55

c[I@1db9742

 

 

첫번쨰 출력은 b와 c를 출력했으므로

 

각각 배열의 주소값이 나옵니다.

 

 

 

b[I@139a55

c[I@1db9742

10a

10b

10c

 

두번째 출력 역시 b와 c의 주소와

 

main에서 초기화된 값이 그대로 출력됩니다.

 

 

 

b[I@139a55

c[I@106d69c

100a

100b

100c

 

 

세번쨰 출력에서는 b와 c의 주소가 나오는데

 

 

c= new int[] { 100, 200};

 

이 부분은 값의 변경이 일어난 것이 아닌

 

새로우 운를 만들어낸 것입니다.

 

그러므로 c의 주소가 바뀌고

 

a,b,c모두 요소가 변경되었기 떄문에

 

변경된 값이 출력됩니다.

 

 

 

a10

100b

10c

 

 

마지막 출력입니다.

 

함수들간의 공간은 독자적인 공간이고

 

서로 영향을 주지 않는 것이 원칙이기 때문에

 

test에서 변경한  a의 값은 함수를 실행해도

 

변경되지 않습니다.

 

c는 값 변경에 영향을 받지 않았습니다

 

test의 c는 새로 선언되어서

 

main의 c와는 주소값이 다르기 떄문에

 

서로 영향을 주지 않습니다.

 

하지만 b는  값 변경에 영향을 받아서 바뀌었습니다.

 

b는 주소값이 같은채로 값을 변경했기 떄문에

 

main의 b역시도 값이 변경되게 됩니다.

 

파라미터를 넘기는 방법에는

 

call by value 와 call by reference가 있습니다.

 

Call By Value : 변수의 '값'을 복사해서 함수의 파라미터 값으로 사용하는 것

 

Call By Reference : 변수를 참조하는 주소값(번지값)을 파라미터로 전달하는 것

 

위와 같은 변화를 봤을 때 자바는 Call By Calue 일까요 아님 Call By Reference 일까요?

 

소수는 파라미터를 넘길때 주소값이 같은게 확인이 되어서 Call By Reference라고 하고

 

다수는 주소값을 넘기지 않아서 a와 c같은 값이 바뀌지 않기 떄문에 Call By Reference가 아니라고 합니다.

 

즉, Java에서 파라미터를 넘기는 과정에 직접적인 참조를 넘긴게 아닌, 주소 값을 복사해서 넘기기 떄문에

 

이것은 Call By Value다 라고 주장합니다.

 

결론은 Java는 Call By Value라고 생각하면 되겠습니다.

 

 

 

 

'Java > 이론' 카테고리의 다른 글

[Java] 객체와 속성  (0) 2024.12.06
[Java] 객체지향 프로그래밍  (0) 2024.12.06
[Java] 디버깅  (0) 2024.11.29
[Java] continue  (0) 2024.11.29
[Java] for문과 while문 예제  (0) 2024.11.28