์ฐฝ๋ฐ์ฑ(Emergence)
- ์ฐฝ๋ฐ์ฑ์ด๋ ๋จ์ํ ๊ฒฐํฉ์ด ๋ณต์กํ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ์๋ฏธ.
- ์ธ๊ฐ์ ๋๋ฅผ ์๋ก ๋ค๋ฉด ํ๋์ ๋ด๋ฐ์ ์ธ์๋ฅ๋ ฅ์ด ์์ง๋ง ์์ญ์ต๊ฐ์ ๋ด๋ฐ์ด ๊ฒฐํฉํ๊ฒ ๋๋ฉด ์๊ธฐ ์ธ์์ด ๋ฐ์ํ๋ ํ์์ ๋งํ๋ ๊ฒ.
- ์ด ์ฐฝ๋ฐ์ฑ์ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ์กฐ์ ์ ์์ด ๊ฐ ๋ถ๋ถ์ ์์ฌ์ํต์ผ๋ก ์๊ธฐ ์กฐ์งํ๋ฅผ ์ด๋ฃจ๊ฒ ๋๊ณ ์ด๋ฌํ ๋ฐ์ผ๋ก ๋ถํฐ์ ํ์ ์๊ธฐ์น ๋ชปํ ๊ธฐ๋ฅ์ ๋ฐํํ๋ ํ
- ์ฝ๊ฒ ์๊ฐํ๋ฉด ์ง๋จ ์ง์ฑ๊ณผ ๊ฐ์ ๊ฒ์ด ์ด์ ํด๋นํ๋ค๊ณ ๋ณผ ์ ์๋ ๊ฒ.
์ฆ ์ฐฝ๋ฐ์ ์ค๊ณ๋ ์ด๋ค ๊ท์น๊ณผ ์์น์ ๋ฐ๋ผ ์ค๊ณ๋ฅผ ํ๊ฒ ๋๋ฉด, ๊ทธ๊ฒ๋ค์ด ๋ชจ์ฌ ์์ฃผ ์ข์ ๊ฑฐ์์ ์ค๊ณ๊ฐ ๋๋ค๊ณ ๋ณด๋ฉด ๋ ๋ฏ.
์ฐฝ๋ฐ์ ์ค๊ณ๋ก ๊น๋ํ ์ฝ๋๋ฅผ ๊ตฌํํ์.
์ผํธ ๋ฒก์ด ์ ์ํ ๋จ์ํ ์ค๊ณ ๊ท์น ๋ค ๊ฐ์ง
- ๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํ๋ค.
- ์ค๋ณต์ ์์ค๋ค.
- ํ๋ก๊ทธ๋๋จธ ์๋๋ฅผ ํํํ๋ค.
- ํด๋์ค์ ๋ฉ์๋ ์๋ฅผ ์ต์๋ก ์ค์ธ๋ค.
๋ชจ๋ ํ ์คํธ๋ฅผ ์คํํ๋ผ.
ํ
์คํธ๋ฅผ ์ฒ ์ ํ ๊ฑฐ์ณ ๋ชจ๋ ํ
์คํธ ์ผ์ด์ค๋ฅผ ํญ์ ํต๊ณผํ๋ ์์คํ
์ ํ
์คํธ๊ฐ ๊ฐ๋ฅํ ์์คํ
์ด๋ค. ๋น์ฐํ์ง๋ง ์ค์ํ ๋ง์ด๋ค. ํ
์คํธ๊ฐ ๋ถ๊ฐ๋ฅํ ์์คํ
์ ๊ฒ์ฆ๋ ๋ถ๊ฐ๋ฅํ๋ค. ๋
ผ๋์ ์ฌ์ง๋ ์์ง๋ง, ๊ฒ์ฆ์ด ๋ถ๊ฐ๋ฅํ ์์คํ
์ ์ ๋ ์ถ์ํ๋ฉด ์ ๋๋ค.
ํ
์คํธ ์ผ์ด์ค๊ฐ ๋ง์์๋ก ๊ฐ๋ฐ์๋ ํ
์คํธ๋ฅผ ์์ฑํ๊ธฐ ๋ ์ฌ์์ง๋ค. ๊ฒฐํฉ๋๊ฐ ๋์ผ๋ฉด ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ต๋ค. ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค๊ณ ๊ณ์ ๋๋ ค๋ผ
๋ผ๋ ๊ฐ๋จํ๊ณ ๋จ์ํ ๊ท์น์ ๋ฐ๋ฅด๋ฉด ์์คํ
์ ๋ฎ์ ๊ฒฐํฉ๋์ ๋์ ์์ง๋ ฅ์ด๋ผ๋, ๊ฐ์ฒด ์งํฅ ๋ฐฉ๋ฒ๋ก ์ด ์งํฅํ๋ ๋ชฉํ๋ฅผ ์ ์ ๋ก ๋ฌ์ฑํ๋ค. ์ฆ, ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ฉด ์ค๊ณ ํ์ง์ด ๋์์ง๋ค.
๋ฆฌํฉํ ๋ง
ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ์์ฑํ๋ค๋ฉด ์ ์ง์ ์ผ๋ก ๋ฆฌํฉํ ๋ง ํด๋๊ฐ๋ค. ์ฝ๋๋ฅผ ์ ๋ฆฌํ๋ฉด์ ์์คํ
์ด ๊นจ์ง๊น ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค. ํ
์คํธ ์ผ์ด์ค๊ฐ ์์ผ๋๊น!
ํ
์คํธ ์ผ์ด์ค๊ฐ ์กด์ฌํ๋ฏ๋ก ์ฝ๋์ ๋ณํ์ ๋ํด ๋๋ ค์์ด ์์ด์ง๋ค.
๋ฆฌํฉํ ๋ง ๋จ๊ณ์์๋ ์์ง๋๋ฅผ ๋์ด๊ณ , ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ณ , ์์คํ ๊ด์ฌ์ฌ๋ฅผ ๋ชจ๋๋ก ๋๋๊ณ , ํจ์์ ํด๋์ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ , ๋ ๋์ ์ด๋ฆ์ ์ ํํ๋ ๋ค์ํ ๊ธฐ๋ฒ๋ค์ด ๋์๋๋ค.
์ค๋ณต์ ์์ ๋ผ
์ฐ์ํ ์ค๊ณ์์ ์ค๋ณต์ ์ปค๋ค๋ ์ ์ด๋ค. ์ค๋ณต์ ์ถ๊ฐ ์์ , ์ถ๊ฐ ์ํ, ๋ถํ์ํ ๋ณต์ก๋๋ฅผ ๋ปํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ค๋ณต์ ์ฌ๋ฌ ๊ฐ์ง ํํ๋ก ํ์ถ๋๋ค. ๋๊ฐ์ ์ฝ๋๋ ๋น์ฐํ ์ค๋ณต์ด๋ค. ๋น์ทํ ์ฝ๋๋ ๋ ๋น์ทํ๊ฒ ๊ณ ์ณ์ฃผ๋ฉด ๋ฆฌํฉํฐ๋ง์ด ์ฌ์์ง๋ค.
public void scaleToOneDimension(float desiredDimension, float imageDimension) {
if (Math.abs(desiredDimension - imageDimension) < errorThreshold)
return;
float scalingFactor = desiredDimension / imageDimension;
scalingFactor = (float)(Math.floor(scalingFactor * 100) * 0.01f);
RenderedOpnewImage = ImageUtilities.getScaledImage(image, scalingFactor, scalingFactor);
image.dispose();
System.gc();
image = newImage;
}
public synchronized void rotate(int degrees) {
RenderedOpnewImage = ImageUtilities.getRotatedImage(image, degrees);
image.dispose();
System.gc();
image = newImage;
}
scaleToOneDimension ๋ฉ์๋์ rotate ๋ฉ์๋๋ฅผ ์ดํด๋ณด๋ฉด ์ผ๋ถ ์ฝ๋๊ฐ ๋์ผํ๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ ๋ฆฌํด ์ค๋ณต์ ์ ๊ฑฐํ๋ค.
public void scaleToOneDimension(float desiredDimension, float imageDimension) {
if (Math.abs(desiredDimension - imageDimension) < errorThreshold)
return;
float scalingFactor = desiredDimension / imageDimension;
scalingFactor = (float) Math.floor(scalingFactor * 10) * 0.01f);
replaceImage(ImageUtilities.getScaledImage(image, scalingFactor, scalingFactor));
}
public synchronized void rotate(int degrees) {
replaceImage(ImageUtilities.getRotatedImage(image, degrees));
}
private void replaceImage(RenderedOpnewImage) {
image.dispose();
System.gc();
image = newImage;
}
์ด๋ฐ โ์๊ท๋ชจ ์ฌ์ฌ์ฉโ์ ์์คํ
๋ณต์ก๋๋ฅผ ๊ทน์ ์ผ๋ก ์ค์ฌ์ค๋ค. ์๊ท๋ชจ ์ฌ์ฌ์ฉ์ ์ ๋๋ก ์ตํ์ผ ๋๊ท๋ชจ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
TEMPLATE METHOD
ํจํด์ ๊ณ ์ฐจ์ ์ค๋ณต์ ์ ๊ฑฐํ ๋ชฉ์ ์ผ๋ก ์์ฃผ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ค. ์๋ฅผ ์ดํด๋ณด์.
public class VacationPolicy {
public void accrueUSDDivisionVacation() {
// ์ง๊ธ๊น์ง ๊ทผ๋ฌดํ ์๊ฐ์ ๋ฐํ์ผ๋ก ํด๊ฐ ์ผ์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋
// ...
// ํด๊ฐ ์ผ์๊ฐ ๋ฏธ๊ตญ ์ต์ ๋ฒ์ ์ผ์๋ฅผ ๋ง์กฑํ๋์ง ํ์ธํ๋ ์ฝ๋
// ...
// ํด๊ฐ ์ผ์๋ฅผ ๊ธ์ฌ ๋์ฅ์ ์ ์ฉํ๋ ์ฝ๋
// ...
}
public void accrueEUDivisionVacation() {
// ์ง๊ธ๊น์ง ๊ทผ๋ฌดํ ์๊ฐ์ ๋ฐํ์ผ๋ก ํด๊ฐ ์ผ์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋
// ...
// ํด๊ฐ ์ผ์๊ฐ ์ ๋ฝ์ฐํฉ ์ต์ ๋ฒ์ ์ผ์๋ฅผ ๋ง์กฑํ๋์ง ํ์ธํ๋ ์ฝ๋
// ...
// ํด๊ฐ ์ผ์๋ฅผ ๊ธ์ฌ ๋์ฅ์ ์ ์ฉํ๋ ์ฝ๋
// ...
}
}
์ต์ ๋ฒ์ ์ผ์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋๋ง ์ ์ธํ๋ฉด ๋ ๋ฉ์๋๋ ๊ฑฐ์ ๋์ผํ๋ค. ์ต์ ๋ฒ์ ์ผ์๋ฅผ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ์ ํ์ ๋ฐ๋ผ ์ด์ง ๋ณํ๋ค. ์ฌ๊ธฐ์ TEMPLATE METHOD ํจํด์ ์ ์ฉํด ๋์ ๋ค์ด์ค๋ ์ค๋ณต์ ์ ๊ฑฐํ๋ค.
abstract public class VacationPolicy {
public void accrueVacation() {
caculateBseVacationHours();
alterForLegalMinimums();
applyToPayroll();
}
private void calculateBaseVacationHours() { /* ... */ };
abstract protected void alterForLegalMinimums();
private void applyToPayroll() { /* ... */ };
}
public class USVacationPolicy extends VacationPolicy {
@Override protected void alterForLegalMinimums() {
// ๋ฏธ๊ตญ ์ต์ ๋ฒ์ ์ผ์๋ฅผ ์ฌ์ฉํ๋ค.
}
}
public class EUVacationPolicy extends VacationPolicy {
@Override protected void alterForLegalMinimums() {
// ์ ๋ฝ์ฐํฉ ์ต์ ๋ฒ์ ์ผ์๋ฅผ ์ฌ์ฉํ๋ค.
}
}
ํํํ๋ผ
์ฝ๋๋ ๊ฐ๋ฐ์์ ์๋๋ฅผ ๋ถ๋ช ํ ํํํด์ผ ํ๋ค. ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๋ช ๋ฐฑํ๊ฒ ์งค์๋ก ๋ค๋ฅธ ์ฌ๋์ด ๊ทธ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค. ๊ทธ๋์ผ ๊ฒฐํจ์ด ์ค์ด๋ค๊ณ ์ ์ง๋ณด์ ๋น์ฉ์ด ์ ๊ฒ ๋ ๋ค.
- ์ข์ ์ด๋ฆ์ ์ ํํ๋ค. ์ด๋ฆ๊ณผ ๊ธฐ๋ฅ์ด ์์ ํ ๋ดํ์ธ ํด๋์ค๋ ํจ์๋ก ๊ฐ๋ฐ์๋ฅผ ๋๋ผ๊ฒ ํด์๋ ์ ๋๋ค.
- ํจ์์ ํด๋์ค ํฌ๊ธฐ๋ฅผ ๊ฐ๋ฅํ ํ ์ค์ธ๋ค. ์์ ํด๋์ค์ ์์ ํจ์๋ ์ด๋ฆ ์ง๊ธฐ๋ ์ฝ๊ณ , ๊ตฌํํ๊ธฐ๋ ์ฝ๊ณ , ์ดํดํ๊ธฐ๋ ์ฝ๋ค.
- ํ์ค ๋ช ์นญ์ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ๋์์ธ ํจํด์ ์์ฌ์ํต๊ณผ ํํ๋ ฅ ๊ฐํ๊ฐ ์ฃผ์ ๋ชฉ์ ์ด๋ค. ํด๋์ค๊ฐ COMMAND๋ VISITOR์ ๊ฐ์ ํ์ค ํจํด์ ์ฌ์ฉํด ๊ตฌํ๋๋ค๋ฉด ํด๋์ค ์ด๋ฆ์ ํจํด ์ด๋ฆ์ ๋ฃ์ด์ค๋ค. ๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ํด๋์ค ์ค๊ณ ์๋๋ฅผ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค.
- ๋จ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๊ผผ๊ผผํ ์์ฑํ๋ค. ํ ์คํธ ์ผ์ด์ค๋ ์์ โ์์ ๋ก ๋ณด์ฌ์ฃผ๋ ๋ฌธ์โ๋ค. ๋ค์ ๋งํด, ์ ๋ง๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ฝ์ด๋ณด๋ฉด ํด๋์ค ๊ธฐ๋ฅ์ด ํ๋์ ๋ค์ด์จ๋ค.
ํ์ง๋ง ํํ๋ ฅ์ ๋์ด๋ ๊ฐ์ฅ ์ค์ํ ๋ฐฉ๋ฒ์ ๋ ธ๋ ฅ์ด๋ค. ๋์ค์ ์ฝ๋๋ฅผ ์ฝ์ ์ฌ๋์ ๋ฐ๋ก ์์ ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ์ฌ์ค์ ๋ช ์ฌํ์. ํจ์์ ํด๋์ค์ ์กฐ๊ธ ๋ ์๊ฐ์ ํฌ์ํ์. ๋ ๋์ ์ด๋ฆ์ ์ ํํ๊ณ , ํฐ ํจ์๋ฅผ ์์ ํจ์ ์ฌ๋ฟ์ผ๋ก ๋๋๊ณ , ์์ ์ ์ํ์ ์กฐ๊ธ๋ง ๋ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์.
์ฃผ์๋ ๋๋จํ ์ฌ๋ฅ์ด๋ค.
ํด๋์ค์ ๋ฉ์๋ ์๋ฅผ ์ต์๋ก ์ค์ฌ๋ผ
์ค๋ณต์ ์ ๊ฑฐํ๊ณ , ์๋๋ฅผ ํํํ๊ณ , SRP
๋ฅผ ์ค์ํ๋ค๋ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋
๋ ๊ทน๋จ์ผ๋ก ์น๋ฌ์ผ๋ฉด ๋๋ณด๋ค ์ค์ด ๋ง์์ง๋ค. ๋๋ฌด ๋ง์ ํด๋์ค์ ๋ฉ์๋๋ ์ฝ๋๋ฅผ ์ดํดํ๋ ๋ฐ ์์ด์ ๋์ฑ ์ด๋ ต๊ฒ ๋ง๋๋ ๊ฒฝ์ฐ๋ ์๋ค. ๋ฐ๋ผ์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ ์ ํ ์ถ์ํ ๋จ๊ณ๋ก ์์ฑํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋๋ก๋ ๋ฌด์๋ฏธํ๊ณ ๋
๋จ์ ์ธ ์ ์ฑ
ํ์ ํด๋์ค ์์ ๋ฉ์๋ ์๊ฐ ๋์ด๋๊ธฐ๋ ํ๋ค. ํด๋์ค๋ง๋ค ๋ฌด์กฐ๊ฑด ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ผ๊ณ ์๊ตฌํ๋ ๊ตฌํ ํ์ค, ์๋ฃ ํด๋์ค์ ๋์ ํด๋์ค๋ ๋ฌด์กฐ๊ฑด ๋ถ๋ฆฌํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฐ๋ฐ์๋ ์ข์ ์๋ค. ๊ฐ๋ฅํ ๋
๋จ์ ์ธ ๊ฒฌํด๋ ๋ฉ๋ฆฌํ๊ณ ์ค์ฉ์ ์ธ ๋ฐฉ์์ ํํด์ผ ํ๋ค.
๋ชฉํ๋ ํจ์์ ํด๋์ค ํฌ๊ธฐ๋ฅผ ์๊ฒ ์ ์งํ๋ฉด์ ๋์์ ์์คํ ํฌ๊ธฐ๋ ์๊ฒ ์ ์งํ๋ ๋ฐ ์๋ค. ํ์ง๋ง ์ด ๊ท์น์ ๊ฐ๋จํ ์ค๊ณ ๊ท์น ๋ค ๊ฐ ์ค ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ๋ค. ๋ค์ ๋งํด, ํด๋์ค์ ํจ์ ์๋ฅผ ์ค์ด๋ ์์ ๋ ์ค์ํ์ง๋ง, ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค๊ณ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ์๋๋ฅผ ํํํ๋ ์์ ์ด ๋ ์ค์ํ๋ค๋ ๋ป์ด๋ค.
๊ฒฐ๋ก
๋จ์ํ ์ค๊ณ ๊ท์น์ ๋ฐ๋ฅธ๋ค๋ฉด (์ค๋ ๊ฒฝํ ํ์์ผ ์ตํ) ์ฐ์ํ ๊ธฐ๋ฒ๊ณผ ์์น์ ๋จ๋ฒ์ ํ์ฉํ ์ ์๋ค.