image

1. List

  • List 인터페이스
  • 순서가 있는 데이터 집합
  • 데이터(value) 중복 O
  • 인덱스를 통해 랜덤 액세스(Random Access) 가능 O(1)
  • 삽입/삭제시 데이터를 옮겨야 해서 비효율적이다 O(N)

  • 구현체 : ArrayList, LinkedList, Vector(동기화 지원, 구버전으로 사용 X)
ArrayList<String> list = new ArrayList<String>();
  • Vector vs ArrayList
    • ArrayList : 동기화가 안되는 클래스(동시에 여러 쓰레드가 접근 가능), 싱글 쓰레드 환경에서 더 빠름
    • Vector : 동기화를 지원하는 클래스(한 번에 하나의 쓰레드만 접근 가능)

2. Set

  • Set 인터페이스
  • 순서가 없는 데이터 집합으로 데이터 중복이 불가

  • 구현체 : HashSet, LinkedHashSet(순서), TreeSet(정렬)
    • TreeSet : Comparable 구현 or Comparator 제공 해야 정렬 가능
HashSet<String> set = new HashSet<String>();
  • 데이터 중복여부를 hashCode()equals()로 확인 (링크)
    • class를 정의할 때 동등객체로 적용하고 싶으면 hashCode()와 equals()을 오버라이딩 해야 한다
    • 동등객체 : hashCode()와 equals() 모두 true일 때
  • HashSet : equals(), hashCode() 비교해서 중복여부 확인
  • TreeSet : equals(), hashCode() 비교 + Comparable 구현여부 확인(정렬)

3. Map

  • Map 인터페이스
  • 순서가 없는 key-value 쌍의 데이터 집합
  • key값은 중복 불가, 데이터는 중복 가능

  • 구현체 : HashMap, LinkedHashMap(순서), TreeMap(정렬), HashTable(동기화 지원, 구버전으로 사용 X)
    • HashMap : Entry[]로 관리, 배열의 index는 key값의 해시값으로 결정
    • LinkedHashMap : 링크드리스트로 구현되어 있어 순서 보장
    • TreeMap : R-B트리로 관리되어 항상 정렬되어 있음, key값을 기준으로 정렬, NavigableMap 구현
HashMap<Integer, String> map = new HashMap<Integer, String>();
  • HashTable vs HashMap
    • HashMap : 동기화가 안되는 클래스(동시에 여러 쓰레드가 접근 가능), 싱글 쓰레드 환경에서 더 빠름
    • HashTable : 동기화를 지원하는 클래스(한 번에 하나의 쓰레드만 접근 가능), 단 5버전 이상부터 지원하는 CurrentHashMap을 사용하는 것이 좋다

메서드

public interface Map<K, V> {
	Set<K> keySet();
	Collection<V> values();
	Set<Map.Entry<K, V>> entrySet();

	interface Entry<K, V> {
        K getKey();
        V getValue();
		...
	}
}
  • 한개의 값
    • Map.Entry 인터페이스의 getKey(), getValue()
    • Map.Entry 인터페이스 : Key-Value 쌍을 다루기 위한 인터페이스, Map인터페이스 내부에 정의
  • 모든 값
    • Key : keySet() (return : Set)
    • Values : values() (return : Collection)
    • Key-Value 쌍 : entrySet() (return : Set)

Properties

  • HashTable의 하위 클래스
  • key와 value 자료형이 모두 String
  • txt, xml파일에 Properties 객체를 추가할 수 있는 기능

4. Stack과 Queue

Stack (클래스)

  • Vector의 하위클래스 (List)
  • push() : 저장, pop() : 꺼내오면서 제거, peek() : 조회

Queue (인터페이스)

  • Collection의 하위 인터페이스
  • offer() : 저장, poll() : 꺼내오면서 제거, peek() : 조회

자바 인터페이스

1. Comparable

public interface Comparable<T> {
    public int compareTo(T o);
}
  • 클래스의 기본 정렬 방식을 지정할 때 사용 (기본값 : 오름차순)
  • compareTo(Object)에 정렬방식을 구현
  • Comparable 인터페이스를 구현한 클래스는 정렬이 가능함
    • 사용자정의 클래스에서 Collections.sort()를 사용하기 위해서는 반드시 Comparable 인터페이스를 구현해야 한다

2. Comparator

public interface Comparator<T> {
    int compare(T o1, T o2);
	boolean equals(Object obj);
	...
  • 기본 정렬 방식을 변경할 때 사용
    • compare(Object o1, Object o2)를 구현

ex) String 클래스에서 compareTo()가 final로 정의되어 있기 떄문에 Comparator를 사용한다

static void sort(Object a)			// 지정된 Comparable에 의한 정렬
static void sort(Object a, Comparator c)	// 수정된 Comparator에 의한 정렬

3. Iterator

public interface Iterator<E> {
    boolean hasNext();
    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
}
  • 컬렉션 프레임워크에서 사용하는 방법
    • Collection 인터페이스에 iterator() 정의
    • List 와 Set 인터페이스에 iterator() 오버라이딩

ex) Map에서 사용하기 위해서는 Key, Entry->Set, Value->Collection으로 변환한 후 iterator()을 호출해야함.
[Map -> Set(Key or Entry의 경우) : keySet() or entrySet() /  Map -> Collection(Value의 경우) : values() 사용해 변환]

public static void main(String[] args) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		
		map.put("나자바", 85); map.put("홍길동", 90);
		map.put("동장군", 80); map.put("홍길동", 95);
		
		// keySet()
		Set<String> keySet = map.keySet();
		Iterator<String> keyIterator = keySet.iterator();
		while (keyIterator.hasNext()) {
			String key = keyIterator.next();
			Integer value = map.get(key);
			System.out.println(key + " : " + value);
		}
		System.out.println();
		
		// entrySet()
		Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
		Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
		while (entryIterator.hasNext()) {
			Map.Entry<String, Integer> entry = entryIterator.next();
			String key = entry.getKey();
			Integer value = entry.getValue();
			System.out.println(key + " : " + value);
		}
		
		// values()
		Collection<Integer> c = map.values();
		Iterator<Integer> valueIterator = c.iterator();
		while (valueIterator.hasNext()) {
			Integer value = valueIterator.next();
			System.out.println(value);
		}
   }
}
// keySet()
나자바 : 85
홍길동 : 95
동장군 : 80

// entrySet()
나자바 : 85
홍길동 : 95
동장군 : 80

// values()
85
95
80