package coffeeshop;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data // getter, setter 자동생성 (눈에 보이지 않음)
@NoArgsConstructor // 디폴트 생성자
@AllArgsConstructor // 모든 매개변수를 가진 생성자
public class MenuItem {
private String name;
private int price;
}
커피 클래스를 만든다 (String, int 를 가지기 때문에 클래스 자료형)
package coffeeshop;
import lombok.Data;
@Data // getter, setter 자동생성
public class Coffee {
private String name;
private int price;
public Coffee(MenuItem menuItem) {
this.name = menuItem.getName();
this.price = menuItem.getPrice();
}
}
바리스타 생성
바리스타는 메뉴내용을 입력받아서 해당 커피를 생성한다
package coffeeshop;
// 책임 : 커피생성
public class Barista {
public Coffee 커피생성(MenuItem menuItem) {
return new Coffee(menuItem);
}
}
메뉴판 클래스를 생성
메뉴내용을 저장하고
메뉴판은 메뉴가 있는지 찾아 준다
package coffeeshop;
import java.util.ArrayList;
import lombok.Data;
// 책임 : 메뉴 선택
@Data
public class Menu {
// 메뉴 아이템들 (컬렉션)
private ArrayList<MenuItem> menuItems;
public Menu(ArrayList<MenuItem> menuItems) {
this.menuItems = menuItems;
}
// 메뉴판에 메뉴가 있는지 찾는 코드
public MenuItem 메뉴선택(String menuName) {
for (MenuItem menuItem : menuItems) { // foreach문은 : 뒤에 배열이 들어가고 배열의 길이만큼 돈다
if (menuItem.getName().equals(menuName)) {
// menuItems 리스트 안에 menuName와 같은 이름의 커피가 있다면 리턴
//(리턴하면 함수를 빠져나간다)
return menuItem;
}
}
return null;
}
}
소비자 생성
소비자는 가게에서 주문을 한다
-메뉴판에서 내가 고를 메뉴내용을 선택하고
-바리스타에게 커피를 만들어달라고 한다
package coffeeshop;
import lombok.Data;
// 책임 : 주문
@Data
public class Comsumer {
public void 주문(String menuName, Menu menu, Barista barista) {
// 손님 -> 메뉴판에 메시지를 보낸다 (메뉴 선택해줘)
MenuItem menuItem = menu.메뉴선택(menuName);
if (menuItem == null) {
System.out.println(menuName + "은 우리 커피숍에 없습니다.");
} else {
// 손님 -> 바리스타에게 메시지를 보낸다 (커피 생성해줘)
Coffee coffee = barista.커피생성(menuItem);
System.out.println("커피를 받았습니다.");
System.out.println(coffee.getName());
System.out.println(coffee.getPrice());
}
}
}
메인
메인에서는 바리스타, 손님, 메뉴판을 생성한다
그리고 손님이 주문하면 모든 일들이 진행된다
package coffeeshop;
import java.util.ArrayList;
public class CoffeeApp {
public static void main(String[] args) {
// 바리스타, 손님
Comsumer comsumer = new Comsumer();
Barista barista = new Barista();
// 메뉴 생성과 메뉴판 리스트에 자료를 넣는 것은 바리스타의 일이지만
// 간략하게 하기위해서 메인에서 작성한다
// 개별 메뉴 생성
MenuItem m1 = new MenuItem("아메리카노", 1500);
MenuItem m2 = new MenuItem("카페라떼", 2500);
MenuItem m3 = new MenuItem("카푸치노", 4000);
// 어레이 리스트에 자료 입력 .add
ArrayList<MenuItem> menuItems = new ArrayList<>();
menuItems.add(m1);
menuItems.add(m2);
menuItems.add(m3);
// 어레이리스트 자료를 출력할때 .get
System.out.println(menuItems.get(1).getName());
System.out.println();
// 메뉴 생성
Menu menu = new Menu(menuItems);
comsumer.주문("아메리카노", menu, barista);
}
}
package composite;
import lombok.Data;
@Data // getter, setter 생성
public class Burger {
private int price;
private String desc;
public Burger() {
this(1500, "기본버거");
}
public Burger(int price, String desc) {
this.price = price;
this.desc = desc;
System.out.println(desc + "가 만들어졌습니다.");
}
public static void main(String[] args) {
System.out.println(new Burger().getPrice());
}
}
코카콜라 만들기
package composite;
import lombok.Data;
@Data
public class Coke {
private int price;
private String desc;
public Coke() {
this(1500, "코카콜라");
}
public Coke(int price, String desc) {
this.price = price;
this.desc = desc;
System.out.println(desc + "가 만들어졌습니다.");
}
public static void main(String[] args) {
System.out.println(new Coke().getPrice());
}
}
감자칩 만들기
package composite;
import lombok.Data;
@Data
public class FrenchFried {
private int price;
private String desc;
public FrenchFried() {
this(2000, "감자칩");
}
public FrenchFried(int price, String desc) {
this.price = price;
this.desc = desc;
System.out.println(desc + "이 만들어졌습니다.");
}
public static void main(String[] args) {
System.out.println(new FrenchFried().getPrice());
}
}
Burger를 상속받아서 BigBurger 만들기
package composite;
import lombok.Data;
@Data
public class BigBurger extends Burger {
public BigBurger() {
super(4000, "빅버거");
}
public BigBurger(int price, String desc) {
super(price, desc);
}
public static void main(String[] args) {
System.out.println(new BigBurger().getPrice());
}
}
Burger를 상속받아서 ShrimpBurger 만들기
package composite;
import lombok.Data;
@Data
public class ShrimpBurger extends Burger {
public ShrimpBurger() {
super(3500, "쉬림프버거");
}
public ShrimpBurger(int price, String desc) {
super(price, desc);
}
public static void main(String[] args) {
System.out.println(new ShrimpBurger().getPrice());
}
}
콤포지션을 이용하여 클래스 안에 클래스를 사용하기
BigBurgerSet만들기
package composite;
import lombok.Data;
// 자바는 다중 상속이 안됨 (부모가 여럿이 될 수 없음)
@Data
public class BigBurgerSet {
// 콤포지션(중요) - 상속이 아닌 만들어 놓은 클래스를 가져오는 것
private BigBurger bigBurger;
private Coke coke;
private FrenchFried frenchFried;
public BigBurgerSet() {
this(new BigBurger(), new Coke(), new FrenchFried());
}
public BigBurgerSet(BigBurger bigBurger) {
this.bigBurger = bigBurger;
this.coke = new Coke();
this.frenchFried = new FrenchFried();
}
public BigBurgerSet(BigBurger bigBurger, Coke coke, FrenchFried frenchFried) {
this.bigBurger = bigBurger;
this.coke = coke;
this.frenchFried = frenchFried;
}
public static void main(String[] args) {
System.out.println(new BigBurgerSet().getBigBurger());
}
}
ShrimpBurgerSet 만들기
package composite;
import lombok.Data;
@Data
public class ShrimpBurgerSet {
// 콤포지션(중요) - 상속이 아닌 만들어 놓은 클래스를 가져오는 것
private ShrimpBurger shrimpBurger;
private Coke coke;
private FrenchFried frenchFried;
public ShrimpBurgerSet() {
this(new ShrimpBurger(), new Coke(), new FrenchFried());
}
public ShrimpBurgerSet(ShrimpBurger shrimpBurger) {
this(shrimpBurger, new Coke(), new FrenchFried());
}
public ShrimpBurgerSet(Coke coke) {
this(new ShrimpBurger(), coke, new FrenchFried());
}
public ShrimpBurgerSet(FrenchFried frenchFried) {
this(new ShrimpBurger(), new Coke(), frenchFried);
}
public ShrimpBurgerSet(ShrimpBurger shrimpBurger, Coke coke) {
this(shrimpBurger, coke, new FrenchFried());
}
public ShrimpBurgerSet(ShrimpBurger shrimpBurger, FrenchFried frenchFried) {
this(shrimpBurger, new Coke(), frenchFried);
}
public ShrimpBurgerSet(Coke coke, FrenchFried frenchFried) {
this(new ShrimpBurger(), coke, frenchFried);
}
// 생성자가 제일 많은 것이 기준
public ShrimpBurgerSet(ShrimpBurger shrimpBurger, Coke coke, FrenchFried frenchFried) {
this.shrimpBurger = shrimpBurger;
this.coke = coke;
this.frenchFried = frenchFried;
}
public static void main(String[] args) {
System.out.println(new ShrimpBurgerSet().getShrimpBurger());
}
}
LotteriaApp 만들기 (햄버거 운영)
package composite;
public class LotteriaApp {
public static void main(String[] args) {
// 빅버거 세트
BigBurgerSet set1 = new BigBurgerSet();
System.out.println();
// 기본버거
Burger burger1 = new Burger();
System.out.println();
// 콜라
Coke coke1 = new Coke();
System.out.println();
// BigBurgerSet
BigBurgerSet set2 = new BigBurgerSet(
new BigBurger(3000, "빅버거할인"),
new Coke(),
new FrenchFried()
);
System.out.println();
BigBurgerSet set3 = new BigBurgerSet(
new BigBurger(2000, "빅버거할인"),
new Coke(),
new FrenchFried()
);
System.out.println();
// 새우버거 세트 추가요
ShrimpBurgerSet set4 = new ShrimpBurgerSet();
System.out.println();
BigBurgerSet set5 = new BigBurgerSet(
new BigBurger(2000, "빅버거할인")
);
System.out.println();
}
}