
그 옛날 이런 글을 작성했더랬다
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);
}
'Java' 카테고리의 다른 글
ConcurrentModificationException 은 어디서, 언제 throw 되는걸까? (0) | 2023.04.12 |
---|---|
Aggregation 과 Composition 개념 (0) | 2023.03.24 |
타입 및 클래스들 사이에 존재하는 각 종 관계들과 리스코프 치환 원칙 (0) | 2023.03.24 |
Java 에서 Stack 구현체로는 무엇을 사용해야할까?(feat_Java로 코딩테스트 문제 풀기) (0) | 2022.09.02 |
record 의 생성자를 private 으로 만드는 것이 불가능한 이슈 (0) | 2022.08.23 |