14-Collection framework
Collection framework
- 배열: 여러가지 데이터를 저장하는 구조
int i[] = new int[50];
//동일 타입 데이터만 저장 가능한 구조, 형변환이 가능하면 동일 타입으로 간주
i = new int[100];
//기존 50개의 배열 구조는 사라지고, 100개의 배열 주소 참조
- 배열은 다수의 객체를 저장해두고 꺼내서 이용하기 편리하나, 객체 수가 배열을 생성할 때 결정되거나 중간에 객체를 삭제했을 때 해당 인덱스가 듬성듬성 빠져 다시 객체를 채워넣으려면 위치를 알아야 하는 한계가 있다.
- java.util.Data/Calender
- 배열의 한계점을 개선하고 여러가지 데이터를 저장 가능한 구조의 클래스
- 여러가지 타입 + 동일 타입이 가능하다.
- 배열의 크기가 동적으로 변경이 가능하다.
- 일종의 틀을 만들어주어서, 순서, 값만 저장할 것인가, 키와 값의 한 쌍, 중복 데이터를 저장하게 가능할 것인가 등을 제공.
- java.util.Data/Calender
collection framework
java.util.List와 HashMap에는 기본적으로 get 메소드가 있다는 것을 기억해두자. 원하는 자료를 꺼내서 쓰고 수정할 수 있다.
java.util.List
-
인터페이스 - 메소드 구현 x
-
클래스로 다중상속하고 메소드로 오버라이딩을 구현
-
순서 데이터 관리 = index 사용이 가능([0]번 자리 [1]번 자리 등)
-
같은 데이터를 중복해서 저장하는 것을 허용해준다. (순서가 있기 때문에)
-
이런 리스트 계열의 인터페이스 내 메소드 :
-
add(){ ...}
-
ArrayList, LinkedList, Vector, Stack 클래스들
-
성적, 점수 저장같은 계열들
-
-
java.util.Set
- 인터페이스 - 메소드 구현 x
- 클래스로 다중상속하고 메소드로 오버라이딩을 구현
- 순서 없이 데이터 관리 = index 사용이 불가능
- 같은 데이터 중복 저장이 불가능
-
ex. 로또번호 : 중복 없이, 순서 없이 , index가 들어가야 하는 경우
-
HashSet, TreeSet 클래스들
-
java.util.Map
- 인터페이스 - 메소드 구현 x
- 클래스로 다중상속하고 메소드로 오버라이딩을 구현
- (키, 값)의 한 쌍으로 구성된 데이터를 저장할 수 있다.
-
키는 중복되면 안 된다. 값은 중복이 가능하다.
-
HashMap, Hashtable, Properties
-
List | Set | Map |
---|---|---|
순서 o , 중복 데이터 허용 | 순서 x, 중복 데이터 불가 | 데이터 순서 x |
데이터 = 값 | 데이터 = 값 | 데이터 = (키, 값) * 키 중복허용 x/ 값은 중복 허용 o |
여러가지 데이터 타입 저장 가능 / 동적 크기 변경 가능 | 여러가지 데이터 타입 저장 가능 / 동적 크기 변경 가능 | 여러가지 데이터 타입 저장 가능 / 동적 크기 변경 가능 |
ArrayList | HashSet | HashMap |
int i[] = new int [5]; // 배열
//콜렉션 프레임워크는 참조형 데이터만 저장하게 되어있다.
//기본형 데이터 int, double은 Integer/Double 클래스 사용
java.util.List
Array List
-
생성자
ArrayList list = new ArrayList(); // ArrayList는 최초에 10개 객체가 저장되는 리스트가 생성 // 모자랄 때 자동으로 10개씩 증가 (자동증가 자동감소) // 모든 형태의 데이터 가능, 숫자 명시 필요 x ArrayList list = new ArrayList(5); // 최초에 5개 생성, 모자라면 5개씩 증가 ArrayList list = new ArrayList(5, 3); // 최초에 5개 객체 저장, 모자라면 자동 3개씩 증가
설정한 객체 수를 넘어서면, 다른 설정 없이 자동으로 값이 늘어난다.
-
메소드 (List 인터페이스 상속 오버라이딩)
-
저장
add(Object o); // 모든 타입의 객체 가능 list.add(100) //1번 인덱스, int 기본형 = Integer 클래스 객체 참조형으로 들어간다고 보면 된다. list.add(3.14) //2번 인덱스, double 기본형 = Double 클래스 객체 참조형 list.add("aaa") //3번 인덱스 add(int index, Object o); // 중간삽입 addElement(); addObject();
-
수정
list.set(1, "java") //1번에 있는 인덱스를 "java"로 수정
-
삭제
list.remove(1);
-
조회
-
데이터갯수 조회
list.size();
-
특정 데이터의 저장여부조회
list.contains("java");
-
특정위치 저장 데이터 조회
list.get(1) //1번 인덱스에 있는 데이터 조회, 객체 얻기
-
-
example
package day7;
import java.util.ArrayList;
class Employee{
int id;
String name;
double salary;
public Employee(int id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return id + "-" + name + "-" + salary;
}
}
public class ArrayListTest {
public static void main(String[] args) {
/*
* 타입 정적 유지
* 타입 지정 안할 시: add(Object o) / Object < --- get(0)
* 타입 지정 시: add(? o) / ? <-- get(0)
*/
//ArrayList list = new ArrayList(5); // 참조형변수만 저장 가능
ArrayList<Employee> list = new ArrayList<Employee>(5);//이 안에는 String타입만 저장한다는 의미
/* list.add(100); // int 타입 > 참조형변이기 때문에 자동으로 Integer타입으로 변형
list.add(new Integer(200)); // Integer 타입 객체
list.add(2.55); //double 타입 객체
list.add(new Double(32.14));
list.add(300);
list.add(9.99);
list.add("자바프로그램"); //7번 인덱스 저장
list.add(0, "변경"); // 0번 인덱스에 변경 저장,
list.set(0, "변경확인");//set은 0번 인덱스테 저장했던 데이터를 수정
list.remove(0); //0번 인덱스를 삭제
*/
Employee e1 = new Employee(100, "이사원", 56000.55);
Employee e2 = new Employee(200, "최대리", 66000.55);
Employee e3 = new Employee(300, "박과장", 76000.55);
list.add(e1);
list.add(e2);
list.add(e3);
System.out.println(list.size()); // 저장한 데이터
//list 내에 멀티캠퍼스가 있다면 문자열 삭제
if(list.contains("멀티캠퍼스")) {
list.remove("멀티캠퍼스");
System.out.println(list.indexOf("멀티캠퍼스"));
}
for(int i = 0; i < list.size(); i++) {
Employee o = list.get(i);
System.out.println(i + " 번 인덱스 =" + o); // id - name -salary overriding
//만약 조회 데이터가 Employee 객체의 name 변수 출력
//Integer, Double, String, Employee
System.out.println(o.name);
//auto boxing / unboxing
//int i = new Integer(500); // 자바는 int 와 integer타입을 같은 타입으로 인식
//Integer in = 100;
}
}
}
java.util.Set
- HashSet
- set은 수정의 개념이 없다.
add("a");
add("b");
//set(1, "c"); X , index 개념이 없음.
add("a"); // 실행 무시
iterator(); // 저장 데이터 모음(저장 순서와 불일치)
// get method는 없음! (index가 없으니까)
HashSet set = new HashSet();
// 10개 저장 길이 , 길이 동적 유지, 여러 데이터타입 저장 가능
HashSet<A> set = new HashSet<A>();
// 10개 저장 길이 , 길이 동적 유지, < > 동일 데이터타입 저장 가능
example
package day7;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest {
public static void main(String[] args) {
HashSet<Employee> set = new HashSet<Employee>();
//set.add(100);
//set.add(3.14);
//set.add("java");
Employee e1 = new Employee(400, "박부장", 88000.99); //-다른 패키지에 클래스 있음.
set.add(e1);
set.add(e1); // 무시
set.add(new Employee(400, "박부장", 88000.99)); //새로운 객체 생성. 중복 x
Iterator<Employee> it = set.iterator(); //set 저장 데이터들을 순서없이 모은 객체를 불러온다.
while(it.hasNext()) { //다음 데이터 존재여부
Object o = it.next(); // 다음데이터 조회
System.out.println(o);
}
System.out.println(" ---------------- ");
//1-45난수 생성하여 lotto 저장
//lotto 출력하면 6개 정수 나오도록 (저장 - 조회 출력 순서 일치하지 않아도 됨)
HashSet<Integer> lotto = new HashSet<Integer>(); // int는 Integer타입으로
while(true){
int num = (int)(Math.random()*45)+1;
lotto.add(num); // 최대 6번까지
System.out.println("생성된 난수" + num);
if(lotto.size() == 6) { break; }
}
/* Iterator<Integer> x = lotto.iterator();
while(x.hasNext()) {
Object o = x.next();
System.out.println(o);
}
*/
for(Integer one : lotto) { //lotto.size()만큼 자동 반복
System.out.println(one);
}
// for( Object a : lotto ) {
// System.out.println(a);
// }
}
}
- HashMap
HashMap map = new HashMap();
//String 타입만 가능 ()
만약 타입 지정 안 할 경우 공백으로 비워놔야 한다. 그러나 저장할 때 반드시 키 값과 벨류값을 넣어야함
HashMap<String, Integer> map = new HashMap<String, Integer>();
//저장하는 법
map.put("id", 100);
map.put("score", 100);
//키는 중복되면 안 된다.
map.put("score", 200);
// 이 경우, score에 값을 추가하는 것이 아닌 socore key의 값을 수정하는 것
// 조회방법
map.get("id"); // 인덱스 번호가 아니라 key의 값을 준다.
map.size(); //데이터 개수
#예시
key(String) | value(String[]) |
---|---|
고등친구 | 폰, 집, 사무실 |
회사동기 | 폰, 집 |
회사상사 | 폰, 이메일 |
초등친구 | 폰, 집, 사무실, 이메일 |
package day7;
import java.util.HashMap;
import java.util.Set;
public class PhoneMappTest {
public static void main(String[] args) {
HashMap<String, String[]> phone =
new HashMap<String, String[]>();
phone.put("초등친구",
new String []{"010-1234-5678", "02-1234-5678", "031-1234-5667", "frie@gmail.com" });
phone.put("고등친구", new String []{"010-1224-5678", "02-1233-5678", "frie3@gmail.com" });
phone.put("회사동기", new String []{"010-1454-5678", "frie2@gmail.com" });
phone.put("회사상사", new String []{"010-1111-5678", "051-1233-5678", "frie1@gmail.com" });
phone.put("회사상사", new String []{"010-1101-5678", "051-1233-5678", "frie1@gmail.com" });
System.out.println(" 연락처 수 " + phone.size());
//회사동기의 연락처 정보 조회
if(phone.containsKey("회사상사")) {
String[] phonelist = phone.get("회사상사");
for(String one : phonelist) {
System.out.println(one);
}
}
//사장님 연락처 정보 조
if(phone.containsKey("사장님")) {
String[] phonelist2 = phone.get("사장님");
for(String one : phonelist2) {
System.out.println(one);
}
}
else {
System.out.println("사장님 연락처 없음");
}
//내 연락처 모든 정보 조회
// 초등친구 : xxx | xxx | xxx ..
// 모든 key 조회 =4번 반복
Set<String> keys = phone.keySet(); // 왜 set? 중복을 허용하지 않기 때문에
for(String k : keys) {
System.out.print(k + " : ");
String[] phonelist = phone.get(k);
for(String one : phonelist) {
System.out.print(one + "|");
}
System.out.println();
}
/*
* "work dir" = 나의 작업 디렉토리
* "os" = windows10
* value에 대한 이름을 부여하는 경우, 그리고 이를 조회할 일이 있을 경우 map.
*/
}
}