์ฐํ
์ฝ ๋ ๋ฒจ 1 ๋์ ์ฒ์์ผ๋ก ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ฒ ๋์๋ค.
์ฌ์ค TDD๋ ์ฒ์์ด๊ณ , ๋๊ตฐ๊ฐ ๋ด ์ฝ๋๋ฅผ ์ฝ๊ณ ํผ๋๋ฐฑ ๋ฐ๋ ๊ฒ ๋ํ ์ฒ์์ธ๋ฐ
์ด๋ฐ ๊ธฐํ๊ฐ ์ ๋ง ๊ฐ์ฌํ๋ฉด์๋ ๋จ๋ ธ๋ ์ฒซ ๋ฆฌ๋ทฐ ์์ฒญ์ด์๋ค ๐
์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ผ๋ ๋ด๊ฐ ๋ชจ๋ฅด๋ ๋ถ๋ถ๊ณผ ๋์ ์ค์๋ค์ ๋ช
ํํ ๋ณผ ์ ์์๋ค.
๋ํ ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๋ ๋์ ์๋ชป๋ ์ฝ๋ฉ ์ต๊ด๋ ๋ฐ๊ฒฌํ ์ ์์๋ค.
๋๋ถ์ ๊ณ ๋ฏผํ๊ณ ๊ณต๋ถํด๋ด์ผ ํ ๊ฒ๋ค์ ์ ์ ์์ด
์ ๋ง๋ก ๋์๊ฒ ๋๋ฌด๋๋ ํฐ ๋์์ด ๋์๋ค ๐โโ๏ธ
ํผ๋๋ฐฑ ๋ฐ์ ๋ถ๋ถ์์ ๊ณ์ ๋จธ๋ฆฟ ์์ ๋ฐ๊ธฐ ์ํด
๋ช ๊ฐ์ง๋ ์ ๋ฆฌํ๊ณ ๋์ด๊ฐ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ ํ๋จ์ด ๋์๋ค.
๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ๋ผ
Pattern ๊ฐ์ฒด๋ ๋น์ธ๋ค
๋๋ ์ง๊ธ๊ป ์ฌ๋ฐ๋ฅธ ์ซ์์ธ์ง, ๋ฌธ์์ธ์ง ๋ฑ์ ๊ฒ์ฆํ ๋
๋๋ถ๋ถ Pattern ๊ฐ์ฒด๋ฅผ ์ ๋ง ์๋ฌด๋ ์ง ์๊ฒ ์ฌ์ฉํ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ฐ๋ ๋ฐฉ๋ฒ์ ์ ๋ ๊ฒ ๋ฉ์๋๋ฅผ ํธ์ถ ์ ํจํด ๊ฐ์ฒด๋ฅผ ๋งค๋ฒ ์์ฑํ๋ค.
ํ์ง๋ง ์ด๋ฒ์ ์ ๋ฐ์ ์ธ ๋ฆฌ๋ทฐ๋ค์ ๋ณด๋ ์ ๊ท์์ ํ์ฉํด ๊ฐ์ ๊ฒ์ฆํ ๋ก์ง์๋
โPattern
์ ๋งค์ฐ ๋น์ผ ๊ฐ์ฒด์ด๋ค.โ ๋ผ๋ ๋ฆฌ๋ทฐ๊ฐ ๊ผญ ์์๋ค.
๋ถ๋๋ฝ์ง๋ง ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ฉด์ ์ฑ๋ฅ๊น์ง ๊ณ ๋ คํ์ง๋ ๋ชปํ๋ ๊ฒ ๊ฐ๋ค.
์ดํํฐ๋ธ ์๋ฐ item 6 ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ๋ผ
์
์ด ๊ธ์ ํ์ด์ ๋ฆฌ๋ทฐ์ ๋ฌ๋ฆฐ ๊ธ์ ๋์ ์ฐธ๊ณ ์๋ฃ๋ก ์ผ์๋ค.
Pattern ์ธ์คํด์ค๋ 1๋ฒ ์ฌ์ฉ๋๊ณ ๋ฒ๋ ค์ ธ์
๊ณง๋ฐ๋ก GC์ ๋์์ด ๋์ด ๋น์ผ ๋น์ฉ์ด ๋ ๋ค.
์ด๋ฐ Pattern ๊ฐ์ฒด๋ ํ ๋ฒ ์์ฑํ๊ณ ์ฌํ์ฉ ํ ์ ์์๊ณ
์๋์ ๊ฐ์ด ๋ฉ์๋ ํธ์ถ ์ ๋งค๋ฒ ์์ฑํ๋ ํจ์จ์ฑ ๋จ์ด์ง๋ ๋ฐฉ๋ฒ์ ๋ฒ๋ฆฌ๊ณ ,
static
๋ณ์๋ก ์ ์ธํด์ฃผ์๋ค.
public class StringCalculator {
private static final Pattern PATTERN = Pattern.compile("//(.)\n(.*)");
static์ ์ฌ์ฉํ๋ ์ด์ ๋ช ์ฌํ๊ธฐ
๋ถ๋ช
ํ static์ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํด์ ์๋ฐ ๊ธฐ๋ณธ ๊ฐ๋
์ ์ ๋ฆฌํ์๋๋ฐ
๊ตฌํ ์ค ๋ฌด๋ถ๋ณํ๊ฒ static
๋ณ์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์๋ค.
static ์ ์ฌ์ฉํ ๋ โ๋ณ์๊ฐ ์ ์ธ๋ ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํ๋ ๋ณ์์ธ๊ฐ?โ๋ฅผ ์ง๋ฌธํ์ง ์์๊ณ ,
โ์ด๋ ํ ์ธ์คํด์ค์๋ ์ํ์ง ์๋ ์ํ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฑ ํ๋๋ง ์กด์ฌํจโ์ ์ผ๋ํด๋์ง ์์ ๋ฌธ์ ์๋ค.
โCars
์ List<Car> cars
๋ ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ณ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด
๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํ๋ ๊ฐ์ด์ด์ผํ๋๊ฐ?โ๋ฅผ ์ง๋ฌธํ๋ฉด
์ ์ฝ๋๋ฅผ ๋ฏ์ด ๊ณ ์ณ์ผ ํ๋ค๋ ๊ฒ์ ๋จ๋ฒ์ ์ ์ ์๋ค.
๋ํ ํผ๋๋ฐฑ์ ๋ฐ๊ณ ๋ณด๋ ์ผ๊ธ ์ปฌ๋ ์
์ ๋ณธ ์๋๋๋ก ๊ตฌํํ์ง ๋ชปํ ๊ฒ ๊ฐ์
์ฃผ์ jojoldu๋์ ์ผ๊ธ ์ปฌ๋ ์
๊ธ์ ๋ค์ ์ ๋
ํด๋ณด์๋ค.
์ธ๊ธํ ๋ถ๋ถ์ ์ผ๊ธ ์ปฌ๋ ์ ์ ๊ฐ๋ ์ ๋์ ํ๊ณ , ์ถ๊ฐ์ ์ผ๋ก ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ณต๋ถํ๋ฉด์ ์๋์ ๊ฐ์ด ๋๋์ ์ธ ๋ฆฌํฉํ ๋ง์ ๊ฑฐ์ณค๋ค.
public class Cars {
private final List<Car> cars;
private Cars(final List<Car> cars) {
this.cars = new ArrayList<>(cars);
}
public static Cars makeFromCarNames(final List<Name> carNames) {
List<Car> cars = carNames.stream()
.map(Car::new)
.collect(Collectors.toList());
validateNonDuplicatedNames(cars);
return new Cars(cars);
}
๋ด๊ฐ โstatic์ ์ฌ์ฉํ๋ ์ด์ ๋ช
์ฌํ๊ธฐโ๋ฅผ โ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ๋ผโ์ ํ์์ ๋ฃ์ ์ด์ ๋
static ๋ฉ์๋๋, static ์์๋ง ๊ฐ๊ณ ์๋ ํด๋์ค๋ ๊ตณ์ด ์๋ก ์ธ์คํด์ค๋ก ์์ฑํ ํ์๊ฐ ์๋ค.
์ฆstatic
์ ์ํ ๊ฐ์ ๊ฐ์ง์ง ์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ํ์๊ฐ ์๋ค.
๋๋ฌธ์ ์์ฑ์๋ฅผ private
์ ๊ทผ์๋ก ๋ง์ ๋ถํ์ํ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋ง์์ผ ํ๋ค.
โ
๋ฆฌ๋ทฐ์ด๋๊ป์ ์ถ๊ฐ์ ์ผ๋ก static๊ณผ ์ผ๊ธ ์ปฌ๋ ์
์ ์ฐธ๊ณ ํ ๋งํ ๋๋ฌด๋๋ ์ ์ตํ ๊ธ์ ์ฃผ์
จ๋ค.
(์ถ๊ฐ๋ก ๊นจ๋ฌ์ ๊ฒ์ ์งค๋งํ๊ฒ ๋จ๊ธฐ์๋ฉด
static
์ ๋คํ์ฑ์ ์๋ฐํ๋ ๊ฐ์ฒด์งํฅ์์๋ ๋ฉ์ด์ง๊ฒ ๋๋ค)
๋ฆฌ๋ทฐ์ด๋์ ๋ชจ๋ ์ฝ๋ฉํธ๊ฐ ๋ด๊ฒ ํผ๊ฐ๋๊ณ ์ด์ด๋๋ค ๐ญ๐โโ๏ธ
Optional์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ
์ฃผ์ ๊ธ์ ์ฝ์ด๋ณด๊ณ ๋ฐํ๊ฐ์ด โ์์โ์ ๋ํ๋ด๋ ๊ฒ์ด ์ฃผ๋ชฉ์ ์ธ
Optional์ ์๋์ ๋ง์ง ์์ get()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ๋ค.
์ค์ค๋ก๋ Optional์ ๋ํด ์ ๋ฆฌ ํ์๋๋ฐ ๊ทธ๋ฅ ๋จ์ํ ๊ฐ๋
์ ์ ๋ฆฌํ๊ธฐ์ ๊ธ๊ธํ๋ ์ถ๊ธฐ๋ ํ๋ค.
๋ง์ํด์ฃผ์ ๋๋ก Car์ Comparable
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ
compareTo()๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ์ฌ map()
์์ ์ต๋๊ฐ์ ๊ตฌํ ์ ์๋๋ก ํ์๋ค.
public class Car implements Comparable<Car> {
private static final String REGEX_ALPHA = "^[a-zA-z]*$";
private static final String REGEX_KOREAN = "[๊ฐ-ํฃ]*$";
private static final int NAME_LENGTH_LIMIT = 5;
private static final int MOVE_PIVOT = 4;
private String name;
private int position;
public Car(final String name) {
validateName(name);
this.name = name;
}
@Override
public int compareTo(final Car anotherCar) {
return Integer.compare(this.getPosition(), anotherCar.getPosition());
}
์์ ํ ๋ฉ์๋
public Car getMaxPositionCar() {
return cars.stream()
.max(Car::compareTo)
.orElseThrow(IllegalStateException::new);
}
๊ฐ์ฒด์งํฅ์์ get์ ์ง์ํ์
์ด ๋ถ๋ถ์ ๋ฆฌ๋ทฐ์ด๋๊ณผ DM์ผ๋ก ๋๋ ์ด์ผ๊ธฐ์์ ๋ช
ํํ ๊นจ๋ซ๊ฒ ๋ ๋ถ๋ถ์ธ๋ฐ,
get ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ ๊ฐ์ฒด๊ฐ ์ด๋ค ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ์ธ๋ถ์ ์ฌ์คํ ๋๋ฌ๋๊ฒ ๋๋ค.
๋ฐ์ดํฐ๊ฐ private
์ด์ด๋ public
get์ ์ฌ์ฉํ๋ฉด ์ธ๋ถ์ ์๋ ค์ง๋ ๊ฒ์ด ๋๋ค.
์ ํผ๋๋ฐฑ ์ฝ๋์์๋ getPosition()
์ด position
์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์์ด ๋๋ฌ๋๋
์๋์ฐจ์ ์ํ๊ฐ maxPosition
์ธ์ง๋ฅผ car
๊ฐ์ฒด์์ ํ์ธํ๋๋ก ํ์๋ค.
public boolean isMaxPosition(final Car maxPositionCar) {
return this.position == maxPositionCar.getPosition();
}
๋ ๋ฐ์ผ๋ฆฌ ๋ฏธํ
๋๊ธฐ๋ค๊ณผ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค ๊นจ๋ซ๊ฒ ๋ ๊ฒ์
๋๋ ์ง๊ธ tryCount๋ผ๋ ๊ฐ์ฒด์์ ๊ฐ์ ๊บผ๋ด for
๋ฌธ์ ๋๋ ธ๋๋ฐ,
์ด๋ while
์ ์ฌ์ฉํ์ฌ tryCount์์ ๊ทธ ์ํ๋ฅผ ํ๋ณํ๋๋ก ๋ณ๊ฒฝํ์๋ค.
์์ ์
private void raceByTryCount() {
for (int i = 0; i < tryCount.getCount(); i++) {
race();
RacingCarView.printProgressResult(cars.cars());
}
}
์์ ํ
private void raceByTryCount() {
while (tryCount.isRemainCount()) {
cars.race();
RacingCarView.printProgressResult(cars.cars());
tryCount.deductCount();
}
}
HashSet์ผ๋ก Wrapper class ์ค๋ณต ์ ๊ฑฐ
Car
ํด๋์ค์ equals์ hashCode๋ฅผ ์ด๋ฏธ Override ํด๋์๋๋ฐ ์๊ธฐ๊ฒ๋ Name์ ๊บผ๋ด์์ HashSet์ผ๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ค.
(๋ง๊ทธ๋๋ก ์ด๋ฆ์ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ํ๊ฑฐ๋ค ใ
)
HashSet์ ๋ด๋ถ์ ์ผ๋ก ๋จผ์ ํด๋น ๊ฐ์ฒด์ hashCode()์ equals()๋ฅผ ์คํํด๋ณธ๋ค.
๊ด๋ จ ๋ด์ฉ์ ๋ด๊ฐ ์ด์ ์ ์ผ๋ ๊ธ์ด ์๊ธธ๋ ๊ทธ ๋ถ๋ถ์ ์ถ๊ฐ์ ์ผ๋ก ๋ ์์ฑํ๋ค.
์ด๋ฒ ํผ๋๋ฐฑ์ผ๋ก ๋๋ ์
- ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ๊ณ ๋ คํ๋ ๊ฐ๋ฐ์๊ฐ ๋์
- ์ด๋ค ๊ฐ๋ ์ ์ฌ์ฉํ ๋ ๊ทธ ์๋ฏธ์ ๋ชฉ์ ์ ๋ค์ ํ๋ฒ ๋์๊ธฐ์
- ๋ ํผ๋ฐ์ค๋ฅผ ์ฐพ์ ๊ธ์ ์ฝ์ ๋ ๋ด๊ฐ ์ป๊ณ ์ ํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ง ๋๋ฑ ๊ฐ์ ธ๊ฐ๋๊ฒ ์๋, ๊ทธ ๋ด์ฉ์ ์๋ฒฝํ ์ฒดํํ์
- ์ด ์ ์ ์ ์ ๊ณต๋ถ ๊ธ๋ค์ ๋ค์ ๋ณด๋ฉด์ ๊ทธ ๋ถ์กฑํจ์ ์ฑ์๋๊ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ๋ค.