자바 배열질문

조회수 978회

자바 간단한 질문하나 하겠습니다.

static void test(int[] array, int k) {
        array[1]=100;
        k =100;
    }
    public static void main(String[] args) throws IOException {
        int[] in = new int[] {1,2,3,4,5,6};
        int a = 4;
        System.out.println(in[1]);
        System.out.println(a);
        test(in,a);
        System.out.println(in[1]);
        System.out.println(a);
    }

위와같은 간단한 자바 코드가 있는데요. 왜 a값은 바뀌지 않지만 배열값은 test에서 바뀌어 출력할 수 있는거죠?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    Java 에는 참조형(reference type)과 원시형(primitive type) 이 있습니다.

    원시형에는 정수형(int, byte, short, long, char), 논리형(boolean), 실수형(float, double) 이 있습니다.

    참조형은 원시형을 제외한 모든 객체들 이며, 원시형의 배열 또한 포함됩니다.

    함수 호출시 원시형은 값 복사를 통해 전달되며, 참조형은 이름에서 알수 있듯이 참조값을 통해 전달됩니다.

    참조값은 객체의 주소를 의미하며, 서로 다른 변수들이 참조값을 통해 같은 객체를 참조할 수 있습니다.

    int[] a = {1, 2, 3};
    int[] b = a;
    

    위와 같이 ab 는 참조형 이기 때문에 대입 연산을 통해 참조값을 복사하게 되고, 두 변수는 같은 참조값을 갖게 됩니다. 참조값이 같다는 것은 동일한 객체를 참조하고 있는 것을 의미합니다. 따라서 b 를 통해 원소값을 변경하면, 같은 객체를 참조하고 있는 a 변수의 내용도 바뀌게 됩니다.

    이에 반해 원시형의 경우 참조값(주소) 이 아닌 원시형이 표현하고자 하는 값을 각각의 변수가 갖게됩니다.

    int c = 10;
    int d = c;
    

    위의 따라서 cb10 이라는 동일한 값을 갖게되나, d 의 값을 변경하여도 c 의 값은 변경되지 않습니다. 이는 cd 가 동일한 주소를 공유하고 있는 것이 아니기 때문입니다.

    정리하면 Java 에서 변수는 값을 저장합니다. 참조형의 변수는 참조값을 저장하며, 이 참조값이 가리키는 객체에 접근하게 됩니다. 원시형의 변수는 각 원시형이 표현하는 값을 저장하며, 이는 주소가 아니기에 동일한 값을 갖는 변수라도 서로에게 영향을 주지 않습니다.

    따라서 void test(int[] array, int k)arrayint[] in = new int[] {1,2,3,4,5,6}; 와 동일한 참조값을 갖고 있기 때문에 array 를 변경하면 in 이 가리키고 있는 개체의 내용이 변경됩니다.

    참고로 위에서는 원시형 변수는 해당 형의 값이 저장된다고 설명을 했지만, Immutable 객체의 참조값이 저장된다고 생각할 수 도 있습니다.

    • 깔끔하게 이해했습니다. 정말 감사합니다. 심승현 2018.5.28 20:23

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)