<커피숍 만들기>

 

 

- 필요한 것 : 손님, 바리스타, 메뉴판(메뉴목록이라는 object가 들어있다), 커피

 

* 모든 object 는 생명력이 있다고 생각해야 한다.

ㄴ 모든 오브젝트는 역할(부모)을 가진다.

ㄴ역할(부모)을 가지면 책임(메서드)을 가진다.

ㄴ오브젝트는 다른 오브젝트들과 메시지(함수의 호출)를 통해서 협력할 수 있다.

ㄴ오브젝트는 대체될 수 있다.

 

 

 

- 손님 class 만들기 

* 책임 : 주문 

 

 

 

- 메뉴 class 만들기

* 책임 : 메뉴 선택 

 

* 가격도 같이 return 해줘야 하기 때문에 String으로 만들면 안된다!

 

 

 

 

- 메뉴 아이템 만들기

 

 

 

- 바리스타 만들기

 

 

 

- 커피 만들기 

 

* 메뉴아이템을 받아야 한다.

 

 

 

뼈대만들기 끝!

 

* CoffeeApp

package coffeeshop;

import java.util.ArrayList;

public class CoffeeApp {

	public static void main(String[] args) {
		//메뉴, 바리스타, 손님
		Consumer consumer = new Consumer();
		Barista barista = new Barista();
		
		MenuItem m1 = new MenuItem("아메리카노", 1500);
		MenuItem m2 = new MenuItem("카페라떼", 2500);
		MenuItem m3 = new MenuItem("카푸치노", 4000);
		
		ArrayList<MenuItem> menuItems = 
				new ArrayList<>();
		
		menuItems.add(m1); //시작번지 0번지 부터!
		menuItems.add(m2);
		menuItems.add(m3);
		
		Menu menu = new Menu(menuItems); //컬렉션에 담긴것 
		// System.out.println(menuItems.get(1).getName());
		
		consumer.주문("카푸치노", menu, barista);
	}
}

 

 

* Consumer 

package coffeeshop;

public class Consumer {

	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());
		}
	}
	
}

 

 

* Menu

package coffeeshop;

import java.util.ArrayList;

import lombok.Data;

@Data
public class Menu {

	// 메뉴 아이템 들(컬렉션)
	private ArrayList<MenuItem> menuItems;

	public Menu(ArrayList<MenuItem> menuItems) {
		super();
		this.menuItems = menuItems;
	}

	public MenuItem 메뉴선택(String menuName) {
		for (MenuItem menuItem : menuItems) {
			if(menuItem.getName().equals(menuName)) {
				return menuItem;
			}
		}
		return null;
	}

}

 

 

* Barista 

package coffeeshop;

public class Barista {

	public Coffee 커피생성(MenuItem menuItem) {
		return new Coffee(menuItem);
	}
	
}

 

 

* MenuItem

package coffeeshop;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor // no 매개변수 constructor (빈생성자)
@AllArgsConstructor // 모든 매개변수가 있는 constructor
// 클래스 자료형 : beans = Table(DB)
public class MenuItem {
	private String name;
	private int price;
}

 

 

* Coffee

package coffeeshop;

import lombok.Data;

@Data
public class Coffee {
	private String name;
	private int price;
	
	public Coffee(MenuItem menuItem) {
		this.name = menuItem.getName();
		this.price = menuItem.getPrice();
	}
}

 

 

 

 


 

 

 

<단방향 연결 리스트(Linked List)>

 

 

 연결리스트는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결시키면서 자료를 저장하는 자료구조이다. 배열과 비교 했을때, 데이터를 삽입/삭제 할 경우 데이터의 재구성에 용이하다. 반면 특정 위치의 데이터를 검색하기 위해서는 연결리스트를 처음부터 끝까지 순회해야 하므로 비효율적이다(셀렉트가 느리다).

 

 

 


 

 

 

<ArrayList>

 

 

- 배열이랑 동일하다. 차이점은 크기가 가변적이라는 것! 

(가변배열)

 

- 장점 : 크기가 가변적이다.

 

데이터들이 순차적으로 저장되어 랜덤으로 엑세스 할 수 있다.

 

검색 효율이 매우 뛰어나다!

 

 

- 단점 : 데이터가 삭제 될 수록 빈 공간이 많아진다.

 

* 웹프로그래밍할때는 배열말고 이거 쓰면 됨 

 

 


 

 

 

 

<Generic>

 

 

- 클래스 생성시 타입을 결정한다.

 

- E - Element, K - key, V - value, T - Type, N- Number

 

 

* 어떤 데이터를 받을지 모를때는 Object를 사용하면 된다(어떤 데이터도 다 받을 수 있다.)

단, 캐스팅 해야하는 단점이 있음

사용할때 불편하다! 

그렇기 때문에 제네릭을 사용하면 된다.

 

 

 

 

- Wrapper 클래스 : 기본자료형을 class화 시켜주는 기술  

 

* int 자리에는 레퍼런스만 들어갈 수 있다

 

 

* 이렇게 바꿔줘야한다.

 

 

- Wrapper class 종류

 

기본형 타입 - Wrapper class

byte - Byte

short - Short

int - Integer

long - Long

float - Float

double - Double

char - Charater

boolean - Boolean

 

 

 

 

 

 

 

 

 

 

 

 

 

openclose