자바기초

기본형과 참조변수의 매개변수

lby132 2022. 5. 29. 21:15

기본형(primitive type)과 참조형(reference type)을 매개변수로 받았을때 차이점을 알아보자

자바에서는 메서드를 호출할때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.

첫번째는 기본형으로 매개변수를 넘겼을때 이다. (그럼 기본형이 복사가 되어서 넘어간다.)

public class PrimitiveParamEx {
    public static void main(String[] args) {
        final Data d = new Data();
        d.x = 10; // 10을 선언
        System.out.println("main() : x = " + d.x);

        change(d.x); // change 함수에 10이 담긴 x를 넣어줌
        System.out.println("After change(d.x)");
        System.out.println("main() : d.x = " + d.x);
    }

    static void change(int x) {
        x = 1000;  // 위에서 넘겨준 x를 받아서 1000으로 값을 넣어줌
        System.out.println("change(): x = " + x);
    }
}

class Data {
    int x;
}

위 코드를 출력했을때 출력 값은 이렇다.

main() : x = 10
change(): x = 1000
After change(d.x)
main() : d.x = 10

 

main메소드에서 분명 x에 10을 담아서 change 함수의 매개변수로 넘겼는데 main메소드에서 x값을 출력해보니 값이 변하지 않았다.

이유는 기본형은 단지 그 자리에서 단순히 값만 변경해준다. 이곳에서 변경된 값을 다른곳에서도 그 값을 쓸 수 없다는 것이다. 한마디로 변경되지 않는다. 하지만 참조형은 다르다.


public class ReferenceParamEx {
    public static void main(String[] args) {
        final Data1 d = new Data1();
        d.x = 10;
        System.out.println("main() : x = " + d.x);;

        change(d);
        System.out.println("After change(d)");
        System.out.println("main() : x = " + d.x);
    }

    static void change(Data1 d) {
        d.x = 1000;
        System.out.println("change() : x = " + d.x);
    }
}

class Data1 {
    int x;
}

위 코드를 출력했을때 출력 값이다.

main() : x = 10
change() : x = 1000
After change(d)
main() : x = 1000

 

기본형과는 다르게 change함수를 통해서 변경한 값이 main메소드 안에 있는 x의 값도 변경 되었다.

이유는 참조형은 기본형과는 다르게 주소를 저장하기 때문이다. 값이 저장된 곳의 주소를 알기 때문에 값을 읽어오고 변경까지도 가능한것이다.

 

기본형 매개변수: 변수의 값을 읽기만 할 수 있다. (read only)

참조형 매개변수: 변수의 값을 읽고 변경할 수 있다. (read & write)

 

'자바기초' 카테고리의 다른 글

Arrays  (0) 2022.08.09
가변인자(varargs)  (0) 2022.06.08
HashMap과 ConcurrentHashMap의 차이점  (0) 2021.10.11
마이바티스 $와 #의 차이  (0) 2021.10.10
aop예제  (0) 2021.10.07