🔷 객체들을 한 곳에 모아놓고 편리하게 사용할 수 있는 환경을 제공
정적 자료구조 (static data structure)
배열
이 대표적인 정적 자료구조동적 자료구조 (Dynamic data structure)
🔷 자료구조들의 종류는 결국은 어떤 구조에서 얼마나 빨리 원하는 데이터를 찾는가에 따라 결정된다.
🔷 java.util 패키지에 포함
🔷 Collection Framework 핵심 interface
interface | 특징 |
---|---|
List | 순서가 있는 데이터의 집합. 데이터의 중복 가능 (ArrayList, LinkedList, Vector) |
Set | 순서를 유지하지 않는 데이터의 집합. 데이터 중복 불가 (HashSet, TreeSet) |
Map | Key와 Value의 쌍으로 데이터를 관리하는 집합. key의 중복 불가, value는 중복 가능 (HashMap, TreeMap) |
Queue | 지하철, 버스를 탈 때 대기줄과 같이 들어온 순서대로 나가는 자료구조 (LinkedList) |
🔷 Collection Framework 핵심 메소드
분류 | Collection |
---|---|
추가 | add(E e), addAll(Collection<? extends E> c) |
조회 | contains(Object o), containsAll(Collection<?>c), equals(), isEmpty(), iterator(), size() |
삭제 | clear(), removeAll(Collectionc), retainAll(Collectionc) |
수정 | - |
기타 | toArray() |
import java.util.*;
// 문자열을 저장할 List, 구현체는 ArrayList
List<String> names = new ArrayList<>();
// 추가
names.add("박영규");
names.add("박민정");
names.add("0, 김준섭");
// 비어있는지 검사
names.isEmpty();
// 수정
names.set(0, "류지인");
// 조회
for(String name : names) {
System.out.println(name);
}
// 삭제
names.remove(0);
names.remove("박영규");
names.clear();
// HashSet
// - 해시 테이블에 원소를 저장
// - 성능면에서 우수하다고 알려져 있음
// - 원소들의 순서가 일정하지 않음
Set<String>set = new HashSet<>();
set.add("박영규");
set.add("이건희");
set.add("박민정");
set.add("박영규");
System.out.println(set); // 순서 없이 3명만 들어있음
❗ Set이 여러 객체를 받을 때, 그 값이 같더라도 해시코드가 다르기 때문에 마치 중복된 값이 저장된 것처럼 보일 수 있다. 이를 방지하기 위해
hashCode()
와equals()
의 재정의가 필요하다.@Override public int hashCode() { return id.hashCode(); } @Override public boolean equals(Object obj) { if(obj instanceof Person) { Person other = (Person)obj; return id.eqauls(other.id); } }
Map<String, String>map = new HashMap<>();
// 값 저장
map.put("박영규", "대전");
map.put("박민정", "괴산");
map.put("류지인", "광주");
// {박영규=대전, 류지인=광주, 박민정=괴산}
// 중복키로 값을 넣으려고 하면 값이 바뀐다.
map.put("박영규", "울진");
// {박영규=울진, 류지인=광주, 박민정=괴산}
// 값 가지고 오기
map.get("박민정"); // 괴산
map.get("김찬진"); // null
// 키가 있는지 확인
map.containsKey("박영규"); // true
// 값이 있는지 확인
map.containsValue("광주"); // true
// 자료 조회
for(String key : map.keySet()) {
System.out.printf("%s : %s", key, map.get(key));
}
for(Map.Entry<String, String> entry: map.entrySet()) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
Queue
는 인터페이스, 구현체는 LinkedList
를 사용선입선출
: 가장 먼저 들어온 값이 가장 먼저 빠져나감Queue<Integer>queue = new LinkedList<>();
// 값 넣기
queue.offer(1);
queue.offer(2);
// 값 순차적으로 꺼내기
while(!queue.isEmpty) {
// queue.poll();
}
후입선출
: 가장 나중에 들어온 값이 가장 먼저 빠져나감Stack<Integer>stack = new Stack<>();
// 값 넣기
stack.push(1);
// 값 꺼내기
while(!stack.isEmpty()) {
stack.pop();
}
🔷 요소들을 특정 기준에 맞추어 내림차순 또는 오름차순으로 배치 하는 것
import java.util.*;
List<String> names = new ArrayList<>();
names.add("박영규");
names.add("박민정");
names.add("김준섭");
// [박영규, 박민정, 김준섭]
Collections.sort(names);
// [김준섭, 박민정, 박영규]
🌟 배열 정렬은 Arrays.sort()
implements Comparable<T>
을 필요로 함public interface Comparable<T> {
public int compareTo(T o);
// 양수: 자리바꿈, 음수: 자리유지, 0: 동일위치
}
implements Comparator<T>
을 필요로 함public interface Comparator<T> {
int compare(T o1, T o2);
}
// 익명 내부 클래스 활용
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});