List에서 제공하는 주요메서드
이름 기능
add(E e) E는 처음에 List를 선언할때 사용했던 타입의 종류(Generic이라고 함)
새로운 객체를 List에 집어넣는 명령
List<String> strList = new ArrayList<String>(); 으로 만들었다면
String str = "User4";
strList.add(str); //String 타입만 가능
contains(Object o) 파라미터로 전달된 객체가 존재하는지 확인해서 true/false로 전달한다.
데이터 개수가 많을수록 contains 는 느려진다.
get(int index) index의 데이터를 돌려준다.
remove(int index) index 위치의 데이터를 삭제한다.
10.
컬렉션은 데이터를 담는객체 #1
• 우리는 컬렉션에 데이터를 주면, 데이터를 넣으라고 명령한다.
• 우리는 컬렉션에 데이터를 달라고 요구한다.
• 우리는 컬렉션에 데이터를 지우라고 요구한다.
실제로 행동을 하는 주체는 누구인가?
우리는 메시지로 일을 객체에 위임한다.
11.
컬렉션은 데이터를 담는객체 #2
결국 우리는 객체의 인터페이스만 관심을 둠
(추상화)
내부 구조를 몰라도 되므로, 내부 구조가 바
뀌더라도 문제가 발생하지 않음.
12.
실습 #1
import java.util.Collection;
importjava.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class ArrayListTest {
public static void main(String...args) {
Collection<User> users = new ArrayList<User>();
update(users);
print(users);
}
public static void update(Collection<User> users) {
users.add(new User("User1"));
users.add(new User("User2"));
}
public static void print(Collection<User> users) {
for (User user : users) {
System.out.println(user.getName());
}
}
}
13.
추상도가 높아질 수록,사용범위도 넓어진다.
Collection<E>
List<E> Set<E>
ArrayList<E> HashSet<E>
HashSet은 List으로 받을 수 없다.
ArrayList는 Collection으로 받을 수 있다.
ArrayList는 Set으로 받을 수 없다.
HashSet은 Collection으로 받을 수 있다.
14.
실습 프로젝트 -다 함께 진행해봅시다.
• 커피가게를 생각해봅시다.
• 다음 메뉴판이 있습니다.
• 실습코드는 https://github.com/charsyam/CoffeeStoreExample
메뉴 가격
아메리카노 3000
카페라테 4000
카푸치노 4000
카라멜마키아토 5000
주문 코드
public classCoffeeStore {
public static void main(String [] args) {
Customer customer = new Customer();
Barista barista = new Barista();
Menu menu = new Menu();
customer.order("Americano", menu, barista);
}
}
MenuItem 클래스
아래의 코드를보면 어떤 속성이 필요한가요?
class MenuItem {
String getName();
int getPrice();
}
제공할
메소드
57.
MenuItem 클래스
public classMenuItem {
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; }
}
Menu 클래스
class Menu{
MenuItem choose(String name);
}
MenuItem 이름으로 MenuItem을 찾아서 돌려줘야 합니다.
60.
Menu 클래스 #1
publicclass Menu {
private List<MenuItem> menus;
public Menu(List<MenuItem> menus) {
this. menus = menus;
}
public MenuItem choose(String name) {
//코드를 구현해봅시다.
}
}
61.
주문 코드
public classCoffeeStore {
public static void main(String [] args) {
Customer customer = new Customer();
Barista barista = new Barista();
List<MenuItem> menus = new ArrayList<MenuItem>();
menus.add(new MenuItem("Americano", 3000));
menus.add(new MenuItem("Caffelatte", 4000));
Menu menu = new Menu(menus);
customer.order("Americano", menu, barista);
}
}
62.
Menu 클래스 #1
publicclass Menu {
private List<MenuItem> menus;
public Menu(List<MenuItem> menus) {
this. menus = menus;
}
public MenuItem choose(String name) {
//코드를 구현해봅시다.
}
}
63.
Menu 클래스 #2
publicclass Menu {
……
public MenuItem choose(String name) {
for (MenuItem menuItem : menus) {
if (menuItem.getName().equals(name)) {
return menuItem;
}
}
return null;
}
}
주문 코드
public classCoffeeStore {
public static void main(String [] args) {
Customer customer = new Customer();
Barista barista = new Barista();
List<MenuItem> menus = new ArrayList<MenuItem>();
menus.add(new MenuItem("Americano", 3000));
menus.add(new MenuItem("Caffelatte", 4000));
Menu menu = new Menu(menus);
customer.order("Americano", menu, barista);
}
}
73.
현재 코드 Menu의단점
Menu가 내부적으로 List를 쓰고 있어서
MenuItem이 많아지면 속도가 느려집니다.
74.
정보 은닉(Information Hiding)#1
사용자 Menu
연관된 객체의 상세 정보를 알 수록
수정하기 어렵다. Menu가 다른
컬렉션을 사용하면?
나는 Menu가 List 형태의 menus
를 가지고 있는걸 알고 있어. 그래서
너의 menus.get을 바로 호출할께.
75.
정보 은닉(Information Hiding)#2
사용자 Menu
연관된 객체의 정보를 모를 수록
상대방이 바뀌어도 수정이 필요 없다.
나는 너에 대해서는 전혀 모르고
choose로 이름을 주면 MenuItem
을 주는것만 알아.
ListTypeMenu Class
import java.util.List;
publicclass ListTypeMenu implements Menu {
private List<MenuItem> menus;
public ListTypeMenu(List<MenuItem> menus) {
this.menus = menus;
}
public MenuItem choose(String name) {
for (MenuItem menuItem : menus) {
if (menuItem.getName().equals(name)) {
return menuItem;
}
}
return null;
}
}
78.
MapTypeMenu Class
import java.util.HashMap;
importjava.util.Collection;
public class MapTypeMenu implements Menu {
private HashMap<String, MenuItem> menus = new HashMap<>();
public MapTypeMenu(Collection<MenuItem> menuItems) {
for (MenuItem menuItem : menuItems) {
menus.put(menuItem.getName(), menuItem);
}
}
public MenuItem choose(String name) {
return menus.get(name);
}
}
79.
주문 코드 :ListTypeMenu
public class CoffeeStore {
public static void main(String [] args) {
Customer customer = new Customer();
Barista barista = new Barista();
List<MenuItem> menus = new ArrayList<MenuItem>();
menus.add(new MenuItem("Americano", 3000));
menus.add(new MenuItem("Caffelatte", 4000));
Menu menu = new ListTypeMenu(menus);
customer.order("Americano", menu, barista);
}
}
80.
주문 코드 :MapTypeMenu
public class CoffeeStore {
public static void main(String [] args) {
Customer customer = new Customer();
Barista barista = new Barista();
List<MenuItem> menus = new ArrayList<MenuItem>();
menus.add(new MenuItem("Americano", 3000));
menus.add(new MenuItem("Caffelatte", 4000));
Menu menu = new MapTypeMenu(menus);
customer.order("Americano", menu, barista);
}
}
커피 주문에서 문제가될 수 있는 상황은?
손님이 메뉴판을 보고 메뉴를 고릅니다.
메뉴판에 없는 메뉴 이름이면?
바리스타가 메뉴를 받아서 제조합니다.
바리스타가 못 만드는 메뉴면?
84.
Customer Class
public classCustomer {
public void order(String name, Menu menu, Barista barista) {
MenuItem menuItem = menu.choose(name);
Coffee coffee = barista.make(menuItem);
System.out.println("Drink : " + coffee.getName());
}
}
없는 메뉴라면
menuItem 은 null 이다.
barista가 못만들면
coffee가 null 이다.
NullPointerException 발생
주문 코드 :NullPointerException
public class CoffeeStore {
public static void main(String [] args) {
Customer customer = new Customer();
Barista barista = new Barista();
List<MenuItem> menus = new ArrayList<MenuItem>();
menus.add(new MenuItem("Americano", 3000));
menus.add(new MenuItem("Caffelatte", 4000));
Menu menu = new MapTypeMenu(menus);
customer.order("milk", menu, barista);
}
}
87.
예외를 구분하고 싶다면: 서로 다른 에러
손님이 메뉴판을 보고 메뉴를 고릅니다.
메뉴판에 없는 메뉴 이름이면?
바리스타가 메뉴를 받아서 제조합니다.
바리스타가 못 만드는 메뉴면?
NotExistedMenuException
NotSupportedMenuException
Menu interface 수정
publicinterface Menu {
public MenuItem choose(String name) throws NotExistedMenuException;
}
91.
ListTypeMenu Class 수정
importjava.util.List;
public class ListTypeMenu implements Menu {
private List<MenuItem> menus;
public ListTypeMenu(List<MenuItem> menus) {
this.menus = menus;
}
public MenuItem choose(String name) throws NotExistedMenuException {
for (MenuItem menuItem : menus) {
if (menuItem.getName().equals(name)) {
return menuItem;
}
}
throw new NotExistedMenuException(name);
}
}
92.
MapTypeMenu Class 수정
importjava.util.HashMap;
import java.util.Collection;
public class MapTypeMenu implements Menu {
private HashMap<String, MenuItem> menus = new HashMap<>();
public MapTypeMenu(Collection<MenuItem> menuItems) {
for (MenuItem menuItem : menuItems) {
menus.put(menuItem.getName(), menuItem);
}
}
public MenuItem choose(String name) throws NotExistedMenuException {
if (menus.containsKey(name) == false) {
throw new NotExistedMenuException(name);
}
return menus.get(name);
}
}
93.
Barista Class의 변경
publicclass Barista {
public Coffee make(MenuItem menuItem) throws NotSupportedMenuException {
return new Coffee(menuItem.getName());
}
}
NewbieBarista Class
public classNewbieBarista extends Barista {
public Coffee make(MenuItem menuItem) throws NotSupportedMenuException {
if (menuItem.getName().equals("americano") == false) {
throw new NotSupportedMenuException(menuItem.getName());
}
return new Coffee(menuItem.getName());
}
}
96.
NewbieBarista Class
public classNewbieBarista extends Barista {
public Coffee make(MenuItem menuItem) throws NotSupportedMenuException {
if (menuItem.getName().equals("americano") == false) {
throw new NotSupportedMenuException(menuItem.getName());
}
return new Coffee(menuItem.getName());
}
}
Overriding : 부모 클래스의 메서드를 재정의
97.
주문 코드 비교: Barista
import java.util.ArrayList;
import java.util.List;
public class CoffeeStore {
public static void main(String[] args) {
Customer customer = new Customer();
Barista brista = new Barista();
List<MenuItem> coffeeMenu = new ArrayList<MenuItem>();
coffeeMenu.add(new MenuItem("americano", 3000));
coffeeMenu.add(new MenuItem("caffelatte", 4000));
coffeeMenu.add(new MenuItem("cafuchino", 4000));
Menu menu = new MapTypeMenu(coffeeMenu);
customer.order("milk", menu, brista);
customer.order("caffelatte", menu, brista);
}
}
98.
주문 코드 비교: NewbieBarista
import java.util.ArrayList;
import java.util.List;
public class CoffeeStore {
public static void main(String[] args) {
Customer customer = new Customer();
Barista brista = new NewbieBarista();
List<MenuItem> coffeeMenu = new ArrayList<MenuItem>();
coffeeMenu.add(new MenuItem("americano", 3000));
coffeeMenu.add(new MenuItem("caffelatte", 4000));
coffeeMenu.add(new MenuItem("cafuchino", 4000));
Menu menu = new MapTypeMenu(coffeeMenu);
customer.order("milk", menu, brista);
customer.order("caffelatte", menu, brista);
}
}