자바 (ref. 자바의정석)

기본형 매개변수와 참조형 매개변수 - JAVA

쿠쿠s 2022. 4. 4. 23:07

 

자바에서 많이 사용되는 메서드는 '반환타입 메서드이름 ( 매개변수 선언 ) { }' 구조로 이루어져 있습니다.

메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨주는데 매개변수의 타입에 따라서 다릅니다.

  • 기본형(primitive type) 매개변수 : 기본형 값이 복사, 변수의 값을 읽기만 할 수 있다. (read only)
  • 참조형(reference type) 매개면수 : 변수의 값을 읽고 변경할 수 있다.(read & write)

 

 

무슨 차이가 있는지 예제를 통하여 보여드리겠습니다.

 

 

 

1. 기본형 매개변수

 

class Data{
    int x;
}

public class Example {

    public static void main(String[] args) {
        Data data = new Data();
        data.x = 20;
        System.out.println("Before data(data.x): " + data.x);

        change(data.x);

        System.out.println("After Change(data.x): " + data.x);
    }

    static void change(int x) {
        x = 50;
        System.out.println("change func() : x = " + x);
    }
}

출력 결과

 

 

change 메서드를 통하여 data.x 를  매개변수로 받아 값을 50으로 바꿨지만 main문에서는 값이 변하지 않았습니다.

data.x의 값이 변경된 것이 아닌, change메서드의 매개변수 x의 값만 변경이 되고 x는 메서드 종료와 함께 제거가 됐기 때문입니다. 원본이 아닌 복사본이 변경된 것이기 때문에 원본에는 아무런 영향을 미치지 못했습니다. 이렇게 기본형 매개변수는 값을 읽을 수 있고 변경은 불가합니다.

 

 

 

그러면 어떻게 기본형 매개변수로 값을 사용하여 값을 변경하나요? 변경된 값을 반환하여 원본에 대입하면 됩니다.

class Data{
    int x;
}

public class Example {

    public static void main(String[] args) {
        Data data = new Data();
        data.x = 20;
        System.out.println("Before data(data.x): " + data.x);

        data.x = change(data.x);

        System.out.println("After Change(data.x): " + data.x);
    }

    static int change(int x) {
        x = 50;
        System.out.println("change func() : x = " + x);
        return x;
    }
}

출력 결과

 

 


 

2. 참조형 매개변수

class Data{
    int x;
}

public class Example {

    public static void main(String[] args) {
        Data data = new Data();
        data.x = 20;
        System.out.println("Before data(data.x): " + data.x);

        change(data);

        System.out.println("After Change(data.x): " + data.x);
    }

    static void change(Data data) {
        data.x = 50;
        System.out.println("change func() : x = " + data.x);
    }
}

출력 결과

 

 

기본형과 다르게 매개변수로 참조형을 사용했는데 이전 예제와 결과가 다른 이유는 참조형은 값이 아닌 '값이 저장된 주소' 를 넘겨주기 때문입니다. 그래서 해당 주소의 값을 변경하게 되면, 원본이 가리키고 있는 주소의 값이 변경된 것이기 때문에 값이 변하게 됩니다. 즉 값을 읽어오는 것뿐만 아니라 변경도 가능하게 됩니다.

 

아마 배열을 매개변수로 넘겨주었을 때 원본까지 바뀌는 경험을 하셨을 수도 있을겁니다. 그 이유가 배열도 객체와 같이 참조 변수를 통해 데이터가 저장된 공간에 접근하기 때문에 주소 값을 넘겨 원본까지 바뀌게 되는 것입니다.