List 와 Set 은 모두 Collection 인터페이스를 상속받고 있으며 List 의 구현 클래스들은 AbstractList 클래스를 상속 받는 구조 입니다.
List 인터페이스는 배열과 유사한 자료구조로 중복이 허용되면서 저장순서가 유지되는 구조를 제공 합니다. 구현 클래스로는 Vector, ArrayList, LinkedList 가 있으며 가장 널리 사용되는것은 ArrayList 입니다.
주요 메서드는 다음과 같습니다. 각 메서드의 구체적인 인자나 사용법은 API문서와 예제를 참고하도록 합니다.
add(), addAll()
: 새로운 요소를 추가, 위치를 지정하거나 컬렉션 데이터를 한번에 추가하는 것이 가능
get()
: 지정된 위치(index)에 있는 객체 반환
indexOf()
: 객체의 위치(index) 반환
lastIndexOf()
: List의 마지막 요소부터 역방향으로 위치 반환
listIterator()
: List의 객체에 접근할 수 있는 ListIterator를 반환
remove()
: 지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환
set()
: 지정된 위치에 객체를 저장
sort()
: 지정된 Comparator로 List 요소 정렬
subList()
: 지정된 범위에 있는 객체를 새로운 List로 반환
가장 대표적인 List 구현 클래스 입니다. 일반적으로 모든 용도에서 사용할 수 있으나 데이터 추가나 삭제가 잦은 경우 처리속도에 문제가 있을 수 있습니다.
ArrayList 는 내부적으로 배열 구조를 사용하고 있으므로 중간에 데이터가 추가되거나 삭제될 경우 기존 데이터를 복사해 새로운 구조를 만들어야 하기 때문으로 이와 같은 경우에는 LinkedList 를 사용할 것을 권장 합니다.
Collection 과 마찬가지로 타입 선언은 인터페이스 타입으로 하고 객체 생성은 ArrayList 나 LinkedList 를 사용하는 형태 입니다.
List<String> l1 = new ArrayList<>();
List<String> l2 = Arrays.asList("one", "two");
List<String> l3 = List.of("three", "four");
l1.add("five");
l1.allAll(l2);
l1.set(0,"zero");
System.out.println(l1.get(0));
LinkedList 의 경우 생성 클래스만 다르고 사용하는 방법은 동일 하며 내부적으로 요소의 추가와 삭제등을 처리하는 방법에 차이가 있습니다.
LinkedList<String> llist = new LinkedList<>();
llist.addAll(l2);
llist.addAll(1,l3);
llist.add("five");
Set 인터페이스는 List와 유사하지만 중복이 허용되지 않고 기본적으로는 순서가 유지 되지 않습니다. 구현 클래스로는 HashSet, LinkedHashSet, EnumSet, TreeSet, CopyOnWriteArraySet 등이 있으며 가장 널리 사용되는것은 HashSet 입니다. 순서가 필요한 경우 LinkedHashSet 클래스나 SortedSet 인터페이스를 구현한 TreeSet등을 사용할 수 있습니다.
주요 메서드는 다음과 같습니다. 각 메서드의 구체적인 인자나 사용법은 API문서와 예제를 참고하도록 합니다.
add(), addAll()
: 기존에 없는 새로운 요소를 추가, 컬렉션 데이터를 한번에 추가하는 것도 가능
clear()
: 모든 요소를 삭제
contains(), containsAll()
: 인자의 객체를 포함하고 있는지 확인, 컬렉션 전체를 비교할수도 있음
isEmpty
: 요소가 하나도 없는지 확인
iterator()
: 현재 Set의 객체에 접근할 수 있는 Iterator를 반환
remove(), removeAll()
: 특정 객체를 삭제하거나 컬렉션 전체를 삭제
size()
: Set 에 저장된 요소의 크기를 반환
toArray()
: 현재 Set의 요소를 배열로 반환
가장 대표적인 Set 구현 클래스 입니다. 데이터가 중복되지 않는 자료구조가 필요한 경우 사용할 수 있으며 LinkedHashSet 의 경우 데이터가 입력된 순서로 저장됩니다.
Collection 과 마찬가지로 타입 선언은 인터페이스 타입으로 하고 객체 생성은 HashSet 이나 LinkedHashSet을 사용하는 형태 입니다.
Set<String> s1 = new HashSet<>();
Set<String> s2 = Set.of("three","four");
s1.addAll(Arrays.asList("one","two"));
s1.addAll(s2);
s1.add("five");
s1.add("two"); // 기존에 있으므로 새로 추가 안됨
s1.remove("five");
boolean check = s1.contains("one");
LinkedHashSet 의 경우 생성 클래스만 다르고 사용하는 방법은 기본적으로 동일 합니다.
LinkedHashSet<String> lset = new LinkedHashSet<>();
lset.addAll(Arrays.asList("one","two","three","four"));
lset.add("five");
Iterator 가 필요한 경우 다음과 같이 Iterator 객체를 가지고와 사용할 수 있습니다.
Iterator<String> iter = lset.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
SortedSet 인터페이스를 구현한 클래스 입니다. HashSet과 동일하게 중복된 데이터를 저장할 수 없으며 LinkedHashSet이 입력한 순서로 저장되는것과 달리 아니라 오름차순으로 데이터를 정렬 합니다.
Set<Integer> tset = new TreeSet<>();
tset.addAll(Arrays.asList(50,10,60,20));
만일 오름차순으로 정렬하기를 원한다면 다음과 같이 스트림 api 를 사용할 수 있습니다.
tset.stream().sorted((o1, o2) -> o2.toString().compareTo(o1.toString())).forEach(System.out::println);
Map 은 List 계열과 달리 순차적으로 데이터를 관리하지 않고 Key 와 Value 의 쌍으로 데이터를 관리합니다.
Map은 Collection 인터페이스를 상속받지 않으며 그 자체로 인터페이스로 여러 Map 구현클래스를 가지고 있습니다. 가장 대표적인 클래스는 HashMap 입니다.
기본적인 Map 사용방식은 다음과 같습니다.
Map<String,String> map = new HashMap<>();
map.put("109875","홍길동");
map.put("109894","김사랑");
System.out.println(map.get("109894")); // 김사랑
다음과 같은 주요 메서드를 사용해 데이터를 추가, 검색, 삭제등의 작업을 수행할 수 있으며 특히 전체 데이터를 출력하거나 하는 경우 key, value 의 값을 각각 Set 과 Collection 타입으로 변환하는 메서드가 유용하게 사용 됩니다.
put(), putAll()
: 새로운 요소를 추가, 데이터를 한번에 추가하는 것도 가능
get()
: 특정 Key 에 해당하는 값을 가지고 옴
remove
: Map 요소 삭제
entrySet
: key 와 value 값 모두를 Entry 객체로 반환
keySet
: key 요소만 Set 객체로 반환
size
: 크기를 반환
values
: value 요소만 Collection 타입으로 반환
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("1922876", "Apple Iphone");
map.put("1922877", "Apple Ipad");
map.put("2136861", "Samsung Galaxy");
map.put("2136863", "Samsung Tablet");
System.out.println("1922877: " + map.get("1922877"));
System.out.println("--------------------");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.printf("%s:%s\n", entry.getKey(), entry.getValue());
}
System.out.println("--------------------");
for (String s : map.keySet()) {
System.out.printf("%s\n", s);
}
System.out.println("--------------------");
for (String s : map.values()) {
System.out.printf("%s\n", s);
}
}
}
public class MapListTest {
public static void main(String[] args) {
List<Integer> s1 = Arrays.asList(95, 89, 93, 87, 94);
List<Integer> s2 = Arrays.asList(99, 79, 91, 89, 91);
List<Integer> s3 = Arrays.asList(93, 81, 95, 88, 99);
Map<String, List<Integer>> student = new HashMap<>();
student.put("홍길동", s1);
student.put("김사랑", s2);
student.put("아무개", s3);
Scanner scan = new Scanner(System.in);
System.out.print("## 성적 조회할 이름을 입력하세요: ");
String input = scan.next();
int total = 0;
for (int s : student.get(input)) {
total += s;
}
System.out.printf("총점: %d, 평균: %d", total, total / 5);
}
}
참고
오라클 java홈페이지
Introduction to Java Programming-IBM
Java Tutorial for Complete Beginners
프로그래밍언어 자바 Part-1