[JAVA] Collections Framework..2

https://ybdeveloper.tistory.com/43

 

[JAVA] Collections Framework...1

κ°œμš” μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ— λŒ€ν•œ μ „λ°˜μ μΈ 이해 Map, Set, List 차이점에 λŒ€ν•œ 이해 "μ–΄λ–€ 상황에 μ–΄λ–€ 클래슀λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?" 각 ν΄λž˜μŠ€κ°€ κ°€μ§€κ³  μžˆλŠ” λ©”μ†Œλ“œ 보단, μ „λ°˜μ μΈ 이해λ₯Ό μ€‘μ μœΌλ‘œ μ§„ν–‰ν•œλ‹€. Col..

ybdeveloper.tistory.com

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

https://iq.opengenus.org/set-in-java/

Set μΈν„°νŽ˜μ΄μŠ€λŠ” 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šκ³  μ €μž₯μˆœμ„œκ°€ μœ μ§€λ˜μ§€ μ•ŠλŠ” μ»¬λ ‰μ…˜ 클래슀λ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. Set μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€λ‘œλŠ” HashSet, TreeSet 등이 μžˆμŠ΅λ‹ˆλ‹€.

HashSet

HashSet은 Set μΈν„°νŽ˜μ΄μŠ€λ‘œ κ΅¬ν˜„ν•œ κ°€μž₯ λŒ€ν‘œμ μΈ μ»¬λ ‰μ…˜μ΄λ©°, Set μΈν„°νŽ˜μ΄μŠ€μ˜ νŠΉμ§•λŒ€λ‘œ HashSet은 μ€‘λ³΅λœ μš”μ†Œλ₯Ό μ €μž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. HashSet에 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•  λ•ŒλŠ” addλ©”μ„œλ“œλ‚˜ addAllλ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ”λ°,  만일 HashSet에 이미 μ €μž₯λ˜μ–΄ μžˆλŠ” μš”μ†Œμ™€ μ€‘λ³΅λœ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³ μž ν•œλ‹€λ©΄ 이 λ©”μ„œλ“œλ“€μ€ falseλ₯Ό λ°˜ν™˜ν•˜μ—¬ 좔가에 μ‹€νŒ¨ν–ˆλ‹€λŠ” 것을 μ•Œλ¦½λ‹ˆλ‹€. μ΄λŸ¬ν•œ HashSet의 νŠΉμ§•μ„ μ΄μš©ν•˜λ©΄, μ»¬λ ‰μ…˜ λ‚΄μ˜ 쀑볡 μš”μ†Œλ“€μ„ μ‰½κ²Œ μ œκ±°ν•  수 있죠.

 

ArrayList와 같이 μ €μž₯μˆœμ„œλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ €μž₯μˆœμ„œλ₯Ό μœ μ§€ν•˜κ³ μž ν•œλ‹€λ©΄ LinkedHashSet을 μ‚¬μš©ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. λ”°λΌμ„œ List의 쀑볡데이터λ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄μ„œ LinkedHashSet을 μ‚¬μš©ν•œλ‹€λ©΄ μ†μ‰½κ²Œ 쀑볡 데이터듀을 μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

HashSetκ³Ό hashCode(), equals()

λ§Œμ•½ nameκ³Ό ageλ₯Ό λ©€λ²„λ³€μˆ˜λ‘œ κ°–λŠ” Person ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€. 이름과 λ‚˜μ΄κ°€ κ°™μœΌλ©΄ 같은 μ‚¬λžŒμœΌλ‘œ μΈμ‹ν•˜λ €λŠ” μ˜λ„λ‘œ μž‘μ„±ν•˜μ˜€μ§€λ§Œ, μ •μž‘ HashSet μ»¬λ ‰μ…˜μ— 이름과 λ‚˜μ΄κ°€ 같은 λ‘κ°œμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ„£μ–΄λ³΄λ‹ˆ  같은 κ²ƒμœΌλ‘œ μΈμ‹ν•˜μ§€ λͺ»ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ 이 두 μΈμŠ€ν„΄μŠ€κ°€ 같은 κ²ƒμœΌλ‘œ μΈμ‹ν•˜κ²Œ ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒμš”? HashSet의 addλ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κΈ° 전에 기쑴에 μ €μž₯된 μš”μ†Œμ™€ 같은 것인지 νŒλ³„ν•˜κΈ° μœ„ν•΄ μΆ”κ°€ν•˜λ €λŠ” μš”μ†Œμ˜ equals()와 hashCode()λ₯Ό ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ— 두 κ°€μ§€ λ©”μ„œλ“œλ₯Ό λͺ©μ μ— 맞게 μ˜€λ²„λΌμ΄λ”© ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 이름과 λ‚˜μ΄κ°€ κ°™μœΌλ©΄ equals()κ°€ trueλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μ˜€λ²„λΌμ΄λ”© ν•΄μ•Όν•˜λ©°, hashCode()λ₯Ό νŠΉμ • λ°©μ‹λŒ€λ‘œ κ΅¬ν˜„ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. 이에 λŒ€ν•œ μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

class Person {
    String name;
    int age; 
    
    /*
    μƒλž΅...
    */ 

    public boolean equals(Object obj) {
        if(obj instanceof Person2) {
            Person2 tmp = (Person2)obj;
            return name.equals(tmp.name) && age==tmp.age; 
        }
        return false; 
    }

    public int hashCode() {
        return Objects.hash(name,age);
    }
}

TreeSet

TreeSet은 이진 검색 νŠΈλ¦¬λΌλŠ” 자료ꡬ쑰의 ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” μ»¬λ ‰μ…˜ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 이진 검색 νŠΈλ¦¬λŠ” μ •λ ¬, 검색, λ²”μœ„κ²€μƒ‰μ— 높은 μ„±λŠ₯을 λ³΄μ΄λŠ” 자료ꡬ쑰이며 TreeSet은 'λ ˆλ“œ-λΈ”λž™ 트리'둜 κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 그리고 TreeSet λ˜ν•œ Set μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν–ˆμœΌλ―€λ‘œ μ€‘λ³΅λœ λ°μ΄ν„°μ˜ μ €μž₯을 ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ©° μ •λ ¬λœ μœ„μΉ˜μ— μ €μž₯ν•˜λ―€λ‘œ μ €μž₯μˆœμ„œλ₯Ό μœ μ§€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 

 

이진 νŠΈλ¦¬λŠ” λ§ν¬λ“œ 리슀트처럼 μ—¬λŸ¬ 개의 λ…Έλ“œκ°€ μ„œλ‘œ μ—°κ²°λœ κ΅¬μ‘°λ‘œμ„œ, 각 λ…Έλ“œμ— μ΅œλŒ€ 2개의 λ…Έλ“œλ₯Ό μ—°κ²°ν•  수 있으며 '루트'라고 λΆˆλ¦¬λŠ” ν•˜λ‚˜μ˜ λ…Έλ“œμ—μ„œ κ³„μ†μ μœΌλ‘œ λ°‘μœΌλ‘œ ν™•μž₯ν•΄ λ‚˜κ°€λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€. TreeSet은 이진 검색 트리의 νŠΉμ„±μ„ μœ μ§€ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 데이터λ₯Ό μ €μž₯ν•  λ•Œ μ™Όμͺ½μ—λŠ” λΆ€λͺ¨λ…Έλ“œμ˜ 값보닀 μž‘μ€ 값을, 였λ₯Έμͺ½μ—λŠ” λΆ€λͺ¨λ…Έλ“œμ˜ 값보닀 큰 값을 μ €μž₯ν•©λ‹ˆλ‹€. λ”°λΌμ„œ 데이터λ₯Ό μ €μž₯ν•  λ•Œ 값듀을 λΉ„κ΅ν•΄μ•Όλ§Œ ν•˜λŠ”λ° 이에 λŒ€ν•΄ κ΅¬ν˜„ν•  수 μžˆλŠ” 두가지 방법이 μ‘΄μž¬ν•©λ‹ˆλ‹€. 

 

1. TreeSet에 μ €μž₯λ˜λŠ” 객체가 Comparable을 κ΅¬ν˜„ν•œλ‹€. 
2. Comparatorλ₯Ό μ œκ³΅ν•΄μ„œ 두 객체λ₯Ό 비ꡐ할 방법을 μ•Œλ €μ€€λ‹€. 

 

이 두 κ°€μ§€ 방법 쀑 ν•˜λ‚˜λΌλ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ TreeSet에 객체λ₯Ό μ €μž₯ν•  λ•Œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€. TreeSet은 이처럼 μ •λ ¬λœ μƒνƒœλ₯Ό 늘 μœ μ§€ν•˜κΈ° λ•Œλ¬Έμ— 단일 κ°’ 검색과 λ²”μœ„κ²€μƒ‰, 예λ₯Ό λ“€λ©΄ 3κ³Ό 7μ‚¬μ΄μ˜ λ²”μœ„μ— μžˆλŠ” 값을 κ²€μƒ‰ν•˜λŠ” 것이 ꡉμž₯히 λΉ λ¦…λ‹ˆλ‹€. λŒ€μ‹  데이터λ₯Ό 순차적으둜 μ €μž₯ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ €μž₯μœ„μΉ˜λ₯Ό μ°Ύμ•„μ„œ μ €μž₯ν•΄μ•Όν•˜λ©° μ‚­μ œν•˜λŠ” 경우 트리 일뢀λ₯Ό μž¬κ΅¬μ„±ν•  ν•„μš”κ°€ μžˆμœΌλ―€λ‘œ λ§ν¬λ“œλ¦¬μŠ€νŠΈλ³΄λ‹€ λ°μ΄ν„°μ˜ μΆ”κ°€/μ‚­μ œ μ‹œκ°„μ€ 더 κ±Έλ¦¬λŠ” νŽΈμž…λ‹ˆλ‹€.