Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

UpDown Dev Story

자바(Java) 컬렉션(Collection)에 대해 알아보자 본문

Java

자바(Java) 컬렉션(Collection)에 대해 알아보자

updown 2021. 7. 9. 02:12

목적

자바 컬렉션(List, Map, Set)에 대해 정리하면서 공부하기위해 글을 작성하였습니다

컬렉션이란 무엇일까?

목록성 데이터를 처리하는 자료구조를 통칭

자바의 컬렉션과 관련된 클래스들의 구조

필자의 자바의 신 중에서 직접 찍은 사진

여기서 보면 Map만 별도로 분리되어 있음을 확인할수 있다

List

  • 특징
    • 순서가 있다

List - ArrayList

  • 확장 가능한 배열
  • 여러 명이 달려들어 값을 변경하려고 하면 문제가 발생할 수 있다 (not-thread-safe)
  • index 값이 있기때문에 특정 요소를 찾을때 유리
  • 중간에 node를 하나 삭제하게 되면 index를 다시 채번해야한다(삽입,삭제 가 빈번한경우 부적합)
  • 인스턴스 생성시 디폴트로 10개로 정해져 리스트의 개수가 capacity 이상이 되면 1.5배씩 늘려 나아가는 전략을 택하고 있다

List - Vector

  • 확장 가능한 배열
  • 여러 명이 달려들어 값을 변경하려고 해도 문제가 발생하지 않는다 (thread-safe)
  • 인스턴스 생성시 디폴트로 10개로 정해져 리스트의 개수가 capacity 이상이 되면 두배 씩 늘려 나아가는 전략을 택하고 있다

List - LinkedList

  • 연결 리스트(LinkedList)는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식의 자료구조
  • 인덱스가 없기에 특정 요소에 접근하기 위해서는 순차 탐색이 필요로 하여 탐색 속도가 떨어진다
  • 중간에 node를 하나 삭제하게 되면 삭제한 노드의 앞과 뒤만 다시 연결해주면 된다(삽입,삭제 가 빈번한경우 적합)

List - Stack

  • Vector 클래스를 확장 가능한 배열
  • LIFO(Last In First Out)

ArrayList, Vector, Stack Thread-Safe 직접 테스트 해보자

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.Vector;

public class Collection {
	static List<String> list = new ArrayList<>();
	// static List<String> list = new Vector<>();
	// static List<String> list = new Stack<>();

	public static void main(String[] ar) {
		list.add("reakwon");
		list.add("hello");
		list.add("world");

		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				list.forEach((item) -> {
					//1초마다 원소를 출력
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(item);
				});
			}
		});

		thread.start();    //thread 시작

		//thread가 forEach문을 먼저 수행할 여유를 주기 위해 1초 기다림
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//thread가 forEach() 하는 중에 원소추가
		list.add("thread-unsafe");
	}
}

위 코드처럼 ArrayList로 다른 스레드에서 값을 수정하려고 접근 하였을때 Exception이 발생되었고

Vector와 Stack으로 다른 스레드에서 값을 수정하려고 접근 하였을때는 정상적으로 출력되는것을 확인할수 있었습니다

 

Set

  • 특징
    • 중복이 없다
    • 순서가 없다

Set - HashSet

  • 순서가 전혀 필요 없는 데이터를 해시 테이블(hash table)에 저장 한다. Set중에 가장 성능이 좋다

Set - TreeSet

  • 저장된 데이터의 값에 따라서 정렬되는 셋이다. red-black 이라는 트리 타입으로 값이 저장되며, HashSet 보다 약간 성능이 느리다

Set - LinkedHashSet

  • 연결된 목록 타입으로 구현된 해시 테이블에 데이터를 저장한다. 저장된 순서에 따라서 값이 정렬된다. 대신 성능이 이 셋 중에서 가장 나쁘다

그렇다면 Set은 중복인지 아닌지 어떻게 비교할까?

HashSet이 구현되어있는 클래스를 들어가보면 생성자에 HashMap이 인스턴스 되어있는것을 확인할수 있다

필자의 IDE에서 들어가본 HashSet 클래스

그러면 add 메소드를 들어가보자 map.put을 하고 있는것을 확인할수 있다

필자가 들어가본 HashSet의 add

그러면 map.put 메소드에 들어가보자 (알고리즘은 잘 모르겠다..)

필자에 IDE에서 들어가본 map 의 put

위에 3가지 캡쳐로 본 결과 HashSet은 HashMap을 사용해서 값을 저장하고 있음을 확인할 수 있었고 HashMap은 put을 할때 동일한 키가 될 조건은 hashCode()의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야 합니다. 이 조건으로 값이 같다면 나중에 들어온 값이 overwirte 된다 그렇기 때문에 중복이 발생하지 않음을 확인할수 있었다

 

Queue

  • 특징
    • FIFO(First In First Out)
    • LinkedList가 Queue 인터페이스를 구현하고 있음

Queue - Priority Queue

  • 들어간 순서에 상관없이 일정한 규칙에 따라 우선순위를 선정하고 우선순위가 가장 높은 데이터가 가장 먼저 나오게 된다
    우선순위는 인스턴스 생성할때 정할수 있음

Map

  • 특징
    • Key, Value 형태로 저장이 된다
    • 키가 없이 값만 저장 될 수 없다
    • 값 없이 키만 저장할 수도 없다
    • 키는 해당 Map에서 고유해야만 한다
    • 값은 Map에서 중복될수 있다

Map - HashMap

  • 동일한 키가 될 조건은 hashCode()의 리턴값이 같아야 하고, equals() 메소드가 true를 리턴해야 합니다
  • 키와 값의 타입이 primitive type을 사용할 수 없고 클래스 및 인터페이스 타입만 사용할 수 있다
  • 해싱(hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어 뛰어난 성능을 보인다.
  • Not Thread Safe
  • List와 달리, Map에는 순서가 없다.

Map - TreeMap

  • 레드-블랙 트리(Red-Black Tree)를 기반으로 하여 부모 노드보다 작은 값을 가지는 노드는 왼쪽 자식으로, 큰 값을 가지는 노드는 오른쪽 자식으로 배치하여 데이터의 추가나 삭제 시 트리가 치우지지않게 균형을 맞추어 준다.
  • 객체를 삽입, 삭제 등의 기본 연산의 속도가 빠르다. 객체를 저장하면 자동 정렬 된다
  • Not Thread Safe

Map - LinkedHashMap

  • 입력된 순서대로 Key가 보장되는 FIFO(First In First Out, 선입선출) 방식이다.
    HashMap의 경우 객체를 넣을때 key의 순서가 지켜지지 않는데, LinkedHashMap은 입력한 순서대로 출력되게 된다
  • Not Thread Safe

Map - Hashtable

  • Hashtable은 HashMap과 동일한 내부 구조를 가지고 있다
  • Thread Safe

이상으로 자바 컬렉션에 대해 정리해 봤습니다

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments