Java 컬렉션 프레임워크 완전 정복, 예외 처리부터 HashSet과 TreeSet까지
📌 자바 기초부터 중급까지, 실무에 꼭 필요한 핵심 문법을 한 번에 정리해드립니다
자바(Java)를 처음 공부하거나 실무에 활용하는 분들이라면 한 번쯤 헷갈려 본 주제가 바로 예외 처리와 컬렉션 프레임워크일 거예요.
특히 List와 Set, 그리고 그 안에 포함된 HashSet, TreeSet 같은 클래스들은 자바의 데이터 구조를 이해하는 데 핵심적인 역할을 합니다.
이번 글에서는 예외 처리의 개념부터 컬렉션 구조, 각 인터페이스의 차이점, 실전 코드 예제까지 알기 쉽게 풀어드릴게요.
개발 입문자부터 자바를 다시 복습하고 싶은 분들까지 모두에게 도움이 될 수 있도록 꼼꼼히 준비했으니 끝까지 함께해 주세요.
먼저 자바에서 예외가 왜 중요한지부터 살펴보고, 컬렉션 프레임워크의 큰 그림과 각 인터페이스의 역할을 짚어볼게요.
그리고 List와 Set의 개념을 비교한 후, HashSet과 TreeSet의 특성과 차이점, 실제로 어떤 상황에서 사용하는 게 좋은지도 예제를 통해 자세히 설명드릴 예정입니다.
📋 목차
⚠️ Java 예외 처리란 무엇인가요?
자바에서 예외(Exception)는 프로그램 실행 중 발생할 수 있는 비정상적인 상황을 의미합니다.
예외 처리는 이러한 상황에 유연하게 대응하여 프로그램이 갑자기 종료되지 않고, 문제를 해결하거나 사용자에게 적절한 안내를 할 수 있도록 도와주는 기법이에요.
예를 들어, 배열의 범위를 벗어나거나 파일이 존재하지 않는 경우, 또는 0으로 나누는 계산이 발생할 때 예외가 발생할 수 있습니다.
이럴 때 try-catch 구문을 사용하여 정상 흐름을 유지하며 예외 상황을 처리할 수 있습니다.
📌 예외 처리의 기본 구조
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
}
위의 코드처럼 문제가 발생할 수 있는 영역은 try 블록으로 감싸고, 문제가 발생했을 때의 처리 방법은 catch 블록에 작성합니다.
- 🚫예외 처리를 하지 않으면 프로그램이 강제 종료될 수 있어요
- 🧯try-catch-finally 구조로 예외 발생에 유연하게 대응 가능
- 📛예외의 종류에 따라 적절한 예외 클래스로 처리해야 합니다
📌 Checked vs Unchecked 예외
자바의 예외는 크게 Checked 예외와 Unchecked 예외로 나뉩니다.
Checked 예외는 컴파일 타임에 반드시 예외 처리를 요구하며, 대표적으로 IOException, SQLException이 있습니다.
반면, Unchecked 예외는 런타임 시점에 발생하며, NullPointerException, ArrayIndexOutOfBoundsException 등이 이에 해당하죠.
💎 핵심 포인트:
예외 처리의 목적은 단순히 오류를 막는 것이 아니라, 예기치 못한 상황에서도 프로그램이 안정적으로 작동할 수 있도록 만드는 데 있습니다.
🧱 컬렉션 프레임워크란 무엇인가요?
컬렉션 프레임워크(Collection Framework)는 자바에서 데이터를 효율적으로 저장하고 처리하기 위해 제공되는 자료구조 라이브러리입니다.
배열보다 더 유연하고 강력하게 데이터를 다룰 수 있도록 도와주는 표준화된 API 집합이죠.
컬렉션 프레임워크는 크게 List, Set, Map이라는 3가지 주요 인터페이스를 중심으로 구성되며, 각각의 목적과 특징에 따라 다양한 구현체들이 존재합니다.
📌 주요 인터페이스와 클래스
| 인터페이스 | 대표 클래스 |
|---|---|
| List | ArrayList, LinkedList |
| Set | HashSet, TreeSet |
| Map | HashMap, TreeMap |
📌 왜 컬렉션을 써야 할까요?
단순한 배열은 크기 고정, 중복 처리, 삽입·삭제의 유연성 등에서 한계가 있습니다.
컬렉션은 이러한 불편함을 해결하고, 다양한 구조의 데이터 저장 방식을 제공합니다.
또한 반복자(Iterator)나 제네릭(Generic) 같은 기능과 결합하면 훨씬 더 안전하고 효율적인 프로그래밍이 가능하죠.
💬 컬렉션 프레임워크는 자바 개발자가 반드시 이해하고 활용할 줄 알아야 할 핵심 요소입니다.
💎 핵심 포인트:
컬렉션 프레임워크를 이해하면 데이터 처리 능력뿐 아니라 자바 언어 전반에 대한 이해도가 높아집니다.
📚 List 인터페이스의 특징과 활용
자바에서 List 인터페이스는 순서가 있는 데이터의 집합을 다룰 때 사용됩니다.
데이터가 입력된 순서를 유지하며, 중복된 요소도 허용되는 것이 큰 특징이에요.
즉, 인덱스를 이용해 원하는 위치의 요소에 접근하거나 수정할 수 있는 구조입니다.
대표적인 구현 클래스로는 ArrayList와 LinkedList가 있으며, 각각 사용 목적에 따라 선택해서 사용하면 됩니다.
📌 주요 메서드와 사용 예
import java.util.ArrayList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Apple"); // 중복 허용
System.out.println(list.get(1)); // Banana
list.remove("Apple");
System.out.println(list); // [Banana, Apple]
}
}
- 📌add(), get(), remove() 등 메서드를 통해 손쉽게 데이터 조작
- 🔁중복된 데이터를 허용하며 입력 순서를 유지
- 🧱ArrayList는 조회에 유리, LinkedList는 삽입·삭제에 유리
📌 언제 List를 사용하면 좋을까요?
List는 다음과 같은 상황에서 매우 유용하게 사용됩니다.
💎 핵심 포인트:
데이터의 순서를 유지해야 하거나, 중복을 허용하면서 인덱스를 기준으로 빠르게 접근하고자 할 때 List는 최고의 선택입니다.
🌀 Set 인터페이스의 개념과 구조
Set 인터페이스는 자바에서 중복되지 않는 데이터를 저장할 때 사용되는 컬렉션입니다.
List와 달리 요소의 순서를 보장하지 않으며, 같은 값을 두 번 이상 저장할 수 없다는 특징이 있어요.
대표적인 구현체로는 HashSet과 TreeSet이 있으며, 데이터의 저장 방식과 정렬 여부에 따라 선택적으로 사용합니다.
📌 List와 Set의 차이점
| 구분 | List | Set |
|---|---|---|
| 중복 허용 | 허용 | 허용하지 않음 |
| 순서 보장 | 입력 순서 유지 | 보장하지 않음 |
| 대표 구현체 | ArrayList, LinkedList | HashSet, TreeSet |
- 🚫Set은 중복된 데이터를 절대 허용하지 않음
- 🔄순서가 필요 없다면 List보다 메모리 사용이나 성능 측면에서 유리
- 🌱HashSet은 빠른 처리 속도, TreeSet은 정렬된 데이터 제공
💎 핵심 포인트:
Set은 데이터의 중복을 철저히 차단하고, 빠르게 포함 여부를 확인할 수 있는 자료구조로 검색이나 필터링 작업에 매우 적합합니다.
🌳 HashSet과 TreeSet의 차이와 예시
자바에서 HashSet과 TreeSet은 모두 Set 인터페이스를 구현한 클래스지만, 내부 구조와 동작 방식에서 큰 차이가 있습니다.
사용 목적에 따라 선택이 달라지므로, 각각의 특징을 정확히 이해하는 것이 중요해요.
📌 HashSet vs TreeSet 비교
| 구분 | HashSet | TreeSet |
|---|---|---|
| 정렬 여부 | 정렬되지 않음 | 자동 정렬 (오름차순) |
| 내부 구조 | HashTable 기반 | Tree 구조 기반 (Red-Black Tree) |
| 속도 | 빠름 (검색/삽입 O(1)) | 느림 (O(log n)) |
| Null 허용 | 1개 허용 | 허용 안 함 |
📌 사용 예제
import java.util.HashSet;
import java.util.TreeSet;
import java.util.Set;
public class SetExample {
public static void main(String[] args) {
Set<String> hashSet = new HashSet<>();
Set<String> treeSet = new TreeSet<>();
hashSet.add("Banana");
hashSet.add("Apple");
hashSet.add("Orange");
treeSet.add("Banana");
treeSet.add("Apple");
treeSet.add("Orange");
System.out.println("HashSet: " + hashSet);
System.out.println("TreeSet: " + treeSet);
}
}
- ⚡HashSet은 빠른 검색과 저장 성능이 장점
- 🧭TreeSet은 자동 정렬이 필요한 상황에 적합
- 🚫Null 허용 여부에도 유의해야 함
💎 핵심 포인트:
HashSet은 빠른 성능이, TreeSet은 정렬 기능이 필요한 상황에서 활용되며, 용도에 따라 선택이 달라집니다.
❓ 자주 묻는 질문 (FAQ)
try-catch 구문 없이 예외를 처리할 수는 없나요?
List와 Set 중 어떤 것을 더 많이 사용하나요?
HashSet은 왜 순서를 보장하지 않나요?
TreeSet은 어떤 기준으로 정렬되나요?
ArrayList와 LinkedList 중 어느 것이 더 빠른가요?
Set에서 중복이 제거되는 기준은 무엇인가요?
TreeSet은 왜 null을 허용하지 않나요?
컬렉션을 사용할 때 제네릭을 꼭 써야 하나요?
🧩 예외 처리부터 Set 활용까지, 자바 컬렉션 마스터하기
이번 글에서는 자바(Java)의 핵심 문법 중 하나인 예외 처리와 컬렉션 프레임워크에 대해 살펴보았습니다.
try-catch 구문을 통한 예외 처리 방식과 Checked/Unchecked 예외의 차이점, 그리고 컬렉션 프레임워크의 전체 구조와 주요 인터페이스인 List와 Set의 개념을 단계적으로 이해할 수 있었죠.
특히 HashSet과 TreeSet의 차이점과 실제 코드 예제를 통해 실무에서 어떤 선택을 해야 할지 명확해졌을 것입니다.
자바 입문자뿐 아니라 중급 개발자에게도 유용한 기초 복습 자료로 활용할 수 있는 내용이니, 필요할 때마다 꺼내보며 복습해보세요.
정리된 테이블과 체크리스트, 예제 코드를 통해 핵심만 빠르게 파악할 수 있도록 구성했습니다.
🏷️ 관련 태그 : 자바예외처리, 컬렉션프레임워크, JavaSet, JavaList, HashSet, TreeSet, 자바기초, 자바자료구조, 자바입문, 자바코딩예제