컬렉션 프레임워크

SionBackEnd·2022년 7월 2일
0

자바 스터디

목록 보기
2/21
post-thumbnail

Java 컬렉션 프레임워크 구조

  • Collection: 순서나 집합적인 저장공간

    • List: 순서가 있는 저장 공간
      • LinkedList: 링크드리스트
      • Stack: 스택자료구조
      • Vector: 동기화 보장(synchronized O)
      • ArrayList: 동기화 보장하지 않음(synchronized X)
    • Set: 집합적인 저장 공간
      • HashSet: set계열의 대표클래스
      • SortedSet: 정렬을 위한 set계열의 클래스
        • TreeSet
  • Map: 키와 값으로 데이터 핸들

    • Hashtable:동기화를 보장하는 Map계열의 클래스(synchronized O)
    • HashMap: 동기화를 보장하지 않는 Map계열의 클래스(synchronized X)
    • SortedMap: 정렬을 위한 Map계열의 클래스
      • TreeMap

간단하게 알아보기

List

특징: 순서를 유지하고 저장, 중복저장 가능
구현클래스: ArrayList, Vector, Stack, LinkedList 등

Set

특징: 순서를 유지하지 않고 저장, 중복저장 불가능
구현클래스: HashSet, TreeSet 등

Map

특징: 키(key)와 값(value)의 쌍으로 저장, 순서 유지하지 않음, 키는 중복저장 불가
구현클래스: HashMap, Hashtable, TreeMap, Properties 등

List

list 인터페이스는 객체를 일렬로 늘어놓은 구조이다. 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여된다.
객체를 인덱스로 검색,삭제할수 있는 기능을 제공한다.

ArrayList

ArrayList는 배열과 유사하지만 차이점은 크기이다. 배열은 크기가 고정되어있고 ArrayList는 저장용량을 초과할경우 자동으로 저장용량이 늘어난다.

생성방법

List<타입 파라미터> 객체명 = new ArrayList<타입 파라미터>(초기 저장용량);
제네릭으로 되어있다. 

List<String> container1 = new ArrayList<String>();
//String타입의 객체를 저장하는 ArrayList, 이때 초기 용량은 10개 객체 저장가능.

기본적으로 초기용량이 10개이지만 용량이 자동으로 늘어나기 때문에 용량의 크기를 적지않고 생성한다.

알아두기

ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장됩니다. 그리고 특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨집니다. 따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다는 이후에 배우게 되는 LinkedList를 사용하는 것이 좋습니다.

rrayList에 String 객체를 추가, 검색, 삭제

public class ArrayListExample {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();

		list.add("Java"); // String 객체 저장/추가
		list.add("egg");
		list.add("tree");

		int size = list.size(); // 저장된 총 객체 수 얻기
		String skill = list.get(0); // 0번 인덱스의 객체 얻기

		for(int i = 0; i < list.size(); i++){// 저장된 총 객체 수 만큼 조회
			String str = list.get(i);
			System.out.println(i + ":" + str);
		}

		list.remove(0); // 0번 인덱스 객체 삭제
	}
}

Vector

vector은 ArrayList와 동일하나, 차이점은 모든 메서드가 동기화(synchronized)메서드로 구현되어 멀티쓰레드에 적합(Tread Safe)하다는 점이다.

LinkedList

linkedList컬렉션은 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용한다. 특징으로는 배열에는 모든데이터가 연속적으로 존재하지만, LinkedList에는 불연속적으로 존재하며, 이데이터는 서로 연결되어있다.

그림을보면 위는 Arrayist 아래는 LinkedList이다. 편하게 위,아래라고 칭하겠다. 위는 인덱스 번호로 연결이 되어있는데 아래는 양옆끼리 연결이 되어있다. 이것이 바로 큰 차이이다. 예를 들어 위에서 1번 데이터를 지우겠다고 하면 '다'데이터가 1번이 될것이다. 하지만 아래에서는 '나'데이터를 지우겠다고 하면 '가'와 '다'데이터가 내옆에는 이제 '나'가 아니라 '다'구나?'가'구나? 이렇게 된다는점이다

예시를 통해서 우리는 ArrayList가 LinkedList보다 추가,삭제 기능이 느리다는것을알아냈다. 그렇다면 검색은 누가더 빠른가? ArrayList가 더 빠르다. ArrayList는 6번데이터를 달라고 하면 6번으로 점프해서 6번데이터를 주지만, LinkedList는 앞에서부터 일일이 세면서 데이터를 찾기 때문에 느리다.

정리

ArrayList 데이터 추가/삭제 느림, 검색빠름
LinkedList 데이터 추가/삭제 빠름, 검색느림
따라서 데이터의 잦은 변경이 예상된다면 LinkedList를, 데이터의 개수가 변하지 않는다면 ArrayList를 사용하는 것이 좋다.

List 정리

  1. ArrayList
  • 저장 용량 자동 추가
  • index로 요소 관리
  1. Vector
  • ArrayList와 동일한 특징
  • 내부 메서드 동기화 적용
  1. LinkedList
  • 앞뒤 요소 정보로 데이터 위치 관리
  • 추가, 삭제 속도 빠름
  • index 정보가 없어 검색 느림

Set

Set은 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는다.
또한 인덱스 정보가 없기 때문에 중복된 원소 중 특정 위치 값을 꺼낼 방법이없다.

중복 여부를 확인하기 위해선 같음을 비교할 수 있어야 함
== 또는 .equals()

대표적인 Set 인터페이스 구현 클래스

  • HashSet
  • LinkedHashSet
  • TreeSet

HashSet

HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스입니다.

         HashSet<String> languages = new HashSet<String>();

이렇게 객체를 생성한후 값들을 입력시키고 출력을 하면 중복된 값 없이 램덤으로 출련된다.

   Iterator it = languages.iterator();

        while(it.hasNext()) {
            System.out.println(it.next());

출력은 주로 Iterator를 사용해서 출력한다. (챕터 2 메서드 모음집에서 설명보기)

LinkedList

  • Set 인터페이스를 구현한 구현 클래스이다. (HashSet의 자식 클래스, HashSet의 모든 기능 사용가능)
  • 수집한 원소를 집합의 형태로 관리하며 저장공간(capacity)를 동적관리
  • 입력 순서와 출력의 순서는 동일(단, 중복원소의 경우 추가되지 않음)

위의 차이점 말고는 HashSet의 기능과 완벽히 동일하다.

기본적인 객체생성 방식
Set LinkedSet1 = new LinkedHashSet();

TreeSet

  • set 인터페이스를 구현한 구현 클래스
  • 수집한 원소를 집합의 형태로 관리하며 저장공간을 동적관리
  • 입력 순서와 관계없이 크기순으로 출력(저장원소는 대소비교가 가능해야함)
    • 크기순은 디폴트가 오름차순이고 메서드를 사용하면 반대로 변경가능
    • 저장원소는 Integer와 String은 기본적으로 자바에서 Overide 되어있지만, 그이외 클래스들은 직접 Overide해주어야함

TreeSet = Set의 기본기능 + 정렬/검색 기능추가
하지만 추가 기능은 사용하기에 조건이 있다.

기본적인 객체생성 방식

  
  방식 1.
  Set <String> treeSet = new TreeSet<String>();
  방식 2.
  TreeSet<String> treeSet = new TreeSet<String>();

  방식1은 추가된 정렬/검색 기능사용불가
  방식2는 추가된 정렬기능 사용가능! 
  > 즉 기능을 사용하기 위해서는 TreeSet<E> 객체 타입 선언!
  
  #### 크기비교 기준
  1. Comparable<T> interface 구현
  2. TreeSet 생성자 매개변수로 Comparator<T>객체 제공
  
  ```java
  public class Employee implements Comparable<Employee>{
    int id;
    String name,department;

    public Employee(int id, String name, String department) {
        this.id = id;
        this.name = name;
        this.department = department;
    }
  
	@Override //매개변수로 받은 employee의 id와 내가 가지고있는 id의 값을 비교하는 것이다. 
    	public int compareTo(Employee employee) {
        if(id > employee.id) 
            return 1;
         else if(id < employee.id)
            return -1;
         else 
            return 0;
    }
}

Set 정리

  1. HashSet
  • HashCode(), equals()를 통해 중복 체크
  • 입력순서 != 출력순서
  1. LinkedHashSet
  • HashSey의 기본 기능 포함
  • 입력순서 = 출력순서
  1. TreeSet
  • Set의 기본 기능 + 정렬/검색 기능 추가
  • 출력순서(오름차순)

Map

Map 인터페이스는 키(key)와 값(value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 그리고 키는 중복 저장될 수 없지만, 값은 중복 저장이 가능하다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면, 기존의 값은 없어지고 새로운 값으로 대치된다.

map에서 ket와 value는 모두 객체이며, 기본타입일 수 없음
key가 다르면, 값이 같아도 다른 entry로 간주한다..
Map 인터페이스를 구현한 클래스에는 HashMap, Hashtable, TreeMap, SortedMap 등이 있다.

HashMap

HashMap은 Map 인터페이스를 구현한 대표적인 클래스이다. 이해할점은 HashMap은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 위치 또한 관계가 없다.

HashMap의 키로 사용할 객체는 hashCode()와 equals() 메서드를 재정의해서 동등 객체가 될 조건을 정해야 한다. 동등 객체, 즉 동일한 키가 될 조건은 HashSet과 동일하다. hashCode()의 리턴값이 같아야 하고, equals() 메서드가 true를 리턴해야 한다. 이렇듯 HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.

HashMap을 생성하기 위해서는 키 타입과 값 타입을 파라미터로 주고 기본 생성자를 호출하면 된다.

Map<Key, Value> map = new HashMap<Key, Value>();
Map<Key, Value> map = new HashMap<Key, Value>(capacity, loadFactor);
  • 다시 한번 더 강조하지만, 키와 값의 타입은 기본타입을 사용할 수 없고 클래스 및 인터페이스 타입만 가능하다.
  • HashMap은 키(key)와 값(value)에 null 값을 허용하지만, Hashtable은 null 값을 허용하지 않는다.
  • Map은 키와 값을 쌍으로 저장하기 때문에 iterator() 를 직접 호출할 수 없다. 그 대신 keySet() 이나 entrySet() 메서드를 이용해 Set 형태로 반환된 컬렉션에 iterator() 를 호출해야 한다.
profile
많은 도움 얻어가시길 바랍니다!

0개의 댓글