본문 바로가기
혼공자

[혼공단 7기] 혼자 공부하는 자바 5주차

by 도리에몽 2022. 2. 20.

▷ 기본 미션: 직접 정리한 키워드 공유하기

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

컬렉션(객체의 저장) + 프레임워크(사용 방법을 정해놓은 라이브러리)

사용 방법을 정의한 인터페이스와 실제 객체를 저장하는 다양한 컬랙션 클래스(구현 클래스)를 제공.

 

  • 주요 인터페이스: List, Set, Map

 

List 컬렉션

List 컬렉션은 배열과 비슷하게 객체를 인덱스로 관리한다. 저장 용량이 자동으로 증가하고, 객체를 저장할 때 자동 인덱스가 부여된다는 점이 배열과 다르다. 추가, 검색, 삭제를 위한 메소드들이 제공되며, 객체 자체를 저장하는 것이 아닌 객체의 번지를 참조한다. 동일한 객체를 중복 저장할 때는 동일한 번지가 참조된다. null도 저장이 가능하지만 이때 해당 인덱스는 객체를 참조하지 않는다.

 

  • List 컬렉션 종류

- ArrayList: 저장할 객체 타입을 E 타입 파라미터 자리에 표기하고 기본 생성자를 호출하여 객체 생성.

- Vector: ArrayList와 동일한 내부 구조. 저장할 객체 타입을 타입 파라미터로 표기하고 기본 생성자를 호출.

- LinkedList: ArrayList는 내부 배열에 객체를 저장해서 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리.

 

 

  • List 컬렉션에서 공통적으로 사용 가능한 List 인터페이스의 메소드 (인덱스를 매개값으로 갖는 메소드가 많음)
기능 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 맨 끝에 추가
void add(int index, E element) 주어진 인덱스에 객체 추가
E set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 조사
E get(int index) 주어진 인덱스에 저장된 객체 리턴
boolean isEmpty() 컬렉션이 비어 있는지 조사
int size() 저장되어 있는 전체 객체 수 리턴
객체 삭제 void clear() 저장된 모든 객체 삭제
E remove(int index) 주어진 인덱스에 저장된 객체 삭제
boolean remove(Object o) 주어진 객체 삭제

 

Set 컬렉션

List 컬렉션과 달리 객체의 저장 순서가 유지되지 않는다. 객체를 중복해서 저장할 수 없고 하나의 null만 저장 가능하다.

 

  • Set 컬렉션 종류

- HashSet, LinkedHashSet, TreeSet

더보기

HashSet: 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다. Set set = new HashSet(); 

 

  • Set 컬렉션에서 공통적으로 사용 가능한 Set 인터페이스의 메소드 (인덱스를 매개값으로 갖는 메소드가 없음)
기능 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 저장한다. 객체가 성공적으로 저장되면 true를 리턴, 중복 객체면 false를 리턴
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 조사
boolean isEmpty() 컬렉션이 비어 있는지 조사
Iterator<E> iterator() 저장된 객체를 한 번식 가져오는 반복자를 리턴
int size() 저장되어 있는 전체 객체 수 리턴
객체 삭제 void clear() 저장된 모든 객체 삭제
boolean remove(Object o) 주어진 객체 삭제

 

Map 컬렉션

키(key)와 값(value)으로 구성된 Map.Entry 객체를 저장하는 구조를 갖고 있다. 키와 값은 모두 객체이며, Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스이다. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다.

 

  • Map 컬렉션 종류

  - HashMap, Hashtable, LinkedHashMap, Properties, TreeMap

더보기

* HashMap: 대표적인 Map 컬렉션. HashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다. 객체가 달라도 동등 객체라면 같은 키로 간주하고 중복 저장되지 않는다. 동등 객체의 조건은 hashCode()의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야 한다.

 

* Hashtable: HashMap과 동일한 내부 구조. 단, Hashtable은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Hashtable의 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야 다른 스레드를 실행할 수 있다.

 

LIFO와 FIFO 컬렉션

후입선출(LIFO: Last In First Out): 나중에 넣은 객체가 먼저 빠져나가는 자료구조

선입선출(FIFO: First In First Out): 먼저 넣은 객체가 먼저 빠져나가는 자료구조

 

컬렉션 프레임워크에는 LIFO 자료구조를 제공하는 Stack 클래스와 FIFO 자료구조를 제공하는 Queue 인터페이스 제공

 

  • Stack

   Stack 객체를 생성하려면 저장할 객체 타입을 E 타입 파라미터 자리에 표기하고 기본 생성자를 호출한다.

 

  • Queue

   Queue 인터페이스를 구현한 대표적인 클래스: LinkedList

 

 

▷ 선택 미션: p.573 [직접 해보는 손코딩] 코딩 과정 및 실행 결과 캡쳐하기

- HashMapExample.java

//이름을 키로 점수를 값으로 저장하기
package sec01.exam06;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashMapExample {
    public static void main(String[] args) {
    	//Map 컬렉션 생성
        Map<String, Integer> map = new HashMap<String, Integer>();

	//객체 저장
        map.put("신용권", 85);
        map.put("홍길동", 90);
        map.put("동장군", 80);
        map.put("홍길동", 95);
        System.out.println("총 Entry 수: " + map.size());
        
        //객체 찾기
        System.out.println("\t홍길동 : " + map.get("홍길동"));
        System.out.println();
        
        //객체를 하나씩 처리
        Set<String> keySet = map.keySet();
        Iterator<String> keyIterator = keySet.iterator();
        while (keyIterator.hasNext()) {
            String key = keyIterator.next();
            Integer value = map.get(key);
            System.out.println("\t" + key + " : " + value);
        }
        System.out.println();

	//객체 삭제
        map.remove("홍길동");
        System.out.println("총 Entry 수: " + map.size());
        
	//객체를 하나씩 처리
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
        
        while (entryIterator.hasNext()) {
            Map.Entry<String, Integer> entry = entryIterator.next();
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println("\t" + key + " : " + value);
        }
        System.out.println();

	//객체 전체 삭제
        map.clear();
        System.out.println("총 Entry 수: " + map.size());
    }
}

 

- 실행 결과