방어적 복사(Defensive Copy) 는 원본과의 참조를 끊은 복사본을 만들어 사용하는 방식이며, 원본의 변경에 의한 예상치 못한 사이드 이펙트를 방지하여 안전한 코드를 만들 수 있는데 도움이 됩니다.
방어적 복사는 2가지 시점이 존재하는데요. 생성자의 인자로 받은 객체의 복사본을 만들어 내부 필드를 초기화하거나, getter 메서드에서 객체를 반환할 때, 복사본을 만들어 반환할 수 있습니다. 만약 컬렉션 자료구조를 반환하는 경우라면 자바의 Unmodifiable Collection을 사용하여, 외부에서 Collection에 대해 조회만 할 수 있도록 강제할 수 있습니다. 자바에서 Unmodifiable Collection은 set(), add(), addAll() 처럼 컬렉션에 요소를 추가하거나 변경하는 메서드를 사용하는 경우, 예외를 발생합니다.
다음 코드에서 발생할 수 있는 문제점은 무엇일까요? 🤔
public class Lotto {
private final List<LottoNumber> numbers;
public Lotto(List<LottoNumber> numbers) {
validateSize(numbers);
this.numbers = new ArrayList<>(numbers); // 방어적 복사
}
}
충분히 고민해 보신 다음에 펼쳐보세요!
LIST
'Spring & Backend' 카테고리의 다른 글
| 길이 단위 px, em, rem에 대해 각각 설명해주세요 (0) | 2025.05.15 |
|---|---|
| 해시 충돌에 대해서 설명해주세요 (0) | 2025.05.14 |
| 제로 런타임 css란 무엇인가요? (0) | 2025.05.13 |
| 네트워크 통신에서 Body(Payload)와 Header의 차이는 무엇인가요? (0) | 2025.05.12 |
| Call By Value와 Call By Reference에 대해서 설명해주세요 (0) | 2025.05.12 |
