Item 47. Return Collection or Stream

๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ๋Š” ์ŠคํŠธ๋ฆผ๋ณด๋‹ค ์ปฌ๋ ‰์…˜์ด ๋‚ซ๋‹ค

๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ๋Š” ์ฃผ๋กœ ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ Iterable, ํ˜น์€ ๋ฐฐ์—ด์ด ์‚ฌ์šฉ๋œ๋‹ค. ์ŠคํŠธ๋ฆผ ํƒ€์ž… ์—ญ์‹œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜ํ™˜ ๋œ ์ŠคํŠธ๋ฆผ์€ for-each๋กœ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์—†์–ด ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.(๋ฉ”์„œ๋“œ ์ฐธ์กฐ + ํ˜•๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ธด ํ•˜์ง€๋งŒ, ๋น„ํšจ์œจ์ )

class Example {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");

        // ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ˜ํ™˜
        Collection<String> collection = list;
        for (String s : collection) {
            System.out.println(s);
        }

        // Iterable ๋ฐ˜ํ™˜
        Iterable<String> iterable = list;
        for (String s : iterable) {
            System.out.println(s);
        }

        // ๋ฐฐ์—ด ๋ฐ˜ํ™˜
        String[] array = list.toArray(new String[0]);
        for (String s : array) {
            System.out.println(s);
        }

        // ์ŠคํŠธ๋ฆผ ๋ฐ˜ํ™˜
        Stream<String> stream = list.stream();
        for (String s : stream) { // ์ปดํŒŒ์ผ ์—๋Ÿฌ
            System.out.println(s);
        }

        for (String s : (Iterable<String>) stream::iterator) { // ํ˜•๋ณ€ํ™˜ + ๋ฉ”์„œ๋“œ ์ฐธ์กฐ, ๋น„ํšจ์œจ์ 
            System.out.println(s);
        }

        for (String s : iterableOf(stream)) { // ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ
            System.out.println(s);
        }
    }

    public static <E> Iterable<E> iterableOf(Stream<E> stream) {
        return stream::iterator;
    }
}

๋งŒ์•ฝ ์˜ค์ง ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์—๋งŒ ์“ฐ์ด๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•ด๋„ ๋˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Iterable์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

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

Collection ์ธํ„ฐํŽ˜์ด์Šค๋Š” Iterable์˜ ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉด์„œ stream ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋–„๋ฌธ์— Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ปฌ๋ ‰์…˜์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๊ณ , ์ŠคํŠธ๋ฆผ์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ๋Š” Collection ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ตœ์„ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ์‹œํ€€์Šค์˜ ํฌ๊ธฐ๊ฐ€ ํฌ์ง€ ์•Š๋‹ค๋ฉด ArrayList๋‚˜ HashSet ๊ฐ™์€ ํ‘œ์ค€ ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋„ ์ข‹์ง€๋งŒ, ํฐ ์‹œํ€€์Šค์ธ ๊ฒฝ์šฐ Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉฑ์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ 2^n๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ Collection์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ArrayList๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

์ „์šฉ ์ปฌ๋ ‰์…˜

๋งŒ์•ฝ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปฌ๋ ‰์…˜์ด ํฌ์ง€๋งŒ ํ‘œํ˜„์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ „์šฉ ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. AbstractList๋ฅผ ์ด์šฉํ•˜์—ฌ ์ „์šฉ ์ปฌ๋ ‰์…˜์„ ๋งŒ๋“  ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

class PowerSet {
    public static final <E> Collection<Set<E>> of(Set<E> s) {
        List<E> src = new ArrayList<>(s);
        if (src.size() > 30) {
            throw new IllegalArgumentException("์ง‘ํ•ฉ์— ์›์†Œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค(์ตœ๋Œ€ 30๊ฐœ).: " + s);
        }
        return new AbstractList<Set<E>>() {
            @Override
            public int size() {
                return 1 << src.size(); // 2์˜ src.size() ์ œ๊ณฑ
            }

            @Override
            public boolean contains(Object o) {
                return o instanceof Set && src.containsAll((Set) o);
            }

            @Override
            public Set<E> get(int index) {
                Set<E> result = new HashSet<>();
                for (int i = 0; index != 0; i++, index >>= 1) {
                    if ((index & 1) == 1) {
                        result.add(src.get(i));
                    }
                }
                return result;
            }
        };
    }
}

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

๊ฒฐ๋ก 

๋ชจ๋“  ๊ฒฝ์šฐ์— ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ง€ ๋ชจ๋ฅธ๋‹ค. ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ์ŠคํŠธ๋ฆผ๊ณผ ๋ฐ˜๋ณต์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Collection ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

Last updated

Was this helpful?