[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item13 ์™„๋ฒฝ๊ณต๋žต. TreeSet

2023. 2. 6. 10:08ใ†JAVA/Effective JAVA

728x90

 

item13. clone ์žฌ์ •์˜๋Š” ํ•ญ์ƒ ์ฃผ์˜ํ•ด์„œ ์ง„ํ–‰ํ•˜๋ผ. 

" p86. TreeSet"

 

 

TreeSet

: TreeSet์€ Set ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋กœ, Set์˜ ํŠน์ง•์ธ ๊ฐ์ฒด๋ฅผ ์ค‘๋ณตํ•ด์„œ ์ €์žฅํ•  ์ˆ˜ ์—†๊ณ , ์ €์žฅ ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š” ํŠน์ง•์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

 

TreeSet์€ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ถ”๊ฐ€์™€ ์‚ญ์ œ์—๋Š” ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ์ง€๋งŒ ์ •๋ ฌ, ๊ฒ€์ƒ‰์— ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. 

 

TreeSet์€ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ง€๋‹Œ ์ž์—ฐ์ ์ธ ์ˆœ์„œ natural order์— ๋”ฐ๋ผ ์ •๋ ฌํ•˜๊ณ , ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. 

์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ Comparator ๊ฐ์ฒด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์ž„์˜๋กœ ์ง€์ •ํ•ด ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. 

 

TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(10);
numbers.add(4);
numbers.add(6);

for (Integer number : numbers)
{
   System.out.println("number = " + number);
}

-> TreeSet์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๊ณ , add๋ฅผ ํ†ตํ•ด  TreeSet์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด๋•Œ natural order๋ฅผ ํ†ตํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด 4,6,10 ์ˆœ์œผ๋กœ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

TreeSet<PhoneNumber> phoneNumbers = new TreeSet<>(Comparator.comparingInt(PhoneNumber::hashCode));
phoneNumbers.add(new PhoneNumber(123, 456,780));
phoneNumbers.add(new PhoneNumber(123, 456,7800));
phoneNumbers.add(new PhoneNumber(123, 456,789));

for (PhoneNumber phoneNumber : phoneNumbers)
{
   System.out.println("phoneNumber = " + phoneNumber); // Comparable์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„์„œ Error ๋ฐœ์ƒ !
}

๊ทผ๋ฐ PhoneNumber์˜ ๊ฒฝ์šฐ์—๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์ด๊ฒŒ ๋ญ”์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌํ•  ์ˆ˜ ์—†๋Š”๋ฐ ์ด๋Ÿด ๋•Œ๋Š” Comparator๋ฅผ ์ถ”๊ฐ€ํ•ด ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค. 

์ง€๊ธˆ์€ hashcode ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋„๋ก ํ–ˆ๊ณ , 

 ์ •๋ ฌ ๊ฒฐ๊ณผ ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

TreeSet<PhoneNumber> phoneNumbers = new TreeSet<>(Comparator.comparingInt(PhoneNumber::hashCode));
Set<PhoneNumber> phoneNumberSet = Collections.synchronizedSet(phoneNumbers); // ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๊ธฐ ์œ„ํ•ด์„œ
phoneNumbers.add(new PhoneNumber(123, 456,780));
phoneNumbers.add(new PhoneNumber(123, 456,7800));
phoneNumbers.add(new PhoneNumber(123, 456,789));

for (PhoneNumber phoneNumber : phoneNumbers)
{
   System.out.println("phoneNumber = " + phoneNumber); // Comparable์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„์„œ Error ๋ฐœ์ƒ !
}

TreeSet์€ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•ด์•ผ ํ•œ๋‹ค๋ฉด Collections.synchronizedSet์„ ํ†ตํ•ด ๋™๊ธฐํ™” ์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค. 

 

 

 

๐Ÿ“š ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ Red-Black Tree 

์ถœ์ฒ˜: https://coding-factory.tistory.com/555

TreeSet์€ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ TreeSet์€ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์ค‘์—์„œ๋„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. 

๋ ˆ๋“œ-๋ธ”๋ž™ ํ‹€๋ฆฌ๋‚˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋Š” ์™ผ์ชฝ ์ž์‹์œผ๋กœ, ํฐ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋…ธ๋“œ๋Š” ์˜ค๋ฅธ์ชฝ ์ž์‹์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€๋‚˜ ์‚ญ์ œ ์‹œ ํŠธ๋ฆฌ๊ฐ€ ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์น˜์ง€ ์•Š๋„๋ก ๊ท ํ˜•์„ ๋งž์ถฐ์ค€๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90