Post

15_컬렉션

15_컬렉션

Java 컬렉션 자료구조

15.1 컬렉션 프레임워크

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.HashMap;

public class CollectionFrameworkExample {
    public static void main(String[] args) {
        // 주요 컬렉션 인터페이스와 구현 클래스들
        List<String> list = new ArrayList<>();          // 순서 유지, 중복 허용
        Set<String> set = new HashSet<>();              // 순서 없음, 중복 불가
        Map<String, Integer> map = new HashMap<>();     // 키-값 쌍, 키는 중복 불가
    }
}
  • 컬렉션 프레임워크는 데이터 그룹을 효과적으로 처리할 수 있는 표준화된 구조를 제공하는 라이브러리입니다.

15.2 List 컬렉션

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
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        // ArrayList - 내부적으로 배열 사용 (검색 빠름)
        List<String> arrayList = new ArrayList<>();
        arrayList.add("Java");              // 요소 추가
        arrayList.add("Python");
        arrayList.add(1, "C++");            // 인덱스 지정 추가
        
        System.out.println(arrayList.get(0));  // "Java" - 인덱스로 접근
        arrayList.remove(1);                // "C++" 삭제
        System.out.println(arrayList.size());  // 2 - 크기 확인
        
        // LinkedList - 노드 연결 (삽입/삭제 빠름)
        List<String> linkedList = new LinkedList<>();
        linkedList.add("Spring");
        linkedList.add("Hibernate");
        
        // 리스트 순회
        for (String item : arrayList) {
            System.out.println(item);
        }
    }
}
  • List는 순서가 있고 중복을 허용하는 컬렉션으로, ArrayList는 빠른 검색, LinkedList는 빠른 삽입/삭제에 적합합니다.

15.3 Set 컬렉션

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
32
33
34
35
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
import java.util.Set;

public class SetExample {
    public static void main(String[] args) {
        // HashSet - 가장 빠른 검색
        Set<String> hashSet = new HashSet<>();
        hashSet.add("Apple");
        hashSet.add("Banana");
        hashSet.add("Apple");  // 중복 무시
        System.out.println(hashSet.size());  // 2 - 중복이 제거됨
        
        // LinkedHashSet - 입력 순서 유지
        Set<String> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add("C");
        linkedHashSet.add("A");
        linkedHashSet.add("B");
        // 출력: C, A, B (입력 순서대로)
        for (String item : linkedHashSet) {
            System.out.println(item);
        }
        
        // TreeSet - 정렬된 순서 유지
        Set<String> treeSet = new TreeSet<>();
        treeSet.add("C");
        treeSet.add("A");
        treeSet.add("B");
        // 출력: A, B, C (정렬됨)
        for (String item : treeSet) {
            System.out.println(item);
        }
    }
}
  • Set은 중복을 허용하지 않는 컬렉션으로, HashSet은 빠른 검색, LinkedHashSet은 입력 순서 유지, TreeSet은 정렬 기능을 제공합니다.

15.4 Map 컬렉션

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
32
33
34
35
36
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.TreeMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        // HashMap - 가장 빠른 키-값 검색
        Map<String, Integer> hashMap = new HashMap<>();
        hashMap.put("사과", 1000);            // 키-값 추가
        hashMap.put("바나나", 2000);
        
        System.out.println(hashMap.get("사과"));  // 1000 - 값 검색
        hashMap.remove("사과");                // 키-값 쌍 삭제
        
        // LinkedHashMap - 입력 순서 유지
        Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
        linkedHashMap.put("C", 3);
        linkedHashMap.put("A", 1);
        linkedHashMap.put("B", 2);
        // 키 순회 (입력 순서대로 C, A, B)
        for (String key : linkedHashMap.keySet()) {
            System.out.println(key + ": " + linkedHashMap.get(key));
        }
        
        // TreeMap - 키 기준으로 정렬
        Map<String, Integer> treeMap = new TreeMap<>();
        treeMap.put("C", 3);
        treeMap.put("A", 1);
        treeMap.put("B", 2);
        // 키 순회 (정렬 순서대로 A, B, C)
        for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
  • Map은 키-값 쌍을 저장하는 컬렉션으로, HashMap은 빠른 검색, LinkedHashMap은 입력 순서 유지, TreeMap은 키 기준 정렬을 제공합니다.

15.5 검색 기능을 강화시킨 컬렉션

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
32
33
34
35
36
37
38
39
40
import java.util.TreeSet;
import java.util.TreeMap;
import java.util.Comparator;

public class EnhancedSearchExample {
    public static void main(String[] args) {
        // TreeSet - 범위 검색
        TreeSet<Integer> scores = new TreeSet<>();
        scores.add(87);
        scores.add(98);
        scores.add(75);
        scores.add(95);
        scores.add(80);
        
        // 특정 값 이상의 가장 가까운 값
        System.out.println("90점 이상 중 최소값: " + scores.ceiling(90));  // 95
        // 80~90 사이의 값들
        System.out.println("80~90 사이 점수: " + scores.subSet(80, true, 90, false));  // [80, 87]
        
        // 사용자 정의 정렬 - 내림차순
        TreeSet<Integer> reverseScores = new TreeSet<>(Comparator.reverseOrder());
        reverseScores.add(87);
        reverseScores.add(98);
        reverseScores.add(75);
        // 출력: 98, 87, 75 (내림차순)
        for (Integer score : reverseScores) {
            System.out.println(score);
        }
        
        // TreeMap - 키 기준 검색
        TreeMap<String, Integer> users = new TreeMap<>();
        users.put("홍길동", 30);
        users.put("김철수", 25);
        users.put("이영희", 28);
        
        // 특정 키 이전의 항목
        Map.Entry<String, Integer> entry = users.lowerEntry("이영희");
        System.out.println("이영희 앞 사람: " + entry.getKey());  // 김철수
    }
}
  • TreeSet과 TreeMap은 이진 검색 트리 구조로 정렬, 범위 검색, 특정 값에 가까운 항목 찾기 등 향상된 검색 기능을 제공합니다.

15.6 LIFO와 FIFO 컬렉션

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
import java.util.Stack;
import java.util.Queue;
import java.util.LinkedList;

public class StackQueueExample {
    public static void main(String[] args) {
        // Stack - LIFO(Last In First Out)
        Stack<String> stack = new Stack<>();
        stack.push("A");
        stack.push("B");
        stack.push("C");
        
        System.out.println(stack.pop());  // "C" - 마지막에 넣은 것 먼저 꺼냄
        System.out.println(stack.peek());  // "B" - 꺼내지 않고 확인만
        
        // Queue - FIFO(First In First Out)
        Queue<String> queue = new LinkedList<>();
        queue.offer("A");
        queue.offer("B");
        queue.offer("C");
        
        System.out.println(queue.poll());  // "A" - 처음 넣은 것 먼저 꺼냄
        System.out.println(queue.peek());  // "B" - 꺼내지 않고 확인만
    }
}
  • Stack은 후입선출(LIFO), Queue는 선입선출(FIFO) 구조를 가진 컬렉션으로 각각 다른 데이터 접근 방식을 제공합니다.

15.7 동기화된 컬렉션

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
32
33
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

public class SynchronizedCollectionExample {
    public static void main(String[] args) {
        // 동기화된 List
        List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
        
        // 멀티스레드 환경에서 안전하게 사용
        Runnable task = () -> {
            synchronizedList.add(Thread.currentThread().getName());
        };
        
        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        t1.start();
        t2.start();
        
        // 동기화된 Map
        Map<String, Integer> synchronizedMap = 
            Collections.synchronizedMap(new HashMap<>());
            
        // 병렬 처리에 최적화된 ConcurrentHashMap
        Map<String, Integer> concurrentMap = new ConcurrentHashMap<>();
        concurrentMap.put("A", 1);
        // 존재하는 경우에만 업데이트 (원자적 연산)
        concurrentMap.computeIfPresent("A", (key, value) -> value + 1);
    }
}
  • 동기화된 컬렉션은 Collections.synchronized* 메소드나 ConcurrentHashMap 같은 클래스를 사용해 멀티스레드 환경에서 안전하게 데이터를 처리할 수 있습니다.

15.8 수정할 수 없는 컬렉션

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
32
33
34
35
36
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Collections;
import java.util.Arrays;

public class UnmodifiableCollectionExample {
    public static void main(String[] args) {
        // 수정 불가능한 리스트
        List<String> unmodifiableList = Collections.unmodifiableList(
            Arrays.asList("A", "B", "C")
        );
        
        // Java 9 이상에서는 of() 메소드 사용 가능
        List<String> immutableList = List.of("A", "B", "C");
        Set<String> immutableSet = Set.of("X", "Y", "Z");
        Map<String, Integer> immutableMap = Map.of("A", 1, "B", 2);
        
        try {
            immutableList.add("D");  // UnsupportedOperationException 발생
        } catch (UnsupportedOperationException e) {
            System.out.println("수정할 수 없는 컬렉션입니다!");
        }
        
        // 기존 컬렉션으로부터 수정 불가능한 컬렉션 생성
        List<String> originalList = new ArrayList<>();
        originalList.add("데이터1");
        originalList.add("데이터2");
        
        List<String> readOnlyList = Collections.unmodifiableList(originalList);
        // readOnlyList.add("데이터3");  // 예외 발생
    }
}
  • 수정할 수 없는 컬렉션은 Collections.unmodifiable* 메소드나 List.of(), Set.of(), Map.of() 등을 사용해 생성하며, 데이터 보호와 불변성 보장에 유용합니다.
This post is licensed under CC BY 4.0 by the author.