본문 바로가기
프로그래밍 언어/JAVA

Call by Value와 Call by Reference 란?

by 검은도자기 2021. 6. 29.

개요

메소드에 전달되는 변수의 데이터 타입에 따라서 메소드 호출 방식이 달라집니다.

메소드를 호출하는 방식으로는 Call By Value Call By Reference 2가지가 있습니다.

 

Call by Value 란?

- 메소드에 값을 전달할 때, 변수의 값을 복사해서 메소드에 전달하는 방식

 

특징

- 저장소를 공유하지 않음

- 기본 자료형 (int, short, long, float, double, char, boolean)

- 값을 복사해서 전달했으므로 받은 인자의 값을 변경하더라도 변경되지 않음.

 

장점

- 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.

 

단점 

- 복사를 하기 때문에 메모리가 사용량이 늘어난다.

 

 

예시

class TestValue {
    int x;
}

public class Test {
    public static void main(String[] args) {
        TestValue testValue = new TestValue();
        testValue.x = 10;

        // Call by Value
        System.out.println("\n== Call by Value ==");
        System.out.println("doService() 호출 전 - testValue.x = " + testValue.x);
        doService(testValue.x);
        System.out.println("doService() 호출 후 - testValue.x = " + testValue.x);
    }

    static void doService(int x) {
        x = 1000;
    }

    static void doService(TestValue testValue) {
        testValue.x =1000;
    }
}

 

결과

 


Call by Reference 란?

- 메소드에 값을 전달할 때, 변수의 주소 값 메소드에 전달하는 방식

 

특징

- 참조 자료형 (Array, Class Instance)

- 저장소 공유함

- 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다.

 

장점

- 복사하지 않고 직접 참조를 하기에 빠르다.

 

단점

- 직접 참조를 하기에 원래 값이 영향을 받는다.

 

 

예시

class TestValue {
    int x;
}

public class Test {
    public static void main(String[] args) {
        TestValue testValue = new TestValue();
        testValue.x = 10;

        // Call by Reference
        System.out.println("\n== Call by Reference ==");
        System.out.println("doService() 호출 전 - testValue.x = " + testValue.x);
        doService(testValue);
        System.out.println("doService() 호출 후 - testValue.x = " + testValue.x);
    }

    static void doService(int x) {
        x = 1000;
    }

    static void doService(TestValue testValue) {
        testValue.x =1000;
    }
}

 

결과

 

 

Call By Value vs Call By Reference 차이점

값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이

 

 

마무리

복습 전에는 그냥 이런 것들이 있구나 정도로 이해했는데, 공부해보니 꽤 중요한 개념인 거 같다고 생각이 들었습니다.

이전에는 단순히 call by reference 위주로 값을 저장해서 사용했는데, 과연 모든 상황에서 call by reference로 값을 처리하는 게 맞는 방식인가? 에 대해서 고민이 들면서 메모리에 대한 공부를 더 해야겠구나 라고 느꼈습니다.

부족하거나 틀린 부분이 있을 수도 있으니 주의하시면 좋을 거 같습니다.

이번 포스팅은 마무리하면서 다음 포스팅에서 뵙겠습니다.

 

 

 

참고

https://velog.io/@sixhustle/callbyvalue

https://velog.io/@jacob0122/call-by-value-call-by-reference

https://wayhome25.github.io/cs/2017/04/11/cs-13/

https://codingplus.tistory.com/29

https://re-build.tistory.com/3

https://wikidocs.net/265

https://devlog-wjdrbs96.tistory.com/44