개발새발

방어적 복사vs Unmodifiable vs copyOf 의 차이점 본문

우아한테크코스/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 를 사용하자.

 

참조

'우아한테크코스 > level1' 카테고리의 다른 글

Command Pattern ( 커멘드 패턴)  (0) 2022.04.03
List.copyOf 란?  (0) 2022.03.21
unmodifiableList 란?  (0) 2022.03.21
방어적 복사란?  (0) 2022.03.21
[레벨1] 블랙잭 회고  (2) 2022.03.21