Java3 - accidentlywoo/sec GitHub Wiki

  • μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°
  • Collection Framework
  • List μΈν„°νŽ˜μ΄μŠ€
  • Set μΈν„°νŽ˜μ΄μŠ€
  • Map μΈν„°νŽ˜μ΄μŠ€

μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°

μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°μ€ μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ— λ‹€ 적용이 λ˜μ–΄μžˆλ‹€.

λ³€μˆ˜μ˜ μ„ μ–Έμ΄λ‚˜ λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό ν•˜λ‚˜μ˜ μ°Έμ‘° μžλ£Œν˜•μ΄ μ•„λ‹Œ μ—¬λŸ¬ μžλ£Œν˜•μ„ λ³€ν™˜ 될 수 μžˆλ„λ‘ ν”„λ‘œκ·Έλž˜λ° ν•˜λŠ” 방식

μ‹€μ œ μ‚¬μš©λ˜λŠ” μ°Έμ‘° μžλ£Œν˜•μœΌλ‘œμ˜ λ³€ν™˜μ€ μ»΄νŒŒμΌλŸ¬κ°€ κ²€μ¦ν•˜λ―€λ‘œ μ•ˆμ •μ μΈ ν”„λ‘œκ·Έλž˜λ° 방식

μžλ£Œν˜• 맀개 λ³€μˆ˜ T

μ—¬λŸ¬ μ°Έμ‘° μžλ£Œν˜•μœΌλ‘œ λŒ€μ²΄ 될 수 μžˆλŠ” 뢀뢄을 ν•˜λ‚˜μ˜ 문자둜 ν‘œν˜„

public class GenericPrinter<T>{ //GenericPrinter<T> : μ œλ„€λ¦­ 클래슀, T : type의 μ•½μž, μžλ£Œν˜• λ§€κ°œλ³€μˆ˜
  private T material;

  public void setMaterial (T material){
    this.material = material;
  }

  public T getMaterial(){
    return material;
  }
}

<T extends 클래슀>

T λŒ€μ‹ μ— μ‚¬μš©λ  μžλ£Œν˜•μ„ μ œν•œν•˜κΈ° μœ„ν•΄ μ‚¬μš©

Material에 μ •μ˜λœ λ©”μ„œλ“œλ₯Ό κ³΅μœ ν•  수 있음

μžλ£Œν˜• 맀개 λ³€μˆ˜κ°€ 두 개 이상일 λ•Œ

public class Point<T, V> {
  T x;
  V y;

  Point(T x, V y){
    this.x = x;
    this.y = y;
  }

  public T getX(){// μ œλ„€λ¦­ λ©”μ†Œλ“œ
    return x;
  }

  public V getV(){// μ œλ„€λ¦­ λ©”μ†Œλ“œ
    return y;
  }
}

μ œλ„€λ¦­ λ©”μ„œλ“œ

λ©”μ„œλ“œμ˜ 맀개 λ³€μˆ˜λ₯Ό μžλ£Œν˜• 맀개 λ³€μˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ

public class GenericMethod {
  public static <T, V> double makeRectangle(Point<T, V> p1, Point<T, V> p2){ // μ œλ„€λ¦­ λ©”μ†Œλ“œ
    double left = ((Number)p1.getX()).doubleValue();
    double right = ((Number)p2.getX()).doubleValue();
    double top = ((Number)p2.getY()).doubleValue();
    double bottom = ((Number)p2.getY()).doubleValue();
  
    double width = right - left;
    double height = bottom - top;

    return width * hight;
  }
}

λ©”μ†Œλ“œ λ‚΄μ—μ„œμ˜ μžλ£Œν˜• 맀개 λ³€μˆ˜λŠ” λ©”μ†Œλ“œ λ‚΄μ—μ„œλ§Œ 유효 함 (지역 λ³€μˆ˜μ™€ 같은 κ°œλ…)

class Shape<T>{
  public static<T, V>double makeRectangle(Point<T, V> p1, Point<T, V> p2){
    .....,
  }
}

Shape의 T와 makeRectangle의 TλŠ” μ „ν˜€ λ‹€λ₯Έ 의미

μ»¬λ ‰μ…˜ ν”„λ ˆμž„ μ›Œν¬λž€

ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„μ— ν•„μš”ν•œ μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•΄ 놓은 라이브러리

java.util νŒ¨ν‚€μ§€μ— κ΅¬ν˜„λ˜μ–΄ 있음

κ°œλ°œμ— μ†Œμš”λ˜λŠ” μ‹œκ°„μ„ μ ˆμ•½ν•˜κ³  μ΅œμ ν™”λœ 라이브러리λ₯Ό μ‚¬μš©ν•  수 있음

Collection μΈν„°νŽ˜μ΄μŠ€μ™€ Map μΈν„°νŽ˜μ΄μŠ€λ‘œ ꡬ성됨

  • Array : 논리 - 연속, 물리 - 연속 : ArrayList, Vector
  • LinkedList : 논리 - 연속, 물리 - 연속X : LinkedList
  • Stack : LIFO, push(), pop()
  • Queue : FIFO, front(dequeue()), rear(enqueue())
  • Hash : 검색을 μœ„ν•œ 자료ꡬ쑰, hash(key) - μ‚°μˆ μ—°μ‚°μ„ μ‚¬μš©ν•΄ λΉ λ₯΄λ‹€. O(1) collision, λ°μ΄ν„°μ˜ 75%μ‚¬μš©μ‹œ, 데이터 μš©λŸ‰ 좔가됨

Collection μΈν„°νŽ˜μ΄μŠ€

ν•˜λ‚˜μ˜ 객체의 관리λ₯Ό μœ„ν•΄ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€λ‘œ ν•„μš”ν•œ κΈ°λ³Έ λ©”μ„œλ“œκ°€ μ„ μ–Έ λ˜μ–΄ ν•˜μœ„μ— List, Set μΈν„°νŽ˜μ΄μŠ€κ°€ 있음

Map μΈν„°νŽ˜μ΄μŠ€

쌍으둜 이루어진 객체λ₯Ό κ΄€λ¦¬ν•˜λŠ”λ° ν•„μš”ν•œ μ—¬λŸ¬ λ©”μ†Œλ“œκ°€ μ„ μ–Έλ˜μ–΄ 있음

Map을 μ‚¬μš©ν•˜λŠ” κ°μ²΄λŠ” key-value 쌍으둜 λ˜μ–΄ 있고 keyλŠ” 쀑볡될 수 μ—†μŒ

List μΈν„°νŽ˜μ΄μŠ€

Collection ν•˜μœ„ μΈν„°νŽ˜μ΄μŠ€

객체λ₯Ό μˆœμ„œμ— 따라 μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ”λ° ν•„μš”ν•œ λ©”μ†Œλ“œκ°€ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€

λ°°μ—΄μ˜ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ λ©”μ†Œλ“œκ°€ 선언됨

ArrayList, Vector, LinkedList

ArrayList와 Vector

객체 λ°°μ—΄ 클래슀

VectorλŠ” μžλ°” 2λΆ€ν„° 제곡된 클래슀

일반적으둜 ArrayListλ₯Ό 더 많이 μ‚¬μš©

Vecto λŠ” λ©€ν‹° μ“°λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ—μ„œ 동기화λ₯Ό 지원

동기화(synchronization) : 두 개의 μ“°λ ˆλ“œκ°€ λ™μ‹œμ— ν•˜λ‚˜μ˜ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Ό ν•  λ•Œ μˆœμ„œλ₯Ό λ§žμΆ”μ–΄μ„œ λ°μ΄ν„°μ˜ 였λ₯˜κ°€ λ°©μ§€ν•˜μ§€ μ•Šλ„λ‘ 함

capacity와 sizeλŠ” λ‹€λ₯Έ μ˜λ―Έμž„

Set μΈν„°νŽ˜μ΄μŠ€

SetμΈν„°νŽ˜μ΄μŠ€λŠ” μˆœμ„œλ₯Ό 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

Iterator둜 μˆœνšŒν•˜κΈ° Collection의 개체λ₯Ό μˆœνšŒν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€

iterator() λ©”μ„œλ“œ 호좜

Iterator ir = memberArrayList.iterator();

Iterator 에 μ„ μ–Έλœ λ©”μ„œλ“œ

  • boolean hasNext() : 이후에 μš”μ†Œκ°€ 더 μžˆλŠ”μ§€λ₯Ό μ²΄ν¬ν•˜λŠ” λ©”μ„œλ“œμ΄λ©°, μš”μ†Œκ°€ μžˆλ‹€λ©΄ trueλ₯Ό λ°˜ν™˜ν•œλ‹€.
  • E next() : λ‹€μŒμ— μžˆλŠ” μš”μ†Œλ₯Ό λ°˜ν™˜ν•œλ‹€.

Collection ν•˜μœ„μ˜ μΈν„°νŽ˜μ΄μŠ€ 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμŒ

ListλŠ” μˆœμ„œκΈ°λ°˜μ˜ μΈν„°νŽ˜μ΄μŠ€μ§€λ§Œ, Set은 μˆœμ„œκ°€ μ—†μŒ

get(i) λ©”μ„œλ“œκ°€ μ œκ³΅λ˜μ§€ μ•ŠμŒ (Iterator둜 순회)

μ €μž₯된 μˆœμ„œμ™€ 좜λ ₯μˆœμ„œλŠ” λ‹€λ₯Ό 수 있음

아이디, 주민번호, μ‚¬λ²ˆ λ“± μœ μΌν•œ κ°’μ΄λ‚˜ 객체λ₯Ό 관리할 λ•Œ μ‚¬μš©

HashSet, TreeSet 클래슀

HashSet 클래슀

Set μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀

쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ €μž₯λ˜λŠ” 객체의 동일함 μ—¬λΆ€λ₯Ό μ•ŒκΈ° μœ„ν•΄ equals()와 hashCode() λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ ν•΄μ•Ό 함.

TreeSet

객체의 정렬에 μ‚¬μš©λ˜λŠ” 클래슀

쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μ˜€λ¦„μ°¨μˆœμ΄λ‚˜ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ 객체λ₯Ό μ •λ ¬ 함

λ‚΄λΆ€μ μœΌλ‘œ 이진 검색 트리(binary search tree - redblack tree) 둜 κ΅¬ν˜„λ˜μ–΄ 있음

이진 검색 νŠΈλ¦¬μ— μžλ£Œκ°€ μ €μž₯ 될 λ•Œ λΉ„κ΅ν•˜μ—¬ μ €μž₯될 μœ„μΉ˜λ₯Ό 정함

객체 비ꡐλ₯Ό μœ„ν•΄ Comparableμ΄λ‚˜ Comparator μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ•Ό 함.

Comparable μΈν„°νŽ˜μ΄μŠ€μ™€ Comparator μΈν„°νŽ˜μ΄μŠ€

μ •λ ¬ λŒ€μƒμ΄ λ˜λŠ” ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€

Comparable 은 compareTo() λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„

λ§€κ°œλ³€μˆ˜μ™€ 객체 μžμ‹ (this)λ₯Ό 비ꡐ

ComparatorλŠ” compare() λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„

두 개의 맀개 λ³€μˆ˜λ₯Ό 비ꡐ

TreeSet μƒμ„±μžμ— Comparatorκ°€ κ΅¬ν˜„λœ 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달

TreeSet<Member> treeSet = new TreeSet<Member>(new Member());

일반적으둜 Comparable 을 더 많이 μ‚¬μš©

이미 Comparable 이 κ΅¬ν˜„λ  경우 Comparatorλ₯Ό μ΄μš©ν•˜μ—¬ λ‹€λ₯Έ μ •λ ¬ 방식을 μ •μ˜ν•  수 있음

Map μΈν„°νŽ˜μ΄μŠ€

key-value pair의 객체λ₯Ό κ΄€λ¦¬ν•˜λŠ”λ° ν•„μš”ν•œ λ©”μ„œλ“œκ°€ μ •μ˜ 됨

keyλŠ” 쀑볡 될 수 μ—†μŒ

검색을 μœ„ν•œ 자료 ꡬ쑰

keyλ₯Ό μ΄μš©ν•˜μ—¬ 값을 μ €μž₯ν•˜κ±°λ‚˜ 검색, μ‚­μ œ ν•  λ•Œ μ‚¬μš©ν•˜λ©΄ νŽΈλ¦¬ν•¨

index = hash(ket) //indexλŠ” μ €μž₯ μœ„μΉ˜

keyκ°€ λ˜λŠ” κ°μ²΄λŠ” 객체의 μœ μΌμ„±μ˜ μ—¬λΆ€λ₯Ό μ•ŒκΈ° μœ„ν•΄ equals()와 hashCode()λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ 함

HashMap 클래슀

Map μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀 쀑 κ°€μž₯ 일반적으둜 μ‚¬μš©ν•˜λŠ” 클래슀 HashTable ν΄λž˜μŠ€λŠ” μžλ°”2λΆ€ν„° 제곡된 클래슀둜 Vector처럼 동기화λ₯Ό 제곡 함 pair자료λ₯Ό 쉽고 λΉ λ₯΄κ²Œ 관리할 수 있음

TreeMap 클래슀

key 객체λ₯Ό μ •λ ¬ν•˜μ—¬ key-valueλ₯Ό pair둜 κ΄€λ¦¬ν•˜λŠ” 클래슀

key에 μ‚¬μš©λ˜λŠ” ν΄λž˜μŠ€μ— Comparable, Comparator μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ java에 λ§Žμ€ ν΄λž˜μŠ€λ“€μ€ 이미 Comparable이 κ΅¬ν˜„λ˜μ–΄ 있음

κ΅¬ν˜„λœ 클래슀λ₯Ό key둜 μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” κ΅¬ν˜„ν•  ν•„μš” μ—†μŒ

public final class Integer extends Number implements Comparable<Integer>{
...
   public int compareTo(Integer anotherInteger){
      return compare(this.value, anotherInteger.value);
   }
}

정리

Collection μΈν„°νŽ˜μ΄μŠ€

ν•˜λ‚˜μ˜ 객체의 관리λ₯Ό μœ„ν•΄ μ„ μ–Έλœ μΈν„°νŽ˜μ΄μŠ€λ‘œ ν•„μš”ν•œ κΈ°λ³Έ λ©”μ„œλ“œκ°€ μ„ μ–Έλ˜μ–΄ 있음 ν•˜μœ„μ— List, Set μΈν„°νŽ˜μ΄μŠ€κ°€ 있음

  • List μΈν„°νŽ˜μ΄μŠ€ : μˆœμ„œκ°€ μžˆλŠ” 자료 관리, 쀑볡 ν—ˆμš©. 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λŠ” ArrayList, Vector, LinkedList, Stack, Queue등이 있음

  • Set μΈν„°νŽ˜μ΄μŠ€ : μˆœμ„œκ°€ μ •ν•΄μ Έ μžˆμ§€ μ•ŠμŒ, 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμŒ. 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λŠ” HashSet, TreeSet 등이 있음

Map μΈν„°νŽ˜μ΄μŠ€

쌍으둜 이루어진 객체λ₯Ό κ΄€λ¦¬ν•˜λŠ”λ° ν•„μš”ν•œ μ—¬λŸ¬ λ©”μ†Œλ“œκ°€ μ„ μ–Έλ˜μ–΄ 있음

Map을 μ‚¬μš©ν•˜λŠ” 객체응 key-value 쌍으둜 λ˜μ–΄ 있고 keyλŠ” 쀑볡될 수 μ—†μŒ

Map : Hashtable ( - Properties), HashMap, TreeMap

⚠️ **GitHub.com Fallback** ⚠️