본문 바로가기
독서

객체지향의 사실과 오해 (Chapter 7 - 함께 모으기)

by graygreat 2021. 4. 14.
728x90
반응형

마지막 장에서는 카페를 빗대어 객체지향을 설명해주고 있다.
이 책에서 처음으로 코드를 짜는게 나온다.
1장부터 6장까지의 봤던 객체지향의 내용을 마지막 장에서 직접 개발하면서 정리하는 느낌인데, 정말 많은 도움이 됐다.

카페 구성

손님, 메뉴판, 메뉴 구성, 바리스타, 커피로 구성되어 있다.
요구사항은 다음과 같다.

  • 손님에게 메뉴 이름과 함께 커피를 주문하라는 메시지가 전달된다.
  • 손님은 메뉴판에서 메뉴 항목을 찾는다.
  • 찾은 메뉴 항목을 바리스타에게 커피를 제조하라는 메시지와 함께 전달한다.
  • 바리스타는 커피를 생성한다.

다음 4가지의 요구사항을 구현 해보자.

우선 손님을 구현해보자.

public class Customer {

    public Coffee order(String menuName, Menu menu, Barista barista) {
        MenuItem menuItem = menu.choose(menuName);
        Coffee coffee = barista.makeCoffee(menuItem);

        return coffee;
    }
}

손님은 주문을 하는데 메뉴 이름을 받아 메뉴를 선택하고 바리스타에게 커피를 만들라고 메시지를 보낸다.

import java.util.List;

public class Menu {
    private List<MenuItem> items;

    public Menu(List<MenuItem> items) {
        this.items = items;
    }

    public MenuItem choose(String menuName) {
        for (MenuItem item : items) {
            if (item.getName().equals(menuName)) {
                return item;
            }
        }
        return null;
    }
}
public class MenuItem {

    private String name;
    private int price;

    public MenuItem(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }
}

메뉴 아이템은 이름과 가격의 필드를 갖는다.
메뉴판에는 여러가지 메뉴 아이템이 있기에 List로 받고 메뉴를 선택하고 반환해야하는 책임이 있기 때문에 choose 메소드를 구현한다.

public class Barista {

    public Coffee makeCoffee(MenuItem menuItem) {
        Coffee coffee = new Coffee(menuItem);
        return coffee;
    }
}
public class Coffee {

    private String name;
    private int price;

    public Coffee(MenuItem menuItem) {
        this.name = menuItem.getName();
        this.price = menuItem.getPrice();
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }
}

반환된 메뉴를 통해 바리스타는 커피를 만든다.

테스트 코드는 아래와 같다.

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

class CustomerTest {

    public List<MenuItem> basicMenuItem() {
        List<MenuItem> menuItems = new ArrayList<>();
        MenuItem menu1 = new MenuItem("menu1", 10000);
        MenuItem menu2 = new MenuItem("menu2", 20000);
        MenuItem menu3 = new MenuItem("menu3", 30000);
        menuItems.add(menu1);
        menuItems.add(menu2);
        menuItems.add(menu3);

        return menuItems;
    }

    @Test
    public void 메뉴_생성_테스트() throws Exception {
        //given
        List<MenuItem> menuItems = basicMenuItem();

        //when
        Menu menu = new Menu(menuItems);
        MenuItem item = menu.choose("menu1");

        //then
        Assertions.assertEquals(menuItems.get(0).getName(), item.getName());
    }

    @Test
    public void 커피_생성_테스트() throws Exception {
        //given
        List<MenuItem> menuItems = basicMenuItem();

        //when
        Customer customer = new Customer();
        Menu menu = new Menu(menuItems);
        Barista barista = new Barista();
        Coffee coffee = customer.order("menu2", menu, barista);

        //then
        Assertions.assertEquals(menuItems.get(1).getName(), coffee.getName());

    }
}

이번 장을 공부하면서 객체지향으로 개발을 한다는 것을 느낄 수 있었다.
하지만 아직 많이 부족하다. 책을 한번 읽고 이해가 됐으면 나는 천재겠지?
꾸준히 읽고 공부하자...

반응형

댓글