[java] Collection Framework와 정렬

young-gue Park·2023년 7월 26일
0

Java

목록 보기
8/11
post-thumbnail

⚡ Collection Framework와 정렬


💡 이 파트는 이미 이전에 설명한 적이 있다. 복습하는 느낌으로 본다 ^^..
파트 1 | 파트 2

📌 Collection Framework

🔷 객체들을 한 곳에 모아놓고 편리하게 사용할 수 있는 환경을 제공

  • 정적 자료구조 (static data structure)
    • 고정된 크기의 자료구조
    • 배열이 대표적인 정적 자료구조
    • 선언 시 크기를 명시하면 바꿀 수 없음
  • 동적 자료구조 (Dynamic data structure)
    • 요소의 개수에 따라 자료구조의 크기가 동적으로 증가하거나 감소
    • 리스트, 스택, 큐 등

🔷 자료구조들의 종류는 결국은 어떤 구조에서 얼마나 빨리 원하는 데이터를 찾는가에 따라 결정된다.

  • 순서를 유지할 것인가?
  • 중복을 허용할 것인가?
  • 다른 자료구조들에 비해서 어떤 단점과 장점을 가지고 있는가?

🔷 java.util 패키지에 포함

🔷 Collection Framework 핵심 interface

interface특징
List순서가 있는 데이터의 집합. 데이터의 중복 가능 (ArrayList, LinkedList, Vector)
Set순서를 유지하지 않는 데이터의 집합. 데이터 중복 불가 (HashSet, TreeSet)
MapKey와 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()

⭐ List

  • 순서가 있고, 중복을 허용
  • 내부적으로 배열을 이용하여 데이터를 관리
  • 배열과 다르게 크기가 유동적으로 변함 (동적 자료구조)
  • 배열을 다루는 것과 유사하게 사용할 수 있음.
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();

⭐ Array

  • 같은 타입의 데이터를 묶어 사용하는 자료구조
  • 접근 속도가 빠름
  • 크기를 변경할 수가 없어 추가 데이터를 넣을 때, 새로운 배열을 만들고 복사함.
  • 데이터 삭제 시, 인덱스를 재조정하기 위해 전체 데이터를 옮겨야 함.
  • ArrayList 역시 Array를 활용하므로 이 같은 특징을 가지고 있음.

⭐ LinkedList

  • 각 요소를 Node로 정의하고 Node는 다음 요소의 참조 값과 데이터로 구성됨
  • 각 요소가 다음 요소의 링크 정보를 가지며 연속적으로 구성될 필요가 없음

⭐ Set

  • 순서가 없고, 중복을 허용하지 않음
  • 빠른 속도, 효율적인 중복 데이터 제거 수단
  • 단순 집합의 개념으로 정렬하려면 별도의 처리가 필요함.
// HashSet
// - 해시 테이블에 원소를 저장
// - 성능면에서 우수하다고 알려져 있음
// - 원소들의 순서가 일정하지 않음
Set<String>set = new HashSet<>();

set.add("박영규");
set.add("이건희");
set.add("박민정");
set.add("박영규");

System.out.println(set); // 순서 없이 3명만 들어있음
  • HashSet은 값을 비교할 때 hash 값을 기준으로 먼저 비교한 후에 일치하면 equals()를 작동시켜 비교한다.

❗ 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

  • Key와 value를 하나의 Entry로 묶어서 데이터 관리, 순서는 없으며 키에 대한 중복은 없음
  • 속도가 빠름
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

  • Queue는 인터페이스, 구현체는 LinkedList를 사용
  • 선입선출: 가장 먼저 들어온 값이 가장 먼저 빠져나감
Queue<Integer>queue = new LinkedList<>();

// 값 넣기
queue.offer(1);
queue.offer(2);

// 값 순차적으로 꺼내기
while(!queue.isEmpty) {
	// queue.poll();
}

⭐ Stack

  • 후입선출: 가장 나중에 들어온 값이 가장 먼저 빠져나감
Stack<Integer>stack = new Stack<>();

// 값 넣기
stack.push(1);

// 값 꺼내기
while(!stack.isEmpty()) {
	stack.pop();
}

📌 정렬

🔷 요소들을 특정 기준에 맞추어 내림차순 또는 오름차순으로 배치 하는 것

  • 순서를 가지는 Collection들만 정렬 가능
  • Collections의 sort()를 이용한 정렬
import java.util.*;

List<String> names = new ArrayList<>();

names.add("박영규");
names.add("박민정");
names.add("김준섭");
// [박영규, 박민정, 김준섭]

Collections.sort(names);
// [김준섭, 박민정, 박영규]

🌟 배열 정렬은 Arrays.sort()

⭐ Comparable interface

  • 나 와 쟤 (비교기준 한 개)
  • implements Comparable<T>을 필요로 함
public interface Comparable<T> {
	public int compareTo(T o);
    // 양수: 자리바꿈, 음수: 자리유지, 0: 동일위치
}

⭐ Comparator

  • 객체가 Comparable을 구현하고 있지 않거나 사용자 정의 알고리즘으로 정렬하려는 경우
  • 얘 와 쟤 (비교기준 두 개)
  • implements Comparator<T>을 필요로 함
  • 1회성 객체 사용시 익명 내부 클래스를 사용
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());
    }
});
profile
Hodie mihi, Cras tibi

0개의 댓글