카테고리 없음

collection 복습

장꾸꾸 2020. 10. 14. 15:24

프레임워크 : 추가/ 삭제 / 수정이 가능한 특징을 가짐. (데이터 처리의 표준화 방법 제공)

 

29. Collections(컬렉션)
   1) Collection Framework이란 
      다수의 데이터를 쉽게 처리할수 있는 표준화된 방법을 제공하는 클래스들
      크게 List, Set, Map의 3가지 타입의 컨테이너를 제공한다
   2) Collection특징
      - 객체를 저장할때마다 크기가 자동으로 늘어난다
      - Set계열 : 중복을 허용하지 않고,추가되는 순서를 유지하지 않는다
        List계열 : 중복을 허용하고, 추가되는 순서를 유지한다
        Map계열 : 키와 값의 쌍으로 저장된다(키와 값이 모두 객체이어야 한다)
        (java.util   package에 있다)
   3) 배열과 Collection
       구분               배열                                      컬렉션
       ----------------------------------------------------------------------------------------------
       장점         - 객체를 저장하는데 가장효율적      - 자동으로 크기조절
                      - 사용상의 편의성                        - 객체 저장시 다양하고 편리한 기능제공
                                                                        표준화된 interface 기반설계
       -----------------------------------------------------------------------------------------------
       단점         -고정된 크기만 제공                     - 다소 복잡한 사용방법

    4) 제네릭스
        자바에서 타입에 관련된 것은 제네릭스와 연관을 갖는다
        (도입배경)
            - Collection클래스에 서로 다른 객체를 저장하는 것에 대한 제한불가
            - 컴파일 하는 도중 타입 확인이 불가능하다
            - 저장된 객체를 사용시에는 반드시 캐스팅해야한다
              (ClassCastException과 같은 런타임 오류를 발생)
         (제네릭스의 특징)
             1. Collection 선언시에< >안에 매개변수타입을선언, 컴파일러에게 사용타입을 전달
             2. 캐스팅이 필요없고, 보다 안전한 코드를 작성할수 있다
             3. 메소드가 받아들일수 있는 타입을 제한 함으로써 에러검사, 타입검사를 생략할수 있다
             4. java.util패키지의 컬렉션클래스 들은 기본적으로 제네릭스를 지원한다
             5. 매개변수 타입에는 primitive타입을 사용할수 없다
             --> 꺽쇠 안에 int X! Integer O !!

(1)Set인터페이스   
     1)HashSet
         - Set에 객체를 저장하는데 Hash를 사용하여 처리속도가 빠르다
     2) LinkedHashSet
         - HashSet과 거의 같다.차이점은 Set에 추가되는 순서를 유지한다는것
     3)TreeSet
        - 객체의 Hash값에 의한 오름차순의 정렬을 유지한다

(2)List인터페이스 
    List인터페이스로 구현된 클래스로 ArrayList, Vector, Stack, LinkedList가 있다
   1) List
      - List의 요소에는 순서를 가진다
   2) ArrayList
      -자바에서는 배열을 생성할때 배열의길이를 늘리거나 줄일수없다.
      -ArrayList클래스는 원소가 가득차게되면 자동적으로 저장영역을 늘려준다 
      - List에서 객체를 얻어내는데 효율적이다
      - 동기화(synchroniztion)을 제공하지 않는다
   3) LinkedList
      - List에서 앞뒤에 데이터를 삽입하거나 삭제하는데 효율적이다
       -동기화를 제공하지 않는다
   4) Vecter --------> 동기화!
      : 가변배열을 처리하는 클래스   
       배열(Array)은 고정길이를 사용하기 때문에 길이를 늘리거나 줄일수 없다
       Vector클래스를 사용하면 배열의 크기를 늘리거나 줄일수 있다.
       기본적으로 ArrayList와 동등하지만 Vector에서는 동기화를 제공한다
       그래서 List객체중에 가장 성능이 좋지 않다

   (형식) Vector<자료형> 객체명  = new Vector<자료형>(첨자,첨자);
                                                                         초기값,늘릴갯수

            ex) Vector<String> ss=new Vector<>(3,2);

   ①hasMoreElements():백터안에서 꺼낼 객체가 있으면 true, 없으면 false
   ②nextElement() : 백터에서 객체를 가져옴
   ③elements()      : 백터요소들에 대한 Enumeration객체를 반환
   ④capacity()        : 현재 용량
   ⑤size()              : 현재data의 갯수
   ⑥addElement()   : data추가
   ⑦indexOf()         : 찾는위치
   ⑧contains()        : 비교
   ⑨remove()         : 삭제
   ⑨trimToSize()     : 빈공간제거
   
(3)Map인터페이스
   1)HashMap
       - 해쉬테이블처럼(키와 객체)쌍으로 저장 관리할수 있다.
       - Map에 키를 저장하는데 hash를 사용하여 성능이 좋다
       - 저장되는 순서를 유지하지 않는다
       - 오직 하나의 null키를 가질수 있다
       - key의 중복을 허용하지 않는다
   2)LinkedHashMap
       - HashMap과 거의 같다.차이점은 Map에 추가되는 순서를 유지한다는것
   3)HashTable
       - 자료를 테이블 구조로 쉽게 저장할수 있고, 검색할수 있는 클래스이다
       - Hashtable클래스는 Vector클래스에서 사용한 Enumeration인터페이스를 
         사용해 값을 가져올수 있다
       - 동기화를 제공한다. null키와 null값을 저장할수 없다
(4)Iterator(반복자)인터페이스
    리스트는 원소를 순차적으로 접근하기 위해서 for문을 이용하지만,
    반복자를 이용하여 원소에 접근할수 있다. 
    모여있는 자료들을 검색하여 처리하는 패턴

(5)Enumeration인터페이스
    Collection인터페이스로 부터 구현한 클래스안에 저장된 객체를 꺼낼수 있다
    ① hasMoreElements() : 요소가 있으면 true반환
    ② nextElement()     : 요소를 얻어낸다
  
(6) AutoBox/AutoUnBoxing
     : primitive type과 Wrapper Class타입간 형변환을 자동화
       Collection에 primitive 타입을 넣고 빼는 경우에 유용함
====================================================================
30. JDBC (Java DataBase Connectivity) : DB와 연동
(1)【 Database별 Driver 와 connection URL 】

DATABASE  |   VALUE 
----------------------------------------------------------------------------------
ORACLE    |  DRIVER  |   oracle.jdbc.driver.OracleDriver 
               |  URL       |   jdbc:oracle:thin:@hostname:port:SID   ex1) jdbc:oracle:thin:@127.0.0.1:1521:XE
                                                                                        ex2) jdbc:oracle:thin:@localhost:1521:ORCL
MSSQL     |  DRIVER  |   com.microsoft.jdbc.sqlserver.SQLServerDriver 
               |  URL       |   jdbc:Microsoft:sqlserver://localhost:1433;databasename=DB명 
MYSQL     |  DRIVER  |   org.gjt.mm.mysql.Driver 
               |              |   (또는) com.mysql.jdbc.Driver
               |  URL       |   jdbc:mysql://localhost:3306/DB명 


(2) 프로그램에서 DB연결

1단계 : JDBC드라이버 로드
Class.forName("드라이버종류");

★ 드라이버 종류
1. Access드라이버(ODBC) : Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
2. MySQL 드라이버:          Class.forName("com.mysql.jdbc.Driver");
3. 오라클 드라이버 :          Class.forName("oracle.jdbc.driver.OracleDriver");
4. MS-SQL 드라이버 :        Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver ");

 

SET)

package collection1;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

//Set : 중복허용X, 순서유지X
//	@SuppressWarnings(value = "unchecked") : 타입을 확인하지 않는 Annotation
public class SetEx {
	public static void main(String[] args) {
		Set set = new HashSet();
		set.add("one");
		set.add(2); // int(primitive type) 기본형 -> 집어넣으면 
					//--> Integer(reference type: 객체형)으로 자동처리
		set.add(new Float(3.0f));
		set.add(new Integer(2));
		set.add(4.0f);
		set.add(new Double(4.00));
		set.add(new String("one"));
		System.out.println(set);

	//	Iterator : 반복자 : 
		Iterator iter = set.iterator();
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}
		
	}

}

 

List: 중복허용/ 순서유지

package collection1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

//List: 중복허용O, 순서유지O
public class ListEx1 {
	public static void main(String[] args) {
		List list=new ArrayList();
		list.add("one"); 
		list.add(2);       
		list.add(new Float(3.0f));
		list.add(new Integer(2));
		list.add(4.0f);    
		list.add(new Double(4.00));
		list.add(new String("one"));
		System.out.println(list);
		
		Iterator iter=list.iterator();
		while(iter.hasNext())
		{
			System.out.println(iter.next());
		}
	}
}

 

		list.remove(2); //int Index
		list.remove(new Integer(2)); // object 

실행하면 인덱스를 삭제할 건지/ 진짜 2라고 쓰인걸 지울 건지의 차이임

즉 list.remove(2)를 실행하면 3.0이 사라지고

list.remove(new Integer(2)) 를 실행하면 object인 

 

 

+++포이치+++

		//포이치로 반복 돌리기
		for(Object ob:list) {
			System.out.println(ob);
		}
		
//		Iterator iter=list.iterator();
//		while(iter.hasNext())
//		{
//			System.out.println(iter.next());
//		}

 

 

 

package collection1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListEx2 {
	public static void main(String[] args) {
		List<Object> list=new ArrayList(); // <>이 안에 쓸 수 있는 건 int와 같은 primitive type은 안됨
											// <> 안에 최상위인 Object를 쓰면 다 가능
		list.add("one"); 
		list.add(2);       
		list.add(new Float(3.0f));
		list.add(new Integer(2));
		list.add(4.0f);    
		list.add(new Float(4.00));
		list.add(new String("one"));

		
		Iterator iter=list.iterator();
		while(iter.hasNext())
		{
			System.out.println(iter.next());
		}
	}
}

아래 예시문제

 

package collection1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListEx3 {
	public static void main(String[] args) {
		Book ob1 = new Book("java", "kim", 100);
		Book ob2 = new Book("c++", "lee", 250);
		Book ob3 = new Book("oracle", "park", 300);
		// 리스트 만들기
		List<Book> listB = new ArrayList();
		listB.add(ob1);
		listB.add(ob2);
		listB.add(ob3);

		Iterator<Book> iter=listB.iterator();
		while(iter.hasNext()) {
			Book m=iter.next();
			System.out.print("책이름:"+m.getTitle()+"\t");
			System.out.print("책저자:"+m.getWriter()+"\t");
			System.out.println("페이지:"+m.getPage());
		}
		
//		for(Book ob:listB) {
//		System.out.println("책이름: "+ob.getTitle());
//		System.out.println("작가: "+ob.getWriter());
//		System.out.println("쪽수: "+ob.getPage());
//		}
	}
}
package collection1;
//디폴트 생성자, 인자 3개받는 생성자 , getter/settter
public class Book {
	private String title;
	private String writer;
	private int page;
	public Book() {
		super();
	}
	public Book(String title, String writer, int page) {
		super();
		this.title = title;
		this.writer = writer;
		this.page = page;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}
}

 

형변환 발생오류 : 제네릭스!!

package collection1;

import java.util.ArrayList;
import java.util.List;

//컴파일의 문제는 없으나 실행시에 형변환의 문제가 발생할수 있다
public class ListError {
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("봄");
		list.add("여름");
		list.add("가을");
		list.add(new Integer(10)); // 오류발생 (ClassCaseExceptio : 형변환 발생 오류)
		list.add("겨울");
		list.add(4.0);
		
		for(int i=0; i<list.size(); i++)
		{
			String s=(String)list.get(i);
			System.out.println(s);
		}
	}
}

s아래와 같은 오류가 발생하게 됨ㅇㅇ

봄
여름
가을
까지 출력 잘되다가
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at collection1.ListError.main(ListError.java:19)