[Java] List ์ ๋ ฌ์ ๋ํ์ฌ.
0.๐ถ๋ค์ด๊ฐ๋ฉฐ
์๋ฐ์์ List๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ฐพ์๋ณด๋ค๊ฐ ์ถ๊ฐ์ ์ธ ๋ช๋ช ๊ฐ๋ ๋ค์ ์ดํด๋ณด๊ฒ ๋์์ต๋๋ค.
List๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ, Comparable๊ณผ Comparator ์ธํฐํ์ด์ค์ ๋ํด ๊ธ์ ์จ๋ณด๊ณ ์๋ฐ List ์ ๋ ฌ ๋ฐฉ์์ธ tim sort์ ๋ํด ์์๋ณผ ์ ์๋๋ก ์ ์ ๋ฆฌ๋ ๋ธ๋ก๊ทธ ๊ธ์ ์๊ฐํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1.๐List๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ
์๋ฐ์ List๋ฅผ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์์์ต๋๋ค.
1) Collections ํด๋์ค์ static ๋ฉ์๋์ธ sort()๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์ฌ์ฉ ๋ฐฉ๋ฒ ๋จผ์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
public class SortingDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello world");
list.add("abcd");
list.add("Kim");
list.add("java");
System.out.println("์ ๋ ฌ ์ ๋ฐฐ์ด : " + list);
Collections.sort(list);
System.out.println("์ ๋ ฌ ํ ๋ฐฐ์ด : " + list);
}
}
# result
์ ๋ ฌ ์ ๋ฐฐ์ด : [hello world, abcd, Kim, java]
์ ๋ ฌ ํ ๋ฐฐ์ด : [Kim, abcd, hello world, java]
์ ์ฝ๋ 10๋ฒ ๋ผ์ธ์ ์ดํด๋ณด์๋ฉด Collections ํด๋์ค์ static ๋ฉ์๋์ธ sort๋ฅผ ์ฌ์ฉํ๊ณ ์ธ์๋ก๋ list๋ฅผ ๋๊ฒจ์ค ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ๋ ์๋ฐ์ String ์ ๋ ฌ ๋ฐฉ์์ธ ๋๋ฌธ์ ์ฐ์ , ์ํ๋ฒณ ์ฐ์ ์์๋ฅผ ๋ฐ๋ผ ์ ์ ๋ ฌ๋์๋ค์!
๊ทธ๋ฐ๋ฐ ์กฐ๊ธ ๋ ์ดํด๋ด ์๋ค. ์๋ ์ฌ์ง์ Collections ํด๋์ค์ sort ๋ฉ์๋ ์ค List ์ธํฐํ์ด์ค๋ฅผ ์ธ์๋ก ๋ฐ๋ ์ฝ๋์ ๋๋ค.
Collections ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ด์ฉํด๋ List ์ธํฐํ์ด์ค์ sort ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค์. ์ฌ์ค์ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ด์ฉํ ๊ฒ์ ๋๋ค. ๊ทธ๋ผ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๋๋ก ํ์ฃ .
2) List ์ธํฐํ์ด์ค์ default ๋ฉ์๋์ธ sort()๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋จผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public class SortingDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello world");
list.add("abcd");
list.add("Kim");
list.add("java");
System.out.println("์ ๋ ฌ ์ ๋ฐฐ์ด : " + list);
list.sort(null);
System.out.println("์ ๋ ฌ ํ ๋ฐฐ์ด : " + list);
}
}
# result
์ ๋ ฌ ์ ๋ฐฐ์ด : [hello world, abcd, Kim, java]
์ ๋ ฌ ํ ๋ฐฐ์ด : [Kim, abcd, hello world, java]
์ฒซ ๋ฒ์งธ ๋ฐฉ์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์๊ณ ์ ๋ ฌ๋ ์๋์์ต๋๋ค. ๋น์ฐํ ์ด์ผ๊ธฐ๊ฒ ์ฃ ? ๊ฐ์ ๋ฉ์๋๋ฅผ ๋ถ๋ ์ผ๋๊น์! ์ด๋ sort๋ฉ์๋์ null์ ์ธ์๋ก ๋๊ฒผ์ต๋๋ค. ์ด ๋ถ๋ถ์ ๋ํด ์กฐ๊ธ ๋ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ ์ฌ์ง์ list ์ธํฐํ์ด์ค์ default ๋ฉ์๋ sort ๋ด๋ถ ์ฝ๋์ ๋๋ค. ์ธ์๋ก Comparator ๊ฐ์ฒด๋ฅผ ์๊ตฌํ๊ณ ์๋ค์! ์ ์ฝ๋์์๋ ํด๋น ๋งค๊ฐ ๋ณ์ ์๋ฆฌ์ null์ ์ธ์๋ก ๋๊ฒจ์ค ๊ฒ์ด๊ณ ์. ๋ํ ์ฝ๋๋ฅผ ํ ์ค์ฉ ์ดํด๋ณด๋ฉด Object ๋ฐฐ์ด๋ก ๋ณํํ ๋ค Arrays.sort ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ํธ์ถํ Arrays.sort ๋ฉ์๋๊ฐ ๋ฌด์์ธ์ง ์๊ธฐ ์ํด ํ๊ณ ๋ค์ด๊ฐ ๋ด ์๋ค!
์ ์ฌ์ง์ Arrays ํด๋์ค์ sort ๋ฉ์๋์ ๋๋ค. ์กฐ๊ฑด๋ฌธ์ ๋ณด์๋ฉด ์ ๋ ฌ์๋ LegacyMergeSort๋ TimSort๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์๋๋ฐ์. LegacyMergeSort์ ๊ฒฝ์ฐ API๋ฅผ ์ดํด๋ณด๋ฉด ์ถํ ์ ๊ฑฐ๋ ์์ ์ด๋ผ๊ณ ํฉ๋๋ค. ์ฆ, ๊ผญ LegacyMergeSort ๋ฐฉ์์ผ๋ก ํด์ฃผ์ธ์๋ผ๊ณ ์ฌ์ฉ์๊ฐ ์๊ตฌํ์ง ์๋๋ค๋ฉด TimSort ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. TimSort ๋ฐฉ์์ ๋ํด์๋ ์ ์ ๋ฆฌ๋ ๊ธ์ ๋ท ๋ถ๋ถ์ ์๊ฐํ๊ฒ ์ต๋๋ค.
2.๐ฌComparable๊ณผ Comparator ์ธํฐํ์ด์ค
์์์ Comparator์ ๋ํ ๋ด์ฉ์ด ๋์์ต๋๋ค. sort ๋ฉ์๋์ ๋น๊ต ๋ฐฉ์์ ์ ๊ณตํด์ฃผ๋ ๊ฐ์ฒด์ธ๋ฐ ๋น์ทํ ๋ด์ฉ์ผ๋ก Comparable์ด ์์ต๋๋ค. ๋ ๊ฐ์ง ๊ฐ๋ ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์์ ์ดํด๋ดค๋ ์ ๋ ฌ ์ฝ๋์์๋ String์ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํด๋ณด์์ต๋๋ค. ์ด์ ๋ค์ ๋ ๊ฐ์ง์ ๋ํ ์ง๋ฌธ์ด ์๊ธธ ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
- String์ ๊ธฐ๋ณธ ์ ๋ ฌ ๊ธฐ์ค์ ์ด๋ค ์ฝ๋๊ฐ ๊ฒฐ์ ํ๋ ๊ฒ์ผ๊น?
- String์ ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์๋ ์์๊น?
์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ ๋ตํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก Comparable ์ธํฐํ์ด์ค์ด๊ณ ๋ ๋ฒ์งธ ์ง๋ฌธ์ ๋ตํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก Comparator ์ธํฐํ์ด์ค์ ๋๋ค.
# Comparable
์ ์ฌ์ง์ String ํด๋์ค๊ฐ ๊ตฌํํ ์ธํฐํ์ด์ค๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ Comparable ์ธํฐํ์ด์ค๊ฐ ์๋ค์!
๋ ํ ๋ฒ Comparable ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ผ ๋ค์ด๊ฐ ๋ด ์๋ค.
public interface Comparable<T> {
/*
๋ง์ ๋ด์ฉ์ ์ฃผ์...
*/
public int compareTo(T o);
}
์ ์ฝ๋๋ Comparable ์ธํฐํ์ด์ค์ ์ฝ๋์ ๋๋ค. compareTo๋ผ๋ ๋ฉ์๋๋ง์ ๊ตฌํํ๋ฉด Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด์ฃ .
์ ์ฌ์ง์ String ํด๋์ค์ compareTo ๋ฉ์๋ ๊ตฌํ ๋ถ๋ถ์ ๋๋ค. ์ ๋ ฌ์ ์ํด์๋ ๋น๊ต ๋์๊ณผ์ ๋์ ๊ด๊ณ ๊ธฐ์ค์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ค์ด ์์ด์ผ "์ ๋ ฌ"์ด๋ผ๋ ํ์๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ์ด๋ฌํ ๊ธฐ์ค์ compareTo ๋ฉ์๋์์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ ๋๋ค. "์์ "๊ณผ "๋น๊ต ๋์ ๊ฐ์ฒด"๋ฅผ ์ ์ ํ ๊ธฐ์ค์ผ๋ก ๋น๊ตํ ๋ค ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ์์, 0, ์์๋ก ๋ฆฌํดํด์ฃผ๋ ๋ฐฉ์์ ๋๋ค.
์ค์ ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋ฉ์๋์ ๋ด๋ถ๋ฅผ ์ดํด๋ณด๋ฉด ๊ฐ์ฒด๋ผ๋ฆฌ์ ๋์ ๊ด๊ณ๋ฅผ ํ์ ํ๊ธฐ ์ํด ํด๋น ๊ฐ์ฒด์ ๊ตฌํ๋์ด ์๋ compareTo ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
# Comparator
์ด์ ๋น์ทํ ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํ๋ Comparator๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. Comparable์ ๋ํด ์์๊ณ ์ด๋ฅผ ํตํด ์ ๋ ฌ์ ์ํํ ์ ์๋ค๋ฉด Comparator๋ ์ ํ์ํ ๊ฒ์ผ๊น์?
Comparator๋ ์์์ ์ดํด๋ณด์๋ ๋ ๊ฐ์ง ์ง๋ฌธ ์ค ๋ ๋ฒ์งธ, "๋ค๋ฅธ ๊ธฐ์ค"์ผ๋ก ์ ๋ ฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด์ผ ํ๋์ง์ ๋ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ฐ์ Comparator ์ธํฐํ์ด์ค๋ฅผ ์ดํด๋ณด๋๋ก ํฉ์๋ค.
public interface Comparator<T> {
int compare(T o1, T o2);
/*
์ฝ๋์ ์ฃผ์๋ค,,
*/
}
Comparator๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ compare ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ด ์ญ์ Comparable๊ณผ ๋ฉ์ปค๋์ฆ๊ณผ ๋์ผํ๋, ์ธ์๋ก ๊ฐ์ฒด ๋ ๊ฐ๋ฅผ ๋ฐ๋ ๊ฒ์ด ์ฐจ์ด์ ์ ๋๋ค.
๋ ๊ฐ์ฒด๋ฅผ ์ ์ ํ ๊ธฐ์ค์ ๊ฐ์ง๊ณ ๋น๊ตํ๋๋ก ๊ตฌํํ๋ฉด ๋๊ณ ๋ฆฌํด ๊ฐ ์ญ์ ๋น๊ต ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์์, 0, ์์๋ก ๋ด์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ด์ ๋ค์ ์ฒ์ ์ดํด๋ณด์๋ ์ ๋ ฌ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public class SortingDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello world");
list.add("abcd");
list.add("Kim");
list.add("java");
System.out.println("์ ๋ ฌ ์ ๋ฐฐ์ด : " + list);
list.sort(null);
System.out.println("์ ๋ ฌ ํ ๋ฐฐ์ด : " + list);
}
}
# result
์ ๋ ฌ ์ ๋ฐฐ์ด : [hello world, abcd, Kim, java]
์ ๋ ฌ ํ ๋ฐฐ์ด : [Kim, abcd, hello world, java]
์์ ๊ฐ์ ์ฝ๋์๋๋ฐ์. ๋ผ์ธ 10๋ฒ์ ๋ณด๋ฉด null์ด๋ผ๊ณ ๋ฃ์ด์ค ์ธ์ ์๋ฆฌ๊ฐ ๋ฐ๋ก Comparator์ ์๋ฆฌ์ ๋๋ค. null์ ๋ฃ์๋ค๋ ๋ป์ ๊ณง, String์ด ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ณธ ์ ๋ ฌ ๋ฐฉ์ ์ฆ, compareTo๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฌํ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฌธ์์ ๊ธธ์ด๋ฅผ ์ ๋ ฌ ๊ธฐ์ค์ผ๋ก ์ผ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public class SortingDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello world");
list.add("abcd");
list.add("Kim");
list.add("java");
System.out.println("์ ๋ ฌ ์ ๋ฐฐ์ด : " + list);
list.sort(new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
System.out.println("์ ๋ ฌ ํ ๋ฐฐ์ด : " + list);
}
}
# result
์ ๋ ฌ ์ ๋ฐฐ์ด : [hello world, abcd, Kim, java]
์ ๋ ฌ ํ ๋ฐฐ์ด : [Kim, abcd, java, hello world]
์ด์ ๊ณผ ๋ค๋ฅธ ์ ์ ํ์ธํ์ จ๋์? list.sort ๋ฉ์๋ ์ธ์์ Comparator๋ฅผ ๊ตฌํํ ์ต๋ช ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ์์ต๋๋ค. compare ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ฉด์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋๋ก return ๊ฐ์ ์ค์ ํด์ค ๊ฒ์ด์ฃ . ์ด๋ฌํ ๋ฐฉ์์ ํตํด sort์ ๊ธฐ์ค์ ์ปค์คํ ํ์ฌ ์ ๋ ฌํ ์ ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
์๋ ์ฌ์ง์ sort ํจ์์ Comparator ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฃ์ด์ฃผ์์ ๋ ๋ถ๋ฅด๋ ๋ฉ์๋ ์ค ํ๋๋ฅผ ์บก์ณํ ์ฌ์ง์ ๋๋ค.
์ค๊ฐ if๋ฌธ์ ๋ณด์๋ฉด c.compare ๋ฉ์๋๋ฅผ ๋ถ๋ฅด๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ์. c๋ ์ฐ๋ฆฌ๊ฐ ์ธ์๋ก ๋ฃ์ด์ค Comparator ๊ฐ์ฒด์ด๊ณ ์ฐ๋ฆฌ๊ฐ ์ปค์คํ ํด์ค compare ํจ์๋ฅผ ํตํด ์ ๋ ฌ์ ์ํํ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์ ๋ ฌ ๊ธฐ์ค์ ์ ๊ณตํด์ฃผ๋ Comparable ์ธํฐํ์ด์ค์ Comparator ์ธํฐํ์ด์ค๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ๋ ์ธํฐํ์ด์ค๊ฐ ๋น์ทํ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ์ด ํท๊ฐ๋ฆด ์ ์์ง๋ง ์์ ์ดํด๋ณด์๋ ๋ ๊ฐ์ง ์ง๋ฌธ์ ์ ์๊ฐํด๋ณด์๋ฉด ๋ ์ธํฐํ์ด์ค์ ์ฉ๋ ์ฐจ์ด๋ฅผ ํ์ ํ์ค ์ ์์ผ์ค ๊ฒ ๊ฐ์ต๋๋ค.
- String์ ๊ธฐ๋ณธ ์ ๋ ฌ ๊ธฐ์ค์ ์ด๋ค ์ฝ๋๊ฐ ๊ฒฐ์ ํ๋ ๊ฒ์ผ๊น?
- String์ ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์๋ ์์๊น?
3.๐Tim sort
Tim sort ๋ฐฉ์์ ์๋ฐ์์ List๋ฅผ ์ ๋ ฌํ ๋ ์ฌ์ฉํ๋ sort ๋ฐฉ์์ ๋๋ค. ํด๋น ๋ด์ฉ์ ์ ๊ฐ ์ ๋ฆฌํ๊ธฐ๋ณด๋ค๋ ์ ์ ๋ฆฌํด์ฃผ์ ๋ธ๋ก๊ทธ ๊ธ์ ์ฐพ์ ์ด๋ฅผ ์๊ฐํ๋ ค ํฉ๋๋ค. ๊ถ๊ธํ์๋ค๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ดํด๋ด์ฃผ์ธ์!
4. ๐จ๋๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์ ์๋ฐ List ์ ๋ ฌ์ ๋ํด ์์๋ณด๋ค๊ฐ ๋ฑ ๋ฑ ๋์์ ์ด๊ฒ์ ๊ฒ ์๊ฒ ๋์ด ์์ฑํ๊ฒ ๋์์ต๋๋ค. sort ๋ฉ์๋์ ์ฌ์ฉ๋ฒ๋ง ์๊ณ ๋์ด๊ฐ๋ค๋ฉด ์ ํ์ง ๋ชปํ์ ๋ด์ฉ๋ค์ด์๋ ๊ฒ ๊ฐ์ ํ ๋ฒ ๋ ์ฐพ์๋ณด๋ ์ต๊ด์ ๊ฐ์ง์ ๋ผ๋ ๋ง์๊ฐ์ง์ ๋ค์ ๋์๊ธธ ์ ์๋ ๊ณ๊ธฐ๊ฐ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.