ArrayList 가 나중 데이터로 인해 수정되는 조건이 알고싶습니다.

조회수 433회

ArrayList 는 데이터를 순서대로 등록하기만 하는 줄 알았는데,

key 값이 같은 HashMap 을 연속으로 등록했더니 먼저 등록한 데이터들까지 마지막에 등록한 데이터와 같은 데이터로 변경되었습니다.

이것저것 시험해본 결과, key 값이 같은 경우에만 이렇게 되는 거 같은데, ArrayList 는 원래 key 값이 같은 데이터가 들어오면, 예전에 등록된 데이터까지 수정해버리나요?

아니면 다른 조건이 더 필요한가요?

그 때 코드는 대충 이런 모양이었습니다.

    ArrayList<HashMap<String, String>> al = new ArrayList<HashMap<String, String>>();
    HashMap<String, String> hm = new HashMap<String, String>();

    for (int i=0; i<3 ; i++ )
    { 
        hm.put("목록", i);
        aList.add(hm);
        System.out.println("aList >>> : " + aList);
    }

참고로 for문 안에 HashMap hm = new HashMap();를 옮겨 쓰면 되는 건 알고있습니다.

제가 알고싶은 건 ArrayList에 등록 된 데이터가 나중에 등록 된 데이터로 인해 수정되는 조건입니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 음...본문과 같이 작성하면 hashmap 객체는 1개가 생성되고 같은 레퍼런스만 3번 저장이 됩니다.

    c/c++ 에서 포인터 개념을 가지고 있다면 이해가 쉬운데... 자바에서 힙에 생성하는 방법은 new 연산자를 이용하는 방법뿐입니다.

    HashMap<String, String> hm = new HashMap<String, String>(); 를 통해 객체가 생성이 되었고 hm 변수가 그 객체를 가리키고 있는 겁니다.

    aList.add(hm); 를 통해 list에 저장하고 있는 것은 객체가 아니라 객체를 가리키는 레퍼런스입니다. 즉 같은 객체를 3번 넣는 겁니다.

    그럼 각각의 다른 객체를 3번 넣을려면 어떻해 하면 될까요?

    아래와 같이 for 안에서 3번 new 연산자로 각각 객체에 생성후 list에 등록해주면 됩니다.

    ArrayList<HashMap<String, String>> al = new ArrayList<HashMap<String, String>>();
    HashMap<String, String> hm = null;
    
        for (int i=0; i<3 ; i++ )
        { 
            hm = new HashMap<String, String>();
            hm.put("목록", i);
            aList.add(hm);
            System.out.println("aList >>> : " + aList);
        }
    
    • 질문과는 무관하지만 제네릭 자료형이 다 잘못되어 있네요. 정영훈 2020.10.21 23:37
    • 음...... 그러니깐. list 는 그 데이터가 아니라 데이터가 있는 key 값을 저장하고 있기 때문에, key 값에 저장된 데이터가 변경되면, list에 등록된 데이터도 변하게 된다는 뜻인가요? 알 수 없는 사용자 2020.10.21 23:51
    • new 를 하면 실제 데이터가 heap 이라는 메모리 공간에 생성이 됩니다. 그리고 그 생성한 시작 주소가 변수에 저장이 되는 겁니다. 그 변수를 3번 list 에 add 한겁니다. 즉 같은 객체를 가리키는 레퍼런스를 3번 넣은것이기 때문에 데이터를 변경하면 다 변경되는 것 처럼 보이는 것이지 실제로는 1개가 변경되는 겁니다. 이 부분을 이해못하면 자바 프로그래밍을 제대로 할 수 없습니다. 정영훈 2020.10.22 00:12
    • 정말로 궁금했던 건데, 덕분에 편히 잘 수 있을 것 같습니다. 감사합니다. 알 수 없는 사용자 2020.10.22 00:23

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)