14-Collection framework



Collection framework

  • 배열: 여러가지 데이터를 저장하는 구조
int i[] = new int[50];
//동일 타입 데이터만 저장 가능한 구조, 형변환이 가능하면 동일 타입으로 간주
i = new int[100];
//기존 50개의 배열 구조는 사라지고, 100개의 배열 주소 참조 
  • 배열은 다수의 객체를 저장해두고 꺼내서 이용하기 편리하나, 객체 수가 배열을 생성할 때 결정되거나 중간에 객체를 삭제했을 때 해당 인덱스가 듬성듬성 빠져 다시 객체를 채워넣으려면 위치를 알아야 하는 한계가 있다.
    • 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. 
      */

}
}