"왜 100에서 32를 빼는가?" 이 부분이 가장 헷갈리는 포인트죠. 감소형 애니메이션의 계산 원리를 단계별로 완전히 분해해서 설명해드리겠습니다.
시작값: 100 (처음 상태)
끝값: 20 (최종 상태)
방향: 감소 (100에서 20으로 줄어듦)
Q1: 100에서 20으로 가려면 얼마나 줄여야 하나?
A1: 100 - 20 = 80만큼 줄여야 함
Q2: 40% 진행됐다면 얼마나 줄어져야 하나?
A2: 80 × 0.4 = 32만큼 줄어져야 함
Q3: 현재값은 얼마인가?
A3: 100(시작) - 32(줄어든 양) = 68(현재값)
// "100에서 20으로 가려면 총 얼마나 변해야 하나?"
전체_변화량 = 시작값 - 끝값
전체_변화량 = 100 - 20 = 80
// 해석: "최대 80만큼 줄어들 수 있다"
// "현재 40% 진행되었다"
progress = 0.4 (40%)
// 해석: "전체 여행의 40%를 완료했다"
// "40% 진행되었으니, 80 중에서 얼마나 줄어졌을까?"
현재까지_줄어든_양 = 전체_변화량 × progress
현재까지_줄어든_양 = 80 × 0.4 = 32
// 해석: "지금까지 32만큼 줄어들었다"
// "원래 100이었는데, 32만큼 줄어들었으니 현재는?"
현재값 = 시작값 - 현재까지_줄어든_양
현재값 = 100 - 32 = 68
// 해석: "100에서 시작해서 32만큼 감소했으므로 현재는 68이다"
처음 잔고: 100만원
목표 잔고: 20만원 (생활비로 써서 줄이기)
총 쓸 금액: 100 - 20 = 80만원
현재 40% 진행:
├── 지금까지 쓴 돈: 80만원 × 40% = 32만원
└── 현재 잔고: 100만원 - 32만원 = 68만원
"원래 100만원에서 32만원을 썼으니까,
당연히 100 - 32 = 68만원이 남아있죠!"
// 이것이 자연스러운 계산법
100 = "시작점" (여기서부터 시작)
20 = "도착점" (여기까지 가야 함)
80 = "여행해야 할 총 거리" (100-20)
0.4 = "여행 진행률" (40% 완료)
32 = "지금까지 여행한 거리" (80×0.4)
68 = "현재 위치" (100-32)
100 ────────────────── 20
│ 32만큼 이동 │
│←──────────→│ │
시작 현재(68) 목표
현재까지_줄어든_양 = 80 × 0.0 = 0
현재값 = 100 - 0 = 100 ✓ (시작값과 동일)
현재까지_줄어든_양 = 80 × 0.5 = 40
현재값 = 100 - 40 = 60 ✓ (중간값)
현재까지_줄어든_양 = 80 × 1.0 = 80
현재값 = 100 - 80 = 20 ✓ (끝값과 동일)
// 시간 순서대로 보는 변화
시작 (0%): 현재값 = 100 - (80 × 0.0) = 100 - 0 = 100
10% 진행: 현재값 = 100 - (80 × 0.1) = 100 - 8 = 92
20% 진행: 현재값 = 100 - (80 × 0.2) = 100 - 16 = 84
30% 진행: 현재값 = 100 - (80 × 0.3) = 100 - 24 = 76
40% 진행: 현재값 = 100 - (80 × 0.4) = 100 - 32 = 68 ← 우리 예시
50% 진행: 현재값 = 100 - (80 × 0.5) = 100 - 40 = 60
...
100% 완료: 현재값 = 100 - (80 × 1.0) = 100 - 80 = 20
현재값
100│●
│ \
90 │ ●
│ \
80 │ ●
│ \
70 │ ●← 68 (40% 지점)
│ \
60 │ ●
│ \
50 │ ●
│ \
40 │ ●
│ \
30 │ ●
│ \
20 │ ●
└─────────────────────────→ progress
0% 20% 40% 60% 100%
// ❌ 직관적으로 잘못 생각하기 쉬운 것:
"100에서 20으로 가니까 100 + 뭔가 = 20?"
"아니면 100 × 뭔가 = 20?"
// ✅ 실제 올바른 계산:
"100에서 시작해서 점점 줄여나가서 20에 도달"
"줄여나간다 = 빼기 연산"
빼기를 사용하는 이유:
1. 시작값(100)이 끝값(20)보다 크다
2. 감소하는 애니메이션이다
3. "원래값 - 줄어든양 = 현재값"이 자연스럽다
시작값: 20
끝값: 100
전체_변화량: 100 - 20 = 80 (증가량)
progress = 0.4일 때:
현재까지_증가한_양 = 80 × 0.4 = 32
현재값 = 20 + 32 = 52 ← 더하기 사용!
// 증가형은 더하기, 감소형은 빼기
// 증가형 (작은 값 → 큰 값)
현재값 = 시작값 + (변화량 × progress)
현재값 = 20 + (80 × 0.4) = 52
// 감소형 (큰 값 → 작은 값)
현재값 = 시작값 - (변화량 × progress)
현재값 = 100 - (80 × 0.4) = 68
32 = "지금까지 줄어든 양"
= "원래값에서 빠진 양"
= "100에서 감소한 양"
// 따라서 100 - 32 = 현재 남아있는 양
100 = "기준점" (여기서 시작)
= "원래 상태"
= "감소가 시작되는 지점"
// 감소는 항상 기준점에서 빼는 것
function calculateCurrentValue(startValue, endValue, progress) {
console.log('=== 계산 과정 ===');
console.log('시작값:', startValue); // 100
console.log('끝값:', endValue); // 20
console.log('진행률:', progress); // 0.4
const totalChange = startValue - endValue;
console.log('전체 변화량:', totalChange); // 80
const currentChange = totalChange * progress;
console.log('현재 변화량:', currentChange); // 32
const currentValue = startValue - currentChange;
console.log('현재값:', currentValue); // 68
console.log('검증:', currentValue, '===', startValue - currentChange);
return currentValue;
}
// 실행
calculateCurrentValue(100, 20, 0.4);
=== 계산 과정 ===
시작값: 100
끝값: 20
진행률: 0.4
전체 변화량: 80
현재 변화량: 32
현재값: 68
검증: 68 === 100 - 32
"100에서 시작해서 20까지 가려고 해.
총 80만큼 줄여야 하는데, 지금 40% 진행됐어.
그러면 80의 40%인 32만큼 줄어들었겠지?
원래 100이었는데 32만큼 줄었으니까 68이야."
현재값 = 100 - 32 = 68
// 직역: "100에서 32를 뺀다"
// 의역: "원래 100이었는데 32만큼 감소했다"
// 결과: "현재는 68이다"
감소 = 줄어든다 = 원래보다 작아진다 = 빼기
"원래 상태에서 변화량을 빼면 현재 상태"
완전 이해 체크:
"100에서 32를 빼는 이유는?"
→ "100은 시작값이고, 32는 지금까지 줄어든 양이니까"
"32는 어디서 나온 건가?"
→ "전체 변화량 80에 진행률 0.4를 곱한 값"
"왜 더하기가 아니라 빼기인가?"
→ "감소하는 애니메이션이기 때문에"
🎉 이제 완전히 이해하셨나요? 100 - 32 = 68의 모든 비밀이 풀렸습니다!