JavaRush /Java Blog /Random-KO /ํ…œํ”Œ๋ฆฟ ์ „๋žต(์ „๋žต)

ํ…œํ”Œ๋ฆฟ ์ „๋žต(์ „๋žต)

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์ „๋žต ํŒจํ„ด์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณ„์—ด์„ ์ •์˜ํ•˜๊ณ  ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์บก์Šํ™”ํ•˜๋ฉฐ ์ƒํ˜ธ ๊ตํ™˜์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ์˜ ์‚ฌ์šฉ๊ณผ ๊ด€๊ณ„์—†์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ์ •์˜๋Š” 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();
    }
}
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION