๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, service๋ฅผ ์ธํฐํ์ด์ค๋ก ๋ง๋ค์ด์ฃผ๊ณ implementsํด์ ์ฌ์ฉํ ๋๊ฐ ๋ง๋ค. ๊ทธ๋ฌ๋, ์ด๋์๊ฐ๋ถํฐ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ ๋จ์ผ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด ๊ธฐ๊ณ์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํด์๋ค๋ ์๊ฐ์ด ๋ค๋ฉฐ ํฌ์คํ ์ ์ ๋ฆฌํ๊ฒ ๋์๋ค.
์ธํฐํ์ด์ค ๊ตฌํ์ฒด Impl ์ ๋ฏธ์ฌ๋ ์ง์ํด์ผํ๋ค
ํ๊ฐ๋ฆฌ์ ํ๊ธฐ๋ฒ์ ์์ฌ
ํ๊ต๋ ๋จ์ํ ์ฝ๋ ๊ฐ๋ฐ ๋ฑ ์๊ฐ๋ณด๋ค ๊ฝค ๋ง์ ๊ณณ์์ ์์ง๊น์ง ์ด๋ฐ layout์ ๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด์๋ Impl ์ ๋ฏธ์ฌ๊ฐ ๋ถ์ ๊ฑธ ๋ณผ ์ ์๋ค. ์ด๋ ํ๊ฐ๋ฆฌ์ ํ๊ธฐ๋ฒ์ ์์ฌ๋ก, ์ง์ํด์ผ ํ๋ ํ๊ธฐ๋ฒ์ด๋ค.
์ธํฐํ์ด์ค ๋ค์ด๋ฐ ๋ฐฉ๋ฒ
์ธํฐํ์ด์ค๋ฅผ ๋ค์ด๋ฐํ ๋๋ ์ธํฐํ์ด์ค์ ์ด๋ฆ์ ๊ทธ ์๋ฏธ ์์ฒด์ ๋ฐ๋ผ ์ง์ด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด ์ ์งgo()), ํ์ง(back()), ํ์ฌ ์์น ๋ฐํ(getDistance())์ ๊ธฐ๋ฅ์ ๊ณตํต์ผ๋ก ๊ฐ๋ ์๋์ฐจ ํด๋์ค๋ฅผ ์์ฑํ๋ค๊ณ ํ์.
๊ณตํต ๊ธฐ๋ฅ์ธ ์ ์ง, ํ์ง, ํ์ฌ ์์น ๋ฐํ์ ๊ฐ๊ฐ์ ํด๋์ค๋ค์ด ๊ฐ๊ณ ์๋ ๊ฒ์ ๊ฐ์ฒด์งํฅ์ ์ด์ง ๋ชปํ ์ฝ๋์ด๋ค. ๊ฐ ๊ฐ์ฒด์์ ์ค๋ณต๋๋ ์ ์ง, ํ์ง, ํ์ฌ ์์น ๋ฐํ์ ํ์๋ฅผ ์ธํฐํ์ด์ค๋ก ์ถ์ํํ๋ ๊ฒ์ด ํ์ํ๋ค.
์ด๋ ์ธํฐํ์ด์ค์ ๋ค์ด๋ฐ์ ์๋์ฐจ์ ์์ง์์ด๋ผ๋ ํ์ ์์ฒด๋ก ๋ค์ด๋ฐ์ ํด์ผํ๋ค๋ ๊ฒ์ด๋ค.
public class CarTest {
public static void main(String[] args) {
Move avante = new AvanteCar();
Move porsche = new PorscheCar();
avante.go();
porsche.go();
porsche.back();
System.out.println("avanteCar = " + avante.getDistance()); // 10
System.out.println("porscheCar = " + porsche.getDistance()); // 90
}
}
interface Move {
void go();
void back();
int getDistance();
}
class AvanteCar implements Move {
private static final int GO_COUNT = 10;
private static final int BACK_COUNT = 5;
private int distance = 0;
@Override
public final int getDistance() {
return this.distance;
}
@Override
public final void go() {
distance += GO_COUNT;
}
@Override
public final void back() {
distance -= BACK_COUNT;
}
}
class PorscheCar implements Move {
private static final int GO_COUNT = 100;
private static final int BACK_COUNT = 10;
private int distance = 0;
@Override
public final int getDistance() {
return this.distance;
}
@Override
public final void go() {
distance += GO_COUNT;
}
@Override
public final void back() {
distance -= BACK_COUNT;
}
}
์ถ๊ฐ๋ก, Java Standard Library์์ List ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธ ArrayList, LinkedList๋ฅผ ArrayListImpl, LinkedListImpl์ด๋ผ๊ณ ๋ช ๋ช ํ์ง ์๋ ๊ฒ์ ํตํด ํ๊ฐ๋ฆฌ์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๋ค์ ํ ๋ฒ ์ ์ ์๋ค.
Impl๊ณผ ๊ฐ์ ์ ๋ฏธ์ด๋ DRY ๊ท์น์๋ ์ด๊ธ๋๋ค.
DRY ๊ท์น
DRY ๊ท์น์ด๋
DRY ๊ท์น์ Don’t Repeat Yourself์ ์ฝ์๋ก, ‘๋ฐ๋ณตํ์ง ๋ง๋ผ’๋ ๊ท์น์ด๋ค.
DRY ๊ท์น์ ์๋ฐฐ๋๋ ๋ค์ด๋ฐ ์ค์
์์์ ์ธ๊ธํ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ Impl ๊ณผ ๊ฐ์ ์ ๋ฏธ์ฌ๋ฅผ ๋ถ์ด๋ ํ์์ฒ๋ผ DTO(Data Transfer Object)์ dto ์ ๋ฏธ์ฌ๋ฅผ ๋ถ์ด๋ ์ค์๋ฅผ ๋ง์ด ํ๋ค. ๋ ๋ํ ์ง๊ธ๊น์ง DTO์ ํด๋น ์ ๋ฏธ์ฌ๋ฅผ ๋ถ์๋ค. dto์ ๋ฏธ์ฌ๋ฅผ ๋ถ์ด๋ ๋์ ํจํค์ง(package)์ ๋ฃ์์ผ๋ก์จ DRY ๊ท์น์ ๋ฐ๋ฅผ ์ ์๋ค.
์ ๋ฆฌ
๋ง์ฝ ํด๋์ค ๋ค์ Impl์ด๋ผ๋ ์ ๋ฏธ์ด๋ฅผ ๋ถ์ผ ์ ๋ฐ์ ์๋ ์ํฉ์ด๋ผ๋ฉด, ์ธํฐํ์ด์ค๋ฅผ ์ฐ๋ ๊ฒ ์์ฒด์ ๋ํด ๋ค์ ์๊ฐํด๋ณผ ํ์๊ฐ ์๋ค. ์ธํฐํ์ด์ค์ ๊ทธ๊ฒ์ ๊ตฌํํ ๋จ ํ๋์ ๊ตฌํ์ฒด๋ง ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฐ์ง ์๋ ๊ฒ์ด ๋ ๋ฐ๋์งํ ์ ์๋ค. ์ง๊ธ ๋น์ฅ ์์ฑํ๋ ์ฝ๋๋ฅผ ๋์๋ณด๊ณ refactoring ํด์ผ๊ฒ ๋ค...
์ง๊ธ๊น์ง ๋น๋นํ๊ฒ Impl์ ๋ถ์ธ ๋ด ๊ณผ๊ฑฐ๊ฐ ๋ถ๋๋ฝ๋ค
https://velog.io/@minide/Java-์ธํฐํ์ด์คInterface-๋ค์ด๋ฐ