안녕하세요.
컨씨브이개발자입니다.
JAVA 코드를 다루다보면 반드시 사용하게되는 foreach 문을 사용하다가
신기한 점을 발견해서 이 글을 쓰게되었습니다.
제가 foreach문 또는 JAVA의 기본적인 상식이 부족해서 몰랐던 사실인 줄 알았으나,
주변의 동료들께도 물어보니 처음 알게 된 사실이라고 하는 동료가 많더군요.
1. foreach문의 기본
foreach 문은 'foreach' 라는 단어의 문법을 사용하는 것이 아니라, for 문과 같은 방식을 사용하되 안에 있는 값을 다르게 적는 것입니다. 아래의 간단한 예제로 foreach 문의 기본을 알아봅니다.
String[] stringArr = {"사과","배","오렌지","감","수박"};
for(String val : stringArr) {
System.out.println(val);
}
위와 같이 for문 안에 "String val" 임의의 String 변수를 선언해주고 ' : ' 문자와 함께 stringArr 배열 적어주면 된다.
그러면 stringArr 배열 안에 값을 하나씩 꺼내어 출력하는 방식이다.
결과 값
사과
배
오렌지
감
수박
이 와 같이 foreach 문을 사용하다가 처음 알게된 사실이 있다.
아래에는 처음 알게된 사실에서의 예제 코드이다.
ObjectMapper objectMapper = new ObjectMapper();
List<HashMap<String, Object>> listMap = new ArrayList<HashMap<String, Object>>();
String jsonString = "[{\"차\":\"K3\", \"차2\":\"셀토스\", \"차3\":\"소렌토\"},{\"차\":\"아벤떼\", \"차2\":\"베뉴\", \"차3\":\"산타페\"},{\"차\":\"모닝\", \"차2\":\"스파크\", \"차3\":\"레이\"}]";
try {
listMap = objectMapper.readValue(jsonString, List.class);
}catch (Exception e) {
e.printStackTrace();
}
for(HashMap<String, Object> mapval : listMap) {
System.out.println(mapval);
}
결과 값
{차=K3, 차2=셀토스, 차3=소렌토}
{차=아벤떼, 차2=베뉴, 차3=산타페}
{차=모닝, 차2=스파크, 차3=레이}
예제로 배열JSON을 List형 HashMap에 담고, List<HashMap>을 foreach 문으로 하나씩 빼는 과정이다.
여기서 HashMap형 mapval 이라는 변수를 선언 후 데이터를 담아 출력했다.
그런데 mapval에서 데이터를 바꾸게되면, 실제 listMap에도 영향이 간다는 것이다.
위 코드에서 foreach문만 다시 작성해보았다.
for(HashMap<String, Object> mapval : listMap) {
System.out.println(mapval);
mapval.put("차3", "값을 비움");
}
System.out.println("");
for(HashMap<String, Object> mapval2 : listMap) {
System.out.println(mapval2);
}
결과 값
{차=K3, 차2=셀토스, 차3=소렌토}
{차=아벤떼, 차2=베뉴, 차3=산타페}
{차=모닝, 차2=스파크, 차3=레이}
{차=K3, 차2=셀토스, 차3=값을 비움}
{차=아벤떼, 차2=베뉴, 차3=값을 비움}
{차=모닝, 차2=스파크, 차3=값을 비움}
결과 값을 보면 실제 listMap에 차3의 key 값에 대한 value는 "값을 비움"으로 변경이 된 것을 볼 수 있다.
이렇듯 foreach문 내부에서 선언된 변수에 대해 값을 변경하면 실제로 던져주는 값에도 영향이 간다는 것을 알 수 있다.
이것을 토대로 다음 예제도 테스트 해보았다.
String[] stringArr = {"사과","배","오렌지","감","수박"};
for(String val : stringArr) {
System.out.println(val);
val.replaceAll("사과", "Apple");
}
System.out.println("");
for(int i = 0; i < stringArr.length; i++) {
System.out.println(stringArr[i]);
}
결과 값
사과
배
오렌지
감
수박
사과
배
오렌지
감
수박
일반 String 배열로 foreach를 사용할때에도 배열의 값이 변하는지 확인해 보았지만,
결과는 HashMap과 다르게 변하지 않는다 이다.
제가 작성한 코드들에 대한 잘못된 부분이나 실수 부분이 있다면 지적해주길 바란다.
또, 다른 케이스가 있다면 댓글을 부탁드립니다.
감사합니다.
'JAVA' 카테고리의 다른 글
[JAVA] REST API 호출 JSON으로 요청 및 데이터 받기 (1) | 2023.04.29 |
---|---|
[JAVA] JSON 데이터 HashMap에 담는 방법 (0) | 2023.04.08 |