면접 대비용 cs 복습 시작!
함수 호출 시 전달되는 변수의 값을 복사한다.
인자의 값이 변경되어도 원본 값이 변하지 않아 안전하다.
메모리의 사용량이 늘어난다.
아래의 코드에서처럼 함수 내에선 6으로 증가하지만 호출한쪽의 변수 num의 값은 변경되지 않는다.
public class CallByValueExample {
public static void main(String[] args) {
int num = 5;
System.out.println("함수 호출 전: " + num);
increment(num);
System.out.println("함수 호출 후: " + num);
}
public static void increment(int x) {
x++;
System.out.println("함수 내부: " + x);
}
}
/* 출력
함수 호출 전: 5
함수 내부: 6
함수 호출 후: 5
*/
함수 호출 시 인자로 받은 값의 메모리 주소를 참조한다.
복사하지 않고 직접 참조를 하기 때문에 빠르다.
함수 내에서 인자의 값을 변경하면 원본 변수도 영향을 받는다.
아래의 코드에서 함수내에서 list에 원소를 추가하면 호출한 측의 list도 같이 변경된다. 리스트가 참조로 전달됐기 때문이다.
import java.util.ArrayList;
public class CallByReferenceExample {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println("함수 호출 전: " + list);
modifyList(list);
System.out.println("함수 호출 후: " + list);
}
public static void modifyList(ArrayList<Integer> list) {
list.add(4);
System.out.println("함수 내부: " + list);
}
}
/* 출력
함수 호출 전: [1, 2, 3]
함수 내부: [1, 2, 3, 4]
함수 호출 후: [1, 2, 3, 4]
*/
자바에서는 기본적으로 call by value로 동작한다.
엄밀하게 따지면 자바에서는 모든 것이 call by value다.
기본형은 값 자체가 복사되어 전달되고, 참조형은 메모리 주소가 value기 때문에 주소값이 복사되어 전달된다.
메서드에서 인자 값을 변경하더라도 원래의 변수 값에는 영향을 미치지 않는다.
전달한 참조 값을 통해서 객체의 필드를 변경하면 원래의 객체도 영향을 받는다.
하지만 메소드 내에서 참조 자체를 변경하는 것은 원래의 참조에 영향을 끼치지 않는다.(메모리 주소 자체를 바꿀 수는 없다.)
따라서 자바에서는 Call By Reference를 완전히 지원하는 것이 아니라 call by value 방식으로 참조를 전달하는 것이다.