728x90
개발의 이유
- 문제 Question :
김씨가 4,000원을 내고 별다방에서 아메리카노를 사 마셨다. 이씨는 4,500원을 내고 콩다방에서 라테를 사 마셨습니다. - 위의 문제를 처음에는 Customer 과 Cafe 클래스로 구성하여 문제를 해결했다.
- 그렇게 하니 다음과 같은 문제들이 보였다.
- 1. 메뉴별 판매 통계를 잡을 수 없었다.
- 2. Customer 클래스에 Customer 와 관련이 없는 변수와 메서드들이 생겨났다.
- 3. Customer 클래스에 buyAmericano, buyLatte 와 같이 메뉴가 추가될 때마다 메서드를 각자 따로 만들어주어야 했다.
- 4. 새로운 메뉴가 생길 때마다, 새로운 카페가 생길 때마다 변수들이 생겨났고 코드가 번잡해졌다.
- 아래 코드가 개발한 코드인데, 질문 2개가 있어서 코드와 함께 질문을 정리해 놓는다.
package object;
public class Customer {
String name;
int money;
int buyCount;
int price;
public Customer(String name, int money) {
this.name = name;
this.money = money;
}
public void buy(Cafe cafe, Menu menu) {
if (menu.menuName == "Americano") {
price = 4000;
} else if (menu.menuName == "Latte") {
price = 4500;
}
this.money -= price;
this.buyCount++;
menu.buy(price);
cafe.buy(price);
}
@Override
public String toString() {
return "Customer [name=" + name + ", money=" + money + ", buyCount=" + buyCount + "]";
}
}
package object;
public class Customer2 {
String name;
int money;
int buyCount;
int price;
public Customer2(String name, int money) {
this.name = name;
this.money = money;
}
public void buy(Cafe2 cafe, Menu menu) {
if (menu.menuName == "Americano") {
price = 4000;
} else if (menu.menuName == "Latte") {
price = 4500;
}
this.money -= price;
this.buyCount++;
menu.buy(price);
cafe.buy(price);
}
@Override
public String toString() {
return "Customer2 [name=" + name + ", money=" + money + ", buyCount=" + buyCount + "]";
}
}
package object;
public class Cafe {
String name;
int money;
int sellCount;
public static Cafe starCafe = new Cafe("starCafe");
public static Cafe beanCafe = new Cafe("beanCafe");
public Cafe(String name) {
this.name = name;
}
public void buy(int money) {
sellCount++;
this.money += money;
}
@Override
public String toString() {
return "Cafe [name=" + name + ", money=" + money + " sellCount=" + sellCount + "]";
}
}
package object;
public class Cafe2 {
String name;
int money;
int sellCount;
public Cafe2(String name) {
this.name = name;
}
public void buy(int money) {
sellCount++;
this.money += money;
}
@Override
public String toString() {
return "Cafe [name=" + name + ", money=" + money + " sellCount=" + sellCount + "]";
}
}
package object;
public class Menu {
String menuName;
int menuSellCount;
int money;
public static Menu Americano = new Menu("Americano");
public static Menu Latte = new Menu("Latte");
public Menu(String menuName) {
this.menuName = menuName;
}
public void buy(int money) {
this.money += money;
this.menuSellCount++;
System.out.println(this.menuName + "이 현재까지 " + menuSellCount + "잔 팔렸습니다.");
}
@Override
public String toString() {
return "Menu [menuName=" + menuName + ", menuSellCount=" + menuSellCount + ", money=" + money + "]";
}
}
package object;
public class CafeTest {
public static void main(String[] args) {
// 고객 인스턴스 생성 (Customer 클래스 사용)
Customer kim1 = new Customer("Kim1", 10000);
Customer kim2 = new Customer("Kim2", 10000);
Customer kim3 = new Customer("Kim3", 100000);
// 고객 인스턴스 생성 (Customer2 클래스 사용)
Customer2 kim4 = new Customer2("Kim4", 100000);
//카페 인스턴스 생성 (Cafe2 클래스 사용)
Cafe2 starCafe = new Cafe2("starCafe");
Cafe2 beanCafe = new Cafe2("beanCafe");
// 음료 주문 시작 (Cafe2 클래스 사용)
kim4.buy(starCafe, Menu.Americano);
kim4.buy(beanCafe, Menu.Latte);
// 음료 주문 시작 (Cafe 클래스 사용)
kim1.buy(Cafe.starCafe, Menu.Americano);
kim1.buy(Cafe.beanCafe, Menu.Americano);
kim2.buy(Cafe.starCafe, Menu.Latte);
kim2.buy(Cafe.beanCafe, Menu.Latte);
kim3.buy(Cafe.starCafe, Menu.Americano);
kim3.buy(Cafe.starCafe, Menu.Americano);
kim3.buy(Cafe.starCafe, Menu.Americano);
kim3.buy(Cafe.starCafe, Menu.Americano);
kim3.buy(Cafe.starCafe, Menu.Americano);
kim3.buy(Cafe.starCafe, Menu.Latte);
kim3.buy(Cafe.starCafe, Menu.Latte);
kim3.buy(Cafe.starCafe, Menu.Latte);
kim3.buy(Cafe.starCafe, Menu.Latte);
kim3.buy(Cafe.beanCafe, Menu.Latte);
kim3.buy(Cafe.beanCafe, Menu.Latte);
kim3.buy(Cafe.beanCafe, Menu.Latte);
kim3.buy(Cafe.beanCafe, Menu.Americano);
System.out.println(kim1.toString());
System.out.println(kim2.toString());
System.out.println(kim3.toString());
System.out.println(kim4.toString());
System.out.println(Cafe.starCafe.toString());
System.out.println(Cafe.beanCafe.toString());
System.out.println(Menu.Americano.toString());
System.out.println(Menu.Latte.toString());
}
}
질문 1
- 별다방의 아메리카노와 콩다방의 아메리카노는 메뉴 이름만 같지 사실은 다른 제품이다. 가격이 다를 수도 있고, 원재료가 다를수도 있으며, 수익 통계 방식도 달라질 수 있다.
- 이런 경우에 starCafeAmericano 와 같이 추가로 변수를 만드는 방법 말고 다른 해결 방법은 무엇이 있을까?
- Menu 클래스에는 menu 와 관련된 것들만 남겨놓고 싶은 이유에서 해당 욕구가 생겼다.
질문 2
- 실행 클래스에서 인스턴스를 만들어서 문제를 해결하는 것과 설계하는 클래스에서 static 으로 cafe 와 menu, Customer 의 인스턴스를 만들어서 문제를 해결하는 것 중 뭐가 더 옳은 방향인가?
답
- 우문현답이라고 했던가, 흠,, 일단 만든 프로그램의 방향성이 혼합되어서 복잡하다는 피드백이 돌아왔다.
- 우선, 지금 내가 하고 있는 방식으로 처리를 하려면 Starcafe 클래스와 Beancafe 클래스를 따로 만들어줘야 한다.
- 다시 만들어본 코드는 아래와 같다.
ㅣ
'[그린컴퓨터] Server > JAVA(객체 지향 프로그래밍)' 카테고리의 다른 글
| 다차원 배열 { 다차원 배열이란, 이차원 배열 } (0) | 2023.05.25 |
|---|---|
| 배열이란? { 배열의 필요성, 배열이란, 배열 선언과 초기화, 배열 사용하기, 문장 저장 배열 만들기, 객체 배열 사용하기, 배열 복사하기, 향상된 for문과 배열} (0) | 2023.05.25 |
| static 응용 - 싱글톤 패턴 {디자인 패턴이란, 싱글톤 패턴이란, 싱글톤 패턴으로 회사 클래스 구현하기, 연습하기} (0) | 2023.05.24 |
| GIT3 branch & conflict - 3 way merge(충돌의 이해) {충돌을 이해해야 하는 이유, 충돌 이해하기 (0) | 2023.05.23 |
| 변수 유효 범위 {변수 유효 범위란, 변수 유형을 나눈 이유} (0) | 2023.05.23 |