컬렉션 프레임워크(Collection Framework)
: 사전적 의미로 요서(객체)를 수집해 저장하는 것
배열의 문제점
: 저장할 수 있는 객체 수가 배열을 생성할 때 결정(사이즈가 fix됨). 불특정 다수의 객체를 저장하기엔 문제.
Collection : List, Set계열
Map 계열
List : 중복허용, 순서대로 들어감.
Set : 중복안됨, 순서대로 안들어감.
Map : key-data, key-data의 집합.
package list;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ListTest1 {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();//제네릭<> 당신은 리스트에 무슨 타입을 담을건가요? 프리미티브타입은 못적어
//List list = new ArrayList(); 도 가능하나, 모든 타입을 다 담을 수 있음.
Random r = new Random();
for (int i = 0; i < 10; i++) {
int num = r.nextInt(10) + 1;
//r.nextInt를 바로 list.add()괄호에 넣으려고 했는데 오류남.
list.add(num);
}
list.add(0, 999);//list의 0번째 인덱스에 999를 넣겠다.
list.remove(0);
// list.add(10);//프리미티브타입 10을 객체타입 Integer에 넣을수가 있나요? 허용합니다.
// list.add(20);
// list.add(30);
for (int data : list) {//Integer 타입으로 넣었지만, int로 꺼내서 넣을 수 있다!
System.out.println(data);
}
}
}
package list;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class ListTest2 {
public static void main(String[] args) {
List<Integer> list = new LinkedList<Integer>();//인터페이스 사용법!
//List<Integer> list = new ArrayList<Integer>();
//ArrayList<Integer> list = new ArrayList<Integer>();//인터페이스 사용 안할거다! 하면 이렇게 해도 됨.
// List list = new List는 안돼. List는 인터페이스이므로 객체생성이 안됨.
// 하위클래스인 ArrayList를 호출해서 쓴다.
// 1~10까지의 숫자를 20개 입력한다.
// 단 while 문을 이용한다.
while (list.size() < 20) {
Random r = new Random();
int num = (r.nextInt(10) + 1);
list.add(num);
}
System.out.println(list.size());
System.out.println("------------------------------------");
for (int data : list) {
System.out.println(data);
}
}
}
package set;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class SetTest1 {
public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
//1~10까지 숫자 10개를 입력하세요.
// for(int i = 0; i < 10; i++) {
// Random r = new Random();
// int num = r.nextInt(10) + 1;
// set.add(num);//중복은 제외됨.
// }
// System.out.println(set.size());
// System.out.println("------------------");
while(set.size() < 10) {
Random r = new Random();
int num = r.nextInt(10) + 1;
set.add(num);
}
System.out.println(set.size());
System.out.println("------------------");
for(int data : set) {
System.out.println(data);
}
}
}
ArrayList가 HashSet보다 많이 쓰임.
package map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest2 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
map.put(4, "d");
map.put(5, "e");
//앞에 있는 게 프라이머리 키, 뒤에는 값
System.out.println(map.size());
System.out.println(map.containsKey(5));
System.out.println(map.containsValue("d"));
System.out.println(map.get(1));
Set<Integer> keys = map.keySet();//keySet()의 반환형태는 Set, key값은 Integer이므로 이렇게 받음
System.out.println(keys.toString());
for (int data :keys) {
System.out.println(map.get(data));//map에서 i번째 데이터 꺼내줄래?
}
}
}
package map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest1 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
map.put(4, "d");
map.put(5, "e");
Set<Integer> keys = map.keySet();
System.out.println(keys.toString());
for (int data :keys) {
System.out.println(map.get(data));
}
}
}
package map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest3 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
map.put(3, "c");
map.put(4, "d");
map.put(5, "e");
Collection<String> col = map.values();
System.out.println(col.size());
for(String data : col) {
System.out.println(data);
}
}
}
실습
먼저 UserDTO를 가져온다.

UserDTO를 보고 DAO 인터페이스를 만든다.
인터페이스가 있기 때문에 App, UserDAO를 순서 상관없이 각각 개발을 시작할 수 있다.
package com.kbstar.app;
import java.util.List;
import java.util.Scanner;
import com.kbstar.dao.DAO;
import com.kbstar.dao.UserDAO;
import com.kbstar.dto.UserDTO;
public class App {
public static void main(String[] args) {
DAO<String, UserDTO> userDao = new UserDAO();
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("Input Command(q, i, d, u, s, sa)");
String cmd = sc.next();
if (cmd.equals("q")) {
System.out.println("bye");
break;
}else if(cmd.equals("i")) {
System.out.println("input id...");
String id = sc.next();
System.out.println("input pw...");
String pw = sc.next();
System.out.println("input name...");
String name = sc.next();
UserDTO user = new UserDTO(id, pw, name);
try {
userDao.insert(user);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}else if(cmd.equals("d")) {
System.out.println("input id...");
String id = sc.next();
try {
userDao.delete(id);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}else if(cmd.equals("u")) {
System.out.println("input id...");
String id = sc.next();
System.out.println("input pw...");
String pw = sc.next();
System.out.println("input name...");
String name = sc.next();
UserDTO user = new UserDTO(id, pw, name);
try {
userDao.update(user);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}else if(cmd.equals("s")) {
System.out.println("input id...");
String id = sc.next();
UserDTO user = null;
try {
user = userDao.select(id);
System.out.println(user);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}else if(cmd.equals("sa")) {
List<UserDTO> list = null;
try {
list = userDao.select();
for(UserDTO u : list) {
System.out.println(u);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
sc.close();
}
}
앱은 try catch를 써서 예외처리를 해주며 작성한다.
package com.kbstar.dao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import com.kbstar.dto.UserDTO;
public class UserDAO implements DAO<String, UserDTO> {
//DB로 이용할 것!
HashMap<String, UserDTO> db = null;
public UserDAO() {
db = new HashMap<>();
}
///////////////
@Override
public void insert(UserDTO v) throws Exception {
if(db.containsKey(v.getId())){
throw new Exception("오류~ 이미 있는 아이디");//해당하는 아이디가 있으면 오류
};
db.put(v.getId(), v);
}
@Override
public void update(UserDTO v) throws Exception {
if(!db.containsKey(v.getId())) {
throw new Exception("오류~~ 없는 아이디라서 업데이트 불가");
}
db.put(v.getId(), v);
}
@Override
public void delete(String k) throws Exception {
if(!db.containsKey(k)) {
throw new Exception("오류~~~ 없는 아이디라서 삭제 불가");//해당하는 아이디가 없으면 오류
}
db.remove(k);
}
@Override
public UserDTO select(String k) throws Exception {
UserDTO user = null;
user = db.get(k);
return user;
}
@Override
public List<UserDTO> select() throws Exception {
ArrayList<UserDTO> list = new ArrayList<UserDTO>();
Collection<UserDTO> col = db.values();
for(UserDTO u : col) {
list.add(u);
}
return list;
}
}
UserDAO를 만들 때 예외처리를 각각 등록해준다.
그리고 반환받을 준비! 반환받는 타입!에 주의하며 코드를 작성한다.\
@Override
public List<UserDTO> select() throws Exception {
ArrayList<UserDTO> list = new ArrayList<UserDTO>();
Collection<UserDTO> col = db.values();
for(UserDTO u : col) {
list.add(u);
}
return list;
다시한번 되새기기.

