[CS] Call By Value / Call By Reference

Lil_Young·2025년 11월 20일

CS

목록 보기
1/1

분명 아는 내용인데도, 막상 질문을 받으면 갑자기 기억이 안 나는 개념들이 있다.
이 ‘CS’ 카테고리에서는 그런 개념들을 다시 정리해볼 예정이다.

오늘은 Call By Value와 Call By Reference에 대해 복습해보자.


Call By Value

Call By Value는 말 그대로 값(value)을 복사해서 전달하는 방식이다.
즉, 함수에 인자를 넘길 때 원본 값이 아닌 ‘복사본’이 전달된다.

원본 값은 절대 변경되지 않는다.
함수 내부에서 값을 바꿔도, 바뀌는 건 복사본뿐.

Java의 기본 타입(int, double 등)이 대표적인 Call By Value 방식이다.

Call By Reference

Call By Reference는 값의 주소(reference)를 전달하는 방식이다.
즉, 변수에 들어있는 메모리 주소를 넘기기 때문에, 함수 내부에서 값을 바꾸면 원본 값도 함께 변경된다.

C/C++에서 포인터를 사용한 전달 방식이 대표적이다.

그러면 Java는 'Call By Value' 인가? 'Call By Reference' 인가?

결론부터 말하면, Java는 기본적으로 Call By Value이다.

필자는 알고리즘 문제를 풀 때, 아래와 같이 얕은 복사때문에 헷갈린 적이 있다.

int[] a = {1, 2, 3};
int[] b = a;

System.out.println(Arrays.toString(b)); // [1, 2, 3]
b[0] = 4;
System.out.println(Arrays.toString(a)); // [4, 2, 3]

그래서 Java에서도 Call By Reference를 사용하는 줄 알았는데, 위와 같은 상황은 메모리 주소를 넘긴 것이 아니라, 메모리 주소 값 자체를 복사해서 b라는 변수에 할당한 것이기 때문에 Call By Value 이다.

그래서 보통 아래와 같이 Arrays 클래스의 copyof() 메서드를 사용해 깊은 복사를 사용한다.

int[] a = {1, 2, 3};
int[] b = Arrays.copyOf(a, a.length);

System.out.println(Arrays.toString(b)); // [1, 2, 3]
b[0] = 4;
System.out.println(Arrays.toString(a)); // [1, 2, 3]
System.out.println(Arrays.toString(b)); // [4, 2, 3]

0개의 댓글