함수의 호출 방식

유경우·2024년 2월 28일
0

CS

목록 보기
13/21
post-custom-banner

들어가기 전

프로그래밍을 하다 보면 "call by value"와 "call by reference"라는 두 가지 주요한 함수 매개변수 전달 방식에 대해 마주치게 됩니다.

이는 함수나 메서드에 값을 전달하는 방식에 따라 함수 내에서 변수의 값을 변경했을 때 원본 데이터에 어떤 영향을 미치는지를 결정합니다.

특히, Java에서는 이에 대한 이해가 중요한데, Java는 이 두 개념을 어떻게 적용하는지에 대해 자주 오해가 있습니다.

Call by Value

"Call by value" 방식에서는 함수로 인자를 전달할 때 인자의 실제 값의 복사본을 생성하여 전달합니다.
이 방식에서는 함수 내에서 매개변수의 값을 변경해도 원본 인자의 값에는 아무런 영향을 주지 않습니다.

즉, 원본 데이터는 보호되며, 함수는 전달된 값의 복사본으로 작업을 수행합니다.

예시:

public void addTen(int number) {
    number += 10; // number는 복사된 값이므로 원본 값에 영향을 주지 않음
}

Call by Reference

반면 "Call by reference" 방식에서는 함수로 인자를 전달할 때 인자의 메모리 주소를 전달합니다.
따라서, 함수 내에서 매개변수를 통해 해당 메모리 주소의 값을 변경하면, 원본 인자의 값도 함께 변경됩니다.

이는 함수가 원본 데이터를 직접 수정할 수 있음을 의미합니다.

예시 (다른 언어에서의 일반적인 사용 예):

void addTen(int *number) {
    *number += 10; // 메모리 주소를 통해 값을 직접 변경
}

Java의 함수 호출 방식

Java에서 모든 함수 호출은 기본적으로 "call by value" 방식으로 이루어집니다.
Java에서 기본 데이터 타입(primitive types)은 값 자체가 함수에 전달되며, 객체는 객체의 참조(메모리 주소의 값)가 복사되어 전달됩니다.

그러나, 이는 객체 자체가 아닌 객체의 참조의 "값"이 복사되어 전달되는 것이므로, 엄밀히 말하면 Java는 "call by reference"를 사용하지 않습니다.

예시:

public class Example {
    public static void modifyNumber(int num) {
        num += 10;
    }

    public static void modifyObject(MyObject obj) {
        obj.setAttribute("Modified");
    }

    public static void main(String[] args) {
        int number = 5;
        MyObject myObj = new MyObject();

        modifyNumber(number); // number의 값은 변경되지 않음
        modifyObject(myObj); // myObj의 속성은 변경됨
    }
}

결론

Java에서는 모든 것이 "call by value"로 처리됩니다.
기본 데이터 타입은 값이 직접 전달되며, 객체는 객체 참조의 값이 전달됩니다.
이러한 Java의 함수 호출 방식 이해는 프로그래밍 시 변수와 객체의 동작을 예측하는 데 매우 중요합니다.

따라서, Java에서는 객체의 상태를 변경할 수 있지만, 이는 객체 참조의 "값"이 함수에 전달되기 때문이며, Java가 "call by reference"를 사용하지 않는다는 점을 명심해야 합니다.

출처 :
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94%EB%8A%94-Call-by-reference-%EA%B0%9C%EB%85%90%EC%9D%B4-%EC%97%86%EB%8B%A4-%E2%9D%93
https://bcp0109.tistory.com/360
https://velog.io/@ahnick/Java-Call-by-Value-Call-by-Reference
https://velog.io/@tilsong/Java-Call-by-value-Call-by-reference

profile
개발자
post-custom-banner

0개의 댓글