Call by value / Call by reference

허세진·2026년 1월 19일

backend

목록 보기
4/20
post-thumbnail

Call by value

Call by value는 메서드 호출 시 변수의 값을 복사해서 전달하는 방식이다.

인자는 지역 변수이기 때문에 값이 변경되도 외부에 영향을 주지 않는다.

Call by reference

Call by reference는 메서드 호출 시 원본 변수의 주소를 전달하는 방식이다.

함수 내부에서 값을 변경하면 외부에 영향을 준다.

Java는 Call by value

자바는 Call by value 방식을 사용한다.

예시를 보면서 이해해보자

ex) Call by value, Primitive type

public class CallByValuePrimitive {

    static void change(int x) {
        x = 100;
    }

    public static void main(String[] args) {
        int a = 10;
        change(a);
        System.out.println(a);
    }
}

위 코드를 실행하면 값 변경 없이 그대로 10이 출력된다.

ex1) Call by value, Object type

class Person {
    String name;
}

public class CallByValueObject{

    static void changeName(Person p) {
        p.name = "heo";
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.name = "sejin";

        changeName(person);
        System.out.println(person.name);
    }
}

위 코드를 실행하면 heo가 출력된다.
그러면 객체는 Call by Reference 아닌가? 하고 생각이 들 수 있는데 아니다.

person에 들어 있는 참조값이 복사되어 p와 person은 같은 객체를 가리켜서
객체 내부 상태 변경은 반영된것이다.

-> 값이 바뀐 게 아니라, 가리키는 대상의 내부가 바뀐 것이다.

ex2) Call by value, Object type

class Person {
    String name;
}

public class CallByValueObject{

    static void changeName(Person p) {

        p = new Person();
        p.name = "heo";
    }

    public static void main(String[] args) {
        Person person = new Person();
        person.name = "sejin";

        changeName(person);
        System.out.println(person.name);
    }
}

위 코드를 실행하면 sejin이 출력된다.
p에 새 객체를 할당하고 p는 지역 변수여서 호출자 person에는 전혀 영향 없다.

-> 참조값도 값이기 때문에 복사본만 바뀐다.

결론

자바는 항상 Call by Value고, 객체는 참조값이 값으로 전달된다.

참고 자료

https://alswns7984.tistory.com/64#1.%20Call%20by%20Value%EC%99%80%20Call%20by%20Reference%EB%9E%80%3F-1

profile
로그를 파고드는 시간을 즐기는 백엔드 개발자, 허세진입니다.

0개의 댓글