Sangil's blog

https://github.com/ChoiSangIl Admin

[JAVA] WRAPPER(래퍼) 클래스의 값 전달(value? or referance?) DEV / PROGRAMING

2018-11-14 posted by sang12


그냥 저냥..개발 하다가 배운점이 있어 글을 남깁니다. java에서는 기본 데이터형으로 primitive타입이 존재하는건 다들 알고 있을 거라고 생각합니다. 그리고 primitive타입을 null을 허용하기위해 그리고 클래스처럼(멤버함수) 사용하기 위해 wrapper 래퍼클래스를 사용을 합니다. 그래서 int의 래퍼 클래스는 Integer, char의 래퍼클래스는 Charater등 래퍼 클래스들이 존재하는데요. 여기서 문제를 하나 내겠습니다.

Integer와 Charater는 클래스잖아요..?


	public static void main(String[] args) {
		Integer a = new Integer(3);
		Integer b = new Integer(4);
		
		b = a;
		b = 10; //new Integer(10);
		
		System.out.println("a::"+a + ", b::" + b);
		
		Map c = new HashMap();
		Map d = new HashMap();
		c.put("test1", "123");
		d = c;
		d.put("test1", "456");
		
		System.out.println("c::"+c + "d::" +d);
	}

위와 같은 경우 결과 값이 어떻게 나올까요? 

Result 

a::3, b::10
c::{test1=456}, d::{test1=456}
아래의 map같은 경우 주소 전달이 되서 같은 값이 들어가게 되는데요. 여기서 Integer 같은 경우로 주소 전달이 되어 같은 값이 들어갈거라고 판단했습니다. 하지만 위 결과와 같이 다른 값이 나오더라구요. 왜그러는 걸까요? 여기서 답은 옆 주석에 있습니다. 자바에서 Wrapper클래스인 Integer에 값을 넣어줄때 오토박싱이 되어 new Integer(10)으로 컴파일러가 변경해서 넣어줍니다. 그러므로 b는 a의 주소값을 가지고 있다가 new 할당자로 새로운 객체의 주소를 가지게 되죠. 더 정확하게 알고싶으신 분들은 순서대로 b의 주소값을 찍어보면 더 쉽게 이해 하실 수 있을 겁니다.
#래퍼 클래스의 값전달 #오토박싱 #언박싱 #자바 원시타입