Home Call By Value
Post
Cancel

Call By Value

Call By Value에 대해 학습하며 정리한 글입니다. 학습 과정에서 작성된 글이기 때문에 잘못된 내용이 있을 수 있으며, 이에 대한 지적이나 피드백은 언제든 환영입니다. 학습 코드는 해당 레포지토리에서 모두 볼 수 있습니다.

image









1. 자바의 Call By Value


자바에는 Call By Reference가 존재하지 않습니다. 이에 대한 글은 많으므로 별도의 설명은 생략하며, 대신 헷갈릴 수 있는 몇 가지 상황에 대해 살펴보겠습니다.





1-1. 재 할당

다음과 같이 Point를 modify 메서드 내에서 재 할당하면 값이 어떻게 나올까요?

1
2
3
4
5
6
7
8
public class Point {

    int x;

    public Point(int x) {
        this.x = x;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@DisplayName("[UnitTest] Call by value 단위 테스트")
class CallByValueUnitTest {

    @Test
    @DisplayName("객체를 재할당 하더라도 기존 객체에 영향을 주지 않는다.")
    void reference_re_assign_test() throws Exception {
        Point point = new Point(1);
        modify(point);

        assertEquals(30, point.x);
    }

    private void modify(Point p) {
        p.x = 30;
        p = new Point(10);
        p.x = 5;
    }
}









정답은 30 입니다. 자바에서 메서드에 객체 참조를 전달하면, 해당 참조의 메모리 주소가 복사됩니다. modify 메서드의 매개변수 p는 복사된 메모리 주소를 받아 point 객체를 참조합니다. 따라서 p를 통해 객체의 필드를 수정하면, point가 가리키는 원본 객체의 필드도 변경됩니다. 하지만 p에 새로운 객체를 할당하면, 이는 p가 가리키는 메모리 주소만 변경됩니다. 이 할당은 원본 point 객체에는 아무런 영향을 주지 않으며, p를 변경하더라도 point는 여전히 원래 객체를 참조하게 됩니다.

image









1-2. Integer, String 객체

Integer, String 객체 또한 마찬가지입니다. modify 메서도 내에서 intValue, strValue의 값을 변경했지만, 이는 참조 값의 복사본을 받기 때문에 값이 변하지 않습니다. 또한 Integer과 String은 불변 객체이므로 그 내부의 값을 직접 변경할 수 없으며, 연산은 새로운 객체를 생성하고 해당 참조로 intValue와 strValue를 업데이트합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@DisplayName("[UnitTest] Call by value 단위 테스트")
class CallByValueUnitTest {

    @Test
    @DisplayName("값을 재할당 하더라도 기존 값에 영향을 주지 않는다.")
    void integer_string_re_assign_test() throws Exception {
        Integer intValue = 5;
        String strValue = "Hello";

        modify(intValue, strValue);

        assertAll(
            () -> assertEquals(5, intValue),
            () -> assertEquals("Hello", strValue)
        );
    }

    private void modify(
        Integer intValue,
        String strValue
    ) {
        intValue = 10;
        strValue = "World";
    }
}

image









2. 정리


자바에서는 Call By Reference가 존재하지 않습니다. 이는 포인터를 숨겨 개발자가 직접 메모리 관리를 하지 않도록 하기 위함입니다. 따라서 주솟값을 넘겨 이를 활용할 수 있을 뿐 직접 이를 관리할 수는 없습니다.


This post is licensed under CC BY 4.0 by the author.