프로그래밍 언어/Java
Java Call by Value ? Call by Reference?
65살까지 코딩
2023. 11. 29. 22:43
728x90
반응형
먼저 Call by Value가 됐든 Refernce가 됐든 여기서 말하는 Call 이란 무엇일까?
여기서 Call 의 의미는 메소드를 호출해서 인수를 넣을 때를 말하는 것이다.
Call by Value
call By Value는 인수가 메소드 블럭으로 넘어갈 때 새로운 변수 (스택에 생성)에 이전 블럭에서 사용하던 변수의 값 자체를 넣어주는 것이다.
Call by Reference
call By Reference 는 인수가 메소드 블럭으로 넘어갈 때 새로운 변수 (스택에 생성)에 이전 블럭에서 사용하던 변수의 값 자체가 아닌 참조를 넣어줌으로서 새로운 변수와 이전 블럭에서 선언한 변수가 같은 주소를 가리키게 하는 것이다. C에서 흔히 포인터를 통해 Call By Reference를 사용할 수 있다.
Java에서는? Call By Value가 적용되어 있다.
가끔 어? 나는 객체를 메소드의 인자로 보내서 사용하니 Call By Reference 처럼 잘 사용되던데? 라고 생각할 수 있지만 Java 의 변수안에 객체의 주소값이 들어가 있기 때문에 메소드의 새로운 변수로 해당 값을 지니게 되어 call By Refernce 처럼 보이는 것이다. 예를 들어 해당 변수에 new를 통해 새로운 객체를 할당하면 이전 블럭의 코드에는 전혀 영향을 미치지 못하는것을 확인 할 수 있다.
cf). primitive type은 값 자체가 들어가 있다.
public class Call {
public static void main(String[] args) {
//출력을 예상해 보자
int primitiveNumber = 1;
int[] numbers = {1, 2, 3, 4, 5};
NumberSet ns = new NumberSet();
change(primitiveNumber, numbers, ns);
System.out.println(primitiveNumber);
System.out.println(numbers[0]);
System.out.println(ns.primitiveNumber);
System.out.println(ns.numbers[0]);
change(ns.primitiveNumber, ns.numbers, null);
System.out.println(ns.primitiveNumber);
System.out.println(ns.numbers[0]);
}
public static class NumberSet {
int primitiveNumber = 1;
Integer wrapperNumber = 2;
int[] numbers = {1, 2, 3, 4, 5};
}
public static void change(int primitiveNumber, int[] numbers, NumberSet ns) {
primitiveNumber = primitiveNumber + 1;
numbers[0] = numbers[0] + 1;
if (ns != null) {
ns.primitiveNumber = ns.primitiveNumber + 1;
ns.numbers[0] = ns.numbers[0] + 1;
}
}
}
헷갈릴 수도 있는데 잘 봐보시길 ...
728x90
반응형