728x90
자바 개발자라면 누구나 **컬렉션 프레임워크(Collections Framework)**를 사용합니다. 데이터를 효율적으로 저장하고 관리하는 데 필수적인 요소죠. 하지만 List, Set, Map 세 가지 주요 인터페이스 중 어떤 것을 언제 사용해야 할지 헷갈릴 때가 많습니다. 데이터의 특성과 요구 사항에 따라 적절한 컬렉션을 선택하는 것이 성능 최적화의 핵심입니다.
1. List: 순서와 중복이 필요할 때
List는 가장 기본적인 컬렉션 형태로, 배열과 유사하게 데이터를 순서대로 저장하며 중복된 요소를 허용합니다. 데이터의 삽입 순서가 유지되며, 인덱스를 통해 특정 요소에 접근할 수 있습니다.
특징 | 설명 |
순서 유지 (Ordered) | 요소가 삽입된 순서를 기억하며, 인덱스로 접근 가능 (‘list.get(index)‘). |
중복 허용 (Allows Duplicates) | 동일한 요소를 여러 번 저장할 수 있습니다. |
List는 언제 사용해야 할까요?
- 데이터의 순서가 중요하고, 삽입 순서대로 처리해야 할 때 (예: 웹 브라우저 방문 기록, 실행해야 할 작업 목록).
- 중복된 데이터 저장이 허용될 때 (예: 주문 내역 리스트, 학생들의 시험 점수 리스트).
- ArrayList는 무작위 접근(random access)이 빈번할 때 (조회 성능 우수), LinkedList는 데이터의 잦은 삽입/삭제가 필요할 때 (추가/제거 성능 우수) 선택합니다.
2. Set: 유일성(Unique)이 가장 중요할 때
Set은 이름에서 알 수 있듯이 '집합'의 개념을 따릅니다. 가장 중요한 특징은 중복된 요소를 허용하지 않는다는 것입니다. 요소의 유일성을 보장하며, 일반적으로 순서가 유지되지 않습니다 (구현체에 따라 다름).
특징 | 설명 |
중복 불가능 (No Duplicates) | 모든 요소는 고유해야 합니다. 중복된 요소를 추가하려 하면 무시됩니다. |
순서 비유지 (Unordered) | 일반적으로 순서가 없습니다 (HashSet 기준). |
Set은 언제 사용해야 할까요?
- 컬렉션 내 모든 요소가 고유해야 함을 보장해야 할 때 (예: 사용자 ID 목록, 당첨 번호 목록).
- 중복 요소를 자동으로 제거하고 싶을 때.
- HashSet은 삽입/검색 성능이 빠르지만 순서를 보장하지 않으며, LinkedHashSet은 삽입 순서를 유지하고, TreeSet은 요소들을 정렬된 상태로 유지합니다.
3. Map: 키-값(Key-Value) 쌍으로 저장해야 할 때
Map은 List나 Set과는 다르게 **키(Key)**와 **값(Value)**의 쌍으로 데이터를 저장합니다. 마치 사전처럼 키를 통해 값을 즉시 검색할 수 있어 매우 빠른 조회가 가능합니다. 여기서 키는 유일해야 하지만, 값은 중복될 수 있습니다.
특징 | 설명 |
키-값 쌍 저장 | 데이터를 키와 값의 한 쌍으로 저장합니다. |
키는 유일 (Unique Keys) | 각 값에 대응하는 키는 반드시 고유해야 합니다. |
빠른 조회 | 키를 통해 값을 **O(1)**에 가까운 시간 복잡도로 빠르게 찾을 수 있습니다. |
Map은 언제 사용해야 할까요?
- 데이터를 **특정 식별자(Key)**로 빠르게 찾고 싶을 때 (예: 사용자 ID를 키로, 사용자 정보를 값으로 저장).
- 두 정보 사이의 매핑(Mapping) 관계를 표현해야 할 때 (예: 국가 코드와 국가명, 설정 속성과 값).
- HashMap은 가장 일반적이고 빠른 구현체이며, LinkedHashMap은 삽입 순서를 유지하고, TreeMap은 키를 기준으로 정렬하여 저장합니다.
💡 요약 정리: 선택 기준 한눈에 보기
컬렉션 인터페이스 | 순서 (Order) | 중복 (Duplicates) | 주요 용도 |
List | O (유지) | O (허용) | 순서가 중요하거나 중복이 허용되는 데이터 목록 |
Set | X (구현체에 따라 다름) | X (불가) | 요소의 유일성(Uniqueness)을 보장해야 할 때 |
Map | X (키-값 쌍) | 키는 불가, 값은 허용 | 키를 통해 값을 효율적으로 찾을 때 (매핑 구조) |
자바에서 데이터를 다룰 때 이 세 가지 컬렉션의 특징을 명확히 이해하고 적재적소에 활용한다면, 더 효율적이고 견고한 코드를 작성할 수 있을 겁니다.
728x90
'백엔드 > Java' 카테고리의 다른 글
Spring Boot와 Java: 백엔드 개발의 기본기 (0) | 2025.10.05 |
---|---|
[개인 프로젝트] 게시판 만들기 6 - Comment Dao, Service (0) | 2025.10.03 |
왜 자바는 여전히 강력한가? (0) | 2025.10.01 |
[개인 프로젝트] 게시판 만들기 5 - 공개, 비공개 기능 (0) | 2025.09.28 |
[개인 프로젝트] 게시판 만들기 4 - HTML, CSS 작성 (0) | 2025.09.27 |