[아이템6] 불필요한 객체 생성을 피하라

ds_chanin

·

2020. 1. 28. 14:58


아이템 6 불필요한 객체 생성을 피하라

String.matches(String regex);

String 의 matches는 반복사용할 경우 그 비용이 매우 비싸다.
내부에서 Pattern 인스턴스를 생성했다가 GC의 대상이 되기 때문이다. 이를 Pattern 인스턴스를 미리 생성한 뒤 이용하여 성능 향상을 꾀하도록 하자.

image

image

image

내부적으로 new Pattern(regex,0) 을 하고 있다.

Map.keySet();

Map.keySet 은 매번 새로운 인스턴스를 생성하는 것 처럼 보일 수 있으나 하나의 객체만을 반환하고 있다.
어댑터의 역할은 keySet이며 뒷단 객체는 Map을 의미한다. Map의 view역할을 keySet이 하여 Set으로 보여주고 있다.
따라서 keySet으로 반환된 Set 객체에서는 add() 와 같은 작업은 하지 못하며 Map 객체에서 해당 작업을 담당하고 있다.

		@DisplayName("어댑터 패턴이 적용된 keySet 테스트")
    @Test
    void name() {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "첫번째");
        map.put(2, "두번째");
        map.put(3, "세번째");

        // keySet 은 view 의 역할을 한다.
        Set<Integer> keySet = map.keySet();
        assertThat(keySet).contains(1, 2, 3);

        // 따라서 뒷단 객체인 map 이 기능을 담당하고 있다.
        map.remove(3);
        assertThat(keySet).doesNotContain(3);

        // view 인 keySet 에서 기능을 동작하려 하면 exception 이 발생한다.
        assertThatThrownBy(() -> keySet.add(3))
                .isInstanceOf(UnsupportedOperationException.class);
    }

image

AutoBoxing

오토박싱또한 불필요한 객체 생성을 야기한다.
long, intLong, Integer 로 의도치 않게 오토박싱 되지 않도록 주의하도록 하자.