๐๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด
๊ฐ์ฒด์งํฅ ๊ณต๋ถ๋ฅผ ํ๊ธฐ ์ํด <๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด>๋ฅผ ์ฝ๊ธฐ ์์ํ๋ค.
์ฑ ์ ๋ด์ฉ์ ๋ฌด์์ ์ ๋ฆฌํ๊ธฐ ๋ณด๋ค๋, ๋ด๊ฐ ์ด ์ฑ ์ ์ฝ๊ณ ๋ ๊ณต๋ถํ๊ณ ์ถ์ ๋ถ๋ถ์ ์ง์ ๋ฅ๋ค์ด๋ธ ํด ๋ณผ ์๊ฐ์ด๋ค.
์ด๋ฒ์ ์ฝ์ ์ฑํฐ๋ [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์ด ๋์๋ค๋ ๊ฒ์ด๋ค.
์บก์ํ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ด๋ค.
โก๏ธ ์ด์ ๊ฐ ๊ฐ์ฒด๋ค์ ์ฑ ์์๋ ์ค์ํ๊ฒ ์ธ๊ธํ๊ณ ์๋ ๋ณธ์ธ์ ์ญํ ์ ์ฑ ์์ ๋คํ๊ณ ์์ผ๋ฉฐ, ๊ฐ์ฒด๋ค๊ฐ์๋ ํ๋ ฅ์ ํ๊ณ ์๋ค.
'CS > Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CS] ๊ธฐ์ด์ง์ ์ด ์ ๋ฆฌ (๋คํธ์ํฌ, ์ด์์ฒด์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์๋ฃ๊ตฌ์กฐ) (1) | 2025.02.07 |
---|---|
[C++] ํ ํ๋ฆฟ(Template) (1) | 2023.05.27 |