์ž๋ฐ” ๊ฐœ๋ฐœ์ž๋กœ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ•„์ˆ˜๋กœ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์ด ๋˜์—ˆ์ฃ .

์ €๋„ ์•„์ง ์Šคํ”„๋ง์„ ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ, core ๋ถ€๋ถ„์„ ๊ณต๋ถ€ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์š”๊ตฌ์‚ฌํ•ญ ๊ตฌํ˜„์„ ์œ„ํ•ด ํด๋ž˜์Šค ๋ชจ๋ธ๋ง ํ•  ๋•Œ์™€ ๋งŽ์ด ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ์š”,

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†!

์œ ๋‚œํžˆ ์Šคํ”„๋ง์„ ๋ถ„์„ํ•˜๋‹ค ๋ณด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋“ค์ด ๋„ˆ~๋ฌด ๋งŽ์•„์„œ ํƒ€๊ณ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ์ „์ฒด๋ฅผ ๋ณด์ง€ ๋ชปํ•˜๊ณ  ๋‚™์‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค..

๋„ˆ๋ฌด๋งŽ์•„ ๋„ˆ๋ฌด๋งŽ์•„

 

๊ทธ๋Ÿฌ๋‹ค ๋ฌธ๋“ ๋‹ค์ค‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ์ƒ˜ํ”Œ ์ฝ”๋”ฉ์„ ํ•˜๋‹ค ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์–ด ์งค๋ง‰ํ•˜๊ฒŒ ์„ค๋ช…์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•ต์‹ฌ์€

์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๊ฐ€์งˆ ํŠน์„ฑ์„ ์ตœ~๋Œ€ํ•œ ์ชผ๊ฐœ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์œ„์ž„ ํด๋ž˜์Šค๋“ค์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด, ์™œ ์Šคํ”„๋ง์ด ๊ทธ๋ ‡๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ž˜๊ฒŒ ์ชผ๊ฐœ์„œ ๊ฐœ๋ฐœ์„ ํ•˜๋Š”์ง€ ์กฐ๊ธˆ์€ ์•Œ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

 

๋™๋ฌผ, ์‚ฌ๋žŒ ์ด๋Ÿฐ ์‰ฌ์šด ๊ฐœ๋…์„ ๋ชจ๋ธ๋งํ•œ๋‹ค๊ณ  ํ•ด ๋ด…์‹œ๋‹ค.

๋™๋ฌผ์˜ ํŠน์ง•: ์ด๋ฆ„, ๋‚˜์ด ๋“ฑ ๊ธฐ๋ณธ ์ •๋ณด ์žˆ์Œ. ์ง–๋Š”๋‹ค, ๊ธฐ์–ด๊ฐ„๋‹ค, ๋‚ ์•„๊ฐ„๋‹ค, ๊ฑธ์„ ์ˆ˜(๋„) ์žˆ๋‹ค, ์ง์ง–๊ธฐ๋ฅผ ํ†ตํ•ด ๊ฒฐํ˜ผ์„ ํ•  ์ˆ˜(๋„) ์žˆ๋‹ค. ๋“ฑ..

์‚ฌ๋žŒ์˜ ํŠน์ง•: ์ด๋ฆ„, ๋‚˜์ด ๋“ฑ ๊ธฐ๋ณธ ์ •๋ณด ์žˆ์Œ. ๊ธฐ์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค, ๊ฑธ์„ ์ˆ˜ ์žˆ๊ณ , ๊ฒฐํ˜ผ ๊ฐ€๋Šฅ, ๊ณต๋ถ€ํ•œ๋‹ค, ๋งํ•œ๋‹ค ๋“ฑ๋“ฑ..

 

์ด๋Ÿฐ ํŠน์ง•๋“ค์„ ์ „~๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ชผ๊ฐญ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ๋”ฑ ํ•˜๋‚˜๋งŒ ๋‚˜์™€๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด ์ง–์„ ์ˆ˜ ์žˆ๋Š” (Barkable) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์ด๋Ÿฐ ์‹์ด๊ฒ ์ฃ .

public interface Barkable {

    void bark();
}

 

๋˜ํ•œ ์ ์–ด๋„ ์‚ฌ๋žŒ, ๋™๋ฌผ ๊ณตํ†ต์ด๋ผ ์ƒ๊ฐ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” CoreBehavior๋กœ ๋ฝ‘์•„๋ณด๊ณ ..

public interface AnimalCoreBehavior {

    void greeting();
    String getName();
    int getAge();

}

 

 

์ฝ”์–ดํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์ตœ ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋„์ถœ์ด ๋˜์—ˆ๋‹ค๋ฉด, ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฆฌ ๋ฌถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ๋žŒ์€ ๊ธฐ์–ด๊ฐ€๊ฑฐ๋‚˜ ๊ฑธ์„ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ Barkable, Walkable์„ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ๋ณด์ฃ .

public interface CrawlAndWalkable extends Crawlable, Walkable {

}

 

์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ชผ๊ฐœ๊ณ  ํ•ฉ์น˜๊ณ  ์ง€์ง€๊ณ  ๋ณถ๊ณ  ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ตœ์ข…์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์€ ๊ตฌํ˜„์ฒด๋Š”

1. ๊ฐ•์•„์ง€

2. ์ƒˆ

3. ๊ฒฐํ˜ผํ•œ ์‚ฌ๋žŒ

 

์„ ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๊ฒ ์ฃ . ๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ์ž…๋งž์— ๋งž๊ฒŒ ์ผ๊ด„์ฒ˜๋ฆฌ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌถ์–ด์„œ ์–ด๋–ค ์ฒ˜๋ฆฌ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public class Main {

    public static void main(String[] args) {

        CrawlAnimal dog = new Dog("์šฐ๋ฆฌ๊ฐ•์•„์ง€", 5);
        FlyingAnimal eagle = new Bird("๋งค์•„๋‹˜", 3);
        MarriedMankind yubunam = new MarriedMan("์ฒ ์ˆ˜", 30, "์˜ํฌ");
        
        List<Barkable> barkables = Arrays.asList(dog, eagle);
        List<AnimalCoreBehavior> animalCoreBehaviors = Arrays.asList(dog, eagle, yubunam);
    }

}

 

๊ฐ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณด๋ฉด, ํŠน์ • ๊ธฐ๋Šฅ๋“ค์€ ์ง์ ‘ Dog, Bird ๋“ฑ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด๋„ ๋˜์ง€๋งŒ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์ž„ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณตํ†ต์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ๊ฒƒ์˜ ๊ตฌํ˜„์ฒด๋„ ๋งŒ๋“ค ์ˆœ ์žˆ์ž–์•„์š”? ๋งŒ๋“ค์–ด ๋‘๋ฉด ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

public class Dog implements CrawlAnimal {

    private AnimalCoreBehavior animalCoreBehavior;
    private Crawlable crawlDelegator;
    private Barkable barkDelegator;

    public Dog(String name, int age) {
        animalCoreBehavior = new AnimalCoreDelegator(name, age);
        crawlDelegator = new CrawlDelegator();
        barkDelegator =  new BarkDelegator("์™ˆ์™ˆ");
    }

    @Override
    public void bark() {
        barkDelegator.bark();
    }

    @Override
    public void crawl() {
        crawlDelegator.crawl();
    }

    @Override
    public void greeting() {
        animalCoreBehavior.greeting();
    }

    @Override
    public String getName() {
        return animalCoreBehavior.getName();
    }

    @Override
    public int getAge() {
        return animalCoreBehavior.getAge();
    }
}
public class Bird implements FlyingAnimal {

    private AnimalCoreBehavior animalCoreBehavior;
    private Barkable barkDelegator;

    public Bird(String name, int age) {
        this.animalCoreBehavior = new AnimalCoreDelegator(name, age);
        this.barkDelegator = new BarkDelegator("๋ผ์•ฝ ๋ผ์•ฝ");
    }

    @Override
    public void fly() {
        System.out.println("ํ‘ธ๋“œ๋“œ๋“");
    }

    @Override
    public void bark() {
        barkDelegator.bark();
    }

    @Override
    public void greeting() {
        animalCoreBehavior.greeting();
    }

    @Override
    public String getName() {
        return animalCoreBehavior.getName();
    }

    @Override
    public int getAge() {
        return animalCoreBehavior.getAge();
    }
}
public class MarriedMan implements MarriedMankind {

    private AnimalCoreBehavior animalCoreBehavior;
    private CrawlAndWalkable crawlAndWalkDelegator;
    private String sideName;

    public MarriedMan(String name, int age, String sideName) {
        this.animalCoreBehavior = new AnimalCoreDelegator(name, age);
        this.crawlAndWalkDelegator = new CrawlAndWalkDelegator("์œ ๋‚œํžˆ ๋นจ๋ฆฌ ๊ฑท๋Š”๋‹ค", "์œ ๋‚œํžˆ ๋Š๋ฆฌ๊ฐ€ ๋›ด๋‹ค.");
        this.sideName = sideName;
    }

    @Override
    public void speak() {
        System.out.println("์•ˆ๋…• ๋‚œ ๋งํ• ์ˆ˜ ์žˆ๋‹ค.");
    }

    @Override
    public void study() {
        System.out.println("๊ณต๋ถ€์ค‘");
    }

    @Override
    public void greeting() {
        animalCoreBehavior.greeting();
    }

    @Override
    public String getName() {
        return animalCoreBehavior.getName();
    }

    @Override
    public int getAge() {
        return animalCoreBehavior.getAge();
    }

    @Override
    public void crawl() {
        crawlAndWalkDelegator.crawl();
    }

    @Override
    public void tellMeYourSide() {
        System.out.println("hello my " + this.sideName);
    }

    @Override
    public void walk() {
        crawlAndWalkDelegator.walk();
    }

    @Override
    public void run() {
        crawlAndWalkDelegator.run();
    }
}

 

๊ฐ ๊ตฌํ˜„ ํด๋ž˜์Šค๋“ค์€ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ๊ฝค ๋งŽ์€ ๊ธฐ๋Šฅ์˜ ์กฐํ•ฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•„๋“œ๋ฅผ ๋ณด๋ฉด ๊ณตํ†ต์˜ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•  ์œ„์ž„ํด๋ž˜์Šค๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์ •๋„๋กœ๋งŒ ํ™•์ธํ•ด๋ด๋„ ์ธํ„ฐํŽ˜์ด์Šค ์กฐํ•ฉํ•˜๊ธฐ์— ๋”ฐ๋ผ์„œ ์—„์ฒญ๋‚œ ํ™•์žฅ์„ฑ์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋ž€๊ฑธ ์•Œ ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ์Šคํ”„๋ง์€ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ฅผ ๋„์ถœํ•˜๊ณ  ๊ทธ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ๊ฐ ์ˆ˜ํ–‰ํ•  ์œ„์ž„ํด๋ž˜์Šค๋“ค์„ ๋งŒ๋“ค์–ด ๋‚ด๋ฉด์„œ ์˜ค๋žœ๊ธฐ๊ฐ„ ๋ฐœ์ „ํ•ด ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒŒ ์•„๋‹๊นŒ ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์‹์˜ ๊ตฌ์กฐ๋ฅผ ํ˜„์—…์—์„œ ์ ์šฉํ•˜๊ธฐ๋ž€ ์ฐธ ์–ด๋ ต๋‹จ ์ƒ๊ฐ์ด ๋“œ๋„ค์š” (์•„์ง ์งฌ์ด ์•ˆ๋˜์„œ ๊ทธ๋Ÿฐ์ง€..)

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ๋ผ์ดํ”„์ฝ”๋ฆฌ์•„ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
  • shared
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ