Call By Value, Call By Reference

지인호·2022년 1월 3일
0

TIL

목록 보기
3/28
post-thumbnail

값을 통한 호출, 주소를 통한 호출

함수의 인자등으로 데이터를 전달할 때, 그 데이터의 호출 방식의 일종이다.

Call By Value

값에 의한 호출 이라는 뜻이다.

값(Value) 자체를 데이터로 전달하며, 전달할 때 해당 데이터를 복사하여 전달한다.

immutable(불변) 객체나 원시형 타입의 데이터가 CBV 를 통해 전달 및 호출된다.

Cal By Reference

주소에 의한 호출 이라는 뜻이다.

주소(Reference)를 데이터로 전달하며, 전달할 때 원본데이터의 주소값(참조)를 전달한다.

따라서, 데이터의 전달 이후, 해당 데이터를 호출하는 쪽(함수 등)에서 원본데이터를 수정할 수 있다.

원본 데이터의 무결성이 보장되지 않는다

Java 는 CBV 를 따를까? CBR 을 따를까?

토비님의 아티클 에서도 알 수 있듯자바는 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 가아닌 자바의 레퍼런스 개념이다.
즉, 동음 이의어라고 보면 된다.

profile
테오의 스프린트 17기 퍼실리테이터

0개의 댓글