๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CS/Study

[๊ฐ์‚ฌ์˜ค] ์ฝ”๋“œ๋กœ ์•Œ์•„๋ณด๋Š” ๊ฐ์ฒด์˜ "์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ"

by bona.com 2025. 3. 16.

๐Ÿ“š๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด

 

๊ฐ์ฒด์ง€ํ–ฅ ๊ณต๋ถ€๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด <๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด>๋ฅผ ์ฝ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ฑ…์˜ ๋‚ด์šฉ์„ ๋ฌด์ž‘์ • ์ •๋ฆฌํ•˜๊ธฐ ๋ณด๋‹ค๋Š”, ๋‚ด๊ฐ€ ์ด ์ฑ…์„ ์ฝ๊ณ  ๋” ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์„ ์ง์ ‘ ๋”ฅ๋‹ค์ด๋ธŒ ํ•ด ๋ณผ ์ƒ๊ฐ์ด๋‹ค.

 

์ด๋ฒˆ์— ์ฝ์€ ์ฑ•ํ„ฐ๋Š” [01. ํ˜‘๋ ฅํ•˜๋Š” ๊ฐ์ฒด๋“ค์˜ ๊ณต๋™์ฒด]๋กœ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๋ณธ์งˆ์— ๋Œ€ํ•ด ํŒŒ๊ณ ๋“ ๋‹ค.

 

๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์ž˜ ์ง  ์ฝ”๋“œ๋Š” ๋ฌด์—‡์ผ๊นŒ?

  • ๊ฐ์ฒด๋Š” ์ถฉ๋ถ„ํžˆ 'ํ˜‘๋ ฅ์ '์ด์–ด์•ผ ํ•œ๋‹ค. ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์š”์ฒญ์— ์ถฉ์‹คํžˆ ์‘๋‹ตํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์ ๊ทน์ ์œผ๋กœ ๋„์›€์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 
  • ๊ฐ์ฒด๊ฐ€ ์ถฉ๋ถ„ํžˆ '์ž์œจ์ '์ด์–ด์•ผ ํ•œ๋‹ค. ๋ณธ์ธ ์Šค์Šค๋กœ์˜ ์›์น™์— ๋”ฐ๋ผ ์–ด๋–ค ์ผ์„ ํ•˜๊ฑฐ๋‚˜ ์ž๊ธฐ ์Šค์Šค๋กœ ํ†ต์ œํ•˜์—ฌ ์ ˆ์ œํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 

'๊ฐ์ฒด์˜ ์ž์œจ์„ฑ'์— ๋Œ€ํ•ด ๋ณด์ถฉ ์„ค๋ช…์„ ํ•˜์ž๋ฉด, ๊ฐ์ฒด์˜ ๋‚ด๋ถ€์™€ ์™ธ๋ถ€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ์ฒด์˜ ์‚ฌ์ ์ธ ๋ถ€๋ถ„์€ ๊ฐ์ฒด ์Šค์Šค๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์™ธ๋ถ€์—์„œ ์ผ์ฒด ๊ฐ„์„ญํ•  ์ˆ˜ ์—†๋„๋ก ์ฐจ๋‹จํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐ์ฒด์˜ ์™ธ๋ถ€์—์„œ๋Š” ์ ‘๊ทผ์ด ํ—ˆ๋ฝ๋œ ์ˆ˜๋‹จ์„ ํ†ตํ•ด์„œ๋งŒ ๊ฐ์ฒด์™€ ์˜์‚ฌ์†Œํ†ตํ•ด์•ผ ํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ๋งŒ ๋ณด๋ฉด ๋Œ€์ถฉ ์ดํ•ด๋Š” ๊ฐˆ ํ…Œ์ง€๋งŒ ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ๋˜ ๋Š๋‚Œ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

 

์ฝ”๋“œ๋กœ ์•Œ์•„๋ณด๊ธฐ

์‹๋‹น ์Šคํƒœํ”„๊ฐ€ ๋ฐฅ์„ ๋จน์€ ์†๋‹˜์—๊ฒŒ ๊ฒฐ์ œ๋ฅผ ์š”์ฒญํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ํ˜„๊ธˆ ๊ฒฐ์ œ๊ฐ€ ์‹๋‹น์—๊ฒŒ ์ด๋“์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒœํ”„๋Š” ์†๋‹˜์ด ํ˜„๊ธˆ์„ ์†Œ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉด ํ˜„๊ธˆ์œผ๋กœ, ์—†์œผ๋ฉด ์นด๋“œ๋กœ ๊ฒฐ์ œ๋ฅผ ๋ถ€ํƒํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

๋จผ์ € ํ˜„๊ธˆ์˜ ๊ฐ€๊ฒฉ์„ Cash ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

public class Cash {
    private int cashAmount;

    public int getCashAmount() {
        return cashAmount;
    }
}

 

์นด๋“œ๋„ ๋˜‘๊ฐ™์ด Credit ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•ด ์ค€๋‹ค.

public class Credit {
    private int creditAmount;

    public int getCreditAmount() {
        return creditAmount;
    }
}

 

์†๋‹˜์€ ๊ฐ€๋ฐฉ์— ํ˜„๊ธˆ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜๋„, ์นด๋“œ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜๋„, ํ˜น์€ ๋‘˜๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์ œ์•ฝํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์•„๋ž˜์ฒ˜๋Ÿผ 3๊ฐœ์˜ ์ƒ์„ฑ์ž ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฐ€๋ฐฉ Bag ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

public class Bag {
    private Cash cash;
    private Credit credit;

    public Bag(Cash cash) {
        this.cash = cash;
    }

    public Bag(Credit credit) {
        this.credit = credit;
    }

    public Bag(Credit credit, Cash cash) {
        this.credit = credit;
        this.cash = cash;
    }

    public boolean hasCash() {
        return cash != null;
    }

    public int getCash() {
        return cash.getCashAmount();
    }

    public int getCredit() {
        return credit.getCreditAmount();
    }
}

 

๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐ€๋ฐฉ์„ ๋“ค๊ณ  ์žˆ๋Š” ์†๋‹˜ Guest ํด๋ž˜์Šค์ด๋‹ค.

public class Guest {
    private Bag bag;

    public Guest(Bag bag) {
        this.bag = bag;
    }

    public Bag getBag() {
        return bag;
    }
}

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€๊ฒฉ์„ ์š”๊ตฌํ•˜๋Š” ์Šคํƒœํ”„ Staff ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

public class Staff {
    private Guest guest;

    public Staff(Guest guest) {
        this.guest = guest;
    }

    public int requestPayment() {
	int price;
        if(guest.getBag().hasCash()) {
            price = guest.getBag().getCash();
        } else{
            price = guest.getBag().getCredit();
        }
        return price;
    }
}

 

์ง€๊ธˆ๊นŒ์ง€ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค๊ฐ„ ์˜์กด์„ฑ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๊ฒฐ๊ณผ๋„ ์ œ๋Œ€๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๋œป๋ณด๋ฉด "์ž˜ ์ง  ์ฝ”๋“œ ์•„๋‹Œ๊ฐ€?" ๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

์Šคํƒœํ”„๊ฐ€ ์†๋‹˜์˜ ๊ฐ€๋ฐฉ์—์„œ ํ˜„๊ธˆ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์ง์ ‘ ํ™•์ธํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, ๊ฐ์ฒด ์‚ฌ์ด์˜ ์˜์กด์„ฑ์ด ๊ฐ•ํ•ด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง„ ๊ฒƒ์ด๋‹ค.

 

๋‘ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์œผ๋ฉด ๋†’์„์ˆ˜๋ก ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋  ํ™•๋ฅ ๋„ ๋†’์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

 

์ž์œจ์„ฑ ๋ถ€์—ฌ

๊ทธ๋ž˜์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ž์œจ์„ฑ์„ ๋ถ€์—ฌํ•ด๋ณด๋„๋ก ํ•˜์ž.

์Šคํƒœํ”„๋Š” ๊ฒฐ์ œ๋ฅผ ์š”๊ตฌํ•œ๋‹ค๋Š” ์š”์ฒญ๋งŒ ์†๋‹˜์—๊ฒŒ ๋ณด๋‚ด๊ณ , ์†๋‹˜์ด ์ง์ ‘ ๊ฐ€๋ฐฉ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋‘๋Š” ๊ฒƒ์ด๋‹ค.

 

Staff ํด๋ž˜์Šค์— ์žˆ๋˜ requestPayment๋ฅผ ์ „๋ถ€ Guest ํด๋ž˜์Šค๋กœ ์˜ฎ๊ธฐ๋ฉด ๋œ๋‹ค.

public class Guest {
    private Bag bag;

    public Guest(Bag bag) {
        this.bag = bag;
    }

//    public Bag getBag() {
//        return bag;
//    }

    public int requestGuest() {
        int price;
        if(bag.hasCash()) {
            price = bag.getCash();
        } else{
            price = bag.getCredit();
        }
        return price;
    }
}
public class Staff {
    private Guest guest;

    public Staff(Guest guest) {
        this.guest = guest;
    }

    public int requestPayment() {
      return guest.requestGuest();
    }
}

 

๊ทธ๋Ÿฌ๋ฉด ์œ„ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด geBag() ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง€์›Œ์ค˜๋„ ๋œ๋‹ค.

์ด์ œ ์Šคํƒœํ”„๋Š” ๋”์ด์ƒ ์†๋‹˜์˜ ๊ฐ€๋ฐฉ์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•œ๋‹ค.

 

์ˆ˜์ •๋œ ์˜์กด์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Staff๋Š” ์˜ค์ง Guest์˜ ์ธํ„ฐํŽ˜์ด์Šค(interface)์—๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค.

๊ฐ์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ๊ณต๊ฐœํ•˜๋Š” ๊ฒƒ์€ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์„ค๊ณ„ ์›์น™์ด๋‹ค.

 

๋” ๊ฐœ์„ ํ•˜์ž

์•„์ง ๊ฐœ์„ ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๋‚จ์•„์žˆ๋‹ค.

์—ฌ์ „ํžˆ ๊ฐ€๋ฐฉ์€ ์†๋‹˜์— ์˜ํ•ด ๋Œ๋ ค๋‹ค๋‹ˆ๋Š” ์ˆ˜๋™์ ์ธ ์กด์žฌ์ด๋‹ค.

๊ทธ๋ž˜์„œ Guest ํด๋ž˜์Šค์— ์žˆ๋˜ "๊ฐ€๋ฐฉ์— ํ˜„๊ธˆ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€" ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ „๋ถ€ Bag ํด๋ž˜์Šค์˜ hold ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ๋„ฃ์–ด์ค€๋‹ค.

public class Bag {
    private Cash cash;
    private Credit credit;

    public Bag(Cash cash) {
        this.cash = cash;
    }

    public Bag(Credit credit) {
        this.credit = credit;
    }

    public Bag(Credit credit, Cash cash) {
        this.credit = credit;
        this.cash = cash;
    }

    public int hold() {
        int price;
        if(hasCash()) {
            price = getCash();
        } else{
            price = getCredit();
        }
        return price;
    }

    private boolean hasCash() {
        return cash != null;
    }

    private int getCash() {
        return cash.getCashAmount();
    }

    private int getCredit() {
        return credit.getCreditAmount();
    }
}
public class Guest {
    private Bag bag;

    public Guest(Bag bag) {
        this.bag = bag;
    }

    public int buy() {
       return bag.hold();
    }
}

 

์ด์ œ Guest๋Š” Bag์˜ ๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•ด๋ด์•ผํ•  ์ ์€ ๊ธฐ์กด Bag ํด๋ž˜์Šค์˜ public์ด์—ˆ๋˜ ํ•จ์ˆ˜๋“ค์ด ๋ชจ๋‘ private์ด ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์บก์Šํ™”๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ์ด๋‹ค.

 

โžก๏ธ ์ด์ œ ๊ฐ ๊ฐ์ฒด๋“ค์€ ์ฑ…์—์„œ๋„ ์ค‘์š”ํ•˜๊ฒŒ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋Š” ๋ณธ์ธ์˜ ์—ญํ• ์— ์ฑ…์ž„์„ ๋‹คํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ์ฒด๋“ค๊ฐ„์—๋„ ํ˜‘๋ ฅ์„ ํ•˜๊ณ  ์žˆ๋‹ค.