๐ ๋ชฉ์ฐจ.
6. ๊ฐ์ฒด์ ์๋ฃ๊ตฌ์กฐ
.์๋ฃ ์ถ์ํ
.์๋ฃ/๊ฐ์ฒด ๋น๋์นญ
.๋๋ฏธํฐ ๋ฒ์น
.์ง์ค ๊ตฌ์กฐ
.์๋ฃ ์ ๋ฌ ๊ฐ์ฒด
.ํ์ฑ ๋ ์ฝ๋
.๊ฒฐ๋ก
โ๏ธ ๋ด์ฉ.
6. ๊ฐ์ฒด์ ์๋ฃ๊ตฌ์กฐ
๋ณ์๋ฅผ ๋น๊ณต๊ฐ(private)๋ก ์ ์ํ๋ ์ด์ ๊ฐ ์๋ค. ๋จ๋ค์ด ๋ณ์์ ์์กดํ์ง ์๊ฒ ๋ง๋ค๊ณ ์ถ์ด์๋ค. ๊ทธ๋ ๋ค๋ฉด ์กฐํ(get) , ์ค์ (set) ํจ์๋ฅผ ๋น์ฐํ๊ฒ ๊ณต๊ฐ(public)ํด ๋น๊ณต๊ฐ ๋ณ์๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ ๊น?
.์๋ฃ ์ถ์ํ
๋ณ์ ์ฌ์ด์ ํจ์๋ผ๋ ๊ณ์ธต์ ๋ฃ๋๋ค๊ณ ๊ตฌํ์ด ์ ์ ๋ก ๊ฐ์ถฐ์ง์ง๋ ์๋๋ค. ๊ตฌํ์ ๊ฐ์ถ๋ ค๋ฉด ์ถ์ํ๊ฐ ํ์ํ๋ค. ๊ทธ์ get/set ํจ์๋ก ๋ณ์๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ํด๋์ค๊ฐ ๋์ง ์๋๋ค.
๊ทธ๋ณด๋ค๋ ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํด ์ฌ์ฉ์๊ฐ ๊ตฌํ์ ๋ชจ๋ฅธ ์ฑ ์๋ฃ์ ํต์ฌ์ ์กฐ์ํ ์ ์์ด์ผ ์ง์ ํ ์๋ฏธ์ ํด๋์ค๋ค.
์๋์ ์์ ๋ชจ๋ ์๋ฃ๋ฅผ ์ธ์ธํ๊ณ ๊ณต๊ฐํ๋ ๊ฒ๋ณด๋ค๋ ์ถ์์ ์ธ ๊ฐ๋
์ผ๋ก ํํํ๋ ํธ์ด ์ข๋ค.
์ธํฐํ์ด์ค๋ get/set ๋ง์ผ๋ก๋ ์ถ์ํ๊ฐ ์ด๋ค์ง์ง ์๋๋ค. ๊ฐ๋ฐ์๋ ๊ฐ์ฒด๊ฐ ํฌํจํ๋ ์๋ฃ๋ฅผ ํํํ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฌ๊ฐํ๊ฒ ๊ณ ๋ฏผํด์ผ ํ๋ค. ์๋ฌด ์๊ฐ ์์ด get/set์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ๋์๋ค.
// X
public class Point {
public double x;
public double y;
}
// O
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
// X
public interface Vehicle {
double getFuelTankCapacityInGallons();
double getGallosOfGasoline();
}
// O
public interface Vehicle {
double getPercentFueRemaining();
}
.์๋ฃ/๊ฐ์ฒด ๋น๋์นญ
์์ ๋ ์์ ๋ ๊ฐ์ฒด์ ์๋ฃ ๊ตฌ์กฐ ์ฌ์ด์ ๋ฒ์ด์ง ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋ค.
- ๊ฐ์ฒด๋ ์ถ์ํ ๋ค๋ก ์๋ฃ๋ฅผ ์จ๊ธด ์ฑ ์๋ฃ๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ง ๊ณต๊ฐํ๋ค.
- ์๋ฃ๊ตฌ์กฐ๋ ์๋ฃ๋ฅผ ๊ทธ๋๋ก ๊ณต๊ฐํ๋ฉฐ ๋ณ๋ค๋ฅธ ํจ์๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
๊ฐ์ฒด์ ์๋ฃ๊ตฌ์กฐ ๋ ์ ์๋ ๋ณธ์ง์ ์ผ๋ก ์๋ฐ๋๋ค.
(์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋) ์ ์ฐจ์ ์ธ ์ฝ๋๋ ๊ธฐ์กด ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ํจ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค.
๋ฐ๋ฉด, ๊ฐ์ฒด ์งํฅ ์ฝ๋๋ ๊ธฐ์กด ํจ์๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค.
๋ฐ๋๋ก๋
์ ์ฐจ์ ์ธ ์ฝ๋๋ ์๋ก์ด ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ๋ชจ๋ ํจ์๋ฅผ ๊ณ ์ณ์ผ ํ๋ค.
๊ฐ์ฒด ์งํฅ ์ฝ๋๋ ์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ๋ชจ๋ ํด๋์ค๋ฅผ ๊ณ ์ณ์ผ ํ๋ค.
์ฆ, ์๋ก์ด ์๋ฃ ํ์
์ด ํ์ํ ๊ฒฝ์ฐ ํด๋์ค์ ๊ฐ์ฒด ์งํฅ ๊ธฐ๋ฒ, ์๋ก์ด ํจ์๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ์ฐจ์ ์ธ ์ฝ๋์ ์๋ฃ๊ตฌ์กฐ๊ฐ ์ ํฉํ๋ค. ๋ถ๋ณ ์๋ ํ๋ก๊ทธ๋๋จธ๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด๋ผ๋ ์๊ฐ์ด ๋ฏธ์ ์์ ์ ์๋ค. ๋๋ก๋ ๋จ์ํ ์๋ฃ ๊ตฌ์กฐ์ ์ ์ฐจ์ ์ธ ์ฝ๋๊ฐ ๊ฐ์ฅ ์ ํฉํ ์ํฉ๋ ์๋ค.
๋ชจ๋์ ์์ ์ด ์กฐ์ํ๋ ๊ฐ์ฒด์ ์์ฌ์ ์ ๋ชฐ๋ผ์ผ ํ๋ค.
๋๋ฏธํฐ ๋ฒ์น
๊ฐ์ฒด๋ ์๋ฃ๋ฅผ ์จ๊ธฐ๊ณ ํจ์๋ฅผ ๊ณต๊ฐํ๋ค. ์ฆ, ๊ฐ์ฒด๋ ์กฐํ ํจ์๋ก ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ณต๊ฐํ๋ฉด ์ ๋๋ค.
์ข ๋ ๋ช
ํํ ํํํ๋ฉด ๋๋ฏธํฐ ๋ฒ์น์ "ํด๋์ค C์ ๋ฉ์๋ f๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ํธ์ถํด์ผ ํ๋ค"๋ผ๊ณ ์ฃผ์ฅํ๋ค.
- ํด๋์ค C
- f ๊ฐ ์์ฑํ ๊ฐ์ฒด
- f ์ธ์๋ก ๋์ด์จ ๊ฐ์ฒด
- C ์ธ์คํด์ค ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ฒด
class C {
prviate A a;
public void cMethod(){
...
}
public void f(Param param){
cMethod(); // ํด๋์ค C ๋ฉ์๋
B b = new B();
b.bMethod(); // f๊ฐ ์์ฑํ ๊ฐ์ฒด(b) ๋ฉ์๋
param.paramMethod(); // ์ธ์๋ก ๋์ด์จ ๊ฐ์ฒด(param) ๋ฉ์๋
a.aMethod(); // C ์ธ์คํด์ค ๋ณ์(a)์ ์ ์ฅ๋ ๋ฉ์๋
}
}
- ๊ธฐ์ฐจ ์ถฉ๋
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
์์ ๊ฐ์ ์ฝ๋๋ฅผ ๊ธฐ์ฐจ ์ถฉ๋์ด๋ผ ๋ถ๋ฅธ๋ค. ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ํ ์ค๋ก ์ด์ด์ง ๊ธฐ์ฐจ๋ก ๋ณด์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ์กฐ์กํ๋ค ์ฌ๊ฒจ์ง๋ ๋ฐฉ์์ผ๋ก ํผํ๋ ํธ์ด ์ข๋ค.
๋ค์๊ณผ ๊ฐ์ด ๋๋๋ ํธ์ด ์ข๋ค.
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
์ ์์ ๊ฐ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋์ง ์ฌ๋ถ๋ ctxt, Options, ScratchDIr์ด ๊ฐ์ฒด์ธ์ง ์๋๋ฉด ์๋ฃ๊ตฌ์กฐ์ธ์ง์ ๋ฌ๋ ค์๋ค.
- ๊ฐ์ฒด์ผ ๊ฒฝ์ฐ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์จ๊ฒจ์ผ ํ๋ฏ๋ก ํ์คํ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐฐํ๋ค.
- ์๋ฃ ๊ตฌ์กฐ๋ผ๋ฉด ๋น์ฐํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ ธ์ถํ๋ฏ๋ก ๋๋ฏธํฐ ๋ฒ์น์ด ์ ์ฉ๋์ง ์๋๋ค.
์ ์์ ๊ฐ get ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋์ ํผ๋์ ์ผ์ผํค๊ฒ ๋ ๊ฒฝ์ฐ์ด๋ค.
์๋์ ๊ฐ์ด ๊ตฌํํ ๊ฒฝ์ฐ ์๋ฃ ๊ตฌ์กฐ๋ก ํ๋จํ๊ณ ๋๋ฏธํฐ ๋ฒ์น ๊ฑฐ๋ก ์ด ํ์๊ฐ ์์ด์ง๋ค.
final String outputDir = ctxt.options.scratchDir.absolutePath; // ์๋ฃ ๊ตฌ์กฐ
์๋ฃ ๊ตฌ์กฐ๋ ๋ฌด์กฐ๊ฑด ํจ์ ์์ด ๊ณต๊ฐ ๋ณ์๋ง ํฌํจํ๊ณ ๊ฐ์ฒด๋ ๋น๊ณต๊ฐ ๋ณ์์ ๊ณต๊ฐ ํจ์๋ฅผ ํฌํจํ๋ค๋ฉด? ๊ฐ๋จํด์ง๋ค.
ํ์ง๋ง ๋จ์ํ ์๋ฃ ๊ตฌ์กฐ์๋ get/set์ ์ ์ํ๋ผ ์๊ตฌํ๋ ํ๋ ์์ํฌ์ ํ์ค(์, Bean)์ด ์กด์ฌํ๋ค.
.์ง์ค ๊ตฌ์กฐ
์์ ์๊ธฐ๋ค๋ก์๋ฃ๊ตฌ์กฐ์ ๊ฐ์ฒด๊ฐ ๋ฐ๋ฐ ์์ธ ์ก์ข ๊ตฌ์กฐ๊ฐ ๋์ค๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ. ์ด๋ฌํ ๊ตฌ์กฐ๋ ํจ์๋ ๋ฌผ๋ก ์ด๊ณ ์๋ฃ๊ตฌ์กฐ๋ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค. ์์ชฝ์ ๋จ์ ๋ง ๋ชจ์๋๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ก์ข ๊ตฌ์กฐ๋ ๋๋๋ก ํผํ๋ ํธ์ด ์ข๋ค.
.์๋ฃ ์ ๋ฌ ๊ฐ์ฒด
์๋ฃ ๊ตฌ์กฐ์ฒด์ ์ ํ์ ์ธ ํํ๋ ๊ณต๊ฐ ๋ณ์๋ง ์๊ณ ํจ์๊ฐ ์๋ ํด๋์ค๋ค. DTO๋ผ๊ณ ๋ถ๋ฆฐ๋ค. ์ฃผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๊ฑฐ๋ ์์ผ์์ ๋ฐ์ ๋ฉ์์ง์ ๊ตฌ๋ฌธ์ ๋ถ์ํ ๋ ์ ์ฉํ๋ค. ํํ DTO๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ์ฅ๋ ๊ฐ๊ณต๋์ง ์์ ์ ๋ณด๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ฌ์ฉํ ๊ฐ์ฒด๋ก ๋ณํํ๋ ์ผ๋ จ์ ๋จ๊ณ์์ ๊ฐ์ฅ ์ฒ์์ผ๋ก ์ฌ์ฉํ๋ ๊ตฌ์กฐ์ฒด๋ค.
์ข ๋ ์ผ๋ฐ์ ์ธ ํํ๋ '๋น Bean' ๊ตฌ์กฐ๋ค.
๋น์ ๋น๊ณต๊ฐ(private) ๋ณ์๋ฅผ get/set ํจ์๋ก ์กฐ์ํ๋ค. ์ผ์ข
์ ์ฌ์ด๋น ์บก์ํ๋ก ๋ณ๋ค๋ฅธ ์ด์ต์ ์ ๊ณตํ์ง ์๋๋ค.
.ํ์ฑ ๋ ์ฝ๋
ํ์ฑ ๋ ์ฝ๋๋ DTO์ ํน์ํ ํํ๋ค. ๊ณต๊ฐ(public) ๋ณ์ or ๋น๊ณต๊ฐ(private) ๋ณ์์ get/set์ด ์๋ ์๋ฃ ๊ตฌ์กฐ์ง๋ง, ๋๊ฒ save๋ find์ ๊ฐ์ ํ์ ํจ์๋ ์ ๊ณตํ๋ค. ํ์ฑ ๋ ์ฝ๋๋ DB Table์ด๋ ๋ค๋ฅธ ์์ค์์ ์๋ฃ๋ฅผ ์ง์ ๋ณํํ ๊ฒฐ๊ณผ์ด๋ค.
ํ์ฑ ๋ ์ฝ๋์ ๋น์ฆ๋์ค ๊ท์น ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ๋ฐ๋์งํ์ง ์๋ค. ์์ ๋งํ ์ก์ข
๊ตฌ์กฐ๊ฐ ๋ ๋ฟ์ด๋ค.
ํ์ฑ ๋ ์ฝ๋๋ ์๋ฃ ๊ตฌ์กฐ๋ก ์ทจ๊ธํ๋ค. ๋น์ฆ๋์ค ๊ท์น์ ๋ด์ผ๋ฉด์ ๋ด๋ถ ์๋ฃ๋ฅผ ์จ๊ธฐ๋ ๊ฐ์ฒด๋ ๋ฐ๋ก ์์ฑํ๋ค. (์ฌ๊ธฐ์ ๋ด๋ถ ์๋ฃ๋ ํ์ฑ ๋ ์ฝ๋์ ์ธ์คํด์ค์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค)
.๊ฒฐ๋ก
- ๊ฐ์ฒด๋ ๋์์ ๊ณต๊ฐํ๊ณ ์๋ฃ๋ฅผ ์จ๊ธด๋ค. ๊ธฐ์กด ๋์์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์ ๊ฐ์ฒด ํ์ ์ ์ถ๊ฐํ๊ธฐ๋ ์ฌ์ด ๋ฐ๋ฉด, ๊ธฐ์กด ๊ฐ์ฒด์ ์ ๋์์ ์ถ๊ฐํ๊ธฐ๋ ์ด๋ ต๋ค.
- ์๋ฃ๊ตฌ์กฐ๋ ๋ณ๋ค๋ฅธ ๋์ ์์ด ์๋ฃ๋ฅผ ๋ ธ์ถํ๋ค. ์ ๋์์ ์ถ๊ฐํ๊ธฐ๋ ์ฌ์ฐ๋, ๊ธฐ์กด ํจ์์ ์ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ ์ด๋ ต๋ค.
์๋ก์ด ์๋ฃ ํ์
์ถ๊ฐ -> ๊ฐ์ฒด
์๋ก์ด ๋์ ์ถ๊ฐ -> ์๋ฃ๊ตฌ์กฐ
ํธ๊ฒฌ์ ๊ฐ์์ง ๋ง๊ณ ๋ฌธ์ ์ ์ต์ ์ธ ํด๊ฒฐ์ฑ
์ ์ ํํ์.
๐ ๋๋์ .
- ๊ฐ์ฒด์ ์๋ฃ๊ตฌ์กฐ์ ์ฐจ์ด์ ๊ณผ ๊ฐ๊ฐ์ ์ ์ ํ ์ฌ์ฉ๋ฒ์ ์๊ฒ ๋์๋ค.
- ๋๋ฏธํฐ์ ๋ฒ์น์ ์ค์ํ๋ฉด ์ข ๋ ๊น๋ํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ๋ค.
'Study > CleanCode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Study][CleanCode - 2] 8. ๊ฒฝ๊ณ (0) | 2022.07.16 |
---|---|
[Study][CleanCode - 2] 7. ์ค๋ฅ ์ฒ๋ฆฌ (0) | 2022.07.16 |
[Study][CleanCode - 2] 5. ํ์ ๋ง์ถ๊ธฐ (0) | 2022.07.13 |
[Study][CleanCode - 1] 4. ์ฃผ์ (0) | 2022.07.11 |
[Study][CleanCode - 1] 3. ํจ์ (0) | 2022.07.01 |