๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[Java] Hashtable์€ Enumeration ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ถœ์ฒ˜

ChatGTP


์ž๋ฐ”์˜ Hashtable ํด๋ž˜์Šค๋Š” Enumeration ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. Enumeration์€ ์ž๋ฐ”์—์„œ ๋ ˆ๊ฑฐ์‹œ ๋ฐ˜๋ณต์ž๋กœ, Iterator๊ฐ€ ๋„์ž…๋˜๊ธฐ ์ด์ „์— ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. Hashtable์€ ์ž๋ฐ” 1.0๋ถ€ํ„ฐ ์‚ฌ์šฉ๋œ ์˜น๋ž˜๋œ ํด๋ž˜์Šค์ด๋ฉฐ, ๊ทธ ๋‹น์‹œ ๋ฐ˜๋ณต์ž ํŒจํ„ด์œผ๋กœ Enumeration์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

1. Enumeration์ด๋ž€?

Enumeration์€ ์ž๋ฐ”์—์„œ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ฃผ๋กœ ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šค์ธ Vector, Stack, ๊ทธ๋ฆฌ๊ณ  Hashtable์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. Enumeration์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • boolean hasMoreElements() : ๋” ๋งŽ์€ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • E nextElement() : ๋‹ค์Œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Enueration์€ ๋‹จ๋ฐฉํ–ฅ ์ˆœํšŒ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ปฌ๋ ‰์…˜์—์„œ ์š”์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

2. Enumeration๊ณผ Iterator์˜ ์ฐจ์ด์ 

Enumeration์€ Iterator๋ณด๋‹ค ๊ธฐ๋Šฅ์ด ์ œํ•œ์ ์ด๋‹ค. Enumeration์€ ๋‹ค์Œ ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ทธ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…๋งŒ ์ง€์›ํ•˜๋ฉฐ, ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์—†๋‹ค.

ํŠน์ง• Enumeration Iterator
์‚ฌ์šฉ ์‹œ์  ์ž๋ฐ” 1.0์˜ ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šค๋“ค(Hashtable, Vector, Stack)์—์„œ ์‚ฌ์šฉ ์ž๋ฐ” 2 ์ดํ›„์˜ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉ
๋ฉ”์†Œ๋“œ hashMoreElements(), nextElements() hasNext(), next(), remove()
์š”์†Œ ์‚ญ์ œ ๋ถˆ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ ( remove() ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
์•ˆ์ „์„ฑ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์ค‘ ๋™์ž‘์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์ค‘ ConcurrentModificationException ๋ฐœ์ƒ ๊ฐ€ (์ˆœํšŒ ์ค‘ Iterator์˜ remove()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์กฐ ๋ณ€๊ฒฝ ํ•˜๋ฉด ๋ฐœ์ƒ)

 

3. Hashtable์—์„œ Enumeration ์‚ฌ์šฉ ์˜ˆ

Hashtable ํด๋ž˜์Šค๋Š” ์—ฌ์ „ํžˆ Enumeration ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ํ‚ค ๋˜๋Š” ๊ฐ’์„ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. Hashtable์—์„œ keys() ๋ฉ”์†Œ๋“œ์™€ elements() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ๊ฐ ํ‚ค์™€ ๊ฐ’์— ๋Œ€ํ•œ Enumeration ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

keys() ๋ฉ”์†Œ๋“œ

Hashtable์˜ ๋ชจ๋“  ํ‚ค์— ๋Œ€ํ•œ Enumeration์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

elements() ๋ฉ”์†Œ๋“œ 

Hashtable์˜ ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•œ Enumeration์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๋‹ค์Œ์€ Hashtable์—์„œ Enumeration์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.

import java.util.Enumeration;
import java.util.Hashtable;

public class EnumerationExample {
    public static void main(String[] args) {
        // Hashtable ์ƒ์„ฑ ๋ฐ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
        Hashtable<String, Integer> hashtable = new Hashtable<>();
        hashtable.put("apple", 10);
        hashtable.put("banana", 20);
        hashtable.put("cherry", 30);

        // keys()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค์— ๋Œ€ํ•œ Enumeration ์–ป๊ธฐ
        Enumeration<String> keys = hashtable.keys();
        System.out.println("Keys:");
        while (keys.hasMoreElements()) {
            System.out.println(keys.nextElement());
        }

        // elements()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์— ๋Œ€ํ•œ Enumeration ์–ป๊ธฐ
        Enumeration<Integer> values = hashtable.elements();
        System.out.println("\nValues:");
        while (values.hasMoreElements()) {
            System.out.println(values.nextElement());
        }
    }
}

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

keys:
banana
apple
cherry

Values:
20
10
30

 

  • keys() : Hashtable์˜ ๋ชจ๋“  ํ‚ค๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ, nextElement()๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • elements() : Hashtable์˜ ๋ชจ๋“  ๊ฐ’์„ ์ˆœํšŒํ•œ๋‹ค.

 

4. ์™œ Enumeration์ด ์•„๋‹Œ Iterator๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

Enumeration์˜ ๊ธฐ๋Šฅ ์ œํ•œ

Enumeration์€ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋‹จ์ˆœํžˆ ์ˆœํšŒ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์—์„œ ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ๋ฐ˜๋ฉด Iterator๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์•ˆ์ „์„ฑ ๋ฌธ์ œ

Enumeration์€ fail-fast ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ์ปฌ๋ ‰์…˜์ด ์ˆœํšŒ ์ค‘์— ๊ตฌ์กฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด๋„(์˜ˆ: ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€/์‚ญ์ œ) ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด Iterator๋Š” ConcurrentModificationException์„ ํ†ตํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆœํšŒ ์ค‘ ๊ตฌ์กฐ์ ์ธ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ‘œ์ค€

์ž๋ฐ” 2(๋ฒ„์ „ 1.2)๋ถ€ํ„ฐ ๋„์ž…๋œ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋Œ€๋ถ€๋ถ„ Iterator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ์ดํ›„๋กœ Enumeration์€ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

5. Hashtable์˜ ํŠน์ง•๊ณผ Enumeration ์‚ฌ์šฉ

Hashtable์€ ์ž๋ฐ”์˜ ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋™๊ธฐํ™” Synchronization

Hashtable์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๋™๊ธฐํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐํ™”๊ฐ€ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๋Œ€์กฐ์ ์œผ๋กœ, HashMap์€ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฅด๋‹ค.

null ํ—ˆ์šฉ ์•ˆ ํ•จ

Hashtable์€ ํ‚ค์™€ ๊ฐ’์œผ๋กœ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐ˜๋ฉด HahsMap์€ null ํ‚ค์™€ null ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.

๋ ˆ๊ฑฐ์ง€ ํด๋ž˜์Šค

Hashtable์€ ์ž๋ฐ” 1.0์—์„œ ๋„์ž…๋œ ์˜ค๋ž˜๋œ ํด๋ž˜์Šค์ด๋ฉฐ, ์ดํ›„์— ๋„์ž…๋œ HashMap๊ณผ ๊ฐ™์€ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋“ค๊ณ  ์ ์ฐจ ๋Œ€์ฒด๋˜์—ˆ๋‹ค. Enumeration ์—ญ์‹œ Hashtable์˜ ์˜ค๋ž˜๋œ ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๋Š” ๋Œ€ํ‘œ์ ์ธ ํŠน์ง•์ด๋‹ค.

 

๊ฒฐ๋ก 

Hashtable์€ ์ž๋ฐ”์˜ ์˜ค๋ž˜๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, Enumeration์ด๋ผ๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ” ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ฐœ์ „์œผ๋กœ Iterator๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ, Enumeration์˜ ์‚ฌ์šฉ์€ ๋งŽ์ด ์ค„์–ด๋“ค์—ˆ๊ณ , ํ˜„๋Œ€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ฃผ๋กœ Iterator๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. Hashtable๊ณผ Enumeration์€ ์—ฌ์ „ํžˆ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€ ํ˜ธํ™˜์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์—์„œ๋Š” HashMap๊ณผ Iterator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค.