์ปฌ๋ ์ (Collection) ์ด๋ ์ฌ์ ์ ์๋ฏธ๋ก ์์๋ฅผ ์์งํด์ ์ ์ฅํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๋ณด๋ฉด ๋ค์๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํด ๋๊ณ ํ์ํ ๋ ๋ง๋ค ๊บผ๋ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋ง์ฝ 10๊ฐ์ Product ๊ฐ์ฒด๋ฅผ ์ ์ฅํด ๋๊ณ , ํ์ํ ๋ ํ๋์ฉ ๊บผ๋ด์ ์ด์ฉํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก Product ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ, ๊ฒ์, ์ญ์ ํ ์ง ๊ณ ๋ฏผํด์ผํ๋๋ฐ, ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด์ ์ด์ฉํ๋ ๊ฒ์ด์ฃ .
// ๊ธธ์ด 10์ธ ๋ฐฐ์ด ์์ฑ
Product[] productArray = new Product[10];
// ๊ฐ์ฒด ์ถ๊ฐ
productArray[0] = new Product("์ํ0");
productArray[1] = new Product("์ํ1");
productArray[2] = new Product("์ํ2");
// ๊ฐ์ฒด ๊ฒ์
Product model0 = productArray[0];
Product model1 = productArray[1];
Product model2 = productArray[2];
// ๊ฐ์ฒด ์ญ์
productArray[0] = null;
productArray[1] = null;
productArray[2] = null;
๋ฐฐ์ด์ ์ฝ๊ฒ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์์ง๋ง, ์ ์ฅํ ์ ์๋ ๊ฐ์ฒด ์๊ฐ ๋ฐฐ์ด์ ์์ฑํ ๋ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๋ถํน์ ๋ค์์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฌผ๋ก ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์ฒ์์ ํฌ๊ฒ ์์ฑํ๋ฉด ๋์ง๋ง, ์ด๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ต๋๋ค. ๋ฐฐ์ด์ ๋ ๋ค๋ฅธ ๋ฌธ์ ์ ์ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ์ ๋ ํด๋น ์ธ๋ฑ์ค๊ฐ ๋น๊ฒ ๋์ด ๋ฑ์์ด ๋ฌ์ฑ๋ฌ์ฑ ๋น ์ง ์ฅ์์๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ค๋ฉด ์ด๋๊ฐ ๋น์ด์๋์ง ํ์ธํ๋ ์ฝ๋๋ ํ์ํ๊ฒ ์ฃ .

์๋ฐ๋ ๋ฐฐ์ด์ ์ด๋ฐ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ณ , ๋๋ฆฌ ์๋ ค์ ธ ์๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ์ฒด๋ค์ ํจ์จ์ ์ผ๋ก ์ถ๊ฐ,์ญ์ ,๊ฒ์ํ ์ ์๋๋ก java.util ํจํค์ง์ ์ปฌ๋ ์
๊ณผ ๊ด๋ จ๋ ์ธํฐํ์ด์ค์ ํด๋์ค๋ค์ ํฌํจ์์ผ ๋์์ต๋๋ค. ์ด๋ค์ ์ด์นญํด์ ์ปฌ๋ ์
์ด๋ผ ๋ถ๋ฆ
๋๋ค.
์๋ฐ์์๋ ๋ช๊ฐ์ง ์ปฌ๋ ์
์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ค์ํ ํํ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํด์ฃผ๋๋ฐ, ์ฃผ์ ์ธํฐํ์ด์ค๋ก List, Set, Map์ด ์์ต๋๋ค. ๋ค์์ ์ด ์ธํฐํ์ด์ค๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ปฌ๋ ์
ํด๋์ค๋ฅผ ๋ณด์ฌ์ค๋๋ค.

List์ Set์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ, ์ญ์ , ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ง์ ๊ณตํต์ ์ด ์๋๋ฐ ์ด ์ธํฐํ์ด์ค๋ค์ ๊ณตํต๋ ๋ฉ์๋๋ง ๋ชจ์ Collection ์ธํฐํ์ด์ค๋ก ์ ์ํด ๋๊ณ ์์ต๋๋ค.
Map์ ํค(Key)์ ๊ฐ(Value)์ ํ๋์ ์์ผ๋ก ๋ฌถ์ด์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๋์ด์๋๋ฐ, ์์ ์ธ๊ธํ๋ List๋ Set๊ณผ๋ ์๋ฃ๊ตฌ์กฐ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์ ํ ๋ค๋ฆ
๋๋ค.

๋ค์ ์ฑํฐ์์ List, Set, Map ๊ฐ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์ ๋ํ์ฌ ๋์ฑ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
List ์ปฌ๋ ์
์ ๊ฐ์ฒด๋ฅผ ์ผ๋ ฌ๋ก ๋์ด๋์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์์ ์ธ๊ธํ๋ ๋ฐฐ์ด๋ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ง๋ง, ๋ฐฐ์ด์ ์ ์ธ ์์ ์ ์ ์ฅํ ์ ์๋ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ช
ํํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ ์ธํ๊ธฐ๊ฐ ์ด๋ ค์ด ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฐ ๋จ์ ์ ๋ณด์ํ, ์๋ฃํ์ ๊ฐ์๊ฐ ๊ณ์ ๋ณํ๋ ์ํฉ์์ ์ ๋ฆฌํ ์๋ฃ๊ตฌ์กฐ ํํ๊ฐ ๋ฐ๋ก List์
๋๋ค.
List ์ปฌ๋ ์
์ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ ์ฅํ๋๊ฒ ์๋๋ผ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฐ์ฒด์ ๋ฒ์ง๋ฅผ ์ฐธ์กฐํฉ๋๋ค. null๋ ์ ์ฅ์ด ๊ฐ๋ฅํ๋ฐ, ์ด ๊ฒฝ์ฐ ํด๋น ์ธ๋ฑ์ค๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ง ์์ต๋๋ค.

๋ค์์ List ์ปฌ๋ ์
์ ์ ์ฅ๋๋ ๊ตฌ์ฒด์ ์ธ ํ์
์ String์ผ๋ก ์ ํด๋๊ณ ์ถ๊ฐ, ์ฐพ๊ธฐ, ๊ทธ๋ฆฌ๊ณ ์ญ์ ํ๋ ๊ฒ์ ์ฝ๋๋ก ๋ณด์ฌ์ค๋๋ค.
List<String> list = ...;
list.add("ํ๊ธธ๋");
list.add(1, "์ผ๊ธธ๋");
String str = list.get(1);
list.remove(0);
list.remove("์ผ๊ธธ๋");
๋ง์ฝ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ํ๋์ฉ ๋ฐ๋ณตํด์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์ป๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด for๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
List<String> list = ...;
for (int i = 0; i < list.size; i++) {
String str = list.get(i); // i ์ธ๋ฑ์ค์ ์ ์ฅ๋ String ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ด
}
์ธ๋ฑ์ค ๋ฒํธ๊ฐ ํ์ ์๋ค๋ฉด ํฅ์๋ for๋ฌธ์ ์ด์ฉํ๋ ๊ฒ์ด ๋์ฑ ํธ๋ฆฌํฉ๋๋ค.
for (String str : list) { // ์ ์ฅ๋ list ์ด ๊ฐฏ์๋งํผ ๋ฃจํ
}
์๋ ํ๋ List ์ปฌ๋ ์ ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ List ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ค์ ๋๋ค. ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ๋งค๊ฐ๊ฐ์ผ๋ก ๊ฐ๋ ๋ฉ์๋๊ฐ ๋ง์ต๋๋ค.
| ๊ธฐ๋ฅ | ๋ฉ์๋ | ์ค๋ช |
|---|---|---|
| ๊ฐ์ฒด ์ถ๊ฐ | boolean add(E e) | ์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ๋งจ ๋์ ์ถ๊ฐ |
| void add(int index, E element) | ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ | |
| set(int index, E element) | ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์ฃผ์ด์ง ๊ฐ์ฒด๋ก ๋ฐ๊ฟ | |
| ๊ฐ์ฒด ๊ฒ์ | boolean contains(Object o) | ์ฃผ์ด์ง ๊ฐ์ฒด๊ฐ ์ ์ฅ๋์ด์๋์ง ์ฌ๋ถ |
| E get(int index) | ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ๋ฆฌํด | |
| isEmpty() | ์ปฌ๋ ์ ์ด ๋น์ด์๋์ง ์ฌ๋ถ | |
| int size() | ์ ์ฅ๋์ด ์๋ ์ ์ฒด ๊ฐ์ฒด ์ ๋ฆฌํด | |
| ๊ฐ์ฒด ์ญ์ | void clear() | ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ |
| E remove(int index) | ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ | |
| boolean remove(Object o) | ์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ์ญ์ |
ArrayList๋ List ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ก, ArrayList์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ฒ๋๋ฉด ๊ฐ์ฒด๊ฐ ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌ๋ฉ๋๋ค. ์ผ๋ฐ ๋ฐฐ์ด๊ณผ ArrayList๋ ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ค๋ ์ ์์๋ ๊ฐ์ง๋ง, ํฐ ์ฐจ์ด์ ์ ๊ฐ๊ณ ์์ต๋๋ค.
๋ฐฐ์ด์ ์์ฑํ ๋ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋๊ณ ์ฌ์ฉ ์ค์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ง๋ง, ArrayList๋ ์ ์ฅ ์ฉ๋(capacity)์ ์ด๊ณผํ ๊ฐ์ฒด๋ค์ด ๋ค์ด์ค๋ฉด ์๋์ ์ผ๋ก ์ ์ฅ ์ฉ๋(capacity)์ด ๋์ด๋ฉ๋๋ค.
ArrayList์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.

๊ธฐ๋ณธ ์์ฑ์๋ก ArrayList๋ฅผ ์์ฑํ๋ฉด ๋ด๋ถ์ 10๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์๋ ์ด๊ธฐ ์ฉ๋์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ์ ์ฅ๋๋ ๊ฐ์ฒด ์๊ฐ ๋์ด๋๋ฉด ์ฉ๋์ด ์๋์ผ๋ก ์ฆ๊ฐํ์ง๋ง, ์ฒ์๋ถํฐ ์ฉ๋์ ํฌ๊ฒ ์ก๊ณ ์ถ๋ค๋ฉด ํฌ๊ธฐ๋ฅผ ๋งค๊ฐ๊ฐ์ผ๋ก ๋ฃ๋ ์์ฑ์๋ฅผ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค.
List<String> list = new ArrayList<String>(30); //String๊ฐ์ฒด 30๊ฐ๋ฅผ ์ ์ฅํ ์ ์๋ ์ฉ๋
ArrayList์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ฉด ์ธ๋ฑ์ค 0๋ถํฐ ์ฐจ๋ก๋๋ก ์ ์ฅ๋ฉ๋๋ค. ๋ง์ฝ ArrayList์์ ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฐ๋ก ๋ค ์ธ๋ฑ์ค๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ๋ชจ๋ ์์ผ๋ก 1์ฉ ๋น๊ฒจ์ง๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์ฝ์
ํ๋ฉด ํด๋น ์ธ๋ฑ์ค๋ถํฐ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ๋ชจ๋ 1์ฉ ๋ฐ๋ ค๋ฉ๋๋ค.
๋ค์ ๊ทธ๋ฆผ์ 4๋ฒ ์ธ๋ฑ์ค๊ฐ ์ ๊ฑฐ๋์์ ๋ 5๋ฒ ์ธ๋ฑ์ค๋ถํฐ ๋ชจ๋ ์์ผ๋ก 1์ฉ ๋น๊ฒจ์ง๋ ๋ชจ์ต์ ๋ณด์ฌ์ค๋๋ค.

๋ฐ๋ผ์ ๋น๋ฒํ ๊ฐ์ฒด ์ญ์ ์ ์ฝ์
์ด ์ผ์ด๋๋ ๊ณณ์์๋ ArrayList๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ์ง ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ๋ผ๋ฉด, LinkedList๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธ๋ฑ์ค ๊ฒ์, ๋งจ๋ง์ง๋ง์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ArrayList๊ฐ ๋ ์ข์ ์ฑ๋ฅ์ ๋ฐํํฉ๋๋ค.
๋ค์ ์์ ๋ ArrayList์ String ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ, ๊ฒ์, ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
// String ๊ฐ์ฒด๋ฅผ ์ ์ฅ
list.add("Java");
list.add("Spring");
list.add("Servlet/JSP");
list.add("DBMS");
list.add("JPA");
int size = list.size();
System.out.println("์ด ๊ฐ์ฒด ์: " + size);
System.out.println();
String skill = list.get(2);
System.out.println("Skill 2: " + skill);
System.out.println();
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ": " + str);
}
System.out.println();
list.remove(2); // 2๋ฒ ์ธ๋ฑ์ค(Servlet/JSP) ์ญ์
list.remove(2); // 2๋ฒ ์ธ๋ฑ์ค(DBMS) ์ญ์
list.remove("Java");
for (int i = 0; i < list.size(); i++) { // ์ ์ฅ๋ ์ด ๊ฐ์ฒด ์๋งํผ ๋ฃจํ
String str = list.get(i);
System.out.println(i + ": " + str);
}
}
}
<์คํ๊ฒฐ๊ณผ>
์ด ๊ฐ์ฒด ์: 5
Skill 2: Servlet/JSP
0: Java
1: Spring
2: Servlet/JSP
3: DBMS
4: JPA
0: Spring
1: JPA
LinkedList๋ List ๊ตฌํ ํด๋์ค์ด๋ฏ๋ก ArrayList์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๋ง ๋ด๋ถ ๊ตฌ์กฐ๋ ์์ ๋ค๋ฆ
๋๋ค.
ArrayList๋ ๋ด๋ถ ๋ฐฐ์ด์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํด์ ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌํ์ง๋ง, LinkedList๋ ์ธ์ ์ฐธ์กฐ๋ฅผ ๋งํฌํด์ ์ฒด์ธ์ฒ๋ผ ๊ด๋ฆฌํฉ๋๋ค.

LinkedList์์ ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ฉด ์๋ค ๋งํฌ๋ง ๋ณ๊ฒฝ๋๊ณ ๋๋จธ์ง ๋งํฌ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์ฝ์
ํ ๋๋ ๋ง์ฐฌ๊ฐ์ง์ฃ . ArrayList๋ ์ค๊ฐ ์ธ๋ฑ์ค์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ค์ ๊ฐ์ฒด๋ ์ธ๋ฑ์ค๊ฐ 1์ฉ ์์ผ๋ก ๋น๊ฒจ์ง๊ธฐ ๋๋ฌธ์ ๋น๋ฒํ ๊ฐ์ฒด ์ญ์ ์ ์ฝ์
์ ๋ถ๋ฆฌํฉ๋๋ค.
๋ค์์ ์ค๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ ๊ฒฝ์ฐ ์๋ค ๋งํฌ์ ์์ ์ด ์ผ์ด๋๋ ๋ชจ์ต์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.

LinkedList๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์ ์ฅํ ๊ฐ์ฒด ํ์
์ ํ์
ํ๋ผ๋ฏธํฐ(E)์ ํ๊ธฐํ๊ณ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค. LinkedList๊ฐ ์ฒ์ ์์ฑ๋ ๋์๋ ์ด๋ ํ ๋งํฌ๋ ๋ง๋ค์ด์ง์ง ์์๊ธฐ ๋๋ฌธ์ ๋ด๋ถ๋ ๋น์ด์๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
List<E> list = new LinkedList<E>();
๋ค์ ์์ ๋ ArrayList์ LinkedList์ 10,000๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฝ์
ํ๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ ์ธก์ ํ ์์ ์
๋๋ค.
0๋ฒ ์ธ๋ฑ์ค์ String ๊ฐ์ฒด๋ฅผ 10,000๋ฒ ์ถ๊ฐํ๊ธฐ ์ํด List ์ธํฐํ์ด์ค์ add(int index, E element)๋ฉ์๋๋ฅผ ์ด์ฉํ์ต๋๋ค.
public class LinkedListExample {
public static void main(String[] args) {
List<String> arrayList = new ArrayList<>();
List<String> linkedList = new LinkedList<>();
long startTime;
long endTime;
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
arrayList.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("ArrayList ๊ฑธ๋ฆฐ์๊ฐ: " + (endTime - startTime) + "ns");
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
linkedList.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("LinkedList ๊ฑธ๋ฆฐ์๊ฐ: " + (endTime - startTime) + "ns");
}
}
์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด LinkedList๊ฐ ArrayList๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
ArrayList ๊ฑธ๋ฆฐ์๊ฐ: 56252133ns
LinkedList ๊ฑธ๋ฆฐ์๊ฐ: 3332620ns
์คํ ๊ฒฐ๊ณผ์์๋ ์ ์ ์๋ฏ์ด, ์ค๊ฐ์ ์ถ๊ฐ ๋๋ ์ญ์ ํ ๊ฒฝ์ฐ๋ ์๋ค ๋งํฌ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ LinkedList๊ฐ ๋ ๋น ๋ฆ ๋๋ค. ArrayList๋ ๋ค์ชฝ ์ธ๋ฑ์ค๋ค์ ๋ชจ๋ 1์ฉ ์ฆ๊ฐ ๋๋ ๊ฐ์ ์ํค๋ ์๊ฐ์ด ํ์ํ๋ฏ๋ก ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ฆฝ๋๋ค.
List ์ปฌ๋ ์ ๊ณผ Set ์ปฌ๋ ์ ์ ํฐ ์ฐจ์ด์ ์ด ์์ต๋๋ค. List ์ปฌ๋ ์ ์ ์ ์ฅ ์์๋ฅผ ์ ์งํ์ง๋ง, Set ์ปฌ๋ ์ ์ ์ ์ฅ ์์๊ฐ ์ ์ง๋์ง ์์ต๋๋ค. ๋ํ ๊ฐ์ฒด๋ฅผ ์ค๋ณตํด์ ์ ์ฅํ ์ ์๋ค๋ ํฐ ํน์ง์ด ์์ต๋๋ค.
Set ์ปฌ๋ ์ ์๋ HashSet, LinkedHashSet, TreeSet ๋ฑ์ด ์๋๋ฐ, ๋ค์์ Set ์ปฌ๋ ์ ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ Set ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ค์ ๋๋ค.
| ๊ธฐ๋ฅ | ๋ฉ์๋ | ์ค๋ช |
|---|---|---|
| ๊ฐ์ฒด ์ถ๊ฐ | boolean add(E e) | ์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ์ ์ฅ, ๊ฐ์ฒด๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฅ๋๋ฉด true๋ฅผ ๋ฆฌํดํ๊ณ ์ค๋ณต ๊ฐ์ฒด๋ฉด false๋ฅผ ๋ฆฌํด |
| ๊ฐ์ฒด ๊ฒ์ | boolean contains(Object o) | ์ฃผ์ด์ง ๊ฐ์ฒด๊ฐ ์ ์ฅ๋์ด ์๋์ง ์ฌ๋ถ |
| isEmpty() | ์ปฌ๋ ์ ์ด ๋น์ด ์๋์ง ์กฐ์ฌ | |
| Iterator iterator() | ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ์ฉ ๊ฐ์ ธ์ค๋ ๋ฐ๋ณต์ ๋ฆฌํด | |
| int size() | ์ ์ฅ๋์ด ์๋ ์ ์ฒด ๊ฐ์ฒด ์ ๋ฆฌํด | |
| ๊ฐ์ฒด ์ญ์ | void clear() | ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ญ์ |
| boolean remove(Object o) | ์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ์ญ์ |
Set<String> set = ..;
set.add("์นด๋ฆฌ๋");
set.add("์ํฐ");
set.remove("์นด๋ฆฌ๋");
Set ์ปฌ๋ ์ ์ ์ ์ฅ ์์๊ฐ ์ ์ง๋์ง ์๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ธ๋ฑ์ค๋ก ๊ฐ์ฒด๋ฅผ ๊ฒ์ํด์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๊ฐ ์์ฃ . ๋์ , ์ ์ฒด ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ํ๋ฒ์ฉ ๋ฐ๋ณตํด์ ๊ฐ์ ธ์ค๋ ๋ฐ๋ณต์(iterator)๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ณต์๋ Iterator ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ๋งํ๋๋ฐ, iterator() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ป์ ์ ์์ต๋๋ค.
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
๋ค์์ Iterator ์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ฉ์๋๋ค์ ๋๋ค.
| ๋ฆฌํด ํ์ | ๋ฉ์๋๋ช | ์ค๋ช |
|---|---|---|
| boolean | hasNext() | ๊ฐ์ ธ์ฌ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด true๋ฅผ ๋ฆฌํดํ๊ณ ์์ผ๋ฉด false๋ฅผ ๋ฆฌํดํฉ๋๋ค |
| E | next() | ์ปฌ๋ ์ ์์ ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค |
| void | remove() | Set ์ปฌ๋ ์ ์์ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค |
Iterator์์ ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ next() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. next() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋จผ์ ๊ฐ์ ธ์ฌ ๊ฐ์ฒด๊ฐ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข๊ฒ ์ฃ ? ์ด๋ hasNext() ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. hasNext() ๋ฉ์๋๋ ๊ฐ์ ธ์ฌ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด true๋ฅผ ๋ฆฌํดํ๊ณ , ์์ผ๋ฉด false๋ฅผ ๋ฆฌํดํด์ค๋๋ค. ๋ฐ๋ผ์ true๊ฐ ๋ฆฌํด๋ ๋ next() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ค์์ Set ์ปฌ๋ ์ ์์ String ๊ฐ์ฒด๋ค์ ๋ฐ๋ณตํด์ ํ๋์ฉ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) { // ์ ์ฅ๋ ๊ฐ์ฒด ์๋งํผ ๋ฃจํ
String str = iterator.next(); // String ๊ฐ์ฒด ํ๋๋ฅผ ๊ฐ์ ธ์ด
}
Iterator๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ ํฅ์๋ for๋ฌธ์ ์ด์ฉํด์ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๋ฐ๋ณตํ ์ ์์ต๋๋ค.
Set<String> set = ...;
for (String str : set) { //์ ์ฅ๋ ๊ฐ์ฒด ์๋งํผ ๋ฃจํ
}
๊ทธ๋ฆฌ๊ณ Set ์ปฌ๋ ์ ์์ Iterator์ next() ๋ฉ์๋๋ก ๊ฐ์ ธ์จ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ ์ถ๋ค๋ฉด remove() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. Iterator์ ๋ฉ์๋์ด์ง๋ง, ์ค์ Set ์ปฌ๋ ์ ์์ ๊ฐ์ฒด๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ๋ณผ๊ฒ์.
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) { // ์ ์ฅ๋ ๊ฐ์ฒด ์๋งํผ ๋ฃจํ
iterator.remove(); // ๊ฐ์ฒด ์ ๊ฑฐ
}
HashSet์ Set ์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค์
๋๋ค. HashSet์ ์์ฑํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
Set<E> set = new HashSet<E>();
์์ ๋ดค๋ ArrayList, LinkedList์ ๋ง์ฐฌ๊ฐ์ง๋ก, ํ์ ํ๋ผ๋ฏธํฐ E์๋ ์ปฌ๋ ์ ์ ์ ์ฅํ ๊ฐ์ฒด ํ์ ์ ์ง์ ํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด String ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ HashSet์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
Set<String> set = new HashSet<String>();
HashSet์ ๊ฐ์ฒด๋ค์ ์์ ์์ด ์ ์ฅํ๊ณ ๋์ผํ ๊ฐ์ฒด๋ ์ค๋ณต ์ ์ฅํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋งํ๋ โ๋์ผํ ๊ฐ์ฒดโ๋ ์๋ฐ์์ ์ด๋ป๊ฒ ๋์ผํ์ง ํ๋จํ ๊น์? HashSet์ด ํ๋จํ๋ ๋์ผํ ๊ฐ์ฒด๋ ๊ผญ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ปํ์ง ์์ต๋๋ค. HashSet์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ ๋จผ์ ๊ฐ์ฒด์ hashCode() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ํด์์ฝ๋๋ฅผ ์ป์ด๋
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ ์ ์ฅ๋์ด์๋ ๊ฐ์ฒด๋ค์ ํด์์ฝ๋์ ๋น๊ตํ์ง์. ๋ง์ฝ ๋์ผํ ํด์์ฝ๋๊ฐ ์๋ค๋ฉด ๋ค์ equals() ๋ฉ์๋๋ก ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํด์ true๊ฐ ๋์ค๋ฉด ๋์ผํ ๊ฐ์ฒด๋ก ํ๋จํ๊ณ ์ค๋ณต ์ ์ฅํ์ง ์์ต๋๋ค. ๊ทธ๋ฆผ์ผ๋ก ๋ณด๊ฒ ์ต๋๋ค.

๋ค์ ์์ ๋ก HashSet์ String ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ, ๊ฒ์, ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ํ์ตํด๋ณด๊ฒ ์ต๋๋ค.
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Spring");
set.add("Servlet/JSP");
set.add("Java");
set.add("DBMS");
System.out.println("์ด ๊ฐ์ฒด์: " + set.size()); // ์ ์ฅ๋ ๊ฐ์ฒด์ ์ถ๋ ฅ
Iterator<String> iterator = set.iterator(); // ๋ฐ๋ณต์ ์ป๊ธฐ
while (iterator.hasNext()) { // ๊ฐ์ฒด ์ ๋งํผ ๋ฃจํ
String element = iterator.next(); // ํ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค
System.out.println("\t" + element);
}
set.remove("DBMS"); // ํ ๊ฐ์ ๊ฐ์ฒด ์ญ์
set.remove("Java"); // ํ ๊ฐ์ ๊ฐ์ฒด ์ญ์
System.out.println("์ด ๊ฐ์ฒด์: " + set.size());
iterator = set.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println("\t" + element);
}
set.clear(); // ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ๊ณ ๋น์
if (set.isEmpty()) {
System.out.println("๋น์ด์์");
}
}
}
<์คํ๊ฒฐ๊ณผ>
์ด ๊ฐ์ฒด์: 4
Java
Servlet/JSP
DBMS
Spring
์ด ๊ฐ์ฒด์: 2
Servlet/JSP
Spring
๋น์ด์์
์ ์ฝ๋์ ๋ํ ์คํ๊ฒฐ๊ณผ๊ฐ ์ดํด๊ฐ ๋์
จ๋ค๋ฉด ๋ค์ ํด์ฆ๋ก ๋์ด๊ฐ๊ฒ์.
์๋ ์ฝ๋์ ๋ํ ๊ฒฐ๊ณผ๋ ๋ฌด์์ผ๊น์?
import java.util.HashSet;
import java.util.Set;
public class HashSetExample2 {
public static void main(String[] args) {
Set<Member> set = new HashSet<>();
set.add(new Member("ํ๊ธธ๋", 30));
set.add(new Member("ํ๊ธธ๋", 30));
System.out.println("์ด ๊ฐ์ฒด์: " + set.size());
}
}
public class Member {
String name;
int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
}
์ด ๊ฐ์ฒด์: 2
๋ ๋ฒ ์ค๋ณต์ผ๋ก ์ฝ์ ํ Member ์ธ์คํด์ค๋ ๋ด๋ถ ๋ฐ์ดํฐ๊ฐ ๋์ผํ์ง๋ง, ์ธ์คํด์ค๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด ๋ ๋ค ์ ์ฅํฉ๋๋ค. ํ์ง๋ง ์๋ํ ๋ฐ๊ฐ ์๋๋๋ค. ๋ด๋ถ ๋ฐ์ดํฐ๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต ์ฒ๋ฆฌ๋ฅผ ํด์ค ์ ์๋๋ก ๋ฐ๊ฟ๋ณด๊ฒ ์ต๋๋ค.
Memberํด๋์ค์์ hashCode()์ equals() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์,
์ธ์คํด์ค๊ฐ ๋ฌ๋ผ๋ ์ด๋ฆ, ๋์ด๊ฐ ๋์ผํ๋ค๋ฉด ๋์ผํ ๊ฐ์ฒด๋ก ๊ฐ์ฃผํ์ฌ ์ค๋ณต ์ ์ฅ๋์ง ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํด๋ณผ๊ฒ์.
public class Member {
String name;
int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return name.hashCode() + age;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Member) {
Member member = (Member)obj;
return member.name.equals(this.name) && member.age == this.age;
} else {
return false;
}
}
}
import java.util.HashSet;
import java.util.Set;
public class HashSetExample2 {
public static void main(String[] args) {
Set<Member> set = new HashSet<>();
set.add(new Member("ํ๊ธธ๋", 30));
set.add(new Member("ํ๊ธธ๋", 30)); // ์ธ์คํด์ค๋ ๋ค๋ฅด์ง๋ง ๋ด๋ถ ๋ฐ์ดํฐ๊ฐ ๋์ผํ๋ฏ๋ก ๊ฐ์ฒด 1๊ฐ๋ง ์ ์ฅ
System.out.println("์ด ๊ฐ์ฒด์: " + set.size());
}
}
์ด ๊ฐ์ฒด์: 1
Map ์ปฌ๋ ์
์ ํค(key)์ ๊ฐ(value)์ผ๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐ์
๋๋ค. ์ฌ๊ธฐ์ ํค์ ๊ฐ์ ๋ชจ๋ ๊ฐ์ฒด์
๋๋ค. ํค๋ ์ค๋ณต๋ ์ ์์ง๋ง ๊ฐ์ ์ค๋ณต ์ ์ฅ๋ ์ ์์ต๋๋ค. ๋ง์ฝ ๊ธฐ์กด์ ์ ์ฅ๋์๋ ํค๊ฐ๊ณผ ๋์ผํ ํค๊ฐ์ผ๋ก ์ ์ฅํ๋ฉด ๊ธฐ์กด์ ๊ฐ์ ์์ด์ง๊ณ ์๋ก์ด ๊ฐ์ผ๋ก ๋์น๋ฉ๋๋ค.

Map ์ปฌ๋ ์
์๋ HashMap, Hashtable, LinkedHashMap, Properties, TreeMap ๋ฑ์ด ์์ต๋๋ค.
์๋ ํ๋ Map ์ปฌ๋ ์
์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ Map ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ค์
๋๋ค. โKeyโ๋ก ๊ฐ์ฒด๋ค์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ Key๋ฅผ ๋งค๊ฐ๊ฐ์ผ๋ก ๊ฐ๋ ๋ฉ์๋๊ฐ ๋ง์ต๋๋ค.
| ๊ธฐ๋ฅ | ๋ฉ์๋ | ์ค๋ช |
|---|---|---|
| ๊ฐ์ฒด์ถ๊ฐ | V put(K key, V value) | ์ฃผ์ด์ง ํค์ ๊ฐ์ ์ถ๊ฐ, ์ ์ฅ๋๋ฉด ๊ฐ์ ๋ฆฌํด |
| ๊ฐ์ฒด๊ฒ์ | boolean containsKey(Object key) | ์ฃผ์ด์ง ํค๊ฐ ์๋์ง ์ฌ๋ถ |
| boolean containsValue(Object value) | ์ฃผ์ด์ง ๊ฐ์ด ์๋์ง ์ฌ๋ถ | |
| Set(Map.Entry<K,V>> entrySet() | ํค์ ๊ฐ์ ์์ผ๋ก ๊ตฌ์ฑ๋ ๋ชจ๋ Map.Entry ๊ฐ์ฒด๋ฅผ Set์ ๋ด์์ ๋ฆฌํด | |
| V get(Object key) | ์ฃผ์ด์ง ํค๊ฐ ์๋ ๊ฐ์ ๋ฆฌํด | |
| boolean isEmpty() | ์ปฌ๋ ์ ์ด ๋น์ด ์๋์ง ์ฌ๋ถ | |
| Set keySet() | ๋ชจ๋ ํค๋ฅผ Set ๊ฐ์ฒด์ ๋ด์์ ๋ฆฌํด | |
| int size() | ์ ์ฅ๋ ํค์ ์ด ๊ฐ์ ๋ฆฌํด | |
| Collection values() | ์ ์ฅ๋ ๋ชจ๋ ๊ฐ์ Collection์ ๋ด์์ ๋ฆฌํด | |
| ๊ฐ์ฒด์ญ์ | vold clear() | ๋ชจ๋ Map.Entry(ํค์ ๊ฐ)๋ฅผ ์ญ์ |
| V remove(Object key) | ์ฃผ์ด์ง ํค์ ์ผ์นํ๋ Map.Entry๋ฅผ ์ญ์ ํ๊ณ ๊ฐ์ ๋ฆฌํด |
์ ํ์์ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ํ์ ๊ณผ ๋ฆฌํด ํ์ ์ K, V๋ผ๋ ํ์ ์ ํ๋ผ๋ฏธํฐ๊ฐ ์๋๋ฐ์, ์ด๊ฒ์ Map ์ธํฐํ์ด์ค๊ฐ ์ ๋ค๋ฆญ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ตฌ์ฒด์ ์ธ ํ์ ์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๊ฒฐ์ ๋ฉ๋๋ค. ๊ฐ์ฒด ์ถ๊ฐ๋ put() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ , key๋ก ๊ฐ์ฒด๋ฅผ ์ฐพ์์ฌ ๋์๋ get(key) ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ฒด ์ญ์ ๋ remove(key) ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Map<String, Integer> map = ...;
map.put("ํ๊ธธ๋", 30); // ๊ฐ์ฒด ์ถ๊ฐ
int score = map.get("ํ๊ธธ๋"); // ๊ฐ์ฒด ์ฐพ๊ธฐ
map.remove("ํ๊ธธ๋"); // ๊ฐ์ฒด ์ญ์
key๋ฅผ ์๊ณ ์๋ค๋ฉด ์ ์ฝ๋์๊ฐ์ด get() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ง๋ง, ์ ์ฅ๋ ๊ฐ์ฒด ์ ์ฒด๋ฅผ ํ๋์ฉ ์ป๊ณ ์ถ์ ๊ฒฝ์ฐ์๋
Map<K, V> map = ...;
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = keySet.iterator();
while(keyIterator.hasNext()) {
K key = keyIterator.next();
V value = map.get(key);
}
Set<Map.Entry<String, Object>> entries = map.entrySet();
for (Map.Entry<String, Object> entry : entries) {
String key = entry.getKey();
Object value = entry.getValue();
}
HashMap์ Map ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ Map ์ปฌ๋ ์ ์ ๋๋ค. HashMap์ ์์ฑํ๊ธฐ ์ํด์๋ ํค ํ์ ๊ณผ ๊ฐ ํ์ ์ ํ๋ผ๋ฏธํฐ๋ก ์ฃผ๊ณ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
Map<K, V> map = new HashMap<K, V>(); // K: ํค ํ์
ํ๋ผ๋ฏธํฐ, V: ๊ฐ ํ์
ํ๋ผ๋ฏธํฐ
ํค์ ๊ฐ์ ํ์ ์ Primitive type(byte, short, int, float, long, double, boolean, char)์ ์ฌ์ฉํ ์ ์๊ณ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค ํ์ ๋ง ๊ฐ๋ฅํฉ๋๋ค. ํค๋ก String ํ์ ์ ์ฌ์ฉํ๊ณ ๊ฐ์ผ๋ก Integer ํ์ ์ ์ฌ์ฉํ๋ HashMap์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
Map<String, Integer> map = new HashMap<String, Integer>();
๋ค์ ์์ ๋ ์ด๋ฆ์ Key๋ก, ์ ์๋ฅผ Value๋ก ์ ์ฅํ๋ HashMap ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋๋ค.
์๋ ์ฝ๋๋ฅผ ๋ณด๊ณ 2๋ฒ ๋ถํฐ ๊ฐ ๋จ๊ณ๋ณ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์์ํด๋ณด์ธ์.
- Map ์ปฌ๋ ์ ์์ฑ
- ๊ฐ์ฒด ์ฐพ๊ธฐ : get() ๋ฉ์๋ ์ด์ฉ
- ๊ฐ์ฒด๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌ : keySet() ๋ฉ์๋ ์ด์ฉ
- ํน์ ๊ฐ์ฒด ์ญ์ : remove() ๋ฉ์๋ ์ด์ฉ
- ๊ฐ์ฒด๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌ : entrySet() ๋ฉ์๋ ์ด์ฉ
- ๋ชจ๋ Map.Entry ์ญ์
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;
public class HashMapExample {
public static void main(String[] args) {
// 1. Map ์ปฌ๋ ์
์์ฑ
Map<String, Integer> map = new HashMap<>();
map.put("ํ๊ธธ๋", 80);
map.put("์นด๋ฆฌ๋", 85);
map.put("์ ์์นด", 95);
map.put("ํ๊ธธ๋", 80); // "ํ๊ธธ๋" ํค๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์ ์ฅํ ๊ฐ์ผ๋ก ์์ด์
System.out.println("์ด Entry ์: " + map.size()); // ์ ์ฅ๋ ์ด Entry ์ ์ป๊ธฐ
// 2. ๊ฐ์ฒด ์ฐพ๊ธฐ
System.out.println("\tํ๊ธธ๋: " + map.get("ํ๊ธธ๋"));
System.out.println();
// 3. ๊ฐ์ฒด๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌ
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Integer value = map.get(key);
System.out.println("\t" + key + ": " + value);
}
System.out.println();
// 4. ๊ฐ์ฒด ์ญ์
map.remove("ํ๊ธธ๋");
System.out.println("์ด Entry ์: " + map.size());
// 5. ๊ฐ์ฒด๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌ
Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); // Map.EntrySet ์ป๊ธฐ
for (Map.Entry<String, Integer> entry : entrySet) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("\t" + key + ": " + value);
}
System.out.println();
// 6. ๋ชจ๋ Map.Entry ์ญ์
map.clear();
System.out.println("์ด Entry ์: " + map.size());
}
}
<์คํ๊ฒฐ๊ณผ>
```java
์ด Entry ์: 3
ํ๊ธธ๋: 80
์ ์์นด: 95
ํ๊ธธ๋: 80
์นด๋ฆฌ๋: 85
์ด Entry ์: 2
์ ์์นด: 95
์นด๋ฆฌ๋: 85
์ด Entry ์: 0
๋ค์ ์์ ๋ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด์ธ Student๋ฅผ Key๋ก ํ๊ณ Value๋ก๋ ์ ์๋ฅผ ์ ์ฅํ๋ HashMap์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
public class Student {
private int no;
private String name;
public Student(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public boolean equals(Object obj) { // ํ๋ฒ๊ณผ ์ด๋ฆ์ด ๋์ผํ ๊ฒฝ์ฐ true
if (obj instanceof Student) {
Student student = (Student)obj;
return (no == student.no) && (name.equals(student.name));
}
return false;
}
@Override
public int hashCode() { // ํ๋ฒ๊ณผ ์ด๋ฆ์ด ๊ฐ๋ค๋ฉด ๋์ผํ ๊ฐ์ ๋ฆฌํด
return no + name.hashCode();
}
}
import java.util.HashMap;
import java.util.Map;
public class HashMapExample2 {
public static void main(String[] args) {
Map<Student, Integer> map = new HashMap<>();
map.put(new Student(50, "ํ๊ธธ๋"), 95); // ํ๋ฒ๊ณผ ์ด๋ฆ์ด ๋์ผํ Student๋ฅผ ํค๋ก ์ ์ฅ
map.put(new Student(50, "ํ๊ธธ๋"), 95);
System.out.println("์ด Entry ์: " + map.size()); // ์ ์ฅ๋ ์ด Map.Entry ์ ์ป๊ธฐ
}
}
<์คํ๊ฒฐ๊ณผ>
์ด Entry ์: 1
HashMap๊ณผ ๋์ผํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง Hashtable์ ๋ํด์ ์์๋ด
์๋ค. HashMap๊ณผ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ด๋ผ๋ฉด Hashtable์ ๋๊ธฐํ๋(synchronized) ๋ฉ์๋๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์ค๋ ๋๊ฐ ๋์์ ์ด ๋ฉ์๋๋ฅผ ์คํํ ์ ์๊ณ , ํ๋์ ์ค๋ ๋๊ฐ ์คํ์ ์๋ฃํด์ผ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ๊ฒ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐ, ์ญ์ ํ ์ ์๋ ํน์ง์ ๊ฐ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ thread safe ํ๋ค๋ผ๊ณ ๋งํฉ๋๋ค.

Hashtable์ ์์ฑ ๋ฐฉ๋ฒ์ HashMap๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์๋ฐ์, ํค ํ์
๊ณผ ๊ฐ ํ์
์ ์ง์ ํ๊ณ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.

๋ค์์ ํค๋ณด๋๋ก ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ์์, Hashtable์ ์ ์ฅ๋ ํค(์์ด๋)์ ๊ฐ(๋น๋ฐ๋ฒํธ)์ผ๋ก ๋น๊ตํ ํ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ์ถ๋ ฅํ๋ ์์ ์
๋๋ค.
package Chapter12.hashtable;
import java.util.Hashtable;
import java.util.Map;
import java.util.Scanner;
public class HashTableExample {
public static void main(String[] args) {
Map<String, String> map = new Hashtable<>();
map.put("taeyuniya12", "rladbs12!@");
map.put("kkunh97", "rjsgur12!@");
map.put("dlawhdfbf12", "rornf713!@");
map.put("qkrwlstjd", "qkrwls12!@");
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํด์ฃผ์ธ์");
System.out.println("์์ด๋: ");
String id = scanner.nextLine(); // ํค๋ณด๋๋ก ์
๋ ฅํ ์์ด๋๋ฅผ ์ฝ๋๋ค
System.out.println("๋น๋ฐ๋ฒํธ: ");
String password = scanner.nextLine();
System.out.println();
if (map.containsKey(id)) {
if (map.get(id).equals(password)) {
System.out.println("๋ก๊ทธ์ธ์ด ๋์์ต๋๋ค");
break;
} else {
System.out.println("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค!");
}
} else {
System.out.println("์
๋ ฅํ์ ์์ด๋๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค!\n");
}
}
}
}
<์คํ๊ฒฐ๊ณผ>

ํ์ ์ ์ถ (LIFO: Last In First Out)์ ๋์ค์ ๋ฃ์ ๊ฐ์ฒด๊ฐ ๋จผ์ ๋น ์ ธ๋๊ฐ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค. ๋ฐ๋๋ก ์ ์ ์ ์ถ(First In First Out)์ ๋จผ์ ๋ฃ์ ๊ฐ์ฒด๊ฐ ๋จผ์ ๋น ์ ธ๋๊ฐ๋ ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค. ์ปฌ๋ ์ ํ๋ ์์ํฌ ์์๋ ํ์ ์ ์ถ(LIFO) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํด์ฃผ๋ Stack, ์ ์ ์ ์ถ(FIFO) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํด์ฃผ๋ Queue ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค.

Stack

Queue
์คํ์ ๋ง์ง๋ง์ ๋ฃ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ฅ ๋จผ์ ๋น ์ง๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ๋ค์ ๊ทธ๋ฆผ์ผ๋ก ์คํ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ดํดํด๋ณผ๊ฒ์. ๊ณผ๊ฑฐ์ ํ์์์ ์ฃผ๋ก ๋ณผ ์ ์์๋ ๋์ ์ผ์ด์ค์ธ๋ฐ, ์ด ์ผ์ด์ค์์ ๋์ ์ ๋ฃ๊ณ , ๋บ ์ ์๋ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก ์คํ ๊ตฌ์กฐ์ ๋๋ค. ์คํ ๊ตฌ์กฐ์์ ๋งจ ์ฒ์์ ๋ฃ์ ๋์ ์ ๋งจ ๋์ค์ ๋บ ์๊ฐ ์์ต๋๋ค. (LIFO)


Stack ํด๋์ค๋ LIFO ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ํด๋์ค ์ด๊ณ , ๋ค์ ํ๋ก Stack ํด๋์ค์ ์ฃผ์ ๋ฉ์๋๋ค์ ๋ณด์์ฃ .
| ๋ฆฌํด ํ์ | ๋ฉ์๋ | ์ค๋ช |
|---|---|---|
| E | push(E item) | ์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ์คํ์ ๋ฃ๋๋ค |
| E | peek() | ์คํ์ ๋งจ ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ฐ์ฒด๋ฅผ ์คํ์์ ์ ๊ฑฐํ์ง ์๋๋ค. |
| E | pop() | ์คํ์ ๋งจ ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ฐ์ฒด๋ฅผ ์คํ์์ ์ ๊ฑฐํ๋ค. |
Stack ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์ ์ฅํ ๊ฐ์ฒด ํ์ ์ ํ๋ผ๋ฏธํฐ๋ก ํ๊ธฐํ๊ณ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
Stack<E> stack = new Stack<E>();
package Chapter13;
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("๋นํธ์ฝ์ธ");
stack.push("์ด๋๋ฆฌ์");
stack.push("์์ด๋ค");
stack.push("์๋ผ๋");
System.out.println(stack.peek()); //paek๊ณผ pop์ ์ฐจ์ด๋ ๋ญ๊น์?
System.out.println(stack.peek());
System.out.println(stack.peek());
System.out.println(stack.peek());
System.out.println("- - - - - -");
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
}
}
์คํ ๊ฒฐ๊ณผ๋ ์ด๋ ์ต๋๋ค.

ํ๋ ์์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ์ถ๋ ฅ์ด ๋๋ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค. ํํ ์ฐ๋ฆฌ๊ฐ ์งํ์ฒ ์ ๊ธฐ๋ค๋ฆฌ๋ ค๊ณ ์ค์ ์ฐ์ ๋, ๋จผ์ ์ค์ ์ ์ฌ๋์ด ์งํ์ฒ ์ ๋จผ์ ํ๊ฒ๋๋ ํํ์ด์ฃ .

๋ค์ ๊ทธ๋ฆผ์ผ๋ก ํ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.

Queue ์ธํฐํ์ด์ค๋ ์ด๋ฐ FIFO ์๋ฃ๊ตฌ์กฐ์์ ์ฌ์ฉ๋๋ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์์ต๋๋ค. ๋ค์ ํ์์ Queue ์ธํฐํ์ด์ค์ ์ ์๋์ด ์๋ ๋ฉ์๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
| ๋ฆฌํด ํ์ | ๋ฉ์๋ | ์ค๋ช |
|---|---|---|
| boolean | offer(E e) | ์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ๋ฃ๋๋ค. |
| E | peek() | ๊ฐ์ฒด ํ๋๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ฐ์ฒด๋ฅผ ํ์์ ์ ๊ฑฐํ์ง ์๋๋ค. |
| E | poll() | ๊ฐ์ฒด ํ๋๋ฅผ ๊ฐ์ ธ์จ๋ค. ๊ฐ์ฒด๋ฅผ ํ์์ ์ ๊ฑฐํ๋ค. |
Queue ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ํด๋์ค๋ LinkedList ์ ๋๋ค.
LinkedList๋ List ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ List ์ปฌ๋ ์ ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ค์ ์ฝ๋๋ LinkedList ๊ฐ์ฒด๋ฅผ Queue ์ธํฐํ์ด์ค ํ์ ์ผ๋ก ๋ณํํ ๊ฒ ์ ๋๋ค.
Queue<E> queue = new LinkedList<E>();
๋ค์์ Queue๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ ๋ฉ์์ง ํ๋ฅผ ๊ตฌํํ ์์ ์ ๋๋ค. ๋จผ์ ๋ฃ์ ๋ฉ์์ง๊ฐ ๋ฐ๋์ชฝ์ผ๋ก ๋จผ์ ๋์ค๊ธฐ ๋๋ฌธ์ ๋ฃ์ ์์๋๋ก ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๊ฐ๋ฉ๋๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์คํ๊ฒฐ๊ณผ๋ฅผ ์ ์ถํด๋ณด์๊ณ , ์ฝ๋๋ฅผ ์ง์ ์์ฑํด๋ณด๋ฉด์ ์คํ๊ฒฐ๊ณผ์ ๊ฐ์ ์ถ๋ ฅ์ ํ๋๋ก ํด๋ด ์๋ค.
public class Message {
private String command;
private String to;
public String getCommand() {
return command;
}
public String getTo() {
return to;
}
public Message(String command, String to) {
this.command = command;
this.to = to;
}
}
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<Message> messageQueue = new LinkedList<>();
messageQueue.offer(new Message("sendMail", "ํ๊ธธ๋"));
messageQueue.offer(new Message("sendSms", "์ ๋"));
messageQueue.offer(new Message("sendKakaoTalk", "๋ฆฌ์ฌ"));
while (!messageQueue.isEmpty()) { // ๋ฉ์์ง ํ๊ฐ ๋น์๋์ง ํ์ธ
Message message = messageQueue.poll(); // ๋ฉ์์ง ํ์์ ํ๋์ ๋ฉ์์ง ๊บผ๋
switch (message.getCommand()) {
case "sendMail":
System.out.println(message.getTo() + "์๊ฒ ๋ฉ์ผ์ ๋ณด๋
๋๋ค.");
break;
case "sendSms":
System.out.println(message.getTo() + "์๊ฒ SMS๋ฅผ ๋ณด๋
๋๋ค.");
break;
case "sendKakaoTalk":
System.out.println(message.getTo() + "์๊ฒ ์นดํก์ ๋ณด๋
๋๋ค.");
break;
}
}
}
}
<์คํ๊ฒฐ๊ณผ>
ํ๊ธธ๋์๊ฒ ๋ฉ์ผ์ ๋ณด๋
๋๋ค.
์ ๋์๊ฒ SMS๋ฅผ ๋ณด๋
๋๋ค.
๋ฆฌ์ฌ์๊ฒ ์นดํก์ ๋ณด๋
๋๋ค.