You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: TDD/Ch1~4.md
+118-41
Original file line number
Diff line number
Diff line change
@@ -55,23 +55,23 @@ public void testMultiplication() {
55
55
56
56
이 코드는 지금 '빨강' 상태이다. public 필드이기도 하고, 금액 계산에 정수형을 사용하고 있다. 일단 '초록'을 보기 위해 문제사항들을 다 적어놓고 진행한다.
57
57
58
-
* $5 + 10CHF = $10(환율이 2:1일 경우)
59
-
* $5 * 2 = $10
60
-
* amount를 private으로 만들기
61
-
* Dollar 부작용?
62
-
* Money 반올림?
58
+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
59
+
> * $5 * 2 = $10
60
+
> * amount를 private으로 만들기
61
+
> * Dollar 부작용?
62
+
> * Money 반올림?
63
+
>
63
64
64
65
65
66
66
67
컴파일이 되게 만드려면 다음과 같은 컴파일에러를 해결해야한다.
67
68
68
-
> 1. Dollar 클래스가 없음
69
-
>
70
-
> 2. 생성자가 없음
71
-
>
72
-
> 3. times(int) 메서드가 없음
73
-
>
74
-
> 4. amount 필드가 없음
69
+
1. Dollar 클래스가 없음
70
+
2. 생성자가 없음
71
+
72
+
3. times(int) 메서드가 없음
73
+
74
+
4. amount 필드가 없음
75
75
76
76
77
77
@@ -160,11 +160,13 @@ void times(int multiplier){
160
160
161
161
162
162
163
-
* $5 + 10CHF = $10(환율이 2:1일 경우)
164
-
*~~$5 * 2 = $10~~
165
-
* amount를 private으로 만들기
166
-
***Dollar 부작용?**
167
-
* Money 반올림?
163
+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
164
+
> *~~$5 * 2 = $10~~
165
+
> * amount를 private으로 만들기
166
+
> ***Dollar 부작용?**
167
+
> * Money 반올림?
168
+
169
+
168
170
169
171
다섯가지 문제 사항 중 4번에 집중해보자.
170
172
@@ -248,13 +250,13 @@ Dollar 객체와 같이 객체를 값처럼 쓸 수 있는데, 이를 __값 객
248
250
249
251
값 객체를 사용했을 때 기억 할 점은 2장에서 다루었던 것과 마찬가지로, 모든 연산이 새 객체를 반환해야 한다는 점과, `equals()` 를 구현해야 한다는 점이다. 만약 Dollar를 해시 테이블의 키로 쓸 것이라면 `equals()` 를 구현할 때 `hashCode()` 도 만들어야 하지만, 일단 그것은 나중에 생각하기로 한다.
250
252
251
-
* $5 + 10CHF = $10(환율이 2:1일 경우)
252
-
*~~$5 * 2 = $10~~
253
-
* amount를 private으로 만들기
254
-
*~~Dollar 부작용?~~
255
-
* Money 반올림?
256
-
*__equals()__
257
-
* hashCode()
253
+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
254
+
> *~~$5 * 2 = $10~~
255
+
> * amount를 private으로 만들기
256
+
> *~~Dollar 부작용?~~
257
+
> * Money 반올림?
258
+
> *__equals()__
259
+
> * hashCode()
258
260
259
261
260
262
@@ -318,13 +320,13 @@ public boolean equals(Object object){
318
320
319
321
320
322
321
-
* $5 + 10CHF = $10(환율이 2:1일 경우)
322
-
*~~$5 * 2 = $10~~
323
-
* amount를 private으로 만들기
324
-
*~~Dollar 부작용?~~
325
-
* Money 반올림?
326
-
*~~equals()~~
327
-
* hashCode()
323
+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
324
+
> *~~$5 * 2 = $10~~
325
+
> * amount를 private으로 만들기
326
+
> *~~Dollar 부작용?~~
327
+
> * Money 반올림?
328
+
> *~~equals()~~
329
+
> * hashCode()
328
330
329
331
330
332
@@ -340,20 +342,95 @@ __값 객체 두개를 비교하도록 하는 동일성 문제__ 는 해결되
340
342
341
343
342
344
343
-
* $5 + 10CHF = $10(환율이 2:1일 경우)
344
-
*~~$5 * 2 = $10~~
345
-
* amount를 private으로 만들기
346
-
*~~Dollar 부작용?~~
347
-
* Money 반올림?
348
-
*~~equals()~~
349
-
* hashCode()
350
-
* Equal null
351
-
* Equal object
345
+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
346
+
> *~~$5 * 2 = $10~~
347
+
> * amount를 private으로 만들기
348
+
> *~~Dollar 부작용?~~
349
+
> * Money 반올림?
350
+
> *~~equals()~~
351
+
> * hashCode()
352
+
> * Equal null
353
+
> * Equal object
352
354
353
355
354
356
355
357
3장에서 다룬 내용은 다음과 같다.
356
358
357
359
* 값 객체를 사용한다면 새로운 오퍼레이션을 구현해야한다( 여기서는 `equals()`)
358
360
* 해당 오퍼레이션을 테스트하고, 간단히 구현한다.
359
-
* 삼각 측량법에 따라 두 경우를 모두 수용할 수 있을 정도로 리팩토링한다.
361
+
* 삼각 측량법에 따라 두 경우를 모두 수용할 수 있을 정도로 리팩토링한다.
362
+
363
+
364
+
365
+
---
366
+
367
+
# 4장 프라이버시
368
+
369
+
> * $5 + 10CHF = $10(환율이 2:1일 경우)
370
+
> *~~$5 * 2 = $10~~
371
+
> ***amount를 private으로 만들기**
372
+
> *~~Dollar 부작용?~~
373
+
> * Money 반올림?
374
+
> *~~equals()~~
375
+
> * hashCode()
376
+
> * Equal null
377
+
> * Equal object
378
+
379
+
380
+
381
+
```java
382
+
publicvoid testMultiplication(){
383
+
Dollar five =newDollar(5);
384
+
Dollar product = five.times(2);
385
+
assertEquals(10, product.amount);
386
+
product = five.times(3);
387
+
asssertEquals(15, product.amount);
388
+
}
389
+
```
390
+
391
+
392
+
393
+
`Dollar.times()` 연산은 호출받은 Dollar 객체 값에 인자로 받은 곱수만큼 곱한 값을 갖는 Dollar를 반환해야 한다. 그럼 `assertEquals()` 에서 불필요한 부분을 리팩토링 해볼 수 있다.
394
+
395
+
396
+
397
+
```java
398
+
publicvoid testMultiplication(){
399
+
Dollar five =newDollar(5);
400
+
assertEquals(newDollar(10, five.times(2));
401
+
assertEquaals(newDollar(15). five.times(3));
402
+
}
403
+
```
404
+
405
+
406
+
407
+
불필요한 product 변수를 걷어냈으므로, Dollar의 amount 변수를 public에서 사용하지 않아도 되게 되었다. 따라서, amount 변수를 private으로 선언할 수 있다.
408
+
409
+
410
+
411
+
```java
412
+
privateint amount;
413
+
```
414
+
415
+
416
+
417
+
>* $5+ 10CHF = $10(환율이 2:1일 경우)
418
+
>*~~$5*2= $10~~
419
+
>*~~amount를 private으로 만들기~~
420
+
>*~~Dollar 부작용?~~
421
+
>*Money 반올림?
422
+
>*~~equals()~~
423
+
>* hashCode()
424
+
>*Equalnull
425
+
>*Equal object
426
+
427
+
428
+
429
+
한 가지를 해결했지만, 주의할 점이 있다.3장에서 만들었던 `equals()` 라는 동치성 테스트가 제대로 작동하지 않는다면, 새로 조정한 테스트코드가 정확하게 작동한다는 것을 보장할 수 없다는 것이다. equals가 두 값 객체를 올바르게 비교한다는 가정 하에 `10` 과 `product.amount` 를 걷어낸 것이기 때문이다.
430
+
431
+
이번 장에서 배운것은 다음과 같다.
432
+
433
+
* 개발된 기능은 테스트의 개선을 위해서만 사용했다.( `Dollar.times()` )
434
+
* 두 테스트가 동시에 실패하면, 망한다.( `equals()` 가 제대로 안 만들어졌다면 망할 것이다)
435
+
* 위험요소가 있음에도 계속 진행한다.(그럼에도 불구하고 테스트코드를 짰다면 코드는 전진한다)
436
+
* 테스트와 코드 사이에 결합도를 낮추기 위해, 테스트하는 객체의 새 기능을 사용했다.-> 테스트코드에서 `amount` 를 사용했기 때문에 `amount` 를 private 변수로 만들 수 없다면, 테스트와 코드가 너무 결합된 것이다. 따라서 `Dollar.times()` 의 새 기능(값 객체를 반환)을 활용하여 결합도를 낮추었다.
0 commit comments