Item 30. Generic Method

์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๋ผ

๋ฉ”์„œ๋“œ๋„ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ํ•˜๋ฉฐ, Collections์˜ sort ๋ฉ”์„œ๋“œ๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค. ๋ช…๋ช… ๊ทœ์น™์ด๋‚˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์™€ ๋™์ผํ•˜๋‹ค.


class Test {

    public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
        Set<E> result = new HashSet<>(s1);
        result.addAll(s2);
        return result;
    }

    public static void main(String[] args) {
        Set<String> a = Set.of("a", "b", "c");
        Set<String> b = Set.of("d", "e", "f");
        Set<String> c = union(a, b);
    }
}

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์œผ๋กœ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ œ๋„ค๋ฆญ ์‹ฑ๊ธ€ํ„ด ํŒฉํ„ฐ๋ฆฌ

๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ํƒ€์ž…์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ œ๋„ค๋ ‰์€ ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์ •๋ณด๊ฐ€ ์†Œ๊ฑฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์–ด๋–ค ํƒ€์ž…์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด์„  ํƒ€์ž…์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ •์  ํŒฉํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์š”์ฒญํ•œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋งž๊ฒŒ ๊ทธ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด ํŒจํ„ด์„ ์ œ๋„ค๋ฆญ ์‹ฑ๊ธ€ํ„ด ํŒฉํ„ฐ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

์ œ๋„ค๋ฆญ ์‹ฑ๊ธ€ํ„ด ํŒฉํ„ฐ๋ฆฌ๋ฅผ ํ•ญ๋“ฑํ•จ์ˆ˜๋ฅผ ๋‹ด์€ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฌ๊ท€์  ํƒ€์ž… ํ•œ์ •(recursive type bound)

์ž๊ธฐ ์ž์‹ ์ด ๋“ค์–ด๊ฐ„ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ—ˆ์šฉ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•˜๋Š” ์žฌ๊ท€์  ํƒ€์ž… ํ•œ์ •์ด๋ผ๋Š” ๊ฐœ๋…๋„ ์กด์žฌํ•œ๋‹ค. ์žฌ๊ท€์  ํƒ€์ž… ํ•œ์ •์€ ์ฃผ๋กœ Comparable ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ’์„ ์ƒํ˜ธ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปฌ๋ ‰์…˜์— ๋‹ด๊ธด ๋ชจ๋“  ์›์†Œ๊ฐ€ ์ƒํ˜ธ ๋น„๊ต๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. Collection์˜ max ๋ฉ”์„œ๋“œ๋„ ์ •์ƒ์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ƒํ˜ธ ๋น„๊ต๊ฐ€ ๋˜์•ผํ•˜๋ฏ€๋กœ T๊ฐ€ Comparable์„ ๊ตฌํ˜„ํ•˜๋„๋ก ์ œํ•œํ•˜๊ณ  ์žˆ๋‹ค.

Last updated