Skip to content

Latest commit

ย 

History

History
137 lines (97 loc) ยท 5.91 KB

File metadata and controls

137 lines (97 loc) ยท 5.91 KB

Java 21 - Sequenced Collections

Java 21?

  • 2021๋…„ ์ถœ์‹œ๋œ Java 17 ์ดํ›„ 2๋…„๋งŒ์— ์ถœ์‹œ๋œ Java์˜ 4๋ฒˆ์งธ LTS(Long Term Support) ๋ฒ„์ „
  • ์ฃผ์š” ๋ณ€ํ™”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  • ์ด ๊ธ€์—์„œ๋Š” Sequenced Collections์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค.

Sequenced Collections

๊ธฐ์กด ์ปฌ๋ ‰์…˜์€ ์ˆœ์„œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋ถˆํŽธํ•จ

  • ๊ธฐ์กด ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ปฌ๋ ‰์…˜ ๋‚ด ์›์†Œ๋“ค์— ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ๋ฒ•์ด ์ œ๊ฐ๊ฐ์ด๊ณ , ์ผ๋ถ€๋Š” ๊ฐ€๋…์„ฑ๋„ ์ข‹์ง€ ์•Š์•˜๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด, List ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์›์†Œ ์ ‘๊ทผ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    List<String> wordList = new ArrayList<>();
    String firstWord = wordList.get(0); // ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    String lastWord = wordList.get(wordList.size() - 1); // ๋งˆ์ง€๋ง‰ ์›์†Œ

    ๋งˆ์ง€๋ง‰ ์›์†Œ ์ ‘๊ทผ์˜ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด์—์„œ 1์„ ๋บ€ ๊ฐ’์ด ๋งˆ์ง€๋ง‰ ์›์†Œ์˜ ์ธ๋ฑ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ด์šฉํ•ด ํš๋“ํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

    ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€์–ด ๋ณธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ต์ˆ™ํ•œ ํ‘œํ˜„๋ฒ•์ด๋ผ ์ด์ƒํ•จ์„ ๋А๋ผ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๋ฉ”์„œ๋“œ๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ์–ด๋””์—๋„ ๋งˆ์ง€๋ง‰์„ ์˜๋ฏธํ•˜๋Š” ํ‘œํ˜„์ด ์—†๋‹ค.

  • ์ด์™€ ๋‹ฌ๋ฆฌ Deque ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์›์†Œ ์ ‘๊ทผ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    Deque<String> wordList = new ArrayDeque<>();
    wordList.getFirst();
    wordList.getLast();

    List์™€ ๋‹ฌ๋ฆฌ ์ฒ˜์Œ๊ณผ ๋์˜ ์›์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ํ™•์‹คํ•œ ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

  • ๋ฌธ์ œ๋Š”, List ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๊ฐ์ฒด์— Deque ๊ตฌํ˜„์ฒด๋ฅผ ํ• ๋‹นํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ๋‹ค.

    • ๊ธฐ์กด์— get์„ ํ†ตํ•ด ์›์†Œ๋ฅผ ํš๋“ํ•˜๋˜ ๋ถ€๋ถ„์„ ๋ชจ๋‘ getFirst์™€ getLast๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • ์ด๋Š” ํ™•์žฅ์„ฑ ๋ฉด์—์„œ ์ข‹์ง€ ์•Š์€ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚จ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Sequenced Collections

  • ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฐ”์™€ ๊ฐ™์ด, ์ผ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ฐ€๋…์„ฑ์ด ๋‚˜์œ ๋ฌธ์ œ๋„ ์žˆ์—ˆ์ง€๋งŒ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์›์†Œ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์ด ์ผ๊ด€๋˜์ง€ ์•Š๋‹ค๋Š” ์ ์ด๋‹ค.

  • ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Java 21์—์„œ ๋„์ž…๋œ ๊ฒƒ์ด ๋ฐ”๋กœ Sequenced Collections์ด๋‹ค.

  • ์ถ”๊ฐ€๋œ Sequenced Collections์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    ์ถœ์ฒ˜: openjdk docs

    • ์ถ”๊ฐ€๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ธฐ์กด List, Deque์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณตํ†ต ์กฐ์ƒ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • SequencedCollection ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

    interface SequencedCollection<E> extends Collection<E> {
        // ์—ญ์ˆœ ์กฐํšŒ
        SequencedCollection<E> reversed();
        
    		// ๊ธฐ์กด Deque์™€ ๋™์ผํ•œ ์ฒซ/๋งˆ์ง€๋ง‰ ์›์†Œ์˜ ์ƒ์„ฑ, ์กฐํšŒ, ์‚ญ์ œ
        void addFirst(E);
        void addLast(E);
        E getFirst();
        E getLast();
        E removeFirst();
        E removeLast();
    }
  • ๋”ฐ๋ผ์„œ, ์ด์ œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ List์—์„œ๋„ ๋ช…์‹œ์ ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์›์†Œ์— ์ ‘๊ทผ ๋˜๋Š” ์ถ”๊ฐ€/์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ถ”ํ›„ ๊ตฌํ˜„์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•ด๋„ ๋ฉ”์„œ๋“œ๋ฅผ ์ผ์ผ์ด ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ๊ฐœ์„ ๋˜์—ˆ๋‹ค.

    List<String> wordList = new ArrayList<>();
    
    // ์ƒ์„ฑ
    wordList.addFirst(element);
    wordList.addLast(element);
    
    // ์กฐํšŒ
    wordList.getFirst();
    wordList.getLast();
    
    // ์‚ญ์ œ
    wordList.removeFirst();
    wordList.removeLast();

์ง‘ํ•ฉ๊ณผ ๋งต์— ํŠนํ™”๋œ Sequenced Collections

  • ์œ„์˜ ๊ณ„์ธต๋„๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, ์ง‘ํ•ฉ๊ณผ ๋งต ๊ด€๋ จ๋œ ์ธํ„ฐํŽ˜์ด์Šค 2๊ฐ€์ง€๊ฐ€ ํ•จ๊ป˜ ์ถ”๊ฐ€๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

    ์ถœ์ฒ˜: openjdk docs

  • SequencedSet์€ ๋‹จ์ˆœํžˆ ์—ญ์ˆœ ์ปฌ๋ ‰์…˜ ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ๊ฐ€ SequencedSet์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์žฌ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

    interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {
        SequencedSet<E> reversed();
    }
  • SequencedMap์€ ๋‹จ์ˆœ ์›์†Œ๊ฐ€ ์•„๋‹Œ, key ๊ฐ’์— ๋Œ€ํ•œ ์ˆœ์„œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

    interface SequencedMap<K,V> extends Map<K,V> {
    		// key ๊ธฐ์ค€ ์—ญ์ˆœ ๋งต ๋ฐ˜ํ™˜
        SequencedMap<K,V> reversed();
    
    		// key ๊ธฐ์ค€ ์ˆœ์ฐจ์  key, value, entry์— ๋Œ€ํ•œ collection ๋ฐ˜ํ™˜
        SequencedSet<K> sequencedKeySet();
        SequencedCollection<V> sequencedValues();
        SequencedSet<Entry<K,V>> sequencedEntrySet();
    
    		// ์ฒซ ๋ฒˆ์งธ, ๋งˆ์ง€๋ง‰ entry์˜ ์ถ”๊ฐ€, ์กฐํšŒ, ์‚ญ์ œ
        V putFirst(K, V);
        V putLast(K, V);
        Entry<K, V> firstEntry();
        Entry<K, V> lastEntry();
        Entry<K, V> pollFirstEntry();
        Entry<K, V> pollLastEntry();
    }

์ฃผ์˜ํ•  ์  - reversed()๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜

  • oracle ๊ณต์‹๋ฌธ์„œ์—์„œ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œํ•˜๊ณ  ์žˆ๋‹ค.

    reversed()ย method provides a reverse-ordered view of the original collection. Any modifications to the original collection are visible in the view. (reversed() ๋ฉ”์„œ๋“œ๋Š” ์›๋ณธ ์ปฌ๋ ‰์…˜์˜ ์—ญ์ˆœ view๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์›๋ณธ ์ปฌ๋ ‰์…˜์˜ ์ˆ˜์ •์€ ์ด view์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.)

  • ์ฆ‰, ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ์‹œ์ ์— ์ƒˆ ์—ญ์ˆœ ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹จ์ˆœํžˆ ์—ญ์ˆœ ์‹œ์ ๋งŒ ๊ฐ€์ง„ ๋™์ผ ๊ฐ์ฒด์˜ view๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ๋”ฐ๋ผ์„œ, ์›๋ณธ ๊ฐ์ฒด์˜ ์ˆ˜์ •์ด reversed()๋ฅผ ํ†ตํ•ด ํš๋“ํ•œ ๊ฐ์ฒด์—๋„ ๋ฐ˜์˜๋จ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ถœ์ฒ˜

์˜ค๋ผํด openjdk ๊ณต์‹ ๋ฌธ์„œ