java 10일차 -2(컬렉션)

KHLee·2023년 3월 8일

자바수업

목록 보기
13/46

컬렉션 프레임워크(Collection Framework)
: 사전적 의미로 요서(객체)를 수집해 저장하는 것
배열의 문제점
: 저장할 수 있는 객체 수가 배열을 생성할 때 결정(사이즈가 fix됨). 불특정 다수의 객체를 저장하기엔 문제.

  • 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리
  • java.util 패키지에 있음.
  • 인터페이스를 통해서 정형화된 방법으로 다양한 컬렉션 클래스 이용.

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;

다시한번 되새기기.


profile
안녕하세요

0개의 댓글