그 옛날 이런 글을 작성했더랬다

https://cocoomoo.tistory.com/101#1.1.%20ImmutableCollection%C2%A0

 

[Java] ImmutableCollection 과 UnmodifiableCollection 과 Immutability

테스트 코드를 작성할 때면 List.of 를 무지성으로 사용하고는 했었다.해당 정적팩토리 메소드를 통해 리턴되는 리스트는 불변 객체라고는 알고 있었지만, 어떤 의미에서의 불변인지.. 해당 컬렉

cocoomoo.tistory.com

 

 

객체지향에 대해 다시 공부하면서 , 게으른 시절 (여전히 게으르지만) 수료 실패한 nextstep 과제를 혼자서 해보고 있다 

 

너무 감이 안잡혀서 빠르지 않게 코드를 작성하고, 다른 사람 PR 들을 보면서 리팩토링을 적용해보고 있는데.

이 과제의 경우 콘솔에 출력을 해야하고, 결국은 객체를 표현계층 단에까지 전달을 해 줘야지 이를 콘솔에 출력 할 수 있는 상황이 발생한다.

자료구조로 풀 수 있는 방법도 있겠지만 getter 를 통해 객체 내부 값들을 전달하는 과정에서 Collection 을 전달해줘야 하는 상황도 발생한다. 

Collection 을 객체 외부로 노출 시킬 때는 항상 주의해야 하는데, 

 

여전히 List 에 대한 불변 컬렉션을 리턴해주는 코드들에 Collections.unmodifialbeList() 를 많이 사용하고 있더라.

 

그런데 생각해보니 나도 파라미터로는 Collection 을 받고 ImmutableCollection 을 리턴하는 메서드가 뭔지 모르더라 ㅋㅋ 

List.of() 말고 뭐가 있지? 

 

 

라이브러리 한 번만 들여봐도 알 수 있는 것이었다

 

 

위 글에서도 이미 UnmodifiableCollection 과 ImmutableCollection 에서 어떤 차이가 발생하는지 설명 했었지만

이 글에서 다시 한 번 ImmutableCollection 을 사용하게 되는 copyOf 와 Collections.unmodifiableList 의 차이는 아래 테스트 코드로 알 수 있다

 

그 이유는 위 포스팅을 타고 들어가서 읽어보면 알 수 있다

        @Test
        @DisplayName("원본 Collection 변경은 List.copyOf 로 새로 생성한 객체에 영향을 주지 않는다")
        void test1() {
            // given
            var originCollection = new ArrayList<String>();
            originCollection.add("abc");

            var copyOfList = List.copyOf(originCollection);
            originCollection.add("def");

            Assertions.assertThat(originCollection).hasSize(2);
            Assertions.assertThat(copyOfList).hasSize(1);
        }

        @Test
        @DisplayName("원본 Collection 변경은 unmodifiableList 로 새로 생성한 객체에 영향을 준다")
        void test2() {
            // given
            var originCollection = new ArrayList<String>();
            originCollection.add("abc");

            var copyOfList = Collections.unmodifiableList(originCollection);
            originCollection.add("def");

            Assertions.assertThat(originCollection).hasSize(2);
            Assertions.assertThat(copyOfList).hasSize(2);
        }
복사했습니다!