디폴트는 불변(immutable)
3장에서 언급한 것과 같이 지역변수는 로직 오류를 최소화하기 위해 기본적으로 불변으로 선언하는 것이 바람직하다.
변수를 가변으로 써야 하는 경우
예1.반복문 카운터와 같이 스코프가 국소적인 경우
예2. 성능이 중요한 경우 - 대량의 데이터를 빠르게 처리해야 하는 경우
예3. 성능이 중요한 경우 - 이미지를 처리하는 경우
예4. 성능이 중요한 경우 - 리소스 제약이 큰 임베디드 소프트웨어를 다루는 경우
가변으로 쓰는 이유
불변으로 쓰면 변수의 데이터를 변경할 때마다 인스턴스를 새로 만들어야 하는데, 이 경우 추가 시간과 추가 메모리 공간을 사용하므로 성능이 중요한 경우에 가변을 사용한다.
가변으로 쓸 경우 주의점
= 변수가 항상 올바른 상태일 수 있도록 보장하기.
나쁜 코드 예시
class HitPoint {
int amount; // 가변 변수
}
class Member {
final HitPoint hitPoint;
final States states;
// 가변 변수 HP 잘못된 상태(=0 미만인 상태)에 빠질 수 있음
// 가변 변수 HP가 0일때 적절한 로직(=캐릭터 상태를 `dead`로 변경)을 수행하지 않음.
void damage(int damageAmount) {
hitPoint.amount -= damageAmount;
}
}
수정 예시
class HitPoint {
private static final int MIN = 0;
int amount; // 가변 변수
// 올바른 상태를 보장하는 생성자
HitPoint(final int amount) {
if (amount < MIN) {
throw new IllegalArgumentException();
}
this.amount = amount;
}
// 1. 데이터 변경 메서드는 엔티티 스스로 보유
// 2. 항상 올바른 상태를 보장하도록 코딩
void damage(final int damageAmount) {
final int changedAmount = amount - damageAmount;
amount = Math.max(MIN, changedAmount);
}
boolean isZero() {
return amount == MIN;
}
}
class Member {
final HitPoint hitPoint;
final States states;
// 1. HP 데이터 변경을 위해 HP 메서드를 호출
// 2. HP가 0일때 적절한 조치를 취함.
void damage(final int damageAmount) {
hitPoint.damage(damageAmount) ;
if (hitPoint.isZero()) {
states.add(StateType.dead);
}
}
}
'디자인패턴 > 내 코드가 그렇게 이상한가요?' 카테고리의 다른 글
클래스 설계 원칙 - 내 코드가 그렇게 이상한가요? 3장 요약 (0) | 2024.12.19 |
---|