λ‚˜μ˜ λͺ¨μ–‘

016 | Java - Generics, Collection Framework λ³Έλ¬Έ

SEB/TIL

016 | Java - Generics, Collection Framework

kexon 2022. 7. 15. 00:38

πŸ’™ 였늘의 곡뢀 - 1. μ œλ„€λ¦­

🀍 Generics

더보기
  • 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ 클래슀, μΈν„°νŽ˜μ΄μŠ€μ˜ νƒ€μž…μ΄ λ§€κ°œλ³€μˆ˜κ°€ λ˜λ„λ‘ ν•  λ•Œ μ‚¬μš©
  • ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œμ˜ νŠΉμ • 데이터 νƒ€μž…μ„ 좔후에 지정할 수 있게 ν•΄μ£ΌλŠ” 것

μ œλ„€λ¦­ νƒ€μž…

  • λ§€κ°œλ³€μˆ˜ν™”λœ μ œλ„€λ¦­ ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€

Type Parameter Naming Conventions

  • νƒ€μž… λ§€κ°œλ³€μˆ˜ 이름 ⇒ μž„μ˜μ˜ 문자둜 지정 κ°€λŠ₯
  • ν•œ κΈ€μžμ˜ λŒ€λ¬Έμžλ‘œ 이루어져 μžˆλŠ”λ°, λ³€μˆ˜μ™€ 일반 클래슀, μΈν„°νŽ˜μ΄μŠ€ λ“±κ³Ό 이름을 κ΅¬λ³„ν•˜κΈ° μœ„ν•¨
Type Parameter Full name Meaning
E Element μš”μ†Œ
K Key ν‚€
N Number 번호
T Type μœ ν˜•
V Value κ°’

μ œλ„€λ¦­ μž₯점

  • 컴파일 μ‹œ νƒ€μž… 체크 ⇒ νƒ€μž… μ•ˆμ •μ„± ν–₯상
  • νƒ€μž…μ²΄ν¬μ™€ ν˜•λ³€ν™˜μ„ μƒλž΅ κ°€λŠ₯ ⇒ μ½”λ“œ κ°„κ²° ⇒ 관리 용이
  • λΉ„μŠ·ν•œ κΈ°λŠ₯ 지원 μ‹œ μ½”λ“œ μž¬μ‚¬μš©μ„± ν–₯상

πŸ“Wrapper class (java.lang)

  • κΈ°λ³Έ νƒ€μž… 데이터λ₯Ό 객체둜 포μž₯ν•΄μ£ΌλŠ”(Wrapper) 클래슀

πŸ“Boxing / Unboxing

  • 값을 μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ , μƒμ„±λœ μΈμŠ€ν„΄μŠ€ κ°’λ§Œ μ°Έμ‘° κ°€λŠ₯

🀍 Generic Class

더보기
  • μ œλ„€λ¦­μ΄ μ‚¬μš©λœ 클래슀

μ œλ„€λ¦­ 클래슀 μ„ μ–Έ

  • Tνƒ€μž…μ€ 아직 νƒ€μž…μ΄ μ •ν•΄μ Έμžˆμ§€ μ•ŠμœΌλ―€λ‘œ 직접 지정해주면 됨
class MusicalInsts<T> { // νƒ€μž… λ§€κ°œλ³€μˆ˜ <T> μ„ μ–Έ
	// class bodyμ—μ„œ 
	private T guitar; // μž„μ˜ νƒ€μž…μœΌλ‘œ T μ‚¬μš©
}

μ œλ„€λ¦­ 클래슀 μΈμŠ€ν„΄μŠ€ν™”

Box<Integer> box = new Box<Integer>();

μ œλ„€λ¦­ 클래슀 μ •μ˜ μ‹œ μ£Όμ˜ν•  점

  • 클래슀 λ³€μˆ˜μ—λŠ” νƒ€μž… λ§€κ°œλ³€μˆ˜ μ‚¬μš© λΆˆκ°€
class MusicalInsts<T> {
	private T guiter; // O 
	static  T piano;  // X 
}
  1. 클래슀 λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ—, 클래슀 λ³€μˆ˜μ— νƒ€μž… λ§€κ°œλ³€μˆ˜ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€λ©΄ 클래슀 λ³€μˆ˜μ˜ νƒ€μž…μ΄ μΈμŠ€ν„΄μŠ€λ³„λ‘œ λ‹¬λΌμ§ˆ κ²ƒμž„
  2. MusicalInsts<String>으둜 λ§Œλ“  μΈμŠ€ν„΄μŠ€μ™€ MusicalInsts<Integer>둜 λ§Œλ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜λŠ” 클래슀 λ³€μˆ˜μ˜ νƒ€μž…μ΄ μ„œλ‘œ λ‹¬λΌμ§€κ²Œ 됨 → ν΄λž˜μŠ€ λ³€μˆ˜λ₯Ό 톡해 같은 λ³€μˆ˜λ₯Ό κ³΅μœ ν•˜λŠ” 게 μ•„λ‹ˆκ²Œ 됨
  3. λ”°λΌμ„œ static이 뢙은 λ³€μˆ˜/λ©”μ„œλ“œμ—λŠ” νƒ€μž… λ§€κ°œλ³€μˆ˜ μ‚¬μš© λΆˆκ°€

μ œλ„€λ¦­ 클래슀 μ‚¬μš©

  • μ œλ„€λ¦­ ν΄λž˜μŠ€λŠ” 멀버λ₯Ό κ΅¬μ„±ν•˜λŠ” μ½”λ“œμ— νŠΉμ •ν•œ νƒ€μž…μ΄ μ§€μ •λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ, μ œλ„€λ¦­ 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•  λ•Œμ—λŠ” μ˜λ„ν•˜κ³ μž ν•˜λŠ” νƒ€μž…μ„ 지정해주어야 함
  • 단, νƒ€μž… λ§€κ°œλ³€μˆ˜μ— μΉ˜ν™˜λ  νƒ€μž…μœΌλ‘œ κΈ°λ³Έ νƒ€μž…μ„ 지정할 수 μ—†μŒ
    int, doubleκ³Ό 같은 μ›μ‹œ νƒ€μž…μ„ 지정해야 ν•˜λŠ” κ²½μš°μ—λŠ” Integer, Doubleκ³Ό 같은 래퍼 클래슀λ₯Ό ν™œμš©
Basket<String>  basket1 = new Basket<String>("Hello");
Basket<Integer> basket2 = new Basket<Integer>(10);
Basket<Double>  basket3 = new Basket<Double>(3.14);
  • new Basket<…> 뢀뢄에 ꡬ체적인 νƒ€μž… μƒλž΅ κ°€λŠ₯ ⇒ μ°Έμ‘°λ³€μˆ˜ νƒ€μž…μ—μ„œ μœ μΆ” κ°€λŠ₯

🀍 Restrictions on Generics

더보기
  • μ œλ„€λ¦­ νƒ€μž…μ— ‘extends’λ₯Ό μ‚¬μš© νŠΉμ • νƒ€μž…μ˜ μžμ†λ“€λ§Œ λŒ€μž…ν•  수 있게 μ œν•œ κ°€λŠ₯
  • μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ†νƒ€μž…μ˜ 객체λ₯Ό 가리킬 수 μžˆλŠ” κ²ƒμ²˜λŸΌ, λ§€κ°œλ³€μˆ˜ν™”λœ νƒ€μž…μ˜ μžμ† νƒ€μž…λ„ κ°€λŠ₯
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  λ•Œλ„ ‘extends’ μ‚¬μš© → ‘implements’ μ•„λ‹˜
  • 클래슀의 μžμ† & μΈν„°νŽ˜μ΄μŠ€λ„ κ΅¬ν˜„ ‘&’ 기호둜 μ—°κ²°
class Example<T extends classname & interfacename> { ... }

🀍 Generic Method

더보기
  • 클래슀 λ‚΄λΆ€μ˜ νŠΉμ • λ©”μ„œλ“œλ§Œ μ œλ„€λ¦­μœΌλ‘œ μ„ μ–Έν•œ 것
  • λ©”μ„œλ“œ 선언뢀에 적은 μ œλ„€λ¦­μœΌλ‘œ 리턴 νƒ€μž…, νŒŒλΌλ―Έν„°μ˜ νƒ€μž…μ΄ μ •ν•΄μ§€λŠ” λ©”μ„œλ“œ
public class MuslcalInsts<T> {
	static T guitar;
}

πŸ’™ 였늘의 곡뢀 - 2. μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬

🀍 Collections Framework

더보기
  • Collection: μ—¬λŸ¬ 객체(데이터)λ₯Ό λͺ¨μ•„놓은 것
  • Framework: ν‘œμ€€ν™”λœ ν”„λ‘œκ·Έλž˜λ° 방식
  • Collection Framework
    • 데이터λ₯Ό μ €μž₯ν•˜λŠ” ν΄λž˜μŠ€λ“€μ„ ν‘œμ€€ν™”ν•œ 섀계
    • ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„μ— ν•„μš”ν•œ 자료ꡬ쑰λ₯Ό κ΅¬ν˜„ν•΄λ†“μ€ JDK 라이브러리
    • λͺ¨λ“  μžλ°” μ»¬λ ‰μ…˜μ€ java.util νŒ¨ν‚€μ§€μ— κ΅¬ν˜„
    • κ°œλ°œμ— μ†Œμš”λ˜λŠ” μ‹œκ°„μ„ μ ˆμ•½ν•˜λ©΄μ„œ μ΅œμ ν™”λœ μ•Œκ³ λ¦¬μ¦˜ μ‚¬μš© κ°€λŠ₯

μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ˜ ꡬ쑰

🀍 List

더보기
  • 객체λ₯Ό 일렬둜 λŠ˜μ–΄λ†“μ€ ꡬ쑰
  • 쀑볡 κ°’ ν—ˆμš© o, μ €μž₯μˆœμ„œ μœ μ§€ o
  • 인덱슀둜 객체 관리 → 객체 μ €μž₯ μ‹œ μžλ™ 인덱슀 λΆ€μ—¬ → 인덱슀둜 객체 μ‘°μž‘(μΆ”κ°€, μ‚­μ œ, 검색) κ°€λŠ₯

ArrayList

  • κΈ°μ‘΄ Vectorλ₯Ό κ°œμ„ ν•œ κ²ƒμœΌλ‘œ, Vector보닀 ArrayListλ₯Ό μ‚¬μš©
  • Object 배열을 이용 ⇒ λ°μ΄ν„°μ˜ μ €μž₯μˆœμ„œ μœ μ§€, 쀑볡 ν—ˆμš©

LinkedList

  • λ°°μ—΄μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλœ 자료ꡬ쑰
  • λ°μ΄ν„°μ˜ 효율적인 μ‘°μž‘(μΆ”κ°€, μ‚­μ œ, λ³€κ²½) κ°€λŠ₯
  • λΆˆμ—°μ†μ μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” 데이터λ₯Ό μ„œλ‘œ μ—°κ²°ν•œ ν˜•νƒœλ‘œ ꡬ성
  • λ°μ΄ν„°μ˜
    • μΆ”κ°€: μΆ”κ°€ν•˜λ €λŠ” μœ„μΉ˜μ˜ 이전 μš”μ†Œμ˜ μ°Έμ‘°λ₯Ό μƒˆλ‘œμš΄ μš”μ†Œμ— λŒ€ν•œ 참쑰둜 λ³€κ²½ν•΄μ£Όκ³ , μƒˆλ‘œμš΄ μš”μ†Œκ°€ κ·Έ λ‹€μŒ μš”μ†Œλ₯Ό μ°Έμ‘°ν•˜λ„λ‘ λ³€κ²½
    • μ‚­μ œ: μ‚­μ œν•˜λ €λŠ” μš”μ†Œμ˜ 이전 μš”μ†Œκ°€ μ‚­μ œν•˜κ³ μž ν•˜λŠ” μš”μ†Œμ˜ λ‹€μŒ μš”μ†Œλ₯Ό μ°Έμ‘°ν•˜λ„λ‘ λ³€κ²½

ArrayList πŸ†š LinkedList

μ„±λŠ₯ 비ꡐ ArrayList LinkedList
순차적으둜 데이터λ₯Ό μΆ”κ°€/μ‚­μ œ πŸ‘πŸ»  
λΉ„μˆœμ°¨μ μœΌλ‘œ 데이터λ₯Ό μΆ”κ°€/μ‚­μ œ   πŸ‘πŸ»
μ ‘κ·Ό μ‹œκ°„ πŸ‘πŸ»  
기반 λ°°μ—΄κΈ°λ°˜ μ—°κ²°κΈ°λ°˜

🀍 Iterator

더보기
  • μ»¬λ ‰μ…˜μ— μ €μž₯된 μš”μ†Œλ“€μ„ 순차적으둜 μ½μ–΄μ˜΄
    • 순회 κΈ°λŠ₯: Iterator μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜
    • Collection μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ iterator()λ₯Ό ν˜ΈμΆœν•˜λ©΄ Iterator νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€κ°€ λ°˜ν™˜λ¨
      ⇒ Collection μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” List와 Set μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λ“€μ€ iterator() λ©”μ„œλ“œ μ‚¬μš© κ°€λŠ₯

Iterator μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œ

  • hasNext(): μ½μ–΄μ˜¬ 객체가 있으면 true, μ—†μœΌλ©΄ false λ°˜ν™˜
  • next(): ν•˜λ‚˜μ˜ 객체λ₯Ό μ½μ–΄μ˜΄
    • next() 호좜 μ „ hasNext()둜 μ½μ–΄μ˜¬ μš”μ†Œκ°€ μžˆλŠ”μ§€ λ¨Όμ € 확인해야함
  • remove(): next()둜 μ½μ–΄μ˜¨ 객체 μ‚­μ œ
    • μˆœμ„œ: next() 호좜 → remove() 호좜

🀍 Set

더보기
  • μ €μž₯ μˆœμ„œκ°€ μœ μ§€λ˜μ§€ μ•ŠμœΌλ©΄μ„œ 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” μ»¬λ ‰μ…˜ 클래슀λ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° μ‚¬μš©

HashSet

  • Set μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ λŒ€ν‘œμ μΈ μ»¬λ ‰μ…˜ 클래슀
  • 쀑볡 κ°’ ν—ˆμš© x, μ €μž₯μˆœμ„œ μœ μ§€ x

TreeSet

  • μ΄μ§„νƒμƒ‰νŠΈλ¦¬(Binary search Tree)둜 κ΅¬ν˜„λœ μ»¬λ ‰μ…˜ 클래슀
  • ν•˜λ‚˜μ˜ λΆ€λͺ¨ λ…Έλ“œκ°€ μ΅œλŒ€ 두 개의 μžμ‹ λ…Έλ“œμ™€ μ—°κ²° κ°€λŠ₯
  • λ²”μœ„ 검색과 정렬에 νŠΉν™”λœ 자료ꡬ쑰
class Node {
	Object element;  // 객체의 μ£Όμ†Œκ°’μ„ μ €μž₯ν•˜λŠ” μ°Έμ‘°λ³€μˆ˜
	Node left;       // μ™Όμͺ½ λ…Έλ“œμ˜ μ£Όμ†Œκ°’μ„ μ €μž₯ν•˜λŠ” μ°Έμ‘°λ³€μˆ˜
	Node right;      // 였λ₯Έμͺ½ λ…Έλ“œμ˜ μ£Όμ†Œκ°’μ„ μ €μž₯ν•˜λŠ” μ°Έμ‘°λ³€μˆ˜
}

🀍 Map

더보기
  • μ €μž₯μˆœμ„œκ°€ μœ μ§€λ˜μ§€ μ•ŠμœΌλ©΄μ„œ ν‚€(key)와 κ°’(value)을 ν•˜λ‚˜μ˜ 쌍으둜 λ¬Άμ–΄ μ €μž₯ν•˜λŠ” μ»¬λ ‰μ…˜ 클래슀λ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° μ‚¬μš©
    • ν‚€λŠ” 쀑볡될 수 μ—†μ§€λ§Œ, 값은 쀑볡을 ν—ˆμš©

Hashtable

  • HashMap의 이전 λ²„μ „μœΌλ‘œ, κ°€λŠ₯ν•˜λ©΄ Hashtable보닀 HashMap을 μ‚¬μš©

HashMap

  • Map μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ λŒ€ν‘œμ μΈ μ»¬λ ‰μ…˜ 클래슀
  • HashMap의 ν‚€(key)와 κ°’(value)
    • ν•΄μ‹±(hashing)κΈ°λ²•μœΌλ‘œ 데이터λ₯Ό μ €μž₯ ⇒ 데이터가 λ§Žμ•„λ„ 검색이 빠름
    • 데이터λ₯Ό 킀와 κ°’ 쌍으둜 μ €μž₯
      • ν‚€: μ»¬λ ‰μ…˜ λ‚΄ ν‚€ 쀑 유일
      • κ°’: 데이터 쀑볡 ν—ˆμš©
  • Map은 킀와 값을 쌍으둜 μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— iterator() 직접 호좜 λΆˆκ°€
    ⇒ entrySet() / keySet() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄ Set ν˜•νƒœλ‘œ λ°˜ν™˜λœ μ»¬λ ‰μ…˜μ— iterator()λ₯Ό ν˜ΈμΆœν•˜μ—¬ 반볡자λ₯Ό λ§Œλ“  ν›„
        반볡자λ₯Ό 톡해 순회

βœ… Ref.

https://docs.oracle.com/javase/tutorial/java/generics/index.html

 

Lesson: Generics (Updated) (The Java™ Tutorials > Learning the Java Language)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/package-summary.html

 

java.util (Java SE 11 & JDK 11 )

 

docs.oracle.com

πŸ’œ μ˜€λŠ˜μ˜ 생각 쑰각λͺ¨μŒ

  • μ˜€λŠ˜μ€ 였늘 배운거 μ§‘μ–΄λ„£λŠλΌ 생각 없을 무

'SEB > TIL' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

018 | Java - Enum, Annotation, Lambda, Stream  (0) 2022.07.18
017 | Java - πŸ₯ Practical | Collection Framework  (0) 2022.07.16
015 | Java  (0) 2022.07.13
014 | Java - Polymorphism, Abstraction  (0) 2022.07.12
013 | Java - Inheritance, Encapsulation  (2) 2022.07.11
Comments