์ฐจ๋์ ๋ฐ๋ฅธ ์ฐ๋ฃ ์ฃผ์ ์ค์ต์ ํตํด ์์๊ณผ ์ธํฐํ์ด์ค๋ฅผ ์ดํดํ๋ค.
์ฐ๋ฆฌ ํ์ฌ๋ ๋ ํฐ์นด๋ฅผ ์ด์ํ๊ณ ์๋ค. ํ์ฌ ๋ณด์ ํ๊ณ ์๋ ์ฐจ๋์ Sonata 2๋, Avante 1๋, K5 2๋๋ก ์ด 5๋์ ์ฐจ๋์ ๋ณด์ ํ๊ณ ์๋ค. ์ฐ๋ฆฌ ํ์ฌ๋ ๊ณ ๊ฐ์ด ์ธํฐ๋ท์ผ๋ก๋ถํฐ ์์ฝํ ๋ ์ฌํํ ๋ชฉ์ ์ง์ ๋๋ต์ ์ธ ์ด๋๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ ฅ ๋ฐ๋๋ค. ์ด ์ด๋๊ฑฐ๋ฆฌ๋ฅผ ํ์ฉํด ์ฐจ๋ ๋ณ๋ก ํ์ํ ์ฐ๋ฃ๋ฅผ ์ฃผ์ ํ๋ค.
์ฐจ๋ ๋ณ๋ก ์ฃผ์ ํด์ผ ํ ์ฐ๋ฃ๋์ ํ์ธํ ์ ์๋ ๋ณด๊ณ ์๋ฅผ ์์ฑํด์ผ ํ๋ค.
๊ฐ ์ฐจ๋๋ณ ์ฐ๋น๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Sonata : 10km/๋ฆฌํฐ
- Avante : 15km/๋ฆฌํฐ
- K5 : 13km/๋ฆฌํฐ
- ์์๊ณผ ์ถ์ ๋ฉ์๋๋ฅผ ํ์ฉํ๋ค.
- ์ ์๊ตฌ์ฌํญ์ if/else ์ ์ ์ฐ์ง ์๊ณ ๊ตฌํํด์ผ ํ๋ค.
์ด ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ ํ ์คํธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
์๋ ํ ์คํธ ์ฝ๋์์ ์๋์ฐจ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋์ ์ซ์๋ ์๋์ฐจ๋ก ์ฌํํ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
public class RentCompanyTest {
private static final String NEWLINE = System.getProperty("line.separator");
@Test
public void report() throws Exception {
RentCompany company = RentCompany.create(); // factory method๋ฅผ ์ฌ์ฉํด ์์ฑ
company.addCar(new Sonata(150));
company.addCar(new K5(260));
company.addCar(new Sonata(120));
company.addCar(new Avante(300));
company.addCar(new K5(390));
String report = company.generateReport();
assertThat(report).isEqualTo(
"Sonata : 15๋ฆฌํฐ" + NEWLINE +
"K5 : 20๋ฆฌํฐ" + NEWLINE +
"Sonata : 12๋ฆฌํฐ" + NEWLINE +
"Avante : 20๋ฆฌํฐ" + NEWLINE +
"K5 : 30๋ฆฌํฐ" + NEWLINE
);
}
}
ํํธ ์์์ ํ์ฉํด ๊ตฌํํด์ผ ํ๋ค. ๊ณตํต ๊ธฐ๋ฅ ๊ตฌํ์ ๋ด๋นํ Car ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค. Car ํด๋์ค์ abstract๋ฅผ ํ์ฉํ๋ค.
public abstract class Car {
/**
* ๋ฆฌํฐ๋น ์ด๋ ๊ฑฐ๋ฆฌ. ์ฆ, ์ฐ๋น
*/
abstract double getDistancePerLiter();
/**
* ์ฌํํ๋ ค๋ ๊ฑฐ๋ฆฌ
*/
abstract double getTripDistance();
/**
* ์ฐจ์ข
์ ์ด๋ฆ
*/
abstract String getName();
/**
* ์ฃผ์
ํด์ผํ ์ฐ๋ฃ๋์ ๊ตฌํ๋ค.
*/
double getChargeQuantity() {
return getTripDistance() / getDistancePerLiter();
}
}
์ธํฐํ์ด์ค๋ฅผ ์ ์ฉํด ๊ตฌํํ๋ค.