ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Java는 Call by Value 일까? Call by Reference 일까?
    Language/Java 2020. 3. 17. 15:32
    728x90
    반응형

    https://devlog-wjdrbs96.tistory.com/44?category=830071

     

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

    C언어를 주로 공부 했던 나는 Call by value 와 Call by reference 에 대해서 call by value 는 값을 넘기는 거고 call by reference 는 포인터를 이용해서 주소를 넘긴다고 알고 있다. 하지만 누군가 나에게 이..

    devlog-wjdrbs96.tistory.com

    Call by Value와 Call by Reference에 대해서는 위에서 참고하길 바란다. 현재 운영하는 블로그는 스스로 공부한 것을 나중에 다시 찾아보기 쉽게 정리하는 공간입니다. 

     

     

    1. Java는 Call by Value? Call by Reference? 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Person {
     
      private String name;
      public Person(String name) {
        this.name = name;
      }
     
      public setName(String name) {
        this.name = name;
      }
     
      @Override
      public String toString() {
        return "name is " + this.name;
      }
    }
     
     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class FunctionCallTest {
     
      public static void assignNewPerson(Person p) {
        p = new Person("hee");
      }
     
      public static void changeName(Person p) {
        p.setName("hee");
      }
     
      public static void main(String[] args) {
        Person p = new Person("doy");
     
        assignNewPerson(p);
        System.out.println(p); // name is doy
     
        changeName(p);
        System.out.println(p); // name is hee
      }
    }
     
     

     

    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
    26
    27
    28
    29
    30
    31
    32
    33
    public class FunctionCallTest2 {
        /* parameter는 참조변수 array 자체의 Reference가 아닌 array가 "저장하고 있는 주소값(Value)" */
        public static void changeContent(int[] array) {
            // If we change the content of arr,
            array[0= 10;  // Will change the content of array in main()
            array[1= 11;
        }
     
        public static void changeRef(int[] array) {
            // If we change the reference,
            array = new int[2];  // Will not change the array in main()
            array[0= 20;
            array[1= 21;
        }
     
        public static void main(String[] args) {
            int[] array = new int[2];
            array[0= 0;
            array[1= 1;
     
            changeContent(array);
            for (int i = 0; i < array.length; i++) {
                // Will print 10 11
                System.out.print(array[i] + " ");  // 10 11
            }
            changeRef(array);
            for (int i = 0; i < array.length; i++) {
                // Will still print 10 11
                // (Change the reference doesn't reflect change here)
                System.out.print(array[i] + " ");  // 10 11
            }
        }
    }
     
     

     

    기본자료형은 Call By Value이고, 참조자료형은 Call By Reference이다??

     

    • 오해 1. 특정 메소드 내에서 전달 받은 객체의 상태를 변경 할 수 있다.
      • changeName 메소드는 참조변수 p가 가리키는 [이름 속성이 "doy"인 person 객체]를 [이름 속성이 "hee"인 새로운 Person 객체]로 변경한 것이 아니라, 단지 이름 속성만 변경했을 뿐이다.
    • 오해 2. 참조변수는 임의의 객체에 대한 레퍼런스를 저장하므로 메소드로 전달한 값이 레퍼런스(Call by Reference)이다.
      • 전달된 레퍼런스는 참조변수 p자체의 레퍼런스가 아닌 p가 저장하고 있는 값(이것도 레퍼런스)이다.
      • 만약 Java가 Call by Reference를 지원한다면 assignNewPerson 메소드 실힝 후에 p참조변수가 가리키는 객체가 [이름 속성이 "hee"인 새로운 Person 객체]로 변경되어야 한다.
      • 또한 참조변수 p자체의 레퍼런스를 얻을 수 있는 방법이 있어야 한다. 그러나 Java는 이 방법을 지원하지 않는다.
    • 따라서 Java는 항상 Call by Value이다.
      • 여기서 value란?
        • 기본자료형의 값 또는 객체에 대한 레퍼런스
      • 기본자료형의 경우 해당하는 변수의 값을 복사해서 전달한다.
      • 참조자료형의 경우 해당하는 변수가 가지는 값이 레퍼런스이므로 인자로 넘길 때 Call by Value에 의해 변수가 가지고 있는 레퍼런스가 복사되어 전달된다. 

     

     

     

     

    설명이 너무 잘 되어 있고, 이해가 잘 되어서 아래에서 내용을 그대로 가져왔습니다. 자세한 내용은 아래를 참고하세요.

     

    [내용 출처]

    https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md#%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9%EC%9D%98-%EC%B0%A8%EC%9D%B4

     

    WeareSoft/tech-interview

    :loudspeaker::person_frowning: tech interview. Contribute to WeareSoft/tech-interview development by creating an account on GitHub.

    github.com

     

    반응형

    댓글

Designed by Tistory.