๐Ÿšฉ์ž๋ฐ” ์ปจํ…Œ์ด๋„ˆ

NtoZยท2023๋…„ 6์›” 25์ผ
1

Interview

๋ชฉ๋ก ๋ณด๊ธฐ
2/2
post-thumbnail

๐Ÿšฉ Collection vs Collections

Collection ์ธํ„ฐํŽ˜์ด์Šค vs Collections ํด๋ž˜์Šค

Collection ์ธํ„ฐํŽ˜์ด์Šค

  • Java11 | Collection ์ธํ„ฐํŽ˜์ด์Šค ๋„ํ๋จผํŠธ

    (์ถœ์ฒ˜ : JavaCodeExamples.com)

  • Collection ์ธํ„ฐํŽ˜์ด์Šค๋Š” Iterable ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด์— ๋”ฐ๋ผ์„œ for-each loop(ํ–ฅ์ƒ๋œ for๋ฌธ)์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • List, Set์ด Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ List์™€ Set ์—ญ์‹œ ํ–ฅ์ƒ๋œ for๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Collection ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Collection์˜ ํ•ต์‹ฌ ์ •๋ฆฌโญ

  • Collection์€ ์ž๋ฐ” ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ฐ€์žฅ ์ƒ์œ„ ๊ณ„์ธต์— ์œ„์น˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ์จ List, Set, Queue ๋“ฑ์˜ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ด๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ๋‹ค์–‘ํ•œ ์žฅ์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๊ธฐ๋Šฅ์œผ๋กœ ์ถ”๊ฐ€, ์‚ญ์ œ, ์กฐํšŒ, ํฌ๊ธฐ ํ™•์ธ ๋“ฑ์ด ์žˆ๋‹ค.

(Advancde) Iterable ์ธํ„ฐํŽ˜์ด์Šค


import java.util.Iterator;
import java.util.NoSuchElementException;
 
// `Collection` ํด๋ž˜์Šค๋Š” `java.util.Iterable` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
class Collection<T> implements Iterable<T>
{
    private T[] array;
    private final int n;
 
    // ์ƒ์„ฑ์ž
    public Collection(T[] array)
    {
        this.array = array;
        this.n = array.length;
    }
 
    /**
    * T ์œ ํ˜•์˜ ์š”์†Œ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    */
    @Override
    public Iterator<T> iterator()
    {
        return new Iterator<T>()
        {
            private int i = 0;
 
            /**
            * ์–ด๋ ˆ์ด์— ๋” ๋งŽ์€ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
            */
            @Override
            public boolean hasNext() {
                return (i < n && array[i] != null);
            }
 
            /**
            * ๋ฐ˜๋ณต์˜ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
            * @throws NoSuchElementException ๋ฐ˜๋ณต์ด ์—†๋Š” ๊ฒฝ์šฐ
            * ๋” ๋งŽ์€ ์š”์†Œ
            */
            @Override
            public T next()
            {
                if (!hasNext()) {
                    throw new NoSuchElementException();
                }
                return array[i++];
            }
        };
    }
}
 
class Main
{
    public static void main(String[] args)
    {
        // ์ •์ˆ˜ ์–ด๋ ˆ์ด
        Integer[] ints = new Integer[] { 1, 2, 3 };
 
        // `Collection` ํด๋ž˜์Šค์—์„œ Integer ์–ด๋ ˆ์ด์„ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.
        Collection<Integer> collection = new Collection<>(ints);
 
        // ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋ ˆ์ด์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
        Iterator<Integer> itr = collection.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
 
        // for-each ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋ ˆ์ด์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
        // `Collection` ํด๋ž˜์Šค๊ฐ€ `Iterable` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
        for (Integer i: collection) {
            System.out.println(i);
        }
    }
}
  • ์ฐธ๊ณ : Iterator ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค.
class Main
{
    public static void main(String[] args)
    {
        // ์ •์ˆ˜ ์–ด๋ ˆ์ด
        Integer[] ints = new Integer[] { 1, 2, 3 };
 
        // `Collection` ํด๋ž˜์Šค์—์„œ `Integer` ์–ด๋ ˆ์ด์„ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.
        Collection<Integer> collection = new Collection<>(ints);
 
        Iterator<Integer> itr = collection.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
 
        // for-each ๋ฃจํ”„๋Š” ์—ฌ๊ธฐ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    }
}
  • Iterable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ทธ ์ง‘ํ•ฉ์ฒด ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

    ๊ทธ ์™ธ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • ํ–ฅ์ƒ๋œ for ๋ฃจํ”„ ์‚ฌ์šฉ
    • ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค - iterator() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜
    • ์™ธ๋ถ€ ๋ฐ˜๋ณต์ž(External Iterator) ํŒจํ„ด - ์ปฌ๋ ‰์…˜๊ณผ ๋ฐ˜๋ณต ์ž‘์—…์„ ๋ถ„๋ฆฌ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ปฌ๋ ‰์…˜ ๋ฐ˜๋ณต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์™ธ๋ถ€ ๋ฐ˜๋ณต์ž๋ฅผ ์ œ๊ณตํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปฌ๋ ‰์…˜์„ ์ˆœํšŒํ•œ๋‹ค. ์ปฌ๋ ‰์…˜์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ฐ˜๋ณต ์ž‘์—…์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ, ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ๋œ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
      (์ฐธ๊ณ  : https://blog.javarouka.me/2012/01/01/internal-external-iterator/)
    • ๋‹ค์ค‘ ๋ฐ˜๋ณต์ž ์‚ฌ์šฉ -
    • ์ปฌ๋ ‰์…˜ ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ™œ์šฉ - ์ŠคํŠธ๋ฆผ๊ณผ forEach ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ

Collections ํด๋ž˜์Šค

  • Java11 | Collections ํด๋ž˜์Šค ๋„ํ๋จผํŠธ

  • Collections ํด๋ž˜์Šค๋Š” java.util.Collections ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.

  • ์ด ํด๋ž˜์Šค๋Š” ์ •๋ ฌ, ์—ญ์ •๋ ฌ, ์ด์ง„ํƒ์ƒ‰, ๋ณต์ œ ๋“ฑ ๋‹ค์–‘ํ•œ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • Arrays๊ฐ€ ๋ฐฐ์—ด๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ,
    โญCollections๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    fill(), copy(), sort(), binarySearch()๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋“ค์€ ๋‘ ํด๋ž˜์Šค ๋ชจ๋‘์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

Collections์˜ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ ํ™œ์šฉํ•˜๊ธฐ

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import static java.util.Collections.*;	//Collections๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ.

public class CollectionsEx {
    public static void main(String[] args) {
        List list = new ArrayList();
        System.out.println(list); //[]

        addAll(list, 1,2,3,4,5); //โญ์š”์†Œ ๋ชจ๋‘ ์ถ”๊ฐ€
        System.out.println(list); //[1, 2, 3, 4, 5]

        rotate(list, 2);    //โญ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‘ ์นธ์”ฉ ์ด๋™
        System.out.println(list); //[4, 5, 1, 2, 3]

        swap(list, 0, 2);   //โญ์ฒซ๋ฒˆ์งธ์™€ ์„ธ๋ฒˆ์งธ๋ฅผ ๊ตํ™˜(swap)
        System.out.println(list); //[1, 5, 4, 2, 3]

        shuffle(list);  //โญ์ €์žฅ๋œ ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ์ž„์˜๋กœ ๋ณ€๊ฒฝ
        System.out.println(list); //[1, 2, 5, 3, 4]

        sort(list, reverseOrder()); //โญ์—ญ์ˆœ ์ •๋ ฌ reverse(list);์™€ ๋™์ผ
        System.out.println(list); //[5, 4, 3, 2, 1]

        sort(list); //โญ์ •๋ ฌ
        System.out.println(list); //[1, 2, 3, 4, 5]

        int idx = binarySearch(list, 3);    //โญ3์ด ์ €์žฅ๋œ ์œ„์น˜(index)๋ฅผ ๋ฐ˜ํ™˜
        System.out.println("index of 3 = " + idx); //index of 3 = 2

        System.out.println("max="+max(list)); //โญmax=5
        System.out.println("min="+min(list)); //โญmin=1
        System.out.println("min="+max(list, reverseOrder())); //โญmin=1

        fill(list, 9); //โญlist๋ฅผ 9๋กœ ์ฑ„์šด๋‹ค.
        System.out.println("list="+list); //list=[9, 9, 9, 9, 9]

        //โญlist์™€ ๊ฐ™์€ ํฌ๊ธฐ์˜ ์ƒˆ๋กœ์šด list๋ฅผ ์ƒ์„ฑํ•˜๊ณ  2๋กœ ์ฑ„์šด๋‹ค. ๋‹จ, ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋ถˆ๊ฐ€
        List newList = nCopies(list.size(), 2);
        System.out.println("newList="+newList); //newList=[2, 2, 2, 2, 2]

        System.out.println(disjoint(list, newList)); // โญ๊ณตํ†ต ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด true , true

        //โญnewList์˜ ์š”์†Œ๊ฐ’๋“ค์„ list์— ๋ณต์‚ฌ
        copy(list, newList);
        System.out.println("newList="+newList); //newList=[2, 2, 2, 2, 2]
        System.out.println("list="+list); //list=[2, 2, 2, 2, 2]

        //โญlist์˜ ์š”์†Œ๊ฐ’ 2๋ฅผ ์ „๋ถ€ 1๋กœ ๋ฐ”๊ฟˆ
        replaceAll(list, 2, 1);
        System.out.println("list="+list); //list=[1, 1, 1, 1, 1]

        //โญenumeration ๋ฐ˜ํ™˜
        Enumeration e = enumeration(list); // Enumeration ํƒ€์ž…
        ArrayList list2 = list(e); // list(Enumeration e)๋ฅผ ์‚ฌ์šฉํ•ด ์ˆœํšŒ๋œ AL๋ฐ˜ํ™˜ list2=[1, 1, 1, 1, 1]

        System.out.println("list2="+list2);
    }
}
  • ๋žŒ๋‹ค์‹์—์„œ๋„ Collections.toC

์ปฌ๋ ‰์…˜์˜ ๋™๊ธฐํ™” synchronized

  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ (multi-thread) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ (consistency) ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณต์œ ๋˜๋Š” ๊ฐ์ฒด์— ๋™๊ธฐํ™”(synchronization)๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • Vector์™€ Hashtable๊ณผ ๊ฐ™์€ ๊ตฌ๋ฒ„์ „(JDK 1.2 ์ด์ „) ํด๋ž˜์Šค๋“ค์€ ์ž์ฒด์ ์œผ๋กœ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์žˆ๋Š”๋ฐ, ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ๋˜์–ด ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ์š”์ธ์ด ๋œ๋‹ค.

    ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ArrayList์™€ HashMap๊ณผ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์€ โญ๋™๊ธฐํ™”๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ java.util.Collectionsํด๋ž˜์Šค์˜ ๋™๊ธฐํ™” ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋™๊ธฐํ™”์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

  • Collections ํด๋ž˜์Šค์˜ ๋™๊ธฐํ™” ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•
    List syncList = Collections.synchronizedList(new ArrayList( ... ));

+ ์ฐธ๊ณ  ์ž๋ฃŒ


๐Ÿšฉ List vs Set vs Map

  • ์ƒ์†๊ณ„์ธต๋„ ํ™•์ธํ•˜๊ธฐ

  • ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง•

์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ

  • ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›์ด๋ž€, '๋ฐ์ดํ„ฐ ๊ตฐ็พค์„ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค๋“ค์„ ํ‘œ์ค€ํ™”ํ•œ ์„ค๊ณ„'์ด๋‹ค.

  • JDK 1.2๋ถ€ํ„ฐ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋ฅผ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์ฒด๊ณ„ํ™” ๋˜์—ˆ๋‹ค.

  • ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›์˜ ์žฅ์ :
    โ‘  ์ปฌ๋ ‰์…˜(๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ)๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ํ•„์š”ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ํ’๋ถ€ํ•œ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณต
    โ‘ก ๊ฐ์ฒด์ง€ํ–ฅ์  ์„ค๊ณ„

    • ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๊ธฐ์— ํŽธ๋ฆฌํ•จ.
    • ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
  • โญ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›์˜ ๋Œ€ํ‘œ์  ์ธํ„ฐํŽ˜์ด์Šค โถList, โทSet, โธMap

    • List : ์ˆœ์„œO, ๋ฐ์ดํ„ฐ ์ค‘๋ณตO
      ๊ตฌํ˜„ ํด๋ž˜์Šค : ArrayList, LinkedList, Stack, Vector ๋“ฑ
    • Set : ์ˆœ์„œX, ๋ฐ์ดํ„ฐ ์ค‘๋ณตX
      ๊ตฌํ˜„ ํด๋ž˜์Šค : HashSet, TreeSet ๋“ฑ
    • Map : ํ‚ค(key)์™€ ๊ฐ’(value) ์Œ(pair)๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ
      ๊ตฌํ˜„ ํด๋ž˜์Šค : HashMap, TreeMap, Hashtable, Properties ๋“ฑ

List ์ธํ„ฐํŽ˜์ด์Šค

  • โญList ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋ฉด์„œ ์ €์žฅ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜๋Š” ์ปฌ๋ ‰์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

  • ๋‹ค์–‘ํ•œ ํ•˜์œ„ ๊ตฌํ˜„ํด๋ž˜์Šค

    • ArrayList : ๋™๊ธฐํ™” ๋ณด์žฅX
    • Vector : ๋™๊ธฐํ™” ๋ณด์žฅ
    • LinkedList
    • Stack
  • List ์‚ฌ์šฉ ์˜ˆ์ œ

import java.util.*;

class ArrayListEx1{
	public static void main(String[] args) {
    	//โญ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ 10์ธ ArrayList ๊ฐ์ฒด ์ฐธ์กฐ๋ณ€์ˆ˜ list1 ์ƒ์„ฑ
		ArrayList list1 = new ArrayList(10);
        //โญlist1์— ์ธํ‹ฐ์ € ๊ฐ์ฒด๋“ค ์ˆœ์„œ๋Œ€๋กœ ์ถ”๊ฐ€. ๋‹จ, ๊ธฐ๋ณธํ˜•์„ ๋„ฃ์–ด๋„ ์˜คํ† ๋ฐ•์‹ฑ๋˜์–ด ๋ฌด๊ด€
		list1.add(new Integer(5));
		list1.add(new Integer(4));
		list1.add(new Integer(2));
		list1.add(new Integer(0));
		list1.add(new Integer(1));
		list1.add(new Integer(3));

		//โญlist2์—๋Š” list1์˜ 1๋ฒˆ์ธ๋ฑ์Šค๋ถ€ํ„ฐ 3๋ฒˆ์ธ๋ฑ์Šค๊นŒ์ง€ ์ถ”์ถœํ•œ ๊ฐ’ ๋‹ด๊น€
		ArrayList list2 = new ArrayList(list1.subList(1,4));
        //๐Ÿ”ฅ์‚ฌ์šฉ์ž ์ •์˜ static ๋ฉ”์„œ๋“œ print
		print(list1, list2);

		Collections.sort(list1);	//โญ list1๊ณผ list2๋ฅผ ์ •๋ ฌํ•œ๋‹ค.
		Collections.sort(list2);	// Collections.sort(List l)
		print(list1, list2);
		//โญcontainsAll ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ์ปฌ๋ ‰์…˜ ์š”์†Œ ํฌํ•จ์—ฌ๋ถ€ boolean์œผ๋กœ ๋ฐ˜ํ™˜. true
		System.out.println("list1.containsAll(list2):" + list1.containsAll(list2));

		//โญ add()๋ฉ”์„œ๋“œ๋กœ int๊ฐ€ ์•„๋‹Œ String์ถ”๊ฐ€ (Object ๋ฐฐ์—ด)
		list2.add("B");
		list2.add("C");
        //โญํŠน์ • ์ธ๋ฑ์Šค์— ์ถ”๊ฐ€ํ• ์ˆ˜๋„ ์žˆ์Œ.
		list2.add(3, "A");
		print(list1, list2);

		//โญset์€ update์˜ ๊ฐœ๋…. 3๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ value "AA"๋กœ ๋ฐ”๊พธ๊ธฐ
		list2.set(3, "AA");
		print(list1, list2);

		//โญlist1์—์„œ list2์™€ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„๋งŒ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋Š” ์‚ญ์ œํ•œ๋‹ค.
		System.out.println("list1.retainAll(list2):" + list1.retainAll(list2));
		print(list1, list2);

		//๐Ÿ’กโญ list2์—์„œ list1์— ํฌํ•จ๋œ ๊ฐ์ฒด๋“ค์„ ์‚ญ์ œํ•œ๋‹ค.
        //๐Ÿ’กโญ i์˜ ๊ฐ’์„ list2.size()-1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ 0๊นŒ์ง€ ๊ฐ์‚ฐ
		for(int i= list2.size()-1; i >= 0; i--) {
        	//โญlist1์ด list2์˜ i์ธ๋ฑ์Šค ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด
			if(list1.contains(list2.get(i)))
            	//โญlist2์—์„œ ๊ทธ i๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
				list2.remove(i);
		}
		print(list1, list2);
	} // main์˜ ๋

	static void print(ArrayList list1, ArrayList list2) {
		System.out.println("list1:"+list1);
		System.out.println("list2:"+list2);
		System.out.println();
	}
} // class

<์‹คํ–‰๊ฒฐ๊ณผ>
list1:[5, 4, 2, 0, 1, 3]
list2:[4, 2, 0]

list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4]

list1.containsAll(list2):true
list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4, A, B, C]

list1:[0, 1, 2, 3, 4, 5]
list2:[0, 2, 4, AA, B, C]

list1.retainAll(list2):true
list1:[0, 2, 4]
list2:[0, 2, 4, AA, B, C]

list1:[0, 2, 4]
list2:[AA, B, C]

Set ์ธํ„ฐํŽ˜์ด์Šค

  • โญSet ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  ์ €์žฅ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๋Š” ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

  • HashSet, TreeSet ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค.

  • HashSet์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” add๋ฉ”์„œ๋“œ๋‚˜ addAll๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋งŒ์ผ HashSet์— ์ด๋ฏธ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์š”์†Œ์™€ ์ค‘๋ณต๋œ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ด ๋ฉ”์„œ๋“œ๋“ค์€ false๋ฅผ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์ค‘๋ณต๋œ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์— ์‹คํŒจํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค.
    โžก๏ธ ์ด๋Ÿฌํ•œ HashSet์˜ ํŠน์ง•์„ ์ด์šฉํ•˜์—ฌ, ์ปฌ๋ ‰์…˜ ๋‚ด์˜ ์ค‘๋ณต ์š”์†Œ๋“ค์„ ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Map ์ธํ„ฐํŽ˜์ด์Šค

  • โญMap ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ‚ค(key)์™€ ๊ฐ’(value)์„ ํ•˜๋‚˜์˜ ์Œ์œผ๋กœ ๋ฌถ์–ด์„œ ์ €์žฅํ•˜๋Š” ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
    โญํ‚ค(Key)๋Š” ์ค‘๋ณตX, ๊ฐ’(Value)๋Š” ์ค‘๋ณตO(ํ—ˆ์šฉ)
    ๐ŸŒŸ<๊ธฐ์กด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์™€ ์ค‘๋ณต๋œ ํ‚ค์™€ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด> ๊ธฐ์กด์˜ ๊ฐ’์€ ์—†์–ด์ง€๊ณ  ๋งˆ์ง€๋ง‰์— ์ €์žฅ๋œ ๊ฐ’์ด ๋‚จ๊ฒŒ๋œ๋‹ค.
    Hashtable(์˜›๋‚ ), HashMap, LinkedHashMap, SortedMap, TreeMap ๋“ฑ์ด ์žˆ๋‹ค. Map์€ ์–ด๋–ค ๋‘ ๊ฐ’์„ ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ๋ถ™์—ฌ์ง„ ์ด๋ฆ„.
import java.util.*;

class HashSetEx1 {
	public static void main(String[] args) {
		//โญ objArr์€ ์—ฌ๋Ÿฌ ์ค‘๋ณต๋œ ๋ฌธ์ž์—ด ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๋ฐฐ์—ด. (๋‹จ, Integer๊ฐ์ฒด ํ•˜๋‚˜ ๋ผ์–ด์žˆ์Œ)
		Object[] objArr = {"1",new Integer(1),"2","2","3","3","4","4","4"};
		//โญ HashSet ๊ฐ์ฒด set์— ์ €์žฅ. (ํƒ€์ž…์„ ๋ณด๋‹ˆ, set์˜ ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ตฌ๋‚˜!)
		Set set = new HashSet();

		//โญHashSet ๊ฐ์ฒด set์ด objArr์˜ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ addํ•จ)
		for(int i=0; i < objArr.length; i++) {
			set.add(objArr[i]);	// HashSet์— objArr์˜ ์š”์†Œ๋“ค์„ ์ €์žฅํ•œ๋‹ค.
		}
		// HashSet์— ์ €์žฅ๋œ ์š”์†Œ๋“ค์„ ์ถœ๋ ฅํ•œ๋‹ค.
		//โญ ๊ฒฐ๊ณผ๋Š” [1,1,2,3,4] ์ผ ๊ฒƒ์ด๋‹ค. ์•ž์˜ 1์€ Integer ํƒ€์ž…์ด๊ณ , ๋’ค์˜ 1์€ String ํƒ€์ž…์ด๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋‹ค.
		System.out.println(set);
	}
}

<์‹คํ–‰๊ฒฐ๊ณผ>
[1, 1, 2, 3, 4]

Map.Entry ์ธํ„ฐํŽ˜์ด์Šค

  • Map.Entry ์ธํ„ฐํŽ˜์ด์Šค๋Š” Map ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
    (์ธํ„ฐํŽ˜์ด์Šค๋„ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.)

  • Map ์— ์ €์žฅ๋˜๋Š” key-value์Œ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ Entry ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด ๋†“์•˜๋‹ค. ์ด ๊ฒƒ์€ ๋ณด๋‹ค ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๋„๋ก ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ Map ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์—์„œ๋Š” Map.Entry ์ธํ„ฐํŽ˜์ด์Šค๋„ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

  • ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ฐฉ์‹

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);

// Map.Entry ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” Key-Value ์Œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” HashMap์˜ Node ๊ฐ์ฒด๋“ค์˜ Set ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜
Set<Map.Entry<String, Integer>> entry = map.entrySet();

System.out.println(entry); // [1=a, 2=b, 3=c]

// Set์„ ์ˆœํšŒํ•˜๋ฉด์„œ Map.Entry๋ฅผ ๊ตฌํ˜„ํ•œ Node ๊ฐ์ฒด์—์„œ key์™€ value๋ฅผ ์–ป์–ด ์ถœ๋ ฅ
for (Map.Entry<String, Integer> e : entry) {
    System.out.printf("{ %s : %d }\n", e.getKey(), e.getValue());
}

<์‹คํ–‰๊ฒฐ๊ณผ>
[a=1, b=2, c=3]

{ a : 1 }
{ b : 2 }
{ c : 3 }
  • Map์—์„œ ์ŠคํŠธ๋ฆผ ํ™œ์šฉํ•˜๊ธฐ
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 3)
map.put("B", 4)

for(Map.Entry<String, Integer> entry : map.entrySet()) {
	System.out.println("entry.getKey() :" + entry.getKey());
    System.out.println("entry.getValue() :" + entry.getValue());
}

System.out.println( map.entrySet().stream()
					.map(Map.Entry<String, Integer> ::getKey)
                    .collect(Collectors.toList())
);

<์‹คํ–‰๊ฒฐ๊ณผ>
entry.getKey() : A
entry.getValue() : 3
entry.getKey() : B
entry.getValue() : 4
[A, B]
profile
9์—์„œ 0์œผ๋กœ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€