-
[STUDY03] ์ฝ๋๋ฅผ ๋ฏ์ด๋ณด์์์ฃFISA 2026. 1. 2. 08:33
๐ฉ ํ ํ๋ฆฟ๋ฉ์๋๋ฅผ ํ์ฉํ ์ฝ๋
๐ฉ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๊ธฐ์ํ ์ฝ๋๋ค
๐ฉ ์ฝ๋ ์ ์ฉํด๋ณด๊ธฐ
๐ฉ ํ ํ๋ฆฟ๋ฉ์๋๋ฅผ ํ์ฉํ ์ฝ๋
์ฐ์ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ์ ์ถ์ ๋ฉ์๋ ํด์ฃผ์ ๊ฒ ๋ถํฐ ๋ด ์๋ค.
package main.java.core; import lombok.extern.slf4j.*;; @Slf4j public abstract class MissionView { protected abstract MissionView view(); protected void breakLine(){ System.out.println("------------------"); } public void render() { this.breakLine(); MissionView result = this.view(); this.breakLine(); while(result != null) { result = result.view(); } } }1. Template Method?????? ๋์์ธ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
render()์ ์์๋๋ก ๋๋ผ๋๋ป์ด์ง
2. protected abstract MissionView view()์ ์ญํ ์ ์ฌ๊ธฐ์ ์ค์ ๋์๋ก์ง ๋ฃ์ผ๋ ์๋ฆฌ๋ค
3.breackLine๋ง์ํด๋์๋งํ๊ณ
4.null์ด๋ฉด ์ข ๋ฃํ๋๋ป
๐ฉ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๊ธฐ์ํ ์ฝ๋๋ค
๋ฉ์ธ ํ์ผ์ ๋๋ค
๋ฏธ์ ๋ชฉ์ ์ด log๋ฅผ ์ถ๋ ฅํด๋ณด์์๊ฑฐ๋ ์
์์ด๋์ด๋ ๋ฐฐ๋ฌ ๊ธฐ๋ฅ์ ํด๋ณด์์์ต๋๋ค.
๊ด๋ฆฌ์์ ์ฌ์ฉ์์ ๊ธฐ๋ฅ์ผ๋ก ๋๋๊ณ ์ฌ์ฉ์๋ ๋ฐฐ๋ฌ์ ์ํค๊ณ ๊ด๋ฆฌ์๋ ๋ฉ๋ด๋ฅผ ์์ ํฉ๋๋ค.
package main.java.main; import java.util.Scanner; import lombok.extern.slf4j.Slf4j; @Slf4j public class Mission { public static void main(String[] args) { log.info("=== ๋ฐฐ๋ฌ ์ฃผ๋ฌธ ์์คํ ์์ ==="); Scanner scanner = new Scanner(System.in); // ๋ก๊ทธ์ธ System.out.print("์ฌ์ฉ์ ID๋ฅผ ์ ๋ ฅํ์ธ์: "); String userId = scanner.nextLine(); Client client = new Client(userId, 50000); boolean running = true; while (running) { System.out.println("\n=== ์ ํ ํ๊ธฐ ==="); System.out.println("1. ์ฃผ๋ฌธํ๊ธฐ"); System.out.println("2. ์ฃผ๋ฌธ ๋ชฉ๋ก ํ์ธ"); System.out.println("3. ์์ก ํ์ธ"); System.out.println("4. ์ข ๋ฃ"); System.out.print("์ ํ: "); String choice = scanner.nextLine(); log.debug("์ฌ์ฉ์ ์ ํ - {}: {}", userId, choice); switch (choice) { case "1": client.order(); break; case "2": client.checkOrderList(); break; case "3": client.checkBalance(); break; case "4": log.info("์ฌ์ฉ์ ์ข ๋ฃ - {}", userId); System.out.println("์์คํ ์ ์ข ๋ฃํฉ๋๋ค."); running = false; break; default: log.warn("์๋ชป๋ ๋ฉ๋ด ์ ํ - ์ ๋ ฅ๊ฐ: {}", choice); System.out.println("์๋ชป๋ ์ ํ์ ๋๋ค."); } } scanner.close(); log.info("=== ๋ฐฐ๋ฌ ์ฃผ๋ฌธ ์์คํ ์ข ๋ฃ ==="); } }main๋ฃ๊ณ case๋ฌธ ๋๋ฆฌ๋ ์์ ๋ก์ง
client๊ฐ์ฒด๋ง๋ค์ด์
์ ์ ์์ด๋๋ฅผ clientํด๋๋ก ๋๊ฒจ์ค๋ค
client์์๋ ๊ธฐ๋ณธ ๋๊ณผ ์ ์ ์์ด๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด ์์ฑํ ๊ฐ์ฒด๋ instance์ด๋ค. not static
์ถ๊ฐ๋๋ฉ์๋๋ก checkbalance๋ฑ๊ณผ๊ฐ์ ์ฃผ๋ฌธ์ฒดํน ๋ฉ์๋๊ฐ์๋ค
package main.java.main; import java.util.ArrayList; import java.util.Scanner; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @Getter @Setter @Slf4j public class Client { private String id; private int money; private ArrayList<Order> orderList = new ArrayList<>(); private FoodManager foodManager = FoodManager.getInstance(); public Client(String id, int money) { this.id = id; this.money = money; log.info("๊ณ ๊ฐ ์์ฑ - ID: {}, ์ด๊ธฐ ์์ก: {}์", id, money); } // ์์ก ํ์ธ ๋ฉ์๋ ์ถ๊ฐ! public void checkBalance() { log.info("์์ก ์กฐํ - ๊ณ ๊ฐ: {}, ํ์ฌ ์์ก: {}์", id, money); System.out.println("=== ์์ก ํ์ธ ==="); System.out.println("ํ์ฌ ์์ก: " + money + "์"); if (money <= 20000) { log.warn("โ ์์ก ๊ฒฝ๊ณ - {}์ (20,000์ ์ดํ)", money); System.out.println("โ ์์ก์ด ๋ถ์กฑํฉ๋๋ค. ์ถฉ์ ์ ๊ถ์ฅํฉ๋๋ค."); } if (money <= 0) { log.warn("โ ์์ก 0์ - ์ฃผ๋ฌธ ๋ถ๊ฐ"); System.out.println("โ ์ฃผ๋ฌธํ ์ ์์ต๋๋ค."); } } // ์ฃผ๋ฌธ ๋ชฉ๋ก ํ์ธ ๋ฉ์๋ (๊ธฐ์กด showOrders ๊ฐ์ ) public void checkOrderList() { log.info("์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํ - ๊ณ ๊ฐ: {}, ์ฃผ๋ฌธ ์: {}๊ฑด", id, orderList.size()); if (orderList.isEmpty()) { log.warn("๋น ์ฃผ๋ฌธ ๋ชฉ๋ก - ๊ณ ๊ฐ: {}", id); System.out.println("์ฃผ๋ฌธ ๋ด์ญ์ด ์์ต๋๋ค."); return; } System.out.println("=== ์ฃผ๋ฌธ ๋ด์ญ ==="); int totalSpent = 0; for (Order order : orderList) { String statusText = getStatusText(order.getStatus()); System.out.println("์ฃผ๋ฌธ๋ฒํธ: " + order.getId() + ", ๋ฉ๋ด: " + order.getFood().getName() + ", ๊ฐ๊ฒฉ: " + order.getFood().getPrice() + "์" + ", ์ํ: " + statusText); totalSpent += order.getFood().getPrice(); } System.out.println("โโโโโโโโโโโโโโโโโ"); System.out.println("์ด ์ฃผ๋ฌธ ๊ฑด์: " + orderList.size() + "๊ฑด"); System.out.println("์ด ์ฌ์ฉ ๊ธ์ก: " + totalSpent + "์"); log.debug("์ด ์ฌ์ฉ ๊ธ์ก: {}์", totalSpent); } // ์ฃผ๋ฌธ ์ํ๋ฅผ ํ๊ธ๋ก ๋ณํ private String getStatusText(OrderStatus status) { switch (status) { case CREATED: return "์ฃผ๋ฌธ ์์ฑ"; case CONFIRM: return "์ฃผ๋ฌธ ํ์ "; case REJECT: return "์ฃผ๋ฌธ ๊ฑฐ๋ถ"; case PROCESSING: return "์กฐ๋ฆฌ ์ค"; default: return "์ ์ ์์"; } } public void order() { log.info("โถ ์ฃผ๋ฌธ ์์ - ๊ณ ๊ฐ: {}", id); // ์์ก ํ์ธ if (money <= 0) { log.warn("โ ์์ก ๋ถ์กฑ - ํ์ฌ ์์ก: {}์", money); System.out.println("์์ก์ด ๋ถ์กฑํฉ๋๋ค."); return; } if (money <= 20000) { log.warn("โ ์์ก ๊ฒฝ๊ณ - ํ์ฌ ์์ก: {}์ (20,000์ ์ดํ)", money); } Scanner s = new Scanner(System.in); // ๋ฉ๋ดํ ๋ณด์ฌ์ฃผ๊ธฐ foodManager.showAllMenu(); System.out.print("์ฃผ๋ฌธํ์ค ์์์ ์ ๋ ฅํด์ฃผ์ธ์: "); String foodName = s.nextLine(); log.debug("์ฃผ๋ฌธ ์์ฒญ ์์: {}", foodName); // ์์ ์ฐพ๊ธฐ Food food = foodManager.findFood(foodName); if (food == null) { log.warn("โ ์ฃผ๋ฌธ ์คํจ - ์กด์ฌํ์ง ์๋ ๋ฉ๋ด: {}", foodName); System.out.println("ํด๋น ๋ฉ๋ด๊ฐ ์์ต๋๋ค."); return; } // ๊ฐ๊ฒฉ ํ์ธ log.debug("์์ ๊ฐ๊ฒฉ: {}์, ํ์ฌ ์์ก: {}์", food.getPrice(), money); if (money < food.getPrice()) { log.warn("โ ์ฃผ๋ฌธ ์คํจ - ์์ก ๋ถ์กฑ (ํ์: {}์, ๋ณด์ : {}์)", food.getPrice(), money); System.out.println("์์ก์ด ๋ถ์กฑํฉ๋๋ค."); return; } // ์ฃผ๋ฌธ ์์ฑ try { Order order = new Order(food, this); orderList.add(order); money -= food.getPrice(); log.info("โ ์ฃผ๋ฌธ ์๋ฃ - ์ฃผ๋ฌธ๋ฒํธ: {}, ๋ฉ๋ด: {}, ๊ฐ๊ฒฉ: {}์, ๋จ์ ์์ก: {}์", order.getId(), food.getName(), food.getPrice(), money); System.out.println("์ฃผ๋ฌธ์ด ์๋ฃ๋์์ต๋๋ค!"); System.out.println("๋จ์ ์์ก: " + money + "์"); } catch (Exception e) { log.error("์ฃผ๋ฌธ ์ฒ๋ฆฌ ์ค ์ค๋ฅ ๋ฐ์ - ๋ฉ๋ด: {}", foodName, e); System.out.println("์ฃผ๋ฌธ ์ฒ๋ฆฌ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค."); } } }๋๋ public๊ณผ private protected ์ด๊ฑฐ ์ธ์ ์ด๋์ ์ธ์ง ๊ณ ๋ฏผ์ด ๋ค์์
๋จ์ํ private์ ๋ด๋ถ ํ์ผ์์๋ง protected๋ ์์์ ์ฉ public์ ์ธ๋ถ ํจํค์ง์์๋ ์จ์ผํ๋ฉด ์ฐ๋๊ฒ ๋ง๋?์ถ๋ค
๋ชฉ์ ์ด ๋ก๊ทธ์์ผ๋
log.warn / log.info/ log.debug ์จ์ฃผ๋ฉด๋๋๊ฑฐ๊ณ
๋ก๊ทธ ์์ค์ ๋ํด์๋ ๋ ธ์ ์ ์ ๋ฆฌํ๊ฒ๋ฐ
๐ฉ ์ฝ๋ ์ ์ฉํด๋ณด๊ธฐ
template method pattern์ผ๋ก ํด๋ณด๊ผ์
“์๋ฆผ ๋ณด๋ด๊ธฐ” Template Method
์๋ฆผ์ ๋ณด๋ผ ๋ ํ๋ฆ์ ํญ์ ๋์ผ
- ์์ ๋ฉ์์ง ์ถ๋ ฅ
- ์ค์ ์๋ฆผ ์ ์ก
- ์๋ฃ ๋ฉ์์ง ์ถ๋ ฅ
public asbstrace void AlarmTemplate{ // ๋ณ๊ฒฝํ๋ฉด ์๋๋ ํ๋ฆ์ด๊ธฐ๋๋ฌธ์ final๋ก ๋ฌถ์ด์ค๋๋ค public final void send(){ //์ด๋ฐ ํ๋ฆ์ผ๋ก ๊ฐ๊ฒ ๋ค ์ ์ธ start(); sendMsg(); end(); } // ์ด์ฐจํผ ๊ณ ์ ๋์ด์๊ณ ํด๋์ค ๋ด๋ถ์์๋ง ์ฐ๋๊น private private void start(){ system.out.println("์์"); } protected abstract void sendMessage(); private void end(){ system.out.println("๋"); } } public class EmailNotification extends AlarmTemplate { @Override protected void sendMessage() { System.out.println("์ด๋ฉ์ผ ์ ์ก"); } } public class Main { public static void main(String[] args) { NotificationTemplate n1 = new EmailNotification(); n1.send(); System.out.println(); NotificationTemplate n2 = new SmsNotification(); n2.send(); } }sendMessage()๊ฐ protected์ธ ์ด์ ๋ ์์ ํด๋์ค์์๋ ๋ฐ๋์ ๊ตฌํ,ํธ์ถ๋์ด์ผ ํ์ง๋ง,
์ธ๋ถ์์๋ ์ ๋ ์ง์ ํธ์ถ๋๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.๊ทธ๋์ ๋ญ๊ฐ ๋ก์ง์์๊ฐ ์์๋ ํ๋ง ์ ์ด๋๊ณ protected๋ private๋ก ์ ์ํ ๋ค์
extends override๋ก ๋ฐ์์ ์ฐ๋๊ฒ๊ฐ์์!!
override์ฐ๋์ด์ ๋
์ปดํ์ผ๋ฌ๊ฐ ํ์ธํ๋ ๊ฒ:
- ๋ถ๋ชจ ํด๋์ค์
- ๊ฐ์ ์ด๋ฆ
- ๊ฐ์ ํ๋ผ๋ฏธํฐ
- ๊ฐ์(๋๋ ๋ ๋์) ์ ๊ทผ ๋ฒ์
์ ๋ฉ์๋๊ฐ ์๋๊ฐ?
ํ๋๋ผ๋ ํ๋ฆฌ๋ฉด ์ฆ์ ์ปดํ์ผ ์๋ฌ.
๋ผ๊ณ ํ๋ค์
728x90'FISA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๊ณ ]1์ฃผ์ฐจ_์ฐ๋ฆฌFISA ํด๋ผ์ฐ๋ ์์ง๋์ด๋ง (4) 2026.01.02 [STUDY04] docker layer์ ๊ดํ์ฌ (0) 2026.01.02 [STUDY02]MVC ํจํด๊ณผ ๊ธฐํ ๋ฑ๋ฑ์ ํจํด (1) 2025.12.31 [STUDY01] Static ๋ณ์ SingleTonPattern/๊ถ๊ธ์ฆ (1) 2025.12.31 ์ฐ๋ฆฌFis์์นด๋ฐ๋ฏธ ๋ฉด์ ํ๊ธฐ+ํฉ๊ฒฉ (1) 2025.11.24