메서드에서 전달받은 변수를 분명히 변경했는데, 왜 변경이 안될까?

Javaghetti·2021년 5월 30일
0

Java

목록 보기
2/2
post-thumbnail
post-custom-banner

Question

Q1. 특정 메서드로 전달받은 매개변수 [int a = 10]를 1000로 변경하였다.
근데 왜, 변경이 '안되는' 것일까?

class Data {
    int x;
}

public class Main {
    public static void main(String[] args) {
        Data data = new Data();
        data.x = 10;
        change(data.x);

        System.out.println(data.x);
    }

    static void change(int a) {
        a = 1000;
    }
}

10

Q2. 특정 메서드로 전달받은 매개변수 [int a = 10]를 1000로 변경하였다.
근데 왜, 변경이 '되는' 것일까?

class Data {
    int x;
}

public class Main {
    public static void main(String[] args) {
        Data data = new Data();
        data.x = 10;
        change(data);

        System.out.println(data.x);
    }

    static void change(Data a) {
        a.x = 1000;
    }
}

1000

Answer

  • java 변수는 두 종류로 나눌 수 있다. 기본형(primitive type)과 참조형(reference type)이다.
  • 기본형은 우리가 익숙한 [byte, short, int, long, short, long, boolean 등] 이다.
  • 이것을 제외한 모든 타입은 참조형이다.
  • 둘의 차이는 여러가지가 있지만, 이 포스팅의 Question에 답하기 위해서는 한가지만 알면 된다. 기본형은 실제 데이터의 값을 보관하고, 참조형은 데이터의 메모리주소를 보관한다.

Q1 Answer

  • Q1에서 change(int b) 매서드가 호출되면서, data.x값이 매개변수 a에 복사된다.
  • data.x와 a는 같은 값을 가질 뿐, 서로 다른 메모리주소에 저장되어있다.
  • a의 값을 1000으로 변경하는 것이 data.x에 영향을 미치지 못한다.

Q2 Answer

  • Data는 참조형이다.
  • Q2에서 change(Data a)메서드가 호출되면서, data의 메모리 주소가 매개변수 a에 복사된다.
  • 매개변수 a는 data와 같은 객체를 가리킨다.
  • b의 변경을 통해 a에 반영된다.

참고자료

profile
If you always do what you've always done, you will get what you've always got.
post-custom-banner

0개의 댓글