우아한테크코스/level1
방어적 복사vs Unmodifiable vs copyOf 의 차이점
무비인
2022. 3. 21. 21:53
학습 동기 📝
리뷰어 분께서 데이터를 보호하기 위해서 방어적 복사를 사용해보는 것은 어떨까요? 라는 피드백을 주셨다.
관련 공부를 하다보니 방어적 복사, UnmodifiableList, copyOf 이 세가지 개념이 비슷한 구석이 있어 정리해보았다.
학습 내용 📖
세가지 개념에 대한 정리 내용은 링크로 대체한다.
방어적 복사 vs Unmodifiable vs copyOf 요약
- 방어적 복사 : 객체를 새로 생성해서 반환함, 원본에 대한 참조는 끊기지만,원본 내 또다른 객체들에 대한 참조는 유지됨.
- Unmodifiable : 읽기 전용으로 반환함. 원본과 참조는 유지
- copyOf : 기존 값을 복사한 후 읽기 전용으로 반환함 원본과 참조 끊김
내가 생각하는 쓰임새 🤔
방어적 복사
객체에 대한 참조를 끊어준 뒤, 추가적인 삽입, 삭제 연산이 가능하기 때문에 맨 처음 생성자에서 객체에 값을 대입할 때 사용하는 것이 좋다고 생각한다.
public Cards(List<Card> cards) {
this.cards = new ArrayList<>(cards);
}
Unmodifiable
Getter 와 같이 반환 값에 대해 읽기만 가능하게 의도할 때 사용하는 것이 좋다고 생각한다. 그러나 참조가 살아있기 때문에 가능하면 copyOf 를 사용하는 것이 좋지 않을까?
public List<Card> getValue() {
return Collections.unmodifiableList(value);
}
copyOf
Getter 에서 사용하기 최적합인 듯하다.
public List<Card> getValue() {
return List.copyOf(value);
}
➡️ 결론 🤓
생성자 에서는 방어적 복사 를 사용하고, getter 에서는 List.copyOf 를 사용하자.