값을 통한 호출, 주소를 통한 호출
함수의 인자등으로 데이터를 전달할 때, 그 데이터의 호출 방식의 일종이다.
값에 의한 호출 이라는 뜻이다.
값(Value) 자체를 데이터로 전달하며, 전달할 때 해당 데이터를 복사하여 전달한다.
immutable(불변) 객체나 원시형 타입의 데이터가 CBV 를 통해 전달 및 호출된다.
주소에 의한 호출 이라는 뜻이다.
주소(Reference)를 데이터로 전달하며, 전달할 때 원본데이터의 주소값(참조)를 전달한다.
따라서, 데이터의 전달 이후, 해당 데이터를 호출하는 쪽(함수 등)에서 원본데이터를 수정할 수 있다.
즉 원본 데이터의 무결성이 보장되지 않는다
토비님의 아티클 에서도 알 수 있듯자바는 CBV 방식으로 데이터를 호출한다.
만약 다음과 같은 코드가 있을 경우
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("hello");
append(sb, " world");
reasonOfCBV(sb);
System.out.println(sb);
}
public static void reasonOfCBV(StringBuilder s) {
s = new StringBuilder();
s.append("!");
}
public static void append(StringBuilder sb, String str) {
sb.append(str);
}
만약 자바가 CBR 이라면, resonOfCBV
함수에 sb 라는 참조변수의 주소를 전달할 것 이고, 따라서 main 의 지역변수인 sb 는 resonOfCBV 에 있는 s = new StringBuilder()
에 의해 새로운 StringBuilder 인스턴스를 참조해야한다.
하지만, 출력값은 hello world 로, 기존에 있던 값이 초기화 되지 않았으며, s.append("!")
또한 실행되지 않았다.
이것이 바로 자바가 CBR 이 아닌 이유이다
🖐 잠시만! 만약 자바가 CBV 라면 hello 만 출력해야하지 않나요?
CBR 은 참조변수 자체의 주소를 인자로 보내어 호출할 수 있는 경우를 뜻한다.
append(sb, "world")
에서는 sb 라는 참조변수 자체의 주소가아닌,sb
가 참조하고있는 데이터의 주소 즉 Reference Value 를 보내므로 Value 가 맞다.
Reference Value 에서 Reference 는 CBR 의 Reference 가아닌 자바의 레퍼런스 개념이다.
즉, 동음 이의어라고 보면 된다.