Collection - ArrayList, HashSet, HashMap

하마·2025년 2월 26일
1

Java

목록 보기
4/8

컬렉션(Collection)이란?


Collections (Java Platform SE 8)

  • 자료구조를 쉽게 사용할 수 있도록 인터페이스와 클래스를 제공하는 집합
  • 컬렉션을 통해 데이터 저장, 조회, 삭제, 정렬 등 다양한 기능을 간편하게 구현할 수 있음
  • 배열과 다르게 컬렉션은 길이를 동적으로 변경할 수 있음

배열의 한계


  • 배열은 선언과 동시에 크기를 지정해줌
    • 이후에 배열의 크기를 변경할 수 없음
int[] numbers = new int[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
// ❌ 요소 추가시 에러발생
numbers[3] = 40;
  • 컬렉션을 사용하면 길이를 동적으로 변경할 수 있음
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(10);
arrayList.add(20);
arrayList.add(30);
// ✅ 크기 제한 없이 무한대로 추가 가능
arrayList.add(40);
...

컬렉션의 종류


인터페이스별 특징

인터페이스특징대표적인 구현체
List순서 유지, 중복 허용ArrayList
Set순서 없음, 중복 불가HashSet
Map키-값 구조, 키 중복 불가HashMap

1️⃣ List 인터페이스

  • 저장 순서가 유지되는 컬렉션을 구현하는 데 사용
  • 같은 요소의 중복 저장을 허용
  • index 로 요소에 접근
  • List 와 배열의 차이
    • List 는 자료형 크기가 고정 아닌, 데이터 양에 따라 동적으로 늘아났다 줄어들 수 있음
  • 요소 사이에 빈 공간을 허용하지 않아 삽입/삭제 시 배열 이동이 일어남
  • List 인터페이스를 구현한 대표적인 구현체
    • ArrayList, LinkedList

📌 ArrayList

  • 배열을 이용하여 만든 리스트
  • 단방향 포인터 구조
  • 각 데이터에 대한 인덱스를 가지고 있음
    • 삽입/삭제가 느린 단점
  • 조회 기능에 뛰어난 성능
    • 순차적으로 삽입/삭제하는 경우 가장 빠름
ArrayList<String> names = new ArrayList<>();

// ✅ 추가
names.add("Spartan");
names.add("Steve");
names.add("Isac");
names.add("1");
names.add("2");

// ✅ 순서 보장
System.out.println("names = " + names);

// ✅ 중복 데이터 허용
names.add("Spartan");

// ✅ 단건 조회
System.out.println("1 번째 요소 조회: " + names.get(0));

// ✅ 데이터 삭제
names.remove("Steve"); 

‼️ ArrayListList 로 자료형을 선언하자!

  • 다형성 을 활용해 List 인터페이스ArrayList 구현체를 받으면
    나중에 다른 구현체(LinkedList , Vector) 로 변경할 때 코드 수정을 최소화할 수 있습니다.
  • 실무에서는 리스트를 선언할 때 대부분 아래와 같이 List 타입으로 받는 것을 권장합니다.
List<Integer> arrayList = new ArrayList<>();

📌 LinkedList

  • 노드를 연결하여 리스트 처럼 만든 컬렉션 (배열이 아님)
  • 양방향 포인터 구조
  • 데이터의 중간 삽입/삭제가 빈번할 경우 빠른 성능을 보장함
    • 데이터의 위치정보만 수정하면 됨
  • 임의 요소에 대한 접근 성능은 좋지 않음

2️⃣ Set 인터페이스

  • 순서를 유지하지 않고, 중복을 허용하지 않는 데이터의 집합 리스트
    • 순서가 없기 때문에 get(index) 메소드가 존재하지 않음
    • 중복이 불가능하기 때문에 null 도 하나만 저장할 수 있음
  • Set 인터페이스를 구현한 대표적인 구현체
    • HashSet, TreeSet

📌 HashSet

  • 배열과 연결 노드를 결합한 자료구조
  • 가장 빠른 임의 접근 속도
  • 추가/삭제/검색/접근성이 모두 뛰어남
  • 순서를 예측할 수 없음
HashSet<String> uniqueNames = new HashSet<>();

// ✅ 추가
uniqueNames.add("Spartan");
uniqueNames.add("Steve");
uniqueNames.add("Isac");
uniqueNames.add("1");
uniqueNames.add("2");

// ⚠️ 순서를 보장 안함
System.out.println("uniqueNames = " + uniqueNames);
// ❌ get 사용 불가
uniqueNames.get(0);

// ⚠️ 중복 불가
uniqueNames.add("Spartan");

// ✅ 제거
uniqueNames.remove("Spartan");

📌 TreeSet

  • 이진 검색 트리 자료구조의 형태로 데이터를 저장함
  • 중복을 허용하지 않고, 순서를 가지지 않음
  • 데이터를 정렬하여 저장하고 있음
  • 정렬/검색/범위 검색에 높은 성능을 가짐

3️⃣ Map 인터페이스

  • 키(Key) - 값(Value) 의 쌍으로 연관지어 이루어진 데이터의 집합
  • 값(Value) 은 중복될 수 있지만, 키(Key) 는 중복될 수 없다.
  • 중복된 키에 값을 저장하면 마지막에 저장한 값으로 덮어씌워진다.
  • 저장 순서를 유지하지 않음
  • Map 인터페이스를 구현한 대표적인 구현체
    • HashMap, TreeMap

📌 HashMap

  • Hashtable 을 보완한 컬렉션
  • 배열과 연결이 결합된 Hashing 형태
    • Key-Value 을 묶어 하나의 데이터로 저장함
  • 중복을 허용하지 않고, 순서를 보장하지 않음
  • 키와 값으로 null 가능
  • 추가/삭제/검색/접근성이 모두 뛰어남
  • 비동기로 작동함
    • 멀티 쓰레드 환경에서는 어울리지 않는다.
HashMap<String, Integer> memberMap = new HashMap<>();

// ✅ 추가
memberMap.put("Spartan", 15);
memberMap.put("Steve", 15); // ✅ 값은 중복 가능
memberMap.put("Isac", 1);
memberMap.put("John", 2);
memberMap.put("Alice", 3);

// ⚠️ 순서 보장 안함 
System.out.println("memberMap = " + memberMap);

// ⚠️ 키 중복 불가
// 새로운 값으로 덮어씌워짐
memberMap.put("Alice", 5);

// ✅ 조회: 15
System.out.println(memberMap.get("Steve"));

// ✅ 삭제 가능
memberMap.remove("Spartan"); 

// ✅ 키 확인
Set<String> keys = memberMap.keySet();
System.out.println("keys = " + keys);

// ✅ 값 확인
Collection<Integer> values = memberMap.values();
System.out.println("values = " + values);

📌 TreeMap

  • 이진 검색 트리의 자료구조의 형태로 데이터를 저장함 (TreeSet 과 같은 원리)
  • Key 값을 기준으로 정렬된다.
  • 정렬된 순서대로 Key-Value 를 저장하여 빠른 검색(특히 범위 검색)이 가능함
  • 데이터를 저장함과 동시에 정렬하기 때문에 시간이 다소 걸림

컬렉션 선택 기준


  • ArrayList

    • 리스트 자료구조를 사용한다면 기본 선택
    • 임의의 요소에 대한 접근성이 뛰어남
    • 순차적인 추가/삭제 제일 빠름
    • 요소의 추가/삭제 불리
  • LinkedList

    • 요소의 추가/삭제 유리
    • 임의의 요소에 대한 접근성이 좋지 않음
  • HashMap / HashSet

    • 해싱을 이용해 임의의 요소에 대한 추가/삭제/검색/접근성 모두 뛰어남
    • 검색에 최고성능 ( get()의 성능이 O(1) )
  • TreeMap / TreeSet

    • 요소 정렬이 필요할때
    • 검색(특히 범위검색)에 적합
    • 그래도 검색 성능은 HashMap보다 떨어짐
  • LinkedHashMap / LinkedHashSet

    • HashMap과 HashSet에 저장 순서 유지 기능을 추가
  • Queue

    • 스택(LIFO) / 큐(FIFO) 자료구조가 필요하면 ArrayDeque 사용
  • Stack, Hashtable

    • 가급적 사용 X (deprecated)

참고자료


Java 컬렉션(Collection) 정리
Java Collections Framework 종류 총정리
챕터 3-3 : 컬렉션(Collection)

0개의 댓글