Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 우테코4기
- 자바로 만들수 있는 것
- JXM
- PR 오류
- 프로젝트 패키지 구조
- ServiceTest
- 리스코프치환원칙
- ControllerTest
- JDK
- throw 와 throws 차이
- 윤년계산하기
- 백준
- 자바 4334
- 제임스고슬링
- 자판기미션
- 상수와 Enum
- 자바의 종류
- 객체지향적인 설계
- 테스트 성능 개선
- 우아한테크코스
- There isn't anything to compare.
- 우테코
- 블랙잭 회고
- 방어적 복사
- Oracle JDK와 OpenJDK의 차이
- java 1000번 A+B
- 인수테스트
- 상근날드
- 자바 버전 다운 그레이드
- Getter Setter
Archives
- Today
- Total
개발새발
방어적 복사란? 본문
방어적 복사란?
객체에 값을 대입할 때, new 키워드를 사용하여 새로운 객체로 복사해주는 것을 의미한다.
public Cards(List<Card> cards) {
this.cards = new ArrayList<>(cards);
}
이렇게 새로 객체를 생성할 경우, 내부 데이터 값만 복사되고 참조가 끊기게 되어 원본의 변경에 상관없이 초기 데이터를 안전하게 사용할 수 있다.
방어적 복사 시점
카드를 관리하는 도메인인 Cards 에서 카드가 1개 이상임이 보장되어야 하여 유효성 검사를 한다고 가정하자.
public Cards(List<Card> cards) {
if(validation(cards)) {
throw new IllegalArgumentException("카드는 한장 이상이어야합니다.");
}
this.cards = new ArrayList<>(cards);
}
보통은 이렇게 검증 후 할당을 하고 있을 것이다.
그러나 멀티 스레딩 환경일 때는 원본 값이 변경 될 위험이 크기 때문에 할당 후 할당한 값에 대해서 검증을 해주는 것이 더욱 안정적인 객체를 만들 수 있다.
public Cards(List<Card> cards) {
this.cards = new ArrayList<>(cards);
if(validation(this.cards)) {
throw new IllegalArgumentException("카드는 한장 이상이어야합니다.");
}
}
원본 훼손을 방지하기 위해
생성자에서 복사본을 만든 것은 원본과의 참조를 끊기 위해서였다.
이번에는 getter 를 통해 나간 객체에 대해서도 방어적 복사를 통해 현재 객체의 훼손을 방어를 해보자.
public List<Card> getCards (){
return new ArrayList<>(cards);
}
참고
'우아한테크코스 > level1' 카테고리의 다른 글
List.copyOf 란? (0) | 2022.03.21 |
---|---|
unmodifiableList 란? (0) | 2022.03.21 |
[레벨1] 블랙잭 회고 (2) | 2022.03.21 |
객체지향 한걸음 (0) | 2022.03.21 |
형변환(Casting) 과 오버 플로우(Overflow) (0) | 2022.03.20 |