본문 바로가기

JAVA

[이것이 자바다] 15 컬렉션 프레임워크

* 본 포스팅은 제가 국비지원교육을 받으며 노션에 정리한 내용을 옮겨놓은 것입니다.
발전을 위한 피드백과 지적은 언제나 환영합니다. 

// 길이 10인 배열 생성
Product array[] = new Product[100];

// 객체 추가
array[0] = new Product("Model1", "red");
array[1] = new Product("Model2", "blue");

// 객체 검색
Product model1 = array[0]; // HashCode 출력됨
Product model2 = array[1];

// 객체 삭제
Product model1 = null;
Product model2 = null;

15.1 컬렉션 프레임워크 소개

  • 배열의 문제점을 해결하고 자료구조 (Data Structure)를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스들과 클래스들이 있다. ⇒ Collection Framework
  • 프레임워크(FrameWork) : 사용방법을 미리 정해놓은 라이브러리 - 주요 인터페이스 : List, Set, Map
  • Collection 사용 이점 : 배열길이의 가변성, 데이터 컨트롤 용이성

 

Collection 인터페이스

 

💡
Collection

<List>
- 순서 O, 중복 저장 O
- 구현 클래스 : ArrayList, Vector, LinkedList

<Set>
- 순서 X, 중복 저장 X
- 구현 클래스 : HashSet, TreeSet
💡
<Map>
- 키와 값의 쌍으로 저장, 중복 저장 X (value는 중복 가능)
- 구현 클래스 : HashMap, HashTable, TreeMap, Properties

 

15.2 List 컬렉션

  • 객체를 일렬로 늘어놓은 구조
  • 객체를 인덱스로 관리 → 인덱스로 검색, 삭제 가능
  • 객체의 번지를 참조하여 저장 (null은 객체 참조 X)

     

    Ex) 10을 집어넣으면 Integer 10 이라는 reference로 저장된다. (Boxing)

    ⇒ 기본형 집어넣을 수 없음. 무조건 객체로 Boxing해서.

     

    List<String> list = ...;
    list.add("홍길동"); // 맨 끝에 객체 추가
    list.add(1, "신용권"); // 인덱스 1에 객체 추가
    
    String str = list.get(1); // 인덱스로 객체 찾기
    list.remove(0); // 인덱스로 객체 삭제
    list.remove("신용권"); //객체 삭제

    ⇒ 동등 객체인지 확인하기 위해 객체 안에 equals & hashcode 재정의 필요할 수도 있다.

     

    for(String str : list) {
    }
    //향상된 for문으로 객체 하나씩 얻기

     

    15.2.1 ArrayList
    • ArrayList : List 인터페이스의 구현 클래스
    • 객체를 추가하면 객체가 인덱스로 관리된다.
    • 저장용량 (capacity) 을 초과한 객체들이 들어오면 자동으로 저장 용량이 늘어난다.

     

    List<String> list = new ArrayList<String>(); // 다형화

     

    • 빈번한 삭제와 수정 : linked list
    • 인덱스 검색 & 맨 마지막에 객체 추가하는 경우 : Array List

     


     

    ArrayListExam.java

     

    실행결과

     

    지우면 그 자리를 비워두는 것이 아니라 해당 인덱스에 뒤에 있던 값이 채워진다.

     

    💡
    고정된 객체들로 구성된 List를 생성할 때
    List<String> list = Arrays.asList("홍길동", "안주현", "김자바");

     

    ArraysListExample.java
    1,2,3,4,5 → 기본형 int 타입 아님 / Integer 타입인데 출력될땐 자동 unboxing 돼서 리터럴로 출력

     

    * 향상된 for문으로 출력

     

     

    list에 클래스 타입 넣은 케이스
    출력결과

    (toString 재정의했음)

     

    15.2.2 Vector
    List<E> list = new Vector<E>();
    • 동기화된 메소드로 구성되어 있어서 멀티스레드가 동시에 이 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다.
    • 멀티스레드에 안전

     

    15.2.3 LinkedList
    • 수정/삭제 많을때

     

    15.3 Set 컬렉션
    • Set 구조 : 주머니에 들어가 있는 구슬 (랜덤 추출)
    • List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 순서 유지 X
    • 중복저장 X
    • 인덱스로 객체를 검색해서 가져오는 메소드가 없고, 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator)를 제공한다.
    • 반복자(Iterator) : Iterator 인터페이스를 구현한 객체
    Set<String> set = ...;
    Iterator<String> iterator = set.iterator();
    while(iterator.hasNext()){
    	//String 객체 하나를 가져옴
    	String str = iterator.next();
    }

     

    Set<String> set = ...;
    for(String str : set){
    // 저장된 객체 수만큼 루핑
    }

     

  • 인덱스 4번에 추가하면 기존에 있던 데이터는 5번으로 밀려난다 (총 객체수 6)
while(iterator.hasNext()){
	String str = iterator.next();
	if(str.equals("홍길동")){
		iterator.remove();
	}
}
//Iterator의 next() 메소드로 가져온 객체를 제거하고 싶을때

 

15.3.1 HashSet

  • Set 인터페이스의 구현클래스 (HashSet이 Set의 자식)
Set<String> set = new HashSet<String>();
  • 객체 순서 X, 중복저장 X
  • HashSet이 판단하는 동일한 객체는 꼭 같은 인스턴스를 뜻하지는 않는다.
  • 객체 저장하기 전에 hashCode( ) 메소드를 호출해서 해시코드를 얻어내고, 동일한 해시코드가 있다면 다시 equals( ) 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.

 

15.4 Map 컬렉션

  • Map 컬렉션은 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조 (키와 값은 모두 객체)
  • 키는 중복저장 X, 값(value)는 중복저장 O
  • 기존에 저장된 키와 동일한 키로 저장하면 기존값 없어지고 새로운 값으로 대치

 

💡
Map 컬렉션

- HashMap
- HashTable
- LinkedHashMap
- Properties
- TreeMap

 

Map<String, Integer> map = ~;
map.put("홍길동", 30);                // 객체 추가
* 원래는 30 <- int 기본형 타입으로 들어갈 수 없지만 자동 unboxing
* int 타입 쓸 수 X, Object 타입이어야 함

int score = map.get("홍길동");        // 객체 찾기
map.put("홍길동", 100);               // 객체 수정
map.remove("홍길동");                 // 객체 삭제

 

Map 전체값 조회하기

 

1) map.keySet( ) 메소드

: 모든 키를 객체에 담아서 리턴하는 메소드

Map<K, V> map = ~;
Set<K> keySet = map.keySet();
Iterator<K> iter = keySet.iterator();
while(iter.hasNext()){
	K key = iter.next();
	V value = map.get(key);
}

 

 

 

2) map.entrySet( )

: entrySet( ) 으로 모든 Map.Entry를 Set 컬렉션으로 담고 반복자를 통해 Map.Entry를 하나씩 얻은 후 getKey(), getValue()로 키와 값을 얻음

Set<Map.Entry<K,V>> entrySet = map.entrySet();
Iterator<Map.Entry<K,V>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()){
	Map.Entry<K,V> entry = entryIterator.next();
	K key = entry.getKey();
	V value = entry.getValue();
}

 

 

 

15.4.2 HashTable

Map<K, V> map = new HashTable<K, V>();
  • 동기화된 메소드로 구성되어 있어서 멀티스레드가 동시에 이 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다.
  • 멀티스레드에 안전

 

이것이 자바다 (신용권의 Java 프로그래밍 정복)

 

이것이 자바다

『이것이 자바다』은 15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서이다. 자바 입문자를 배려한 친절한 설명과 배려로 1장에 풀인원 설치 방법을 제

book.naver.com