목차
- Collection Framework
- Collection Framework의 핵심 인터페이스 - List, Set, Map
- Collection Frmawork의 동기화(synchronization)
1. Collection Framework
-
Collection
- 다수의 데이터, 즉, 데이터 그룹을 의미한다. - Framework
- 표준화, 정형화된 체계적인 프로그래밍 방식 - Collection framework
- 데이터 군(群)을 저장하는 클래스들을 표준화한 설계
- 다수의 데이터를 쉽게 처리할 수 있는 방법을 제공하는 클래스들로 구성
- JDK1.2부터 제공 - Collection class
- 다수의 데이터를 저장할 수 있는 클래스(예, Vector, ArrayList, HashSet) - Collection method
- int size();
- boolean isEmpty();
- boolean add(Object element);
- boolean remove(Object obj);
- boolean removeAll(Collection other);
- boolean contains(Object obj);
- Iterator iterator(); // iterator 인터페이스를 얻어냄
- Object[] toArray(); // 컬렉션에 들어있는 요소를 배열 객체로 바꿈
2. Collection Framework의 핵심 인터페이스
List interface
순서가 있는 데이터 집합. 데이터 중복 허용
구현 클래스: ArrayList, LinkedList, Stack, Vector ...
Set interface
순서를 유지하지 않는 데이터 집합. 데이터 중복 허용x
구현 클래스: HashSet, TreeSet, ...
Map interface
키(key)와 값(value)의 쌍으로 이루어진 데이터 집합. 순서유지되지 않으며, 키 중복 허용되지 않음. 값 중복 허용
구현 클래스: HashMap, TreeMap, HashTable, Properties ...
1) List Interface
- Sequence(연속된 상태) 라고도 함.
- 순서 보장, 중복 허용
- 구현 클래스: Stack, Vector, ArrayList ...
- 배열과의 차이점: 배열은 크기가 고정, List 구조는 가변적 길이
Method
Element get(int index) // element 가져오기
void set(int index, Element e); // element 교체
boolean contains(Element e)
int indexOf(Element e)
int lastIndexOf(Element e)
...
Iterator pattern
// 기본 list의 element 값 가져오기
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + "\t");
}
// interator 객체로 element 얻어오기 => Iterator Pattern
Iterator elements = list.iterator();
while (elements.hasNext()) {
System.out.print(elements.next() + "\t");
}
// LinkedList에 있는 메소드 사용하여 element가져오기
int i = 0;
while (!linkedList.isEmpty()) {
System.out.println(i + "->" + linkedList.poll()); // 메모리에서 삭제하면서 element를 가져옴.
i++;
}
ArrayList와 LinkedList 비교
컬렉션 | 읽기(접근시간) | 추가 / 삭제 | |
ArrayList | 빠르다 | 느리다 | 순차적인 추가삭제는 빠름. 비효율적인 메모리 사용 |
LinkedList | 느리다 | 빠르다 | 데이터가 많을수록 접근성이 떨어짐. |
ArrayList와 LinkedList 성능 비교 코드
// 입력 성능이 필요한 곳에서는 Linkedlist를 사용하는 것이 성능면에서 좋다.
List<String> list1 = new ArrayList<String>();
List<String> list2 = new LinkedList<String>();
long startTime;
long endTime;
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list1.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("ArrayList 걸린 시간: " + (endTime - startTime) + "ns");
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list2.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("LinkedList 걸린 시간: " + (endTime - startTime) + "ns");
2) Set Interface
- 중복된 element가 발생하지 않도록 내부에서 관리 => 중복허용X
- 정렬되지 않음. => 순서유지X
- 구현 클래스: HashSet, TreeSet
HashSet
정렬저장 X
TreeSet
정렬저장 O (오름차순)
이진 검색 트리(binary search tree) 의 구조로 되어있음
검색과 정렬에 유리하지만, HashSet보다 데이터 추가, 삭제시간이 더 걸림
Member.java
public class Member {
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
/*
equals: 최상위 클래스인 Object가 가지고 있는 메소드
Overriding하여 조건에 맞는 equals 구현 가능
(ex. HashSet에서 같은 값이면 추가되지 않는 조건 지정 가능)
*/
public boolean equals(Object obj) {
if (obj instanceof Member) {
Member member = (Member) obj;
return member.name.equals(name) && (member.age == age);
} else {
return false;
}
}
// 메모리가 생성된 주소값
public int hashCode() {
return this.name.hashCode() + age;
}
}
3) Map Interface
- Key와 Value를 매핑하는 객체
- Key는 절대 중복될 수 없음.
- 정렬 기준이 없음.
- 구현 클래스: HashMap, TreeMap ...
Hash Map
저장되는 value와 key가 null 허용
동기화가 포함되지 않았으므로 나중에 배우는 multi-thread 환경에서의 구현이 아니라면 Hashtable에 비해서 처리 속도가 빠름.
HashTableExample.java
Map<String, String> map = new Hashtable<String, String>();
map.put("spring", "12");
map.put("summer", "123");
map.put("fall", "1234");
map.put("winter", "12345");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("아이디와 비밀번호를 입력해주세요.");
System.out.println("아이디: ");
String id = sc.nextLine();
System.out.println("비밀번호:");
String pw = sc.nextLine();
System.out.println();
if (map.containsKey(id)) {
if (map.get(id).equals(pw)) {
System.out.println("로그인 되었습니다.");
break;
} else {
System.out.println("비밀번호가 일치하지 않습니다.");
}
} else {
System.out.println("입력하신 아이디가 존재하지 않습니다.");
}
}
sc.close();
Tree Map
TreeMapExample1.java - 원하는 값을 가져오거나, 정렬을 원할 경우 entry로 뽑아옴.
TreeMap<Integer, String> scores = new TreeMap<>();
scores.put(new Integer(87), "홍길동");
scores.put(new Integer(98), "이동수");
scores.put(new Integer(75), "발길순");
scores.put(new Integer(95), "신용권");
scores.put(new Integer(80), "김자바");
Map.Entry<Integer, String> entry = null;
entry = scores.firstEntry();
System.out.println("가장 낮은 점수 : " + entry.getKey() + "-" + entry.getValue());
entry = scores.lastEntry();
System.out.println("가장 높은 점수 : " + entry.getKey() + "-" + entry.getValue());
entry = scores.lowerEntry(new Integer(95));
System.out.println("95점 아래 점수 : " + entry.getKey() + "-" + entry.getValue());
entry = scores.higherEntry(new Integer(95));
System.out.println("95점 위의 점수 : " + entry.getKey() + "-" + entry.getValue());
entry = scores.floorEntry(new Integer(95));
System.out.println("95점 이거나 바로 아래의 점수: " + entry.getKey() + "-" + entry.getValue());
entry = scores.ceilingEntry(new Integer(85));
System.out.println("85점 이거나 바로 위의 점수: " + entry.getKey() + "-" + entry.getValue());
while (!scores.isEmpty()) {
entry = scores.pollFirstEntry();
System.out.println(entry.getKey() + "-" + entry.getValue() + "(남은 객체 수 : " + scores.size() + ")");
}
TreeMapExample2.java
TreeMap<Integer, String> scores = new TreeMap<>();
scores.put(new Integer(87), "홍길동");
scores.put(new Integer(98), "이동수");
scores.put(new Integer(75), "발길순");
scores.put(new Integer(95), "신용권");
scores.put(new Integer(80), "김자바");
NavigableMap<Integer, String> descendingMap = scores.descendingMap();
Set<Map.Entry<Integer, String>> descendingEntrySet = descendingMap.entrySet();
for (Map.Entry<Integer, String> entry : descendingEntrySet) {
System.out.print(entry.getKey() + "-" + entry.getValue() + " ");
}
System.out.println();
NavigableMap<Integer, String> ascendingMap = descendingMap.descendingMap(); // descending 번갈아가며 수행
Set<Map.Entry<Integer, String>> ascendingEntrySet = ascendingMap.entrySet();
for (Map.Entry<Integer, String> entry : ascendingEntrySet) {
System.out.print(entry.getKey() + "-" + entry.getValue() + " ");
}
Map Collection - Properties 가져오기
public static void main(String[] args) throws FileNotFoundException, IOException{
Properties pt = new Properties();
String path = PropertiesExample.class.getResource("database.properties").getPath();
// /C:/Java%20Programming/Sources/och11/bin/och11/database.properties
System.out.println("1 path : " + path);
path = URLDecoder.decode(path, "utf-8");
pt.load(new FileReader(path));
String driver = pt.getProperty("driver");
String url = pt.getProperty("url");
String userName = pt.getProperty("username");
String password = pt.getProperty("password");
// /C:/Java Programming/Sources/och11/bin/och11/database.properties
System.out.println("2 path : " + path);
System.out.println("driver: " + driver);
System.out.println("url1 : " + url);
System.out.println("username : " + userName);
System.out.println("password: " + password);
}
3. Collection Framework의 동기화(synchronization)
추후 예정
'Java' 카테고리의 다른 글
Why can't a top level class be static in Java? (0) | 2019.10.04 |
---|---|
오버로딩(Overloading) / 오버라이딩(Overriding) (0) | 2019.08.30 |
[Java] 추상 클래스(abstract class)와 인터페이스(interface) (0) | 2019.08.29 |
[Java] 상속 (inheritance) 정의 / final 클래스와 메소드 / instanceof 연산자 (0) | 2019.08.28 |
[Java] 클래스: 구성 멤버 / final / 접근제한자(access modifier) (0) | 2019.08.27 |