인프런 커뮤니티 질문&답변

Lego님의 프로필 이미지
Lego

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

상품 도메인 개발

ArrayList로 감싸서 반환하는 이유

작성

·

505

0

5:50쯤에 ArrayList로 감싸서 반환하는 이유를 말씀하시는데 납득이 안되는데 부연설명 가능할까요?

답변 1

2

안녕하세요. Lego님, 공식 서포터즈 David입니다.

Map의 values를 그대로 반환하게 되면 외부(ItemRepository)에서 Map 내 element를 삭제할 수 있게 됩니다. 그런데 강의와 같이 ArrayList로 한 번 감싸게 되면 Map의 values에 변경을 가할 수 없게 됩니다. 이런 이유로 ArrayList로 한 번 감싼 것입니다.

자세한 동작은 아래 테스트 코드를 참고해 주세요.

public class MapTest {

    @Test
    void removeElementFromMapValues() {
        Map<String, Item> itemMap = new HashMap<>();
        itemMap.put("David", new Item("David"));
        itemMap.put("Sophie", new Item("Sophie"));

        System.out.println("Original Map Values");
        itemMap.values().forEach(System.out::println);

        Collection<Item> values = itemMap.values();
        values.remove(new Item("David"));

        System.out.println("Modified Map Values");
        itemMap.values().forEach(System.out::println);
    }

    @Test
    void removeElementFromNewArrayListWithMapValues() {
        Map<String, Item> itemMap = new HashMap<>();
        itemMap.put("David", new Item("David"));
        itemMap.put("Sophie", new Item("Sophie"));

        System.out.println("Original Map Values");
        itemMap.values().forEach(System.out::println);

        List<Item> items = new ArrayList<>(itemMap.values());
        items.remove(new Item("David"));

        System.out.println("ArrayList Items");
        items.forEach(System.out::println);

        System.out.println("Original Map Values");
        itemMap.values().forEach(System.out::println);
    }

    static class Item {

        private String name;

        public Item(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Item item = (Item) o;
            return Objects.equals(name, item.name);
        }

        @Override
        public int hashCode() {
            return Objects.hash(name);
        }

        @Override
        public String toString() {
            return "Item{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
}

감사합니다.

Lego님의 프로필 이미지
Lego

작성한 질문수

질문하기