'

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ๋•Œ ํ๋ฆ„์€ ํ•ญ์ƒ ๋™์ผ

    1. ์‹œ์ž‘ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
    2. ์‹ค์ œ ์•Œ๋ฆผ ์ „์†ก
    3. ์™„๋ฃŒ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
    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

    ๋Œ“๊ธ€

Designed by Tistory.
ํ‹ฐ์Šคํ† ๋ฆฌ ์นœ๊ตฌํ•˜๊ธฐ