KITRI 교육/Java Programming (KITRI 교육)

자바 컬렉션 프레임워크(Collection Framework)

벨플라워 2020. 5. 31. 18:06

1. 컬렉션 프레임워크 : 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할  있도록 java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스를 포함시킴

 

- 컬렉션 프레임워크의 주요 인터페이스는 : List, Set, Map

List 구현 클래스 : ArrayList, Vector, LinkedList

Set 구현 클래스 : HashSet, TreeSet

Map 구현 클래스 : HashMap, Hashtable, TreeMap, Properties

 

- 컬렉션 특징

List : 순서를 유지하고 저장, 중복 저장가능

Set : 순서를 유지하지 않고 저장, 중복 저장 안됨

Map : 키와 값의 쌍으로 저장, 키는 중복 저장 안됨

 

- List

List 컬렉션은 객체를 직접 저장하는 것이 아니라, 객체의 번지를 참조한다. 동일한 객체를 중복 저장할  있는데,  경우 동일한 번지가 참조됨, null 저장이 가능한데,  경우 해당 인덱스는 객체를 참조하지 않는다.

 

1. 예시

List<String> list = …;

list.add(“홍길동”); //맨 끝에 객체 추가

list.add(1, “신용권”); //지정된 인덱스에 객체 삽입

String str = list.get(1); //인덱스로 객체 찾기

list.remove(0); //인덱스로 객체 삭제 (힙영역이므로 참조하지 않으면 객체 삭제)

list.remove(“신용권”); //객체 삭제

for(String str : list) { //향상된 for문

System.out.print(str);

}

 

- ArrayList

ArrayList 저장 용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다

[자바 4이전] : 객체타입을 Object 저장하고 다운캐스팅 해야하므로 비효율적

 

[자바 5이후] : 애초에 객체타입을 지정할  있음

 

ArrayList<String> list = new ArrayList<String>(); // ()안에는 생성할 공간 수

list.add(“홍길동”); //컬렉션에 객체를추가

String name = list.get(0); //컬렉션에서 객체 검색, 홍길동을 얻음

 

1. 특징

ArrayList에서는 특정 인덱스의 객체를 삭제하면 기존 객체들이 앞으로 당겨지고, 추가하면 기존 객체들이 뒤로 밀린다

2. 객체 바로 저장하는 

List<String> list1 = Arrays.asList(“홍길동”,“신용권”,“김자바”);

for(String name : list1){

  System.out.println(name);

}

 

- Vector

Vector ArrayList 동일한 내부구조를 가지고 있다. Vector 생성하기 위해서는 저장할 객체타입을 타입 파라미터로 표기하고 기본 생성자를 호출한다

List<E> list = new Vector<E>();

 

1. 특징

ArrayList 다른점은 Vector 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에  메소드를 실행할  없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할  있다.(레이스 컨디션) 그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할  있다. 이것을 스레드가 안전하다라고 말한다.

 

-LinkedList

LinkedList 인접 참조를 링크에서 체인처럼 관리한다.

객체의 빈번한 추가 삭제가 있는 곳에서는 ArrayList보다 LinkedList  빠르다

 

- Set

Set 컬렉션은 수학에 비유하면 집합이다. 집합은 순서와 상관없고 중복이 허용되지 않기 때문이다. Set 컬렉션은 구슬 주머니와 비슷하다. 동일한 구술을 넣을  없고, 들어갈 때의 순서와 나올 때의 순서가 다를 수도 있기 때문이다.

 

1.예시

Set<String>set = …;

set.add(“홍길동”);

set.add(“신용권”);

set.remove(“홍길동”);

 

2.특징

Set 컬렉션은 인덱스가 없는 대신, Iterator 제공하기 때문에 iterator() 메소드를 호출하여 객체를 얻을  있다.

 

Set<String> set = …;

Iterator<String> iterator =set.iterator();

while(iterator.hasNext()) {

//String 객체 하나를 가져옴

    String str = iterator.next();

} //저장된 객체 수만큼 루핑한다.

 

또는 향상된 for문으로 객체를 뽑아낼  있다.

for(String str : set) {…}

 

- HashSet

HashSet 구현 클래스이다

Set<E> set = new HashSet<E>();

Set<String> set = new HashSet<String>();

 

HashSet 내부적으로 hashCode()메서드를 호출하고 동일 해시코드가 있다면 다시 equals() 메서드로  객체를 비교해서 true 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.

 

- Map

Map 컬렉션은 키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 여기서 키와 값은 모두 객체이다. 키는 중복 저장이 가능하지만, 값은 불가능하다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면, 값이 대체된다.

K1,V1 -> K1,V2 저장 --->결과: K1,V2 출력

★ List Set 객체추가시 add이지만 Map put이다

 

1.예시

Map<String, Integer> map = ~;

map.put(“홍길동”, 30); //객체 추가

int score = map.get(“홍길동”) //키로 찾기

map.remove(“홍길동”); //객체 삭제

 

- 저장된 객체를 하나씩 얻기

Map<K,V> map = ~;

Set<K> keySet = map.keySet();

Iterator<K> keyIterator = keySet.iterator();

while(keyIterator.hasNext()) {

   K key = keyIterator.next();

   V value = map.get(key);

}

 

- HashTable

HashTable HashMap 동일한 내부 구조를 가지고 있다. Hashtalbe 동기화된 메소드로 구성되어 있다.(Vector) 따라서 멀티 스레드가 동시에  메소드를 실행할 수는 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할  있다. 그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삽입할  있다.

Map<K, V> map = new Hashtable<K, V>();

 

1.예시 ( 아이디와 비밀번호 검사하기 문제)

Import java.util.*;

 

Public class HashTableExample {

Public static void main(String[] args) {

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 scanner = new Scanner(System.in);

while(true) {

System.out.println(“아이디와 비밀번호 입력”);

System.out.print(“아이디: ”);

String id = scanner.nextLine();

 

System.out.print(“비밀번호: ”);

String password = scanner.nextLine();

System.out.println();

 

if(map.containsKey(id)){

if(map.get(id).equals(password)) {

System.out.println(“로그인 되었습니다.”);

break;}

else {

 System.out.println(“비밀번호가 일치하지 않습니다.”);}

else {

  System.out.println(“입력하신 아이디가 존재하지 않습니다.”);

    }  

   }  

  }

 }

 

이 외에도 다양한 컬렉션이 존재합니다. 저도 모든 것을 완벽하게 다 기억하고 있기는 어려우므로, 수시로 공부하려합니다. 그리고 제가 동영상도 보고 인터넷도 보며 공부를 시작했습니다만, 책으로 다시 한번 개념을 다지는 것이 기초를 탄탄하게 만드는 길이라는 것을 느꼈습니다. 여러분도 어느정도 개념이 잡혔으면 책으로 다시 한번 개념을 굳히기를 추천드립니다. 감사합니다.

 

참조도서 : 이것이 자바다 저자:신용권