2023. 2. 6. 10:08ใJAVA/Effective JAVA
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
TreeSet์ ์ด์ง ํ์ ํธ๋ฆฌ์ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ TreeSet์ ์ด์ง ํ์ ํธ๋ฆฌ ์ค์์๋ ์ฑ๋ฅ์ ํฅ์์ํจ ๋ ๋-๋ธ๋ ํธ๋ฆฌ๋ก ๊ตฌํ๋์ด ์๋ค.
๋ ๋-๋ธ๋ ํ๋ฆฌ๋ ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง๋ ๋ ธ๋๋ ์ผ์ชฝ ์์์ผ๋ก, ํฐ ๊ฐ์ ๊ฐ์ง๋ ๋ ธ๋๋ ์ค๋ฅธ์ชฝ ์์์ผ๋ก ๋ฐฐ์นํ์ฌ ๋ฐ์ดํฐ์ ์ถ๊ฐ๋ ์ญ์ ์ ํธ๋ฆฌ๊ฐ ํ์ชฝ์ผ๋ก ์น์ฐ์น์ง ์๋๋ก ๊ท ํ์ ๋ง์ถฐ์ค๋ค.