Study/Java

[Java] HashMap remove, 객체, 참조

fftl 2023. 8. 22. 00:05

코딩테스트 공부를 하다가 문득 궁금증이 생겼습니다. 하나의 객체를 생성하여 HashMap에 다가 담아놓고, 이를 get으로 불러서 다른 자료구조 예를들어 ArrayList에다가 추가를 했을 때, HashMap에서 해당 객체를 remove 한다면 ArrayList에 있는 객체도 함께 삭제가 되지 않을까? 하는 궁금증 이었습니다. 그래서 테스트를 진행해봤습니다.

 

일단 테스트에 사용할 클래스를 하나 만들어 주었습니다. 

static class Test{
        int val;

        public Test(int val) {
            this.val = val;
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Test{");
            sb.append("val=").append(val);
            sb.append('}');
            return sb.toString();
        }
    }

그리고 생각으로 했었던 코드를 구성 해보았습니다.

HashMap<Integer, Test> map = new HashMap<>();
map.put(1, new Test(10));

ArrayList<Test> arr = new ArrayList<>();
arr.add(map.get(1));

System.out.println("일단 입력 상황 확인 --------------------------");
System.out.println(map);
System.out.println(arr);

//삭제!!
map.remove(1);

System.out.println("삭제 이후 --------------------------");
System.out.println(map);
System.out.println(arr);

저는 map에 입력한 key를 1로 가지는 Test 객체와 arr에 추가한 Test 객체는 같은 주소를 공유하고 있기에 아래와 같은 결과를 나타내지 않을까 생각하고 있었습니다.

일단 입력 상황 확인 --------------------------
{1=Test{sId=1, tId=1, score=5}}
[Test{sId=1, tId=1, score=5}]
삭제 이후 --------------------------
{}
{}

하지만 결과는 아래와 같았습니다.

일단 입력 상황 확인 --------------------------
{1=Test{sId=1, tId=1, score=5}}
[Test{sId=1, tId=1, score=5}]
삭제 이후 --------------------------
{}
[Test{sId=1, tId=1, score=5}]

확인해보니 map.remove(1);를 통해서 map에 있는 객체를 삭제하더라도 다른 컬렉션에 추가한 경우에는 해당 컬렉션에 참조가 남아있기 때문에 메모리에서 해제되지 않는다고 합니다. 즉 arr에 있는 참조 까지 따로 제거를 해줘야 메모리에서 해제될 수 있습니다.