기본형과 참조형?
기본형
기본형은 int, long, double, boolean 처럼 변수를 선언하고 그 변수에 값을 직접 저장하는 형태를 기본형이라고 한다.
참조형
참조형은 앞에서 말한 배열과 같이 변수를 선언하고 그 변수에 값을 직접 저장하는 것이 아닌 (참조)주소를 저장하는 형태를 참조형이라고 한다.
기본형과 참조형의 출력
위와 같이 int형 변수와 int를 담는 배열을 선언하고 배열은 인덱스를 이용하여 출력하는 것이 아닌 변수 그 자체를 출력하면
위와 같이 기본형인 num은 값 그 자체가 참조형인 nums는 배열의 주소가 참조되는 것을 확인할 수 있다.
기본형과 참조형의 차이1 (대입)
자바에서는 가장 중요한 원칙이 있는데 이는 자바에서 변수를 대입할 때 값을 복사해서 대입한다는 것이다.
간단하게 설명하면,
에서 num1와 nums1의 값을 변수에 대입한 것을 출력해보면
와 같이 출력되는데 모두 그 변수의 값을 복사하여 대입했다는 것을 알 수 있다.
기본형의 대입
와 같이 num2에 num1의 값을 대입하고 num1 변수의 값을 수정하면 어떻게 될까? 또 num2의 변수의 값을 수정하면 어떻게 될까? 답은 위에서 말한 대원칙에 있다.
대원칙에서는 값을 복사해서 대입한다고 했다. 따라서
와 같이 num1과 num2의 변수의 값을 바꿔도 num2는 num1의 값을 복사해서 대입 받았을 뿐 다른 관계가 없어 각자의 변수의 값만 수정된다.
참조형의 대입
참조형에서의 대입은 어떨까?
와 같이 nums2에 nums1변수를 대입하면 위에서 말한 것 처럼 nums1 변수의 값(주소)를 복사해서 대입한다. 그 후 nums1의 배열안의 값과 nums2의 배열안의 값을 수정하면
와 같이 둘은 메모리에 생성된 같은 배열의 주소를 가지고 있기 때문에 nums1의 배열의 값을 수정해도 nums2의 배열의 값이 수정되고 반대도 똑같이 수정되는 것이다.
기본형과 참조형의 차이2 (호출)
기본형과 참조형의 메서드 호출에 대한 차이점에 대해서 알아볼 차례이다.
위와 같이 기본형을 메서드에서 호출하여 변수의 값을 바꾸고 메인 메서드에서 변수의 값을 출력하면 어떻게 될까? 이 또한 위에서 말한 대원칙을 떠올리면 쉽게 에상할 수 있다.
위와 같이 당연히 메인메서드의 기본형 변수의 값은 수정되지 않았다. 왜냐하면 메서드에서 매개변수로 값을 호출하고 메인메서드의 기본형 변수가 값을 대입할 때 자기 자신을 대입하는 것이 아닌 값을 복사해서 대입하기 때문에 changeValue 메서드에서 매개변수의 값을 수정한다고 해서 메인 메서드 변수의 값이 수정되지 않는다. 따라서 위의 changeValue 매개 변수 받는 것은
와 같이 생각하면 쉽게 이해할 수 있을 것이다.
를 생각하면 어떻게 될까? 변수의 값을 대입할 때에는 값을 복사해서 대입한다. 라는 것을 떠올리면 a의 값(주소)를 메서드에게 전달한 것이고 여기서 배열의 값을 수정하면 똑같은 배열을 가리키고 있기 때문에 당연히 메인 메서드의 배열의 값도 수정되었을 것이다. 라는 것을 예상할 수 있을 것이다.
위와 같은 예상과 같은 결과를 알 수 있었다.
최종 정리