[그린컴퓨터] Server/JAVA(객체 지향 프로그래밍)

간단한 카페 프로그램 개발해보기(객체 간 협업, 참조변수 활용) {개발의 이유, 질문}

Ben의 프로그램 2023. 5. 24. 19:03
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 클래스를 따로 만들어줘야 한다. 
  • 다시 만들어본 코드는 아래와 같다. 
  •