์ ๋ต ํจํด์ ์๊ณ ๋ฆฌ์ฆ ๊ณ์ด์ ์ ์ํ๊ณ ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์บก์ํํ๋ฉฐ ์ํธ ๊ตํ์ด ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ์ธก์์์ ์ฌ์ฉ๊ณผ ๊ด๊ณ์์ด ์๊ณ ๋ฆฌ์ฆ์ ๋
๋ฆฝ์ ์ผ๋ก ์์ ํ ์ ์์ต๋๋ค(์ด ์ ์๋ Eric Freeman๊ณผ Elizabeth Robson์ด ์ด ์ฑ
"Head First. Design Patterns"์์ ๊ฐ์ ธ์ด). ์ด ์ ์๋ ์ฝ๊ฐ ํผ๋์ค๋ฌ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ด ์ ์๋ฅผ ์ผ๋ฐ ์ธ์ด๋ก ๋ ์์ธํ ์ค๋ช
ํด์ผ ํฉ๋๋ค . ์ข
๊ต๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค :) ์ธ์์๋ ๋ง์ ์ข
๊ต๊ฐ ์์ต๋๋ค(๊ณ ๋ฐฑ, ์ด๋, ์ ๋
๋ฑ). ์ด๊ฒ์ ์ฝ๋๋ก ์ด๋ป๊ฒ ์ค๋ช
ํ ์ ์์๊น์? ์๋ฅผ ๋ค์ด, ์ข
๊ต ํด๋์ค๋ฅผ ์ ํํ๊ณ ์ด ํด๋์ค์์ ๋ค๋ฅธ ์ข
๊ต๋ฅผ ์์๋ฐ์ ์ ์์ต๋๋ค. ๋ถํ์ํ ๊ฒ๋ค์ ์ถ์ํํ๊ณ Religion ํด๋์ค์์ ํ๋์ believe() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
public abstract class Religion {
public void believe() {
System.out.println("ะฏ ะฒะตัั ะฒ ะะพะณะฐ-ัะฒะพััะฐ ััะพะณะพ ะผะธัะฐ");
}
}
๋ค๋ฅธ ๋ชจ๋ ์ข
๊ต๋ ์ด ํด๋์ค์์ ์์๋ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋
๊ต์ ์ด์ฌ๋๊ต, ์ ๋๊ต์๋ง ๊ตญํํ๋ค๋ฉด ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์์ ๊ฒ์
๋๋ค.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
๊ทธ๋ฌ๋ ํ์ฌ ์กด์ฌํ๋(๋๋ ์ด์ ์ ์กด์ฌํ์ง๋ง ์ฌ๋ผ์ง) ๋ค๋ฅธ ์ข
๊ต๋ฅผ ์๊ฐํ๋ฉด ์ ์ด๋ ๋ถ๊ต๋์๊ฒ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์
๋๋ค. ๋น์ ์ ๊ทธ๋ค์ ๋ฏฟ์ ๋ฐฉ๋ฒ์ ๋ฌด์ํด์ผ ํ ๊ฒ์
๋๋ค.
public class Buddhism extends Religion {
@Override
public void believe() {
System.out.println("ะััั ะะพะณ or ะฑะพะณะธ or ะฝะตั, ััะพ ะฝะต ะฒะฐะถะฝะพ, ะณะปะฐะฒะฝะพะต ะดะพััะธัั ะฝะธัะฒะฐะฝั :)");
};
}
๊ทธ๋ฆฌ๊ณ ๋ง์ ์ข
๊ต๊ฐ ์๊ณ ๊ทธ๋ค์ ์ฌ์ง์ด ํ์คํ ๊ดด๋ฌผ(ํ์คํํ๋ฆฌ์์ฃผ์)์ ๋ฏฟ๊ธฐ ๋๋ฌธ์, ์ด ๋ชจ๋ ์ข
๊ต์์๋ ์ ์ ๋ฐฉ๋ฒ์ ์ฌ์ ์ํด์ผ ํ ๊ฒ์
๋๋ค. ํ์ง๋ง ๋ค๋ฅด๊ฒ ํ ์ ์์ต๋๊น? ์ด ๋ฉ์๋๋ฅผ Faith ์ธํฐํ์ด์ค๋ก ์ด๋ํ๊ณ ๊ทธ ์์ believe ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ณ ์ด ๋ฉ์๋๋ฅผ ๊ฐ ํด๋์ค์ ๊ตฌํํฉ๋๋ค(๋ฐ๋ผ์ ์ํ๋ ๋๋ก ๊ฐ ํด๋์ค์ ๊ตฌํํฉ๋๋ค). ๊ทธ๋ฌ๋ ๊ทธ๋ฌ๋ฉด ์ ์ด๋ ์ ๋์ธ๊ณผ ๊ธฐ๋
๊ต์ธ ์ฌ์ด์์๋ ์ฝ๋๊ฐ ์ค๋ณต๋ ๊ฒ์
๋๋ค. ํ๋๋์ ๋ฌด์ฌ๋ฆผ์ ์๋์ด๋ก ๊ธ์ ์ธ ์ ์์ต๋๋ค.
public interface Faith {
public void believe();
}
public class Christianity implements Faith {
@Override
public void believe() {
System.out.println("ะฏ ะฒะตัั ะฒ ะะพะณะฐ-ัะฒะพััะฐ ััะพะณะพ ะผะธัะฐ");
}
}
public class Judaism implements Faith {
@Override
public void believe() {
System.out.println("ะฏ ะฒะตัั ะฒ ะะพะณะฐ-ัะฒะพััะฐ ััะพะณะพ ะผะธัะฐ");
}
}
์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ ๋ฐฉ์์ ๊ตฌํํ๋ ๊ฒ์ด ํฐ ๋์์ด ๋์ง ์์ผ๋ฉฐ, ์ข
๊ต๊ฐ ๋๋ฌด ๋ง์์ Faith ์ธํฐํ์ด์ค์์ ๊ธฐ๋ณธ ๋ฐฉ์์ ์ ์ํ๋๋ผ๋ ๋ชจ๋ ๋น์ ์ ๊ต์์๋ ์ด ๋ฐฉ์์ ๋๋ฆ๋๋ก ๊ตฌํํ๊ณ ๋ฐ๋ณตํด์ผ ํ ๊ฒ์
๋๋ค. ์ด๋๊ฐ์. ์ด ๊ฒฝ์ฐ ์ ๋ต ํจํด์ ์ฐ๋ฆฌ์๊ฒ ๋ฌด์์ ์ ๊ณตํฉ๋๊น? ํ์ฌ ์ธํฐํ์ด์ค์ ๋ํด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ํ
ํ๋ฆฟ ํด๋์ค๋ฅผ ์์ฑํ ๋ค์ ํน์ ์ข
๊ต์ ์์ฑ์๋ก ๋์ฒด๋ฉ๋๋ค. ์ ๊ฒ๋ค. ์ ์ ์์ ๋ถ๋ถ์์ ์ธ๊ธํ ๊ฒ๊ณผ ๋์ผํ ์๊ณ ๋ฆฌ์ฆ ๊ณ์ด์ ์ ์ํ๊ณ ์์ฑํฉ๋๋ค.
public interface Faith {
public void believe();
}
public class AbrahamicReligion implements Faith {
@Override
public void believe() {
System.out.println("ะฏ ะฒะตัั ะฒ ะะพะณะฐ-ัะฒะพััะฐ ััะพะณะพ ะผะธัะฐ");
}
}
public class BuddismReligion implements Faith {
@Override
public void believe() {
System.out.println("ะััั ะะพะณ or ะฑะพะณะธ or ะฝะตั, ััะพ ะฝะต ะฒะฐะถะฝะพ, ะณะปะฐะฒะฝะพะต ะดะพััะธัั ะฝะธัะฒะฐะฝั :)");
}
}
public class JediismReligion implements Faith {
@Override
public void believe() {
System.out.println("ะะฐ ะฟัะตะฑัะดะตั ั ะฒะฐะผะธ ะกะธะปะฐ!");
}
}
๊ทธ๋ฆฌ๊ณ ์์ฑ์์ ๊ฐ ํด๋์ค์์ ์ด๋ฅผ ๋์ฒดํฉ๋๋ค.
public abstract class Religion {
Faith faith;
}
public class Judaism extends Religion{
public Judaism() {
this.faith = new AbrahamicReligion();
}
}
public class Christianity extends Religion{
public Christianity() {
this.faith = new AbrahamicReligion();
}
}
public class Buddhism extends Religion {
public Buddhism() {
this.faith = new BuddismReligion();
}
}
๋ฐ๋ผ์ ํ๋ก์ ํธ์ ๋ค๋ฅธ ์ข
๊ต๋ฅผ ํฌํจํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํด๋์ค ๋๋ ํด๋์ค์ ์ผ๋ถ์ ๋ํ ์ ์ ๋ฐฉ๋ฒ์ ๋ค์ ์ ์ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Faith ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋๋ฝ๋ ํด๋์ค(์์ง ์๋ ๊ฒฝ์ฐ)๋ฅผ ๊ตฌํํ๊ณ ์ด ํด๋์ค๋ฅผ ์ ์ข
๊ต์ ์์ฑ์์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
public class PastafarianismReligion implements Faith{
@Override
public void believe() {
System.out.println("ะัะพ ััะตะป ะผะพะธ ะผะฐะบะฐัะพะฝั???");
}
}
public class Pastafarianism extends Religion {
public Pastafarianism() {
this.faith = new PastafarianismReligion();
}
}
GO TO FULL VERSION