공부를 하다보니 Call By Value 와 Call By Reference 에 대해서 알게 되었다.
메서드의 매개변수(파라미터) 를 전달할 때 값을 어떻게 보낼 것인지에 대한 방법이다.
Call By Value
- 메서드에 매개변수를 넘겨줄 때 매개변수의 값만 복사하여 전달한다.
Call By Reference
- 메서드에 매개변수를 넘겨줄 때 매개변수의 주소를 전달한다.
근데 Call By Reference 는 자바에서 존재하지 않는다고 한다.

the Java authors choose to only include one simple idea - pass-by-value, with no default values or optional parameter (overloading often provides a satisfactory alternative), no variable length parameter lists (added finally in Java 5), no named parameters, no pass-by-reference, no const (a general Java issue) parameters, etc. - 제임스 고슬링
자바 창시자 제임스 고슬링이 자바는 call by value 만을 참고해서 만들었다고 한다.
한번 직접 써보자!
1번 예시
public class Main {
public static void cbv(String str) {
str = new String("바이");
}
public static void main(String[] args) {
String s1 = "하이";
String s2 = s1;
cbv(s1);
System.out.println("s1 == s2: " + s1.equals(s2)); // True
System.out.println("s1: " + s1); // 하이
System.out.println("s2: " + s2); // 하이
}
}

위의 cbv() 메서드에서 사용되는 str 함수는 메서드 종료 시 스택 프레임에서 제거 된다.
str = new String("바이"); 를 입력하니 새로운 메모리에 "바이"라는 문자열을 저장한 객체가 생성되고 이 객체에 대한 참조는 str 변수에 할당된다.
2번 예시
import java.util.Arrays;
public class Main {
public static void cbv1(int[] arr) {
arr = new int[]{4, 5, 6};
}
public static void cbv2(int[] arr) {
arr[0] = 99;
}
public static void main(String[] args) {
int[] s1 = {1, 2, 3};
System.out.println("S1 Before: " + Arrays.toString(s1));
cbv1(s1);
System.out.println("S1 After Call by Value 1: " + Arrays.toString(s1)); // [1, 2, 3]
cbv2(s1);
System.out.println("S1 After Call by Value 2: " + Arrays.toString(s1)); // [99, 2, 3]
}
}


위에 사진만 보면 어? Call By Reference 아니야? 주소값 전달하잖아! 라고 생각할 수 있다.
근데 그게 아니다 Call By Reference 로 동작하면 변수를 새로 할당해줄 때 원본 값에도 영향이 생긴다.
즉 cbv1 메서드를 실행하면 0x100 의 메모리 주소에도 값에 영향이 갈 수 있다는 것
여러 블로그들을 돌아다니면서 찾아보니까 되게 뜨거운 감자로 논란이 여기저기 있다.
자바는 C언어를 근간으로 쓰고 있으니 Call By Reference 의 개념이 존재한다라고 하던지..
유저 레벨에서는 Call By Reference를 쓸 수 없으니 Call By Value 로만 존재한다느니...
C언어의 포인터는 그 메모리 주소를 직접적으로 참조
자바에서는 객체를 다른 메서드에 전달할 때 해당 객체의 참조가 복사되어 전달된다. 하지만 이건 여전히 값에 의한 호출이다. 객체의 참조가 전달되는 것이지 객체 자체가 직접 전달되는 것은 아니다.
그래서 Call By Value(값에 의한 호출) 라는 것이다.
자바스크립트 진영에서는 위와 비슷한 상황을 Call By Sharing 이라는 단어로 쓰인다는데...
Call By Sharing 의 특징은 이렇다
1. 매개변수를 주면 매개변수는 지역변수로만 사용한다. (Call By Value 특징)
2. 객체를 매개변수로 주면 그 객체가 가지고 있는 속성의 값은 변경 가능 (Call By Reference 특징)
3. 메서드 내부에 할당 받은 객체에 새로운 메모리 값으로 할당은 불가능 (1번 예시에서 새로운 메모리 값줘도 원래 있던 0x100 은 사라지지 않았음)
위의 특징과 딱 들어맞다고 생각한다.
근데 제임스 고슬링이.. 자바는 Call By Value 로 동작한다고 했으니 Call By Sharing 은 그냥 외우는데에만 도움되게 하구 Call By Value 로 객체 주소 값을 복사해서 준다고 생각하면 될 거 같다.
------
Reference.
https://www.educative.io/answers/what-is-call-by-sharing
https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing
공부를 하다보니 Call By Value 와 Call By Reference 에 대해서 알게 되었다.
메서드의 매개변수(파라미터) 를 전달할 때 값을 어떻게 보낼 것인지에 대한 방법이다.
Call By Value
- 메서드에 매개변수를 넘겨줄 때 매개변수의 값만 복사하여 전달한다.
Call By Reference
- 메서드에 매개변수를 넘겨줄 때 매개변수의 주소를 전달한다.
근데 Call By Reference 는 자바에서 존재하지 않는다고 한다.

the Java authors choose to only include one simple idea - pass-by-value, with no default values or optional parameter (overloading often provides a satisfactory alternative), no variable length parameter lists (added finally in Java 5), no named parameters, no pass-by-reference, no const (a general Java issue) parameters, etc. - 제임스 고슬링
자바 창시자 제임스 고슬링이 자바는 call by value 만을 참고해서 만들었다고 한다.
한번 직접 써보자!
1번 예시
public class Main {
public static void cbv(String str) {
str = new String("바이");
}
public static void main(String[] args) {
String s1 = "하이";
String s2 = s1;
cbv(s1);
System.out.println("s1 == s2: " + s1.equals(s2)); // True
System.out.println("s1: " + s1); // 하이
System.out.println("s2: " + s2); // 하이
}
}

위의 cbv() 메서드에서 사용되는 str 함수는 메서드 종료 시 스택 프레임에서 제거 된다.
str = new String("바이"); 를 입력하니 새로운 메모리에 "바이"라는 문자열을 저장한 객체가 생성되고 이 객체에 대한 참조는 str 변수에 할당된다.
2번 예시
import java.util.Arrays;
public class Main {
public static void cbv1(int[] arr) {
arr = new int[]{4, 5, 6};
}
public static void cbv2(int[] arr) {
arr[0] = 99;
}
public static void main(String[] args) {
int[] s1 = {1, 2, 3};
System.out.println("S1 Before: " + Arrays.toString(s1));
cbv1(s1);
System.out.println("S1 After Call by Value 1: " + Arrays.toString(s1)); // [1, 2, 3]
cbv2(s1);
System.out.println("S1 After Call by Value 2: " + Arrays.toString(s1)); // [99, 2, 3]
}
}


위에 사진만 보면 어? Call By Reference 아니야? 주소값 전달하잖아! 라고 생각할 수 있다.
근데 그게 아니다 Call By Reference 로 동작하면 변수를 새로 할당해줄 때 원본 값에도 영향이 생긴다.
즉 cbv1 메서드를 실행하면 0x100 의 메모리 주소에도 값에 영향이 갈 수 있다는 것
여러 블로그들을 돌아다니면서 찾아보니까 되게 뜨거운 감자로 논란이 여기저기 있다.
자바는 C언어를 근간으로 쓰고 있으니 Call By Reference 의 개념이 존재한다라고 하던지..
유저 레벨에서는 Call By Reference를 쓸 수 없으니 Call By Value 로만 존재한다느니...
C언어의 포인터는 그 메모리 주소를 직접적으로 참조
자바에서는 객체를 다른 메서드에 전달할 때 해당 객체의 참조가 복사되어 전달된다. 하지만 이건 여전히 값에 의한 호출이다. 객체의 참조가 전달되는 것이지 객체 자체가 직접 전달되는 것은 아니다.
그래서 Call By Value(값에 의한 호출) 라는 것이다.
자바스크립트 진영에서는 위와 비슷한 상황을 Call By Sharing 이라는 단어로 쓰인다는데...
Call By Sharing 의 특징은 이렇다
1. 매개변수를 주면 매개변수는 지역변수로만 사용한다. (Call By Value 특징)
2. 객체를 매개변수로 주면 그 객체가 가지고 있는 속성의 값은 변경 가능 (Call By Reference 특징)
3. 메서드 내부에 할당 받은 객체에 새로운 메모리 값으로 할당은 불가능 (1번 예시에서 새로운 메모리 값줘도 원래 있던 0x100 은 사라지지 않았음)
위의 특징과 딱 들어맞다고 생각한다.
근데 제임스 고슬링이.. 자바는 Call By Value 로 동작한다고 했으니 Call By Sharing 은 그냥 외우는데에만 도움되게 하구 Call By Value 로 객체 주소 값을 복사해서 준다고 생각하면 될 거 같다.
------
Reference.
https://www.educative.io/answers/what-is-call-by-sharing
https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing