붓, 그리다
컬렉션 ★★ 본문
[ 컬렉션 ]
- 데이터를 저장, 즉 겍체만 저장 가능하다
- 기본 자료형은 객체가 아니기 때문에 저장할 수 없음
[ Wrapper Class ]
기본자료형의 값을 객체형태로 만들어서 제공되는 클래스
-> 컬렉션에 기본자료형을 집어넣기 위해 만들어진 클래스
- 기본자료형의 첫글자만 대문자로 쓰면 Wrapper Class가 된다
기본자료형 | byte | short | int | long | float | double | char | boolean |
Wrapper Clasee | Byte | Short | Intger.parseInt(~) | Long | Float | Double | Character.isDigit(), Character.toUpperCase() | Boolea |
- String은 Wrapper Class가 아니다
1) unboxing
- 자바의 객체형(Wrapper)이 기본자료형으로 변환
2) boxing
- 자바의 기본자료형이 자바의 객체형(Wrapper 클래스)로 변환
package j0619;
// Wrapper 클래스 : 자바의 기본자료형의 값을 컬렉션객체에 저장하기 위해서
// 기본자료형 <--> Wrapper클래스의 자료형
public class BoxingTest {
public static void main(String[] args) {
System.out.println("자동 unboxing");
//unboxing : 자바의 객체형(Wrapper)가 기본자료형으로 변환
//int obj=10;
Integer obj=new Integer(10);
int sum=obj+20;
//Double obj2=new Double(23.5);
System.out.println("sume=>"+sum);
//boxing : 자바의 기본자료형이 객체형(Wrapper)로 변환
Double d=new Double(123.45);
printDouble(d);
}
static void printDouble(Double obj2) { // 123.45 -> toString() => "123.45"
System.out.println(obj2.toString());
}
}
- 스택 : 한쪽은 막혀 있고 한쪽은 open
- 큐 : 양쪽이 다 open
- 배열 : 기차모양처럼 한쪽으로 늘어뜨린 구조 또는 사물함 구조
데이터를 관리 -> 자바의 컬렉션 -> 구조와 상관없이 공통적으로 사용
1) 데이터를 저장(추가)
2) 데이터를 삭제
3) 데이터를 수정 -> 원하는 데이터만 수정
4) 데이터를 검색
-> 인터페이스를 작성(공통메소드) -> Collention
데이터의 저장 구조에 따라서 1) List 2) Set 3) Map 으로 나눔
1) List 인터페이스
- 중복저장이 가능하며 저장순서가 있다
- 배열
- 인덱스 번호로 구분
- Vector->ArrayList, LinkedList
2) Set 인터페이스
- 데이터 중복 저장이 안되며 저장되는 순서가 없다
- 항아리
- HashSet
3) Map
- 표형태로 저장(키, 값)
- 사물함 구조
- 저장시 키를 부여하며 키를 이용하여 빠르게 검색
- HashTabel,HashMpa => 웹에서 세션값 저장시 많이 사용
[ 컬렉션의 특성 ]
1) 객체만 저장
-> 기본자료형은 저장이 안됨, Wrapper 클래스를 이용 가능
2) 정벅배열(크기가 정해져 있는 경우) <-> 동적배열(크기가 유동)
3) 객체를 저장 : 형이 Object형으로 변환
-> 어떠한 객체라도 다 저장이 가능하게 만들기 위한 목적
4) 저장된 데이터를 꺼내올 때 원해의 형으로 형변환시켜야 한다.
[ 단점 ]
- 3), 4)로 인해 원하지 않는 데이터도 저장이 된다
- 자료형에 문제발생(ex. Type mismatch)
[ 제너릭]
클래스명<자료형>
=> 저장할 자료형을 미리 지정하는 제너릭 체제로 변경
- 제너릭을 부여하면 자료형을 형변환 할 필요가 없다
자동 Boxint)
package j0619;
import java.util.*;
public class VectorTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Vector v=new Vector(); // new Vector(1,1);와 동일
v.add("테스트"); // v.add(new String("테스트));
v.add(100); // v.add(new Integer(100)); 자동 Boxing
// 기본자료형을 넣으면 자동 Boxing이 된다.
v.addElement("임시테스트");
v.add("테스트2");
System.out.println("v의 크기(size)는 : "+v.size());
}
}
제너릭 부여)
package j0619;
import java.util.*;
public class VectorTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Vector<String> v=new Vector<String>(); // new Vector(1,1);와 동일
v.add("테스트"); // v.add(new String("테스트));
v.add(100); // 오류 뜸
v.addElement("임시테스트");
v.add("테스트2");
System.out.println("v의 크기(size)는 : "+v.size());
}
}
Vector)
package j0619;
import java.util.*;
public class VectorTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Vector v=new Vector();
//형식) 클래스<String> :
//Vector<String> v=new Vector<String>(); // new Vector(1,1);와 동일
v.add("테스트"); // v.add(new String("테스트));
//v.add(100); // v.add(new Integer(100)); 자동 Boxing
// 기본자료형을 넣으면 자동 Boxing이 된다.
v.addElement("임시테스트");
v.add("테스트2");
System.out.println("v의 크기(size)는 : "+v.size());
//값 출력
for(int i=0; i<v.size();i++) {
String temp=(String)v.elementAt(i);
// 제너릭을 주면 (String) 자료형 형변환을 할 필요가 없다.
System.out.println("temp=>"+temp);
}
// 다양한 값을 저장
Vector v2=new Vector();
v2.add(new Character('a')); // v2.add('c'); //0
// 3.141592 / 1번 인덱스
v2.addElement(100); //1->2번 인덱스로 변경->"Set"으로 수정
// 중간에 값을 추가(insert)하고 싶을 경우
v2.insertElementAt(3.141592, 1); // 저장할 객체명, 삽입할 인덱스번호
// 수정 : setElementAt(수정할 객체명, 수정할 인덱스위치)
v2.setElementAt("Set", 2);
//출력
for(int i=0;i<v2.size();i++) {
System.out.println("v2의 값 => "+v2.elementAt(i));
}
}
}
ArrayList)
package j0619;
import java.util.*;
public class ArrayListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Vector는 메모리를 많이 차지 -> 개선 ArrayList, LinkedList
ArrayList<String> list=new ArrayList<String>(); //형변환할 필요 없음
list.add("포도"); //0, 객체명이 포도가 아니라 사과로 변경
list.add("딸기"); //1
// "키위" 인덱스번호 2
list.add("복숭아"); //2->3
// 중간에 삽입(inset) : add(삽입할 위치, 삽입할 객체명)
list.add(2, "키위"); //2번 인덱스번호 위치에 키위를 삽입
// 수정(set) : set(수정할 위치, 수정할 값)
list.set(0, "사과"); // 0번 인덱스번호 위치한 객체명(포도)를 사과로 수정
//삭제(remove) : 1) remove(삭제할 데이터명) or 2) remove(인덱스번호) -> 중복데이터일 경우 인덱스번호로 삭제
list.remove("키위");
//배열로 호출
for(int i=0; i<list.size();i++) { // 가져오는 메서드 : get(인덱스번호)
String temp=list.get(i); //제너릭이 적용된 컬렉션은 가져올 때 형변환이 필요 없다
System.out.println("temp : "+list.get(i));
}
}
}
LinkedList)
package j0619;
import java.util.*;
public class ArrayListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Vector는 메모리를 많이 차지 -> 개선 ArrayList, LinkedList
LinkedList<String> list=new LinkedList<String>();
list.add("포도"); //0, 객체명이 포도가 아니라 사과로 변경
list.add("딸기"); //1
// "키위" 인덱스번호 2
list.add("복숭아"); //2->3
// 중간에 삽입(inset) : add(삽입할 위치, 삽입할 객체명)
list.add(2, "키위"); //2번 인덱스번호 위치에 키위를 삽입
// 수정(set) : set(수정할 위치, 수정할 값)
list.set(0, "사과"); // 0번 인덱스번호 위치한 객체명(포도)를 사과로 수정
//삭제(remove) : 1) remove(삭제할 데이터명) or 2) remove(인덱스번호) -> 중복데이터일 경우 인덱스번호로 삭제
list.remove("키위");
//배열로 호출
for(int i=0; i<list.size();i++) { // 가져오는 메서드 : get(인덱스번호)
String temp=list.get(i); //제너릭이 적용된 컬렉션은 가져올 때 형변환이 필요 없다
System.out.println("temp : "+list.get(i));
}
}
}
-> ArrayList와 LinkedList는 구조는 다르나 같은 계열이기에 사용하는 메서드가 동일
확장for문을 활용한 검색방법)
// 검색방법 2 : 확장 for문 -> 배열이나 컬렉션객체의 값을 꺼내올 때
System.out.println("==확장 for문==");
for(String s:list) //for 자료형 출력변수명:배열 또는 컬렉션 객체명
System.out.println(s);
}
[ Stack과 Queue ]
*컬렉션의 값을 검색할 때
- 클래스마다 조금씩 차이가 있다
- ArrayList : get(인덱스번호)
- Vector : elementAt(인덱스번호)
[ Iterator와 Enumeration ]
- 검색에 관련된 인터페이스
- 데이터 저장 구조에 상관없이 공통적인 검색방법을 사용 가능
-> 메서드의 매개변수 또는 반환형을 통해서 객체를 얻어옴
- Enumeration : hasMoreElement(), nextElement()
package j0619;
import java.util.*;
//제너릭?, Map(Hashtable, HashMap)+검색(Enumeration,Iterator)
public class EnumTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Vector<String> v=new Vector<String>();
v.add("test1"); v.add("test2"); v.add("test3");
System.out.println("해쉬테이블(Map)");
Hashtable<Integer,String> h=new Hashtable<Integer, String>();
h.put(1, "홍길동"); h.put(2, "테스트"); h.put(3, "010-1234-4564");
String tel=h.get(3); //get(검색할 키명) : 키를 알고 있으면 검색속도가 빠르다
System.out.println("tel : "+ tel);
// 1) 공통으로 검색하는 방법 : Enumeration -> 배열의 값을 출력
System.out.println("==Enumeration으로 검색==");
Enumeration <String>eu=v.elements();
while(eu.hasMoreElements()) //검색해서 꺼내올 객체가 존재한다면
System.out.println(eu.nextElement()); //꺼내와서 출력
// 2) Iterator (책꽂이에 들어가 있는 책을 연상)
System.out.println("==Iterator로 검색==");
Iterator<String> ih=v.iterator();
while(ih.hasNext()) // 검색해서 꺼내올 객체가 존재한다면
System.out.println(ih.next());
}
}
'JAVA > Basic' 카테고리의 다른 글
제너릭의 종류 1) Class 클래스명<T>{} (0) | 2017.06.20 |
---|---|
제너릭 Genrics 개요 (0) | 2017.06.20 |
쓰레드 2 (동기화, Singleton) (0) | 2017.06.19 |
상속, 오버라이딩 (0) | 2017.06.16 |
쓰레드 (0) | 2017.06.16 |
Comments