자바 배열질문
조회수 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 답변
-
Java 에는 참조형(reference type)과 원시형(primitive type) 이 있습니다.
원시형에는 정수형(
int
,byte
,short
,long
,char
), 논리형(boolean
), 실수형(float
,double
) 이 있습니다.참조형은 원시형을 제외한 모든 객체들 이며, 원시형의 배열 또한 포함됩니다.
함수 호출시 원시형은 값 복사를 통해 전달되며, 참조형은 이름에서 알수 있듯이 참조값을 통해 전달됩니다.
참조값은 객체의 주소를 의미하며, 서로 다른 변수들이 참조값을 통해 같은 객체를 참조할 수 있습니다.
int[] a = {1, 2, 3}; int[] b = a;
위와 같이
a
와b
는 참조형 이기 때문에 대입 연산을 통해 참조값을 복사하게 되고, 두 변수는 같은 참조값을 갖게 됩니다. 참조값이 같다는 것은 동일한 객체를 참조하고 있는 것을 의미합니다. 따라서b
를 통해 원소값을 변경하면, 같은 객체를 참조하고 있는a
변수의 내용도 바뀌게 됩니다.이에 반해 원시형의 경우 참조값(주소) 이 아닌 원시형이 표현하고자 하는 값을 각각의 변수가 갖게됩니다.
int c = 10; int d = c;
위의 따라서
c
와b
는10
이라는 동일한 값을 갖게되나,d
의 값을 변경하여도c
의 값은 변경되지 않습니다. 이는c
와d
가 동일한 주소를 공유하고 있는 것이 아니기 때문입니다.정리하면 Java 에서 변수는 값을 저장합니다. 참조형의 변수는 참조값을 저장하며, 이 참조값이 가리키는 객체에 접근하게 됩니다. 원시형의 변수는 각 원시형이 표현하는 값을 저장하며, 이는 주소가 아니기에 동일한 값을 갖는 변수라도 서로에게 영향을 주지 않습니다.
따라서
void test(int[] array, int k)
의array
는int[] in = new int[] {1,2,3,4,5,6};
와 동일한 참조값을 갖고 있기 때문에array
를 변경하면in
이 가리키고 있는 개체의 내용이 변경됩니다.참고로 위에서는 원시형 변수는 해당 형의 값이 저장된다고 설명을 했지만, Immutable 객체의 참조값이 저장된다고 생각할 수 도 있습니다.
댓글 입력