[java] java Map 같은값이 들어갈경우 :: 개발/일상_Mr.lee

[java] java Map 같은값이 들어갈경우

Posted by Mr.mandu.
2016. 5. 28. 10:00 개발/java,spring

정말 어처구니 없는 일이 있었다...

사실 제가 너무 무지해서 발생했던 일입니다.


그래서 다시는 잊지 않기위해 포스팅 합니다.


Map에 중복된 값이 계속 들어간다고 생각했던....그래서 멘붕에 빠진 날이 있었습니다.


상황은 이렇습니다.


Map 객체 생성후 for문을 돌려 값을 채울려고 했습니다.


Map param = new HashMap();
		
		List<Map> testList = new ArrayList(); 
		
		for(int i=0; i<5;i++){
			
			param.put("one", i);
			param.put("two", i);
			param.put("three", i);
			param.put("four", i);
			param.put("five", i);
			
			testList.add(param);
		}
		
		for(int i=0; i<testList.size(); i++){
			logger.info("--------"+i+"번째----------------------------------------");
			logger.info("@@@@@@@@@@@@" + testList.get(i).get("one").toString());
			logger.info("@@@@@@@@@@@@" + testList.get(i).get("two").toString());
			logger.info("@@@@@@@@@@@@" + testList.get(i).get("three").toString());
			logger.info("------------------------------------------------");
		}

 

물론 이와 똑같은 상황은 아니었지만 포스팅하기위에 따로 소스를 적어보았습니다.


위의 소스의 결과 입니다.



[결과화면]




분명 List객체에 서로 다른 값을 넣었는데

결과는 모두 같은 값을 출력하고 있었습니다.


제가 하는 프로젝트가 데이터가 정신없이 돌아가고 있는 상황이었기 때문에

왜 계속 같은 값을 넣고 있는지 로직만 쳐다보고 있었죠.....


이에 올바른 소스를 적어보겠습니다.


Map param = new HashMap();
		
		List<Map> testList = new ArrayList(); 
		
		for(int i=0; i<5;i++){
			param = new HashMap();
			param.put("one", i);
			param.put("two", i);
			param.put("three", i);
			param.put("four", i);
			param.put("five", i);
			
			testList.add(param);
		}
		
		for(int i=0; i<testList.size(); i++){
			logger.info("--------"+i+"번째----------------------------------------");
			logger.info("@@@@@@@@@@@@" + testList.get(i).get("one").toString());
			logger.info("@@@@@@@@@@@@" + testList.get(i).get("two").toString());
			logger.info("@@@@@@@@@@@@" + testList.get(i).get("three").toString());
			logger.info("------------------------------------------------");
		}

차이를 말씀드리기 전에 결과 화면을 출력해보겠습니다.


[결과화면]




결과를 보시면 Map에 i 값이 +되어 차근차근 들어가는 모습을 확인 할 수 있습니다.


2개의 소스의 차이를 보면


new HashMap()을 어디서 했느냐를 보시면 알수 있습니다.

첫번째 소스에서는 for문 밖에서!

두번째 소스에서는 for문 안에서!


차이는 단지 이거지만 여기서 중요한 사실을 잊고 있었습니다.


List에 넣은건 객체 자체를 넣은게 아니라 리퍼런스를 넣은 것이었습니다.

즉, 실제의 객체는 1개만 존재합니다. 그래서 최종 변경된 내용으로 출력되었던 것입니다.



이 사실을 몰랏던 저는 한참을 고생하였습니다..... 

한번 모르기 시작하면 별거 아닌데 2~3시간씩 고생들 하시잖아요...?ㅠㅠ

모두 저와 같은 실수 안하기를 빕니다!