#4-1. 재할당

재할당(파괴적 할당) : 변수에 값을 다시 할당하는 것

재할당은 변수의 의미를 바꿔 추측하기 어렵게 만듭니다.

또한 언제 어떻게 변경되었는지 추적하기 힘들게 만듭니다.

[code 4-1] 변수 tmp에 여러 번 재할당하기

int damage(){
	// 멤버의 힘과 무기 성능을 기본 공격력으로 활용합니다.
	int tmp = member.power() + member.weaponAttack();

	// 멤버의 속도로 공격력을 보정합니다.
	tmp = (int)(tmp * (1f + member.speed() / 100f));

	// 공격력에서 적의 방어력을 뺀 값을 데미지로 사용합니다.
	tmp = tmp - (int)(enemy.defence / 2);
	
	// 데미지가 음수가 되지 않게 조정합니다.
	tmp = Math.max(0, tmp);

	return tmp;
}

현재 다양한 값을 가져와 최종 데미지를 구하는 과정에서 변수 tmp는 공격력, 보정 값, 데미지 등이 계속 재할당되면서 값의 의미가 바뀝니다.

재할당의 부정적 영향

따라서 재할당의 부정적 영향을 피하기 위해 계속해서 새로운 변수를 만들어 사용한다.

#4-1-1. 불변 변수로 만들어서 재할당 막기

변수에 final 키워드를 붙임으로서 재할당을 기계적으로 막는다.

[code 4-2] 지역 변수에 final을 붙여 기계적으로 재할당 막기

void doSomething() {
	final int value = 100;
	value = 200; // 컴파일 에러
  ...
}

[code 4-3] 개별적인 불변 지역 변수를 사용하는 형태로 변경하기

int damage(){
	final int basicAttackPower = member.power() + member.weaponAttack();
	final int finalAttackPower = (int)(basicAttackPower * 
																		(1f + member.speed() / 100f));

	final int reduction = (int)(enemy.defence / 2);
	final int damage = Math.max(0, finalAttackPower - reduction);

	return damage;
}

#4-1-2. 매개변수도 불변으로 만들기