https://link.coupang.com/a/37DdD
↑ 정말 재밌게 봤고 좋은 책
변수의 값을 변경하는 등 상태를 변경할 수 있는 것을 가변(mutable) 이라고 한다.
반면 상태를 변경할 수 없는 것을 불변(immutable)이라고 한다.
가변과 불변을 적절하게 설계하지 못하면, 동작을 예측하기 어렵고 혼란스러워진다.
예를 들어 '이 값은 이렇게 변경될 것이다' 라고 생각하고 구현했는데, 의도하지 않은 다른 값으로 변경되는 상황이 생길 수 있다.
이런 문제를 해결하려면, 가능한 한 상태가 변경되지 않도록 설계해야 한다.(불변)
4.1 재할당
변수에 값을 다시 할당하는 것을 재할당 또는 파괴적 할당이라고 한다.
재할당은 변수의 의미를 바꿔 추측하기 어렵게 만들고, 언제 어떻게 변경되었는지 추적하기 힘들게 한다.
int damage(){
// 멤버의 힘과 무기 성능을 기본 공격력으로 활용한다.
int tmp = member.power() + member.weaponAttack();
// 멤버의 속도로 공격력을 보정한다.
tmp = (int) (tmp * (1f + member.speed() / 100f ));
// ...
...
return tmp;
}
4.1.1 불변 변수로 만들어서 재할당 막기
아래처럼 변수에 final 키워드를 붙여서 재할당을 기계적으로 막을 수 있다.
int damage(){
// 멤버의 힘과 무기 성능을 기본 공격력으로 활용한다.
final int basicAttackPower = member.power() + member.weaponAttack();
// 멤버의 속도로 공격력을 보정한다.
final int finalAttackPower = (int) (tmp * (1f + member.speed() / 100f ));
// ...
...
return tmp;
}
4.1.2 메서드 매개변수도 불변으로 만들기
마찬가지로 매개변수에 final 붙이면 됨
4.2 가변으로 인해 발생하는 의도하지 않은 영향
인스턴스가 가변이면 다른 부분에 의도하지 않은 영향을 주기 쉽다고 한다.
4.2.1 책의 사례 1. 가변 인스턴스 재사용하기
결국 생각해보면 당연한건데 하나의 인스턴스를 2개 변수에 할당하고, 1개 변수에서 인스턴스 변수 값을 변경하면 다른 변수의 로직에도 영향을 미치게 된다는 부분이다.
4.2.2 사례 2. 함수로 가변 인스턴스 조작하기
인스턴스 변수의 값을 변경하는 메서드가 다른 스레드에서 의도치 않게 호출된다면, 마찬가지로 영향을 미친다.
4.2.3 부수 효과의 단점
함수의 부수 효과는 '함수가 매개변수를 전달받고, 값을 리턴하는 것' 이외에 외부 상태(인스턴스 변수 등)을 변경하는 것을 가르킨다.
상태 변경이란 함수 밖에 있는 상태를 변경하는 것을 의미한다.
- 인스턴스 변수 변경
- 전역 변수 변경
- 매개변수 변경
- 파일 읽고 쓰기 같은 I/O 조작
4.2.4 함수의 영향 범위 한정하기
함수는 아래 항목을 만족하도록 설계하는 것이 좋다.
- 상태는 매개변수로 받는다
- 상태를 변경하지 않는다.
- 같은 함수의 리턴 값으로 돌려준다.
4.2.5 불변으로 만들어서 예기치 못한 동작 막기
기능 변경 때에 의도하지 않게 부수 효과가 있는 함수가 만들어져서, 예상하지 못한 동작을 일으킬 가능성은 항상 존재하기 때문에, 인스턴스 변수에 final을 붙여서 불변으로 만드는 것이 좋다.
4.3 불변과 가변은 어떻게 다루어야 할까
4.3.1 기본적으로는 불변으로
장점
- 변수의 의미가 변하지 않으므로, 혼란을 줄일 수 있음
- 동작이 안정적이게 되므로, 결과를 예측하기 쉬움
- 코드의 영향 범위가 한정적이므로, 유지 보수가 편리해짐
4.3.2 가변으로 설계해야 하는 경우
성능이 엄청 중요한 경우는 가변으로 만드는 것이 필요할 때도 있다.
4.3.4 코드 외부와 데이터 교환은 국소화하기
'책 내용 정리 > [책] 내 코드가 그렇게 이상한가요?' 카테고리의 다른 글
12장 메서드: 좋은 클래스에는 좋은 메서드가 있다. (0) | 2023.07.28 |
---|---|
7장 컬렉션: 중첩을 제거하는 구조화 테크닉 (0) | 2023.07.27 |
6장 조건 분기: 미궁처럼 복잡한 분기 처리를 무너뜨리는 방법 (0) | 2023.07.23 |
5장 응집도: 흩어져 있는 것들 (0) | 2023.07.18 |
3장 클래스 설계: 모든 것과 연결되는 설계 기반 (0) | 2023.07.16 |
댓글