CodeGym /ํ–‰๋™ /All lectures for KO purposes /๏ปฟTreeMap ์ปฌ๋ ‰์…˜ ์†Œ๊ฐœ

๏ปฟTreeMap ์ปฌ๋ ‰์…˜ ์†Œ๊ฐœ

All lectures for KO purposes
๋ ˆ๋ฒจ 1 , ๋ ˆ์Šจ 639
์‚ฌ์šฉ ๊ฐ€๋Šฅ

์–ด๋Š ๋‚  ๋Œ€ํ•™์—์„œ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ์˜ ํ‚ค ์—ญํ• ์„ ํ•˜๋Š” ๋™๊ธ‰์ƒ์˜ ์„ฑ์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋•Œ TreeMap ํด๋ž˜์Šค ์— ๋Œ€ํ•ด ์•Œ์•˜๋‹ค๋ฉด ํ›จ์”ฌ ๋” ๋นจ๋ฆฌ ์ž‘์—…์„ ์™„๋ฃŒํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ๋งต ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ ? ์š”์†Œ๋ฅผ ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ํ‚ค๋ณ„๋กœ ์ •๋ ฌํ•˜๋Š” ์‚ฌ์ „๊ณผ ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์–ด๋””์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธ€์Ž„์š”, ๊ฐ™์€ ๋ฐ˜ ์นœ๊ตฌ์˜ ์„ฑ์„ ๊ฐ€์ง„ ๋™์ผํ•œ ๊ณผ์ œ์— ์ด์ƒ์ ์ด์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ’์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ž์ฒด ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  TreeMap์„ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Integer ๋ฐ String ๊ณผ ๊ฐ™์€ ์œ ํ˜•์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TreeMap ์— ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํ˜•์„ ๋„ฃ์œผ๋ ค๋ฉด ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ด๋Š” compareTo() ๋ฉ”์„œ๋“œ ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํด๋ž˜์Šค์—์„œ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


public class Person implements Comparable<Person> {
 
    private String firstName;
    private String lastName;
 
    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
  โ€ฆ
 
    @Override
    public int compareTo(Person person) {
        return person.getFirstName().compareTo(firstName);
    }
 
    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }
}

compareTo() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ • ์˜ํ•˜์—ฌ ์•ŒํŒŒ๋ฒณ ์—ญ์ˆœ์œผ๋กœ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.


TreeMap map = new TreeMap<Person, String>();
 
map.put(new Person("AA","BB"), "aa");
map.put(new Person("BB","BB"), "aa");
map.put(new Person("DD","BB"), "aa");
map.put(new Person("CC","BB"), "aa");

๊ฐ’์€ ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.


Person{firstName='DD', lastName='BB'}
Person{firstName='CC', lastName='BB'}
Person{firstName='BB', lastName='BB'}
Person{firstName='AA', lastName='BB'}

TreeMap ํด๋ž˜์Šค๋Š” NavigableMap ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ , ์ด๋Š” SortedMap ์ธํ„ฐํŽ˜์ด์Šค ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค . ์ด๋ฅผ ํ†ตํ•ด TreeMap ํด๋ž˜์Šค๋Š” ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Wikipedia์—์„œ ๋งํ–ˆ๋“ฏ์ด ํŠธ๋ฆฌ๋Š” ๋จผ์ € ๊ฐ’์„ ๋น„๊ตํ•œ ํ›„ ๋…ธ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž์ฒด ๊ท ํ˜• ์ด์ง„ ๊ฒ€์ƒ‰ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋Š” ๊ฐ’์ด ๋ฃจํŠธ๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์— ๊ฐ’์ด ์ ์œผ๋ฉด ์™ผ์ชฝ ํ•˜์œ„ ํŠธ๋ฆฌ์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌํ˜„์€ ๊ตฌ์กฐ์˜ ๊ฐ’์„ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋Š” ์ž์ฒด์ ์œผ๋กœ ๊ท ํ˜•์„ ์ด๋ฃจ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ๊ฐ์˜ ์ƒˆ ๊ฐ’์ด ์‚ฝ์ž…๋  ๋•Œ๋งˆ๋‹ค ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์ถ”๊ฐ€๋œ ๊ฐ’์ด ์ฒ˜์Œ์—๋Š” ๋ฃจํŠธ๋กœ ๊ฐ„์ฃผ๋˜์ง€๋งŒ ๊ท ํ˜• ์กฐ์ • ๊ณผ์ •์—์„œ ๋‹ค๋ฅธ ๊ฐ’์ด ๋ฃจํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž, ์ด์ œ TreeMap ์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•˜์Šต๋‹ˆ๋‹ค .

TreeMap์€ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  compareTo() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•˜๋Š” ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค .

ํ•˜์ง€๋งŒ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋กœ๋“œ๋œ ํƒ€์‚ฌ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ๊ทธ ์•ˆ์— Comparable์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ Comparator ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค .

Comparator ๋Š” compare() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ๋น„๊ตํ•˜๊ณ  TreeMap ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .


Comparator<Person> comparator = new Comparator<Person>() {
 
    @Override
    public int compare(Person person1, Person person2) {
        return person1.getFirstName().compareTo(person2.getFirstName());
    }
};
 
 
TreeMap map = new TreeMap<Person, String>(comparator);

์ด ์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • Comparator๋ฅผ ๋งŒ๋“ค๊ณ  TreeMap ์„ ํด๋ž˜์Šค์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค .

Java 8๋ถ€ํ„ฐ ๋žŒ๋‹ค ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


TreeMap map = new TreeMap<Person, String>((Person person1, Person person2) -> person1.getFirstName().compareTo(person2.getFirstName()));

์ฆ‰, TreeMap ์— ๊ฐ’์„ ์ €์žฅํ•˜๋ ค๋ฉด ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. Comparable์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์ž์‹ ์˜ Comparator๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค .

ํ•˜์ง€๋งŒ null์„ TreeMap ์— ํ‚ค๋กœ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š” ? HashMap์„ ์‚ฌ์šฉ ํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ํ•˜์ง€๋งŒ TreeMap์€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?


TreeMap map = new TreeMap<Person, String>();
map.put (null, "Person");

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

java.base/java.util.TreeMap.put(TreeMap.java:561)์—์„œ ์Šค๋ ˆ๋“œ "main" java.lang.NullPointerException์˜ ์˜ˆ์™ธ

๋ฌธ์ œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ TreeMap ํด๋ž˜์Šค๊ฐ€ compareTo() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค . ํ™•์‹คํžˆ null ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Ÿฐํƒ€์ž„์— ๋ฉ”์„œ๋“œ๊ฐ€ null ๊ฐ’ ์—์„œ ํ˜ธ์ถœ๋˜์–ด NullPointerException์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

HashMap๊ณผ TreeMap์˜ ๋น„๊ต

TreeMap ๊ณผ ๋‹ฌ๋ฆฌ HashMap์—์„œ๋Š” null ์„ ํ‚ค๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ตฌ์กฐ์—๋Š” ๋ชจ๋“  null ํ‚ค์— ๋Œ€ํ•œ ํŠน์ • ์œ„์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. HashMap์€ ํ•ด์‹œ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋™ํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ๋น„๊ต๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ•ด์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— null ํ‚ค๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ๋ชจ๋“  null ํ‚ค์—๋Š” ์ œ์ž๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๊ฐ’์„ ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ์ €์žฅํ•ด์•ผ ํ•  ๋•Œ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ์ •๋ ฌ ๊ทœ์น™์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION