본문 바로가기
Programming Language 👅

[Java] 자바는 Call by Value!

by 서니서닝 2023. 5. 19.
728x90

🗣 Call by Value 와 Call by Reference란?

Call by Value는 함수의 인자를 전달할 때 값을 전달하는 방식
Call by Reference는 주소를 전달하는 방식

📌 자바는 Call by Value방식을 사용하며, Call by Reference는 존재하지 않는다.

 

the Java authors choose to only include one simple idea - pass-by-value, with no default values or optional parameter (overloading often provides a satisfactory alternative), no variable length parameter lists (added finally in Java 5), no named parameters, no pass-by-reference, no const (a general Java issue) parameters, etc.

-The Java Programming Language, 2nd ed. by Ken Arnold and James Gosling, section 2.6.1, page 40, 3rd paragraph.

 

Call by Value

값만 전달하는 방식

전달받은 값을 복사하여 처리한다. 전달받은 값을 변경하여도 원본은 변경되지 않음

 

public class MyClass {
    public static void main(String args[]) {
      int num1 = 10;
	  int num2 = 20;

      System.out.println("Before Call Method : num1 = " + num1 + ", num2 = " + num2);
      
      ex_method(num1, num2);
      
      System.out.println("After Call Method : num1 = " + num1 + ", num2 = " + num2);
    }
    
    public static void ex_method(int num1, int num2) {
        num1 = 30;
        num2 = 40;
        
        System.out.println("Inside Method : num1 = " + num1 + ", num2 = " + num2);
        
    }
}

 

 

Call by Reference

참조에 의한 호출

전달받은 값을 직접 참조한다. 전달받은 값을 변경하면 원본도 같이 변경된다.

 

public class MyClass {
    int value;

    MyClass(int value) {
        this.value = value;
    }

    public static void swap(MyClass x, MyClass y) {
        int temp = x.value;
        x.value = y.value;
        y.value = temp;
        
    }
    
    public static void main(String[] args) {
    
        MyClass num1 = new MyClass(10);
        MyClass num2 = new MyClass(20);
        
        
        System.out.println("Before Call Method : num1 = " + num1.value + ", num2 = " + num2.value);
        
        swap(num1, num2);
        
        System.out.println("After Call Method : num1 = " + num1.value + ", num2 = " + num2.value);
    
    }
}

 

 

 

🤔 Java에서 Call by Reference는 없다면서요

자바의 데이터형에는 두가지가 있다.

  • 기본형(primitive type) : Boolean Type(boolean), Numeric Type(short, int, long, float, double, char)
  • 참조형(reference type) : Class Type, Interface Type, Array Type, Enum Type, 기본형을 제외한 모든 것들
 

 

public class main
{
    public static void main(String[] args)
    {
        int var = 1;
        int[] arr = { 1 };

        // call by value
        add_value(var);
        System.out.println("primitive type : " + var); // 1 : 값 변화가 없음

        // call by reference
        add_reference(arr);
        System.out.println("reference type : " + arr[0]); // 101 : 값이 변화함
    }

    static void add_value(int var_arg) {
        var_arg += 100;
    }

    static void add_reference(int[] arr_arg) {
        arr_arg[0] += 100;
    }
}

 

 

  • primitive type : 원시값이 저장된다.
  • reference type : 실제 데이터는 heap 메모리에 저장되고, stack에는 주소값이 저장된다.

 

  • add_value 내 var_arge가 바뀐 것
  • var가 바뀐것 아님

 

  • arr과 arr_arg가 같은 주소값
  • 두 변수가 하나의 데이터를 동시에 참조

 

이를 보면 call by reference가 아닌가 생각이 들 수 있다.

 

그러나, Java는 C와 달리 포인터를 철저하게 숨겨 개발자가 직접 메모리 주소에 접근하지 못하게 했기 때문에 call by reference라는 개념이 존재하지 않는다.

 

즉, call by value로 동작하면서 단지 원시값이 복사되느냐 주소값이 복사되느냐 차이이다.

이 때문에 똑같은 value지만 call by value / call by address 로 구분하기도 한다.




 관련 질문

Q1. Call by value와 Call by reference의 차이점

Q2. 자바에는 포인터 개념이 없는 이유가 무엇일까요?

Q3. C++언어에서 쓰이는 Call by reference와 Java의 reference 차이점은 무엇인가요?

 

📖 참고 자료

명품자바에센셜

자바는 Call by reference 개념이 없다❓

[Java] Call by value와 Call by reference

[Java] Java는 Call by reference가 없다

[Java] Call by Value, Call by Reference

[JAVA] Call by Value와 Call by reference란?

[개발공통] Call by value와 Call by reference (Java, Python, C/C++)

Call By Reference와 Call By Value

728x90

'Programming Language 👅' 카테고리의 다른 글

[Java] 제네릭(Generic)  (0) 2023.04.25
[Java] Stream API  (0) 2023.04.10
[Java] 자바의 컴파일 과정  (0) 2023.03.27
[Java] 상속과 오버라이딩(inheritance & overriding)  (0) 2023.02.28

댓글