์ฐ๋ฆฌ๋ private
์ ํตํด ๋ณ์๋ฅผ ์์ฃผ ์ ์ํ๋ค. ์ด๋ ๊ฒ ํ๋ ์ด์ ๋ ๋จ๋ค์ด ๋ณ์์ ์์กดํ์ง ์๋๋ก ๋ง๋ค๊ณ ์ถ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ get
, set
ํจ์๋ฅผ ๋น์ฐํ๊ฒ ์ธ๋ถ์ ๋
ธ์ถํ๋ ์ค๋ฅ๋ฅผ ๋ฒํ๋ค.
์๋ฃ ์ถ์ํ
// ๊ตฌ์ฒด์ ์ธ Point ํด๋์ค
public class Point {
public double x;
public double y;
}
์ด ๊ฒฝ์ฐ public
์ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ์ ์ผ๋ก ๊ฐ์ ์ฝ๊ณ ์ค์ ํ๋๋ก ๊ฐ์ ํ๋ค. ๋ Point๋ฅผ ๋ํ๋ด๋ ๋ฐฉ๋ฒ ์ค ํ๋์ธ ์ง๊ต์ขํ๊ณ๋ฅผ ์ฌ์ฉํจ์ ์์ฐ์ค์ ๋ดํฌํ๊ณ ์๋ค. ๊ทธ๋ผ ๋ง์ฝ ์ฌ๊ธฐ์ get
, set
์ ๊ดํ ํจ์๋ง ์ ๊ณตํ๊ณ ๋ณ์๋ฅผ private
ํ๊ฒ ๋ง๋ค๋ฉด ๊ฐ์ถฐ์ง๋ ๊ฑธ๊น? ์๋๋ค. ์ฌ์ ํ ๊ตฌํ ์ฌํญ์ ์ธ๋ถ๋ก ๋
ธ์ถํ๋ ์
์ด๋ค. ๋ณ์ ์ฌ์ด์ ํจ์๋ผ๋ ๊ณ์ธต์ ๋ฃ๋๋ค๊ณ ๊ตฌํ์ด ๊ฐ์ถฐ์ง์ง๋ ์๋๋ค. ๊ตฌํ์ ๊ฐ์ถ๋ ค๋ฉด ์ถ์ํ๊ฐ ํ์ํ๋ค.
// ์ถ์์ ์ธ Point ํด๋์ค
public interface Point {
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
์ ์๊ฐ ์ํ๋ class๋ ์ด์ ๊ฐ์ ๋ฐฉ์์ด๋ค. ์ถ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ ์ฌ์ฉ์๊ฐ ๊ตฌํ์ ๋ชจ๋ฅธ์ฒด ์๋ฃ์ ํต์ฌ์ ์กฐ์ํ ์ ์์ด์ผ ํ๋ค. ์ ๊ฐ์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์ ์ฅ์์๋ ๊ตฌํ์ด ์ง๊ต์ขํ๊ณ๋ก ๋์ด ์๋์ง ๊ทน์ขํ๊ณ๋ก ๋์ด์๋์ง ์ ๋ฐฉ๋ฒ์ด ์๋ค.
// ๊ตฌ์ฒด์ ์ธ Vehicle ํด๋์ค
public interface Vehicle {
double getFuelTankCapacityInGallons();
double getGallonsOfGasoline();
}
๋ ํจ์๋ฅผ ๋ณด๋ฉด, ๊ทธ๋ฅ ๊ตฌํ๋์ด ์๋ ๊ฐ์ ์ฝ์ด์ ๋ฐํํ๊ณ ์์์ ์ง๊ด์ ์ผ๋ก ํ์ธํ ์ ์๋ค. (๋ฌผ๋ก ์๋์๋ ์์ง๋ง ๋ณ์๋ช ๋ง ๋ณด์์ ๋ ๊ทธ๋ฌํ๋ค๋ ์๊ธฐ)
// ์ถ์์ ์ธ Vehicle ํด๋์ค
public interface Vehicle {
double getPercentFuelRemaining();
}
๋ฐ๋ฉด ์ด ๊ฒฝ์ฐ Percent๋ผ๋ ์ถ์์ ์ธ ๊ฐ๋ ์ผ๋ก ์๋ ค์ฃผ๊ณ ์๋ค. ์ด ๊ฒฝ์ฐ, ์ ๋ณด๊ฐ ์ด๋์ ์ค๋์ง ์ฌ์ฉ์ ์ธก์์๋ ์ ๋ฐฉ๋ฒ์ด ์๋ค.
์์ฝ
- ์๋ฃ๋ฅผ ์ธ์ธํ ๊ณต๊ฐํ๋ ๊ฒ๋ณด๋ค, ๊ฐ๋ ์ ๋ดํฌํ๋ ์ถ์ํ๋ฅผ ํตํด ํํํด๋ผ.
- ์ด ๊ณผ์ ์์ ๋จ์ํ ์ธํฐํ์ด์ค๋ ์กฐํ/์ค์ ํจ์๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ์ถ์ํ๋ฅผ ์ด๋ฃฐ ์ ์๋ค.
- ์๋ฌด ์๊ฐ ์์ด ์กฐํ/์ค์ ํจ์๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋์๋ค.
์๋ฃ / ๊ฐ์ฒด ๋น๋์นญ
์๋ฃ ์ถ์ํ ์ ์์ ๋ฐ์ํ ๋ฌธ์ ์ ๋ณธ์ง์ ๋ฌด์์ผ๊น? ์ด๋ ์๋ฃ ๊ตฌ์กฐ์ ๊ฐ์ฒด์ ์ฐจ์ด๋ฅผ ๊ตฌ๋ถํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์๋ฃ ๊ตฌ์กฐ์ ๊ฐ์ฒด์ ํน์ง๋ถํฐ ์์๋ณด๋ ๊ฒ์ด ์์์ ๋ง์ ๊ฒ์ด๋ค.
- ์๋ฃ๊ตฌ์กฐ
- ์๋ฃ๋ฅผ ๊ทธ๋๋ก ๊ณต๊ฐํ๋ฉฐ ๋ณ๋ค๋ฅธ ํจ์๋ ์ ๊ณตํ์ง ์๋๋ค.
- ๊ฐ์ฒด
- ์ถ์ํ ๋ค๋ก ์๋ฃ๋ฅผ ์จ๊ธด ์ฑ ์๋ฃ๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ง ๊ณต๊ฐํ๋ค.
์ฆ, ์๋ฃ๊ตฌ์กฐ์ ๊ฒฝ์ฐ ์๋ฃ์ ์ง์คํ๊ณ , ๊ฐ์ฒด์ ๊ฒฝ์ฐ ํจ์์ ์ง์คํ๋ค๋ ๋ง์ด๋ค. ์ด๋ ๊ฒ ๋ณด๋ ๋ ๊ฐ๋ ์ ๊ต์ฅํ ์๋ฐ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
// ์ ์ฐจ์ ์ธ ๋ํ
public class Square {
public Point topLeft;
public double side;
}
public class Rectangle {
public Point topLeft;
public double height;
public double width;
}
public class Circle {
public Point center;
public double radius;
}
public class Geometry {
public final double PI = 3.141592653589793;
public double area(Object shape) throws NoSuchShapeException {
if (shape instanceof Square) {
Square s = (Square)shape;
return s.side * s.side;
} else if (shape instanceof Rectangle) {
Rectangle r = (Rectangle)shape;
return r.height * r.width;
} else if (shape instanceof Circle) {
Circle c = (Circle)shape;
return PI * c.radius * c.radius;
}
throw new NoSuchShapeException();
}
}
์ด ์ฝ๋๋ ์๋ฃ ๊ตฌ์กฐ์ ์
์ฅ์์ ๊ฐ ๋ค๊ฐํ์ ๋์ด๋ฅผ ๊ตฌํ๋ ์ฝ๋๋ฅผ ๊ตฌํํด ๋ณธ ๊ฒ์ด๋ค. ์๋ฃ ๊ตฌ์กฐ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ค ๋ณด๋ ๊ฐ์ ๋ํด ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๊ณ , ํจ์๋ ๋ง๋ค์ง ์์๋ค. ์ด ๊ฒฝ์ฐ, area
๋ผ๋ ๋์์ ํ๊ธฐ ์ํด์๋ if
๋ฌธ์ ํตํด ์ ์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
๋ง์ฝ ๋๋ ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ perimeter()
ํจ์๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ์ด๋จ๊น? Geometry
๋ด๋ถ์ ํ๋์ ํจ์๋ฅผ ์๋ก ๋ง๋ค๊ธฐ๋ง ํ๋ฉด ๋์ด๋ค. ๊ธฐ์กด ์๋ฃ๊ตฌ์กฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์๋ ์๋ก์ด ๋ํ์ธ ์ค๊ฐํ์ ๋ฃ์ด๋ณธ๋ค๊ณ ์๊ฐํด๋ณด์. ์ด ๊ฒฝ์ฐ์๋ Geometry
์ ์ํ ๋ชจ๋ ํจ์๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๋ค.
// ๋คํ์ ์ธ ๋ํ
public class Square implements Shape {
private Point topLeft;
private double side;
public double area() {
return side * side;
}
}
public class Rectangle implements Shape {
private Point topLeft;
private double height;
private double width;
public double area() {
return height * width;
}
}
public class Circle implements Shape {
private Point center;
private double radius;
public final double PI = 3.141592653589793;
public double area() {
return PI * radius * radius;
}
}
์ด๋ฒ์๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ค์ด ๋ณด์๋ค. ๋ณ์๋ฅผ ๊ฐ์ถ์๊ณ , ํจ์๋ก๋ง ์ธ๋ถ์์ ์ฌ์ฉ๊ฐ๋ฅํ๋๋ก ์ด์ด์ฃผ์๋ค.
perimeter()
์ถ๊ฐ๋ฅผ ์ํ๋ค๋ฉด ๋ชจ๋ ํด๋์ค์ ํด๋น ํจ์๋ฅผ ๊ตฌํํด์ฃผ์ด์ผ ํ๋ค. ๋ฐ๋๋ก ์ค๊ฐํ์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด, ๋จ์ํ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด ๊ทธ์ ๋ง๋ ๋ฉ์๋๋ง ๊ตฌํํด์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ฌ์ค์ ๋ฐ๋์ ์์ญ์ ์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ฆ, ๊ทผ๋ณธ์ ์ผ๋ก ์๋ถ๋๋ ์ฑ์ง์ ์ง๋๋ค.
์์ฝ
๋๋ฏธํฐ ๋ฒ์น(Law of Demeter)
๋ชจ๋์ ์์ ์ด ์กฐ์ํ๋ ๊ฐ์ฒด์ ์์ฌ์ ์ ๋ชฐ๋ผ์ผ ํ๋ค.
๋ํ์ ์ธ Heruistic ๋ฐฉ์(๊ฒฝํ์ ๊ธฐ๋ฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฑฐ๋ ํ์ตํ๊ฑฐ๋ ๋ฐ๊ฒฌํด ๋ด๋ ๋ฐฉ๋ฒ == ๊ฐ, ์ง๊ฐ)์ด๋ค.
์ข ๋ ์ ํํ๊ฒ ํํํ๋ฉด, ํด๋์ค C์ ๋ฉ์๋ f๋ ์์ ํํ๋ ๋ฒํธ์ ํด๋นํ๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ง ํธ์ถํด์ผ ํ๋ค.
- Class C
- f๊ฐ ์์ฑํ ๊ฐ์ฒด
- f ์ธ์๋ก ๋์ด์จ ๊ฐ์ฒด
- C instance ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ฒด
์ฌ๊ธฐ์ ํต์ฌ์, ๋ฏ์ ์ฌ๋์ ๊ฒฝ๊ณํ๊ณ ์น๊ตฌ๋๋ง ๋๋ผ๋ ๊ฒ์ด๋ค. ์์๋ฅผ ๋ณด๋ฉด์ ์ดํดํด๋ณด์.
๊ธฐ์ฐจ ์ถฉ๋
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
์ฌ์ฉํด๋ณด์๋ ๋ฉ์๋์ด๋ค. ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ํ ์ค๋ก ์ด์ด์ง ๊ธฐ์ฐจ์ฒ๋ผ ๋ณด์ธ๋ค๊ณ ํด์ ์ด๋ฐ ์ฝ๋๋ฅผ **๊ธฐ์ฐจ ์ถฉ๋(train wreck)**์ด๋ผ ๋ถ๋ฅธ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์กฐ์กํ๋ค ์ฌ๊ฒจ์ง๋ ๋ฐฉ์์ด๋ฏ๋ก ํผํ๋ ํธ์ด ์ข๋ค. ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋๋ ํธ์ด ์ข๋ค.
// ๊ธฐ์ฐจ ์ถฉ๋์ ํด๊ฒฐํ ์ฝ๋
Options opts = ctxt.getOptions();
File scratchDir = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
์ด๋ ๊ฒ ๋ณ๊ฒฝ๋ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋์ง ํ์ธํด๋ณด์. ์ด ๋
ผ์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ctxt
. opts
, scratchDir
๊ฐ ์๋ฃ ๊ตฌ์กฐ์ธ์ง ๊ฐ์ฒด์ธ์ง ๋ช
ํํ๊ฒ ์์์ผ ํ๋ค. ๊ฒฐ๊ตญ ๋๋ฏธํฐ ๋ฒ์น ์ญ์ ํน์ ๋ชจ๋์ ์บก์ํ๋ฅผ ํตํด ์ ๋ณด ์๋์ ์ํ๋๋์ ๋ํ ์๊ธฐ๋ก ๊ท๊ฒฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ ์๋ฃ ๊ตฌ์กฐ๋ผ๋ฉด, ๋น์ฐํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ ธ์ถํ๊ธฐ ๋๋ฌธ์ ๋๋ฏธํฐ ๋ฒ์น์ด ์ ์ฉ๋์ง ์๋๋ค. ํ์ง๋ง ๊ฐ์ฒด๋ผ๋ฉด ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ๋ ธ์ถ๋์ด ์๊ธฐ ๋๋ฌธ์(== ์กฐ์ํ๋ ๊ฐ์ฒด์ ์์ฌ์ ์ ์๊ณ ์์) ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋ค.
final String outputDir = ctxt.options.scratchdir.absoluterPath;
๊ทธ๋ฐ๋ฐ ์ฌ์ค ์๋ฃ๊ตฌ์กฐ์ธ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข๋ค. ์์์ ๋งํ๋ฏ ์๋ฏธ์๋ get
, set
์ ํ์์๋ค.
์ก์ข ๊ตฌ์กฐ
๋ง๋ก๋ง ๋ค์ด๋ ํผ๋์ค๋ฌ์ด ์ด๋ฐ ์ํฉ์ ์ค์ ์ฝ๋ ์์ฐ ์ ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค. ์์ํ๊ฒ ์ง๋ง ์๋ฃ๊ตฌ์กฐ์ ๊ฐ์ฒด๊ฐ ์์ธ ์ก์ข ๊ตฌ์กฐ๊ฐ ๋์จ๋ค. ์์ธ ์ํฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ค์ํ ๊ธฐ๋ฅ์ ์ํํ๋ ํจ์
- ๊ณต๊ฐ ๋ณ์
- ๊ณต๊ฐ ์กฐํ/์ค์ ๋ณ์ (
get
,set
)
์ด๋ ๊ฒ ํผ์ฌ๋ ์ํฉ์ ๊ฐ์ฒด๋ก ์ค๊ณ๋์์๋ ๋ถ๊ตฌํ๊ณ ํด๋น ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ด ์ ์ฐจ ์งํฅ์ ์ธ ์๋ฃ๊ตฌ์กฐ์ฒ๋ผ private ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๊ฒ ๋ง๋ ๋ค.
์ด๋ฐ ๊ตฌ์กฐ๋ ์๋ก์ด ํจ์๋ ๋ฌผ๋ก ์ด๊ณ ์๋ก์ด ์๋ฃ ๊ตฌ์กฐ๋ ์ถ๊ฐํ๊ธฐ ์ด๋ ต๋ค. ์์ชฝ ์ธ์์์ ๋จ์ ๋ง ๋ชจ์๋์ ๊ตฌ์กฐ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋๋๋ก ์ด๋ฐ ๊ตฌ์กฐ๋ ํผํ๋๋ก ํ์. ํ๋ก๊ทธ๋๋จธ๊ฐ ํจ์๋ ํ์ ์ ๋ณดํธํ ์ง ๊ณต๊ฐํ ์ง ํ์ ํ์ง ๋ชปํด (๋ ๋์๊ฒ๋ ๋ฌด์งํด) ์ด์ค๊ฐํ๊ฒ ๋ด๋์ ์ค๊ณ์ ๋ถ๊ณผํ๋ค.
๊ตฌ์กฐ์ฒด ๊ฐ์ถ๊ธฐ
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
๊ทธ๋ผ ctxt
. opts
, scratchDir
์ด ๊ฐ์ฒด๋ผ๋ฉด ์ด๋จ๊น? ์ผ๋จ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐฐํ ๊ฒ์ ์๊ฒ ๊ณ , ์ด๋ป๊ฒ ๋ณ๊ฒฝํ ์ง ์๊ฐํด๋ณด์. ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ฉด ์ข์๊น?
// ctxt ๊ฐ์ฒด์ ๊ณต๊ฐํด์ผ ํ๋ ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์: ๋๋ฌด ์ถ์ํํจ
ctxt.getAbsolutePathOfScratchDirectoryOption();
// ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐํํ๋ ๋๋์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค.
ctxt.getScratchDirectoryOption().getAbsolutePath()
์ด ๊ฒฝ์ฐ ๋๋ค ๋ง์์ ์๋ ๋ค. ์๋ก ์ ์ผ๋ก ์ ์ ๋ ๊ฒฝ๋ก๊ฐ ํ์ํ์ง ํ์ธํด๋ณด์.
String outFile = outputDir + "/" + className.replace('.', '/') + ".class";
FileOutputStream fout = new FileOutputStream(outFile);
BufferedOutputStream bos = new BufferedOutputStream(fout);
์์ ๋๋ ํฐ๋ฆฌ์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ป์ผ๋ ค๋ ์ด์ ๊ฐ ์์ ํ์ผ์ ์์ฑํ๊ธฐ ์ํ ๋ชฉ์ ์ด๋ผ๋ ๊ฒ์ ์์๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ด ์์ ํ์ผ ์์ฒด๋ฅผ ์์ฑํ๋ ์ฑ
์์ ctxt
์ ๋๊ธฐ๋ฉด ์ด๋จ๊น?
BufferedOutputStream bos = ctxt.createScratchFileStream(classFileName);
๋ณด๋ค ์ ๋นํ๊ฒ ๋ณ๊ฒฝ๋์๋ค. ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋๋ฌ๋ด์ง ์์ผ๋ฉฐ ๋ชจ๋์ ๋ชฐ๋ผ์ผํ๋ ์ฌ๋ฌ๊ฐ์ฒด๋ฅผ ํ์ํ ํ์๊ฐ ์๋ค. ๋๋ฏธํฐ ๋ฒ์น๋ ์๋ฐํ์ง ์๋ ๊ฐ์ฒด ์งํฅ๋ฐฉ์์ ๋ง๋ค์๋ค.
์๋ฃ ์ ๋ฌ ๊ฐ์ฒด
public class Address {
public String street;
public String streetExtra;
public String city;
public String state;
public String zip;
}
์๋ฃ ๊ตฌ์กฐ์ฒด์ ์ ํ์ ์ธ ํํ๋ ๊ณต๊ฐ ๋ณ์๋ง ์๊ณ ํจ์๊ฐ ์๋ ํด๋์ค์ด๋ค. ์ด๋ฅผ **์๋ฃ ์ ๋ฌ ๊ฐ์ฒด(Data Transfer Object)**๋ผ ํ๋ค.
ํ์ฑ ๋ ์ฝ๋
ํ์ฑ ๋ ์ฝ๋๋ DTO์ ํน์ํ ํํ๋ค. ๊ณต๊ฐ ๋ณ์๊ฐ ์๊ฑฐ๋ ๋น๊ณต๊ฐ ๋ณ์์ getter/setter๊ฐ ์๋ ์๋ฃ ๊ตฌ์กฐ์ง๋ง, ๋๊ฒ save๋ find์ ๊ฐ์ ํ์ ํจ์๋ ์ ๊ณตํ๋ค.
๋ถํํ๋ ํ์ฑ ๋ ์ฝ๋์ ๋น์ฆ๋์ค ๊ท์น ๋ฉ์๋๋ฅผ ์ถ๊ฐํด ์ด๋ฐ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ ๊ฐ๋ฐ์๊ฐ ํํ๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด ์ก์ข ๊ตฌ์กฐ๊ฐ ๋์ค๊ฒ ๋๋ค.
ํด๊ฒฐ์ฑ ์ ๋น์ฐํ๋ค. ํ์ฑ ๋ ์ฝ๋๋ ์๋ฃ ๊ตฌ์กฐ๋ก ์ทจ๊ธํ๋ค. ๋น์ฆ๋์ค ๊ท์น์ ๋ด์ผ๋ฉด์ ๋ด๋ถ ์๋ฃ๋ฅผ ์จ๊ธฐ๋ ๊ฐ์ฒด๋ ๋ฐ๋ก ์์ฑํ๋ค. (์ฌ๊ธฐ์ ๋ด๋ถ ์๋ฃ๋ ํ์ฑ ๋ ์ฝ๋์ ์ธ์คํด์ค์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.)
๊ฒฐ๋ก
||์๋ฃ ๊ตฌ์กฐ ์ฌ์ฉ ๋ฐฉ์|๊ฐ์ฒด ์ฌ์ฉ ๋ฐฉ์| |::|:--------------------------|:-------------------| |์ฐ๊ด๋ ํจ๋ฌ๋ค์|์ ์ฐจ์ |๊ฐ์ฒด์งํฅ์ | |ํน์ง|์๋ฃ๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ๋ํ๋|๋์์ ๊ณต๊ฐํ๊ณ ์๋ฃ๋ฅผ ์จ๊น| |์ฅ์ |์๋ฃ๊ตฌ์กฐ ๋ณํ ์์ด ์๋ก์ด ํจ์ ์ถ๊ฐ ์ฌ์|๊ธฐ์กด ํจ์๋ฅผ ๋ณํํ์ง ์์ผ๋ฉด์ ์๋ก์ด ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ฌ์| |๋จ์ |์๋ก์ด ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ด๋ ค์. ๋ชจ๋ ํจ์๋ฅผ ๊ณ ์ณ์ผ ํจ|์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํ๊ธฐ ์ด๋ ค์. ๋ชจ๋ ํด๋์ค์ ์ถ๊ฐํด์ฃผ์ด์ผ ํจ| |์ ํ ๊ธฐ์ค|์๋ก์ด ๋์์ ์ถ๊ฐํ๋ ์ ์ฐ์ฑ ํ์์|์๋ก์ด ์๋ฃ ํ์ ์ ์ถ๊ฐํ๋ ์ ์ฐ์ฑ ํ์์|
- ๊ฐ์ฒด ์งํฅ ์ฝ๋์์ ์ด๋ ค์ด ๋ณ๊ฒฝ์ ์ ์ฐจ์ ์ฝ๋์์ ์ฌ์ฐ๋ฉฐ, ์ ์ฐจ์ ์ฝ๋์์ ์ด๋ ค์ด ๋ณ๊ฒฝ์ ๊ฐ์ฒด ์งํฅ ์ฝ๋์์ ์ฝ๋ค. (Trade-Off)
- ์ํฉ์์ ๋ง๊ฒ ๋ ๋ฐฉ์์ ์ ํํ์ฌ ์ ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด๋ผ๋ ์๊ฐ์ ๋ฏธ์ ์ด๋ค.
- ๊ฐ์ฒด ํธ์ถ์ ๋์ ๊ฐ๊น์ด ์น๊ตฌ๋ค๊ณผ ํ์. ์ธ๋ถ์ธ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋์.