
Java ์ปฌ๋ ์ ํ๋ ์์ํฌ ํต์ฌ ์ ๋ฆฌ (ArrayList vs HashSet + Iterator + equals/hashCode)
0) ์ปฌ๋ ์ ์ด ์ ํ์ํด?
์๋ฐ์์ “์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด”๋ฅผ ๋ด๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์์ด:
- ๋ฐฐ์ด(Array): ํฌ๊ธฐ ๊ณ ์ , ๊ธฐ๋ฅ ์ ์
- ์ปฌ๋ ์ (Collection Framework): ํฌ๊ธฐ ๊ฐ๋ณ, ๊ธฐ๋ฅ ํ๋ถ(์ถ๊ฐ/์ญ์ /๊ฒ์/์ค๋ณต์ฒ๋ฆฌ/์ ๋ ฌ ๋ฑ)
์ปฌ๋ ์ ์ ๋ํ ๋ผ์ธ:
- List: ์์ O, ์ค๋ณต O → ๋ํ: ArrayList
- Set: ์์ X(๋ณด์ฅ ์ ํจ), ์ค๋ณต X → ๋ํ: HashSet
1) List ์ธํฐํ์ด์ค & ArrayList
1-1. ArrayList ํน์ง
- ์ ์ฅ ์์๊ฐ ์ ์ง๋จ
- ์ค๋ณต ์ ์ฅ ๊ฐ๋ฅ
- get(i)์ฒ๋ผ ์ธ๋ฑ์ค๋ก ์ ๊ทผ ๊ฐ๋ฅ
- ๋์ ์ค๊ฐ ์ฝ์ /์ญ์ ๊ฐ ๋ง์ผ๋ฉด ๋๋ ค์ง ์ ์์(๋ค ์์๋ค์ด ๋น๊ฒจ์ง๊ฑฐ๋ ๋ฐ๋ฆผ)
2) ํ์๊ด๋ฆฌ ์์ : MemberArrayList
2-1. ํ๋์ ์์ฑ์

ํ ์ค์ฉ ์ฝ๊ฒ ํด์ค
- private ArrayList<Member> arrayList;
→ “Member ๊ฐ์ฒด๋ค์ ๋ด์ ‘๋ฐ์ค(๋ฆฌ์คํธ)’๋ฅผ ์ค๋นํด๋๊ฒ” - arrayList = new ArrayList<Member>();
→ “๋ฐ์ค๋ฅผ ์ค์ ๋ก ๋ง๋ ๋ค(๋ฉ๋ชจ๋ฆฌ์ ์์ฑ)”
2-2. ํ์ ์ถ๊ฐ: addMember()

2-3. ์ ์ฒด ํ์ ์ถ๋ ฅ: showAllMember() + ํฅ์๋ for๋ฌธ

์ค์ ํฌ์ธํธ
- for (Member member : arrayList) ๋ ํฅ์๋ for๋ฌธ(= for-each)
→ “๋ฆฌ์คํธ์ ์ฒ์๋ถํฐ ๋๊น์ง ํ๋์ฉ ๊บผ๋ด์ member ๋ณ์์ ๋ด์ ๋ฐ๋ณต” - System.out.println(member)
→ ์ฌ๊ธฐ์ member๋ ๊ฐ์ฒด๋๊น, ๋ด๋ถ์ ์ผ๋ก member.toString()์ด ํธ์ถ๋จ
→ ๊ทธ๋์ Member ํด๋์ค์ toString() ๊ตฌํ์ด ์ถ๋ ฅ ๋ชจ์์ ๊ฒฐ์ ํด.
โ ํฅ์๋ for๋ฌธ ๋ฌธ๋ฒ
โ ๏ธ ์ฃผ์: ํฅ์๋ for๋ฌธ ๋๋ฉด์ add/remove๋ก ์ปฌ๋ ์ ์ ์์ ํ๋ฉด ๋ณดํต ์ํ(์๋ Iterator์์ ์ค๋ช )
2-4. ํ์ ์ญ์ : removeMember(int memberId) (์ธ๋ฑ์ค ๊ธฐ๋ฐ)
์ค์ท์ ๋์จ ํํ๋ ์ด๊ฑฐ์ผ:

ํ ์ค์ฉ ํต์ฌ๋ง “์?” ์ค์ฌ์ผ๋ก ํด์ค
- for (int i=0; i<arrayList.size(); i++)
→ ArrayList๋ ์์/์ธ๋ฑ์ค๊ฐ ์์ผ๋๊น 0๋ฒ๋ถํฐ ๋๊น์ง ํ์ด์ ์ฐพ๋ ๋ฐฉ์ - arrayList.get(i)
→ i๋ฒ์งธ ํ์ ๊บผ๋ - if (tempId == memberId)
→ “์ฐพ๋ id๋ฉด” - arrayList.remove(i)
→ i๋ฒ์งธ ์์ ์ญ์ (์ญ์ ๋๋ฉด ๋ค๊ฐ ํ ์นธ์ฉ ๋น๊ฒจ์ง) - return true
→ “์ญ์ ์ฑ๊ณต”์ ์ฆ์ ์ข ๋ฃ๋ก ์๋ ค์ค - ๋๊น์ง ๋ชป ์ฐพ์ผ๋ฉด ์๋ด๋ฌธ ์ถ๋ ฅ ํ false
2-5. (๊ณผ์ ) ํน์ ์์น์ ํ์ ์ถ๊ฐ: insertMember(member, index)
์ค์ท ํํธ: public void insertMember(Member member, int index)
ArrayList๋ ์ด๋ฏธ ๊ธฐ๋ฅ์ด ์์ด:
add(index, element) → ํด๋น ์์น์ ๋ผ์๋ฃ๊ณ , ๋ค ์์๋ค์ ํ ์นธ์ฉ ๋ฐ๋ฆผ

3) ArrayList ํ ์คํธ ์ฝ๋: MemberArrayListTest

- ํ์ ์์ฑ → ๋ฆฌ์คํธ์ ์ถ๊ฐ → ์ ์ฒด ์ถ๋ ฅ → ํ ๋ช ์ญ์ → ๋ค์ ์ถ๋ ฅ” ํ๋ฆ ๊ฒ์ฆ์ฉ
4) Set ์ธํฐํ์ด์ค & HashSet
4-1. HashSet ํน์ง
- ์ค๋ณต ๋ถ๊ฐ
- ์์ ๋ณด์ฅ ์ ๋จ (์ถ๋ ฅ ์์๊ฐ ๋งค๋ฒ ๊ฐ์ ํ์ ์์)
- ๋ด๋ถ์ ์ผ๋ก “ํด์(hash)” ๊ตฌ์กฐ๋ฅผ ํ์ฉํด์ ํ๊ท ์ ์ผ๋ก ๋น ๋ฆ
4-2. ๋ฌธ์์ด HashSet ์์ (์ค๋ณต ์๋ ์ ๊ฑฐ)
์ "์์คํ"์ด ํ ๋ฒ๋ง ๋จ์๊น?

- String์ ์ด๋ฏธ equals()์ hashCode()๊ฐ “๋ฌธ์์ด ๋ด์ฉ ๊ธฐ์ค”์ผ๋ก ์ ๊ตฌํ๋์ด ์์
- ๊ทธ๋์ HashSet์ด “๊ฐ์ ๊ฐ”์ผ๋ก ํ๋จํ๊ณ ์ค๋ณต ์ฝ์ ์ ๋ง์
5) ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ HashSet์ ๋ฃ์ ๋ ํต์ฌ: equals() + hashCode()
5-1. HashSet์ด ์ค๋ณต์ ํ๋จํ๋ ๋ฐฉ์ (์ง์ง ์ค์)
HashSet์ ์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ ๋ ๋์ถฉ ์ด๋ฐ ์์๋ก ๊ฒ์ฌํด:
- hashCode()๋ก “๋ค์ด๊ฐ ์นธ(๋ฒํท)”์ ๋จผ์ ์ฐพ๊ณ
- ๊ฐ์ ์นธ์ ์ด๋ฏธ ๋๊ฐ ์์ผ๋ฉด equals()๋ก “์ง์ง ๊ฐ์์ง” ์ต์ข ๋น๊ต
โ ๋ฐ๋ผ์ ๊ท์น:
- equals๋ฅผ ์ฌ์ ์ํ๋ฉด hashCode๋ ๋ฐ๋์ ๊ฐ์ด ์ฌ์ ์ํด์ผ ํจ
- (๋์ด ๊ธฐ์ค์ด ๋ค๋ฅด๋ฉด HashSet์์ ์ค๋ณต์ด ๋ซ๋ฆฌ๊ฑฐ๋ ๊ฒ์์ด ์คํจํ ์ ์์)
5-2. Member ํด๋์ค ์์ (์ค์ท ๋ด์ฉ)

ํ ์ค์ฉ ๊ฐ ์ก๊ธฐ
- hashCode()๋ “๋น ๋ฅธ ๋ถ๋ฅ์ฉ ๋ฒํธํ”
- ์ฌ๊ธฐ์ memberId๊ฐ ๊ณง “ํ์์ ๊ณ ์ ์๋ณ์”๋๊น ๊ทธ๋๋ก ๋ฐํ
- equals(Object obj)์ ๋งค๊ฐ๋ณ์๊ฐ Object์ธ ์ด์
- ์๋ฐ์ ๋ชจ๋ ํด๋์ค๊ฐ Object์ equals๋ฅผ “์ค๋ฒ๋ผ์ด๋”ํ๋ ๊ตฌ์กฐ๋ผ์ ์๊ทธ๋์ฒ๊ฐ ๊ณ ์
- instanceof Member๋ก ํ์
ํ์ธ ํ ์บ์คํ
- ์์ ํ๊ฒ Member๋ผ๋ฆฌ๋ง ๋น๊ตํ๋ ค๊ณ
- memberId๊ฐ ๊ฐ์ผ๋ฉด ๊ฐ์ ํ์(true)
- ์ฆ, ์ด๋ฆ์ด ๋ฌ๋ผ๋ id๋ง ๊ฐ์ผ๋ฉด “๊ฐ์ ํ์”์ผ๋ก ์ทจ๊ธ
6) HashSet์ผ๋ก ํ์๊ด๋ฆฌ: MemberHashSet
์ค์ท ํ๋ฆ: HashSet<Member>๋ก ๊ด๋ฆฌํ๋๊น “์ค๋ณต ํ์ id”๊ฐ ๋ค์ด์ค๋ฉด ๋งํ๊ฒ ๋ง๋ค๊ณ ์ถ์ ๊ฑฐ์ผ.
6-1. ๊ธฐ๋ณธ ๊ตฌ์กฐ

6-2. ์ญ์ ๊ฐ ์ Iterator๋ก ๋ฐ๋๋?
Set(ํนํ HashSet)์ ์ธ๋ฑ์ค๊ฐ ์์ด → get(i) ๊ฐ์ ๊ฒ ์์
๊ทธ๋์ “์ ์ฒด๋ฅผ ์ํํ๋ฉด์ ์กฐ๊ฑด์ ์ฐพ๋ ๋ฐฉ์”์ด ํ์ํจ.
๊ทธ๋ ์ฐ๋ ๋๊ตฌ๊ฐ Iterator(๋ฐ๋ณต์)
โ Iterator ํต์ฌ 3๊ฐ:
- hasNext() : ๋ค์ ์์ ์๋?
- next() : ๋ค์ ์์ ํ๋ ๊บผ๋ด๋ผ
- remove() : “๋ฐฉ๊ธ next()๋ก ๊บผ๋ธ ๊ทธ ์์”๋ฅผ ์์ ํ๊ฒ ์ญ์
6-3. removeMember(Iterator ๋ฒ์ ) — ์์ ํ ์ ์ ์ฝ๋
์ค์ท์๋ hashSet.remove(member) ํํ๊ฐ ์์๋๋ฐ, ์ค๋ฌด/์ ์์ **iterator.remove()**๊ฐ ๋ ์์ ํด.
(์ปฌ๋ ์
์ ์ํ ์ค์ ์ปฌ๋ ์
์ ์ง์ ์์ ํ๋ฉด ConcurrentModificationException ์ํ์ด ์์ด์)

7) HashSet ํ ์คํธ: “id ์ค๋ณต์ด๋ฉด ์ถ๊ฐ๊ฐ ์ ๋ผ์ผ ํ๋ค”

- equals/hashCode๋ฅผ memberId ๊ธฐ์ค์ผ๋ก ํด๋จ์ผ๋ฉด,
- 1003์ ์ด๋ฏธ ์กด์ฌ → ๋ ๋ฒ์งธ ์ถ๊ฐ๋ ์คํจ(์ค๋ณต์ผ๋ก ํ๋จ)
โ ๏ธ ๊ทธ๋ฆฌ๊ณ HashSet์ ์์๊ฐ ๋ณด์ฅ๋์ง ์์์ ์ถ๋ ฅ ์์๊ฐ ๋ฐ๋ ์ ์์
“์
๋ ฅํ ์์๋๋ก ์ถ๋ ฅ”์ด ๋ชฉํ๋ฉด → LinkedHashSet์ ์จ์ผ ํด.
8) ์ค์ต ๋ฌธ์ : StudentTest (HashSet<Student>)
์ค์ท ์๊ตฌ์ฌํญ:
- new Student("100","์ฐจ์์ฌ")
- new Student("100","์ค์๋ฆ")
→ ํ๋ฒ์ด ๊ฐ์ผ๋ฉด ์ค๋ณต์ผ๋ก ์ฒ๋ฆฌ๋์ด ํ ๋ช ๋ง ๋จ์์ผ ํจ
8-1. Student ํด๋์ค ๊ตฌํ ์์ (ํต์ฌ: equals/hashCode ํ๋ฒ ๊ธฐ์ค)

โ ํฌ์ธํธ
- ์ค๋ณต ๊ธฐ์ค = studentId
- ์ถ๋ ฅ ํํ = toString()์ด ๊ฒฐ์
โ ๏ธ HashSet ์ถ๋ ฅ ์์๊ฐ ๊ณ ์ ์ด ์๋๋ผ์
“100,200,300 ์์๊ฐ ๊ผญ ํ์”ํ๋ฉด:
- HashSet → LinkedHashSet์ผ๋ก ๋ฐ๊ฟ์ ์ ๋ ฅ ์์ ์ ์ง ๊ถ์ฅ
9) ํ ์ฅ ์์ฝ
- ArrayList(List)
- ์์ O, ์ค๋ณต O, ์ธ๋ฑ์ค O
- ์ญ์ /์ฝ์ ์ ์์ ์ด๋ ๋ฐ์
- HashSet(Set)
- ์์ X(๋ณด์ฅ ์ ํจ), ์ค๋ณต X, ์ธ๋ฑ์ค X
- ์ค๋ณต ํ๋จ์ hashCode() → equals() ์์๋ก ํจ
- ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ equals/hashCode ๋ ๋ค ์ฌ์ ์ ํ์
- Iterator
- Set์ฒ๋ผ ์ธ๋ฑ์ค ์๋ ์ปฌ๋ ์ ์ํ/์ญ์ ์ ํ์
- ์ํ ์ค ์ญ์ ๋ iterator.remove()๊ฐ ์ ์
์ ์ฐ์์ผ, ์ง๊ธ ๋งํ ํ๋ฆ์ด ๊ฑฐ์ ์ ๋ต์ด๊ณ , ๋ฑ ํ ๋ฌธ์ฅ๋ง ์ ํํ ๊ณ ์น๋ฉด ์๋ฒฝํด์ ธ.
1) “HashSet์ ๋ฃ์ ๋ Student๊ฐ ์ค๋ฒ๋ผ์ด๋ํ hashCode/equals๋ฅผ ์ด๋ค” → โ ๋ง์
set.add(student) ํ ๋ HashSet์ Student ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ด๋ ๊ฒ ์ฌ์ฉํด:
- student.hashCode()
→ ์ด๋ ์นธ(๋ฒํท)์ ๋ฃ์์ง ๊ฒฐ์ - ๊ฐ์ ์นธ์ ์ด๋ฏธ ๋ญ๊ฐ ์์ผ๋ฉด student.equals(existing)
→ ์ค๋ณต์ธ์ง ํ๋จ
๊ทธ๋์ ๋ค ๋ง:
“Student ๊ฐ์ฒด์์๋ ์ค๋ฒ๋ผ์ด๋๋ก ์๋กญ๊ฒ ์ ์ํ hashCode/equals๋ก ํ๋จํ๊ฒ ๋ง๋ค์๋ค”
โ ๋ง์.
2) “๊ทธ๋ toString๋ ํ๋จ์ ์ฐ๋?” → โ ์๋์ผ (์ฌ๊ธฐ๋ง ์์ !)
์ค์:
- ์ค๋ณต ํ๋จ์๋ hashCode() + equals()๋ง ์ฌ์ฉ
- toString()์ ์ค๋ณต ํ๋จ๊ณผ ๋ฌด๊ด
- toString()์ ์ถ๋ ฅํ ๋๋ง ์ฌ์ฉ
์ฆ,
โ
“ํ๋จ์ hashCode/equals, ์ถ๋ ฅ์ toString”
์ด๋ ๊ฒ ์ญํ ์ด ๋ถ๋ฆฌ๋ผ ์์ด.
3) “toString์ ์ฐ๋ฉด String์ผ๋ก ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํ ๋…” → ๊ฐ๋ ๋ง ์ ๋ฆฌํ๋ฉด โ
์ฌ๊ธฐ์ ํํ์ด ์ด์ง ํท๊ฐ๋ฆฐ ๋ถ๋ถ:
(A) HashSet์ Student๋ฅผ ๋ฃ์ ๊ฒฝ์ฐ
- Set ์์๋ Student ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ผ (String์ผ๋ก ์ ์ฅ๋๋ ๊ฒ ์๋)
- ์ถ๋ ฅํ ๋๋ง:
- System.out.println(set) → set.toString() ํธ์ถ
- ๊ทธ ๋ด๋ถ์์ ๊ฐ ์์์ ๋ํด student.toString() ํธ์ถ
- ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์ ์ํ ํ์ "ํ๋ฒ: ์ด๋ฆ" ์ผ๋ก ๋ณด์ด๋ ๊ฑฐ์ผ
โ ๊ฒฐ๋ก : ๊ฐ์ฒด ์ ์ฅ์ ๊ฐ์ฒด ๊ทธ๋๋ก / ์ถ๋ ฅ๋ง toString() ๊ฒฐ๊ณผ
โ ์ ๋ฆฌ
- toString()์ด “์ ์ฅ๋์ด ์๋” ๊ฒ ์๋๋ผ,
- ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋ ๋๋ง๋ค println()์ด ๊ทธ ์๊ฐ toString()์ ํธ์ถํด์ ๋ฌธ์์ด์ ๋ง๋ค์ด ์ถ๋ ฅํ๋ ๊ฑฐ์ผ.
์์๋ก ๋๋ ์ก๊ธฐ

'๐ฉโ๐ปDeveloper ๐ก > ๐พBack-end๐๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| JAVA ์ค๋ ๋(Thread) ์์ ์ ๋ฆฌ (0) | 2026.02.12 |
|---|---|
| Java ์ ๋ค๋ฆญ(Generic) ์์ ์ ๋ณต (0) | 2026.02.12 |
| Java ์์ธ ์ฒ๋ฆฌ (0) | 2026.02.11 |
| Java 8. Interface (0) | 2026.02.10 |
| JAVA : ์์ (0) | 2026.02.10 |