본문으로 건너뛰기
hits

방어적 복사를 수행하는 방법과 시기

· 약 2분
HyoYoonNam
Software Engineer

이 문장까지 미리보기로 노출됩니다.

이 글을 읽으면

방어적 복사란 무엇이고, 왜 수행해야 하는지를 알 수 있습니다.

  • List.of(), List.copyOf(), Collections.unmodifiableList()

  • 불변 컬렉션 A를 List.copyOf()에 넣어서 뱉어진 것을 B라고 하면, A == B 참조 비교가 똑같은가?

  • UnmodifiableList은 계속 원본 컬렉션을 참조함을 보여주기. (DB의 View 개념)

ImmutableList와 UnmodifiableList

List.copyOf()에 불변 컬렉션에 전달하면, 복사를 수행하지 않고 그대로 반환한다

import java.util.ArrayList;  
import java.util.List;

public class ListCopyOfForImmutableCollection {
public static void main(String[] args) {
List<Integer> mutableList = new ArrayList<>(List.of(1, 2, 3));
List<Integer> copiedOfMutable = List.copyOf(mutableList);

System.out.println("가변 리스트와 그에 대한 방어적 복사본의 참조 동일성 비교 = " + (mutableList == copiedOfMutable));

List<Integer> ImmutableList = List.of(1, 2, 3);
List<Integer> copiedOfImmutable = List.copyOf(ImmutableList);
System.out.println("불변 리스트와 그에 대한 방어적 복사본의 참조 동일성 비교 = " + (ImmutableList == copiedOfImmutable));
}
}

실행 결과

가변 리스트와 그에 대한 방어적 복사본의 참조 동일성 비교 = false
불변 리스트와 그에 대한 방어적 복사본의 참조 동일성 비교 = true

따라서 정적 팩터리 메서드와 생성자에서 중복적으로 호출해도 ...

중복적으로 호출하는 이유에 대해 서술: 로직 수행중 컬렉션 오염... 여기서는 멀티 스레드로 예시 만들어서 제시.

하지만 싱글 스레드에서는 고려하지 않아도 됨

...

References