Java에서 List와 Set은 모두 컬렉션(Collection) 프레임워크에 속하는 핵심 인터페이스입니다. 두 인터페이스 모두 Collection 인터페이스를 상속하며, 여러 객체를 하나의 단위로 묶어 저장하는 데 사용됩니다.
JDK 1.2 이전에는 객체를 그룹화하기 위해 배열(Array), Vector, Hashtable을 주로 사용했습니다. JDK 1.2부터 도입된 컬렉션 프레임워크는 이러한 데이터 구조를 체계적으로 통합하여 훨씬 편리하고 일관성 있는 방식으로 객체를 관리할 수 있게 해줍니다.
그렇다면 List와 Set은 어떤 점에서 다를까요? 아래 표에서 주요 차이점을 한눈에 확인할 수 있습니다.
List와 Set의 주요 차이점
| 번호 | 구분 | List | Set |
|---|---|---|---|
| 1 | 위치 기반 접근 | 인덱스(index)를 통해 컬렉션 내 요소에 위치 기반으로 접근할 수 있습니다. | 위치 기반 접근을 지원하지 않습니다. |
| 2 | 주요 구현체 | ArrayList, LinkedList, Vector, Stack 등이 있습니다. | HashSet, LinkedHashSet, TreeSet 등이 있습니다. |
| 3 | 중복 요소 | 중복된 요소를 자유롭게 저장할 수 있습니다. | 중복된 요소를 저장할 수 없습니다. |
| 4 | 순서 유지 | 요소가 삽입된 순서(insertion order)를 그대로 유지합니다. | 기본적으로 순서를 유지하지 않습니다. (LinkedHashSet은 삽입 순서, TreeSet은 정렬 순서 예외) |
| 5 | null 요소 | 여러 개의 null 값을 저장할 수 있습니다. | null 값은 최대 하나만 저장할 수 있습니다. |
List 사용 예제
다음 예제는 ArrayList에 문자열을 추가하는 코드입니다. 동일한 값 "BMW"를 두 번 추가해도 중복 없이 그대로 저장되는 것을 확인할 수 있습니다.
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class ListExample {
public static void main(String[] args) {
List<String> al = new ArrayList<String>();
al.add("BMW");
al.add("Audi");
al.add("BMW"); // 중복 허용
System.out.println("List Elements: ");
System.out.print(al);
}
}실행 결과
List Elements: [BMW, Audi, BMW]
Set 사용 예제
다음 예제는 HashSet에 정수 값을 추가하는 코드입니다. HashSet은 중복을 허용하지 않으며, 내부 해시 알고리즘에 따라 저장 순서가 달라질 수 있습니다.
import java.util.Set;
import java.util.HashSet;
import java.util.TreeSet;
public class SetExample {
public static void main(String args[]) {
int count[] = {2, 4, 3, 5};
Set<Integer> hset = new HashSet<Integer>();
try {
for(int i = 0; i < 4; i++) {
hset.add(count[i]);
}
System.out.println(hset);
}
catch(Exception e) {
e.printStackTrace();
}
}
}실행 결과
[2, 4, 3, 5]
정리: 언제 무엇을 사용해야 할까?
List는 요소의 순서가 중요하거나, 인덱스로 특정 위치의 데이터에 접근해야 하거나, 중복 데이터를 허용해야 하는 경우에 적합합니다. 반면 Set은 중복을 허용하지 않는 고유한 값들의 집합을 다룰 때 유용합니다. 예를 들어 회원 ID 목록처럼 중복이 없어야 하는 데이터를 관리할 때 Set을 사용하는 것이 좋습니다.