๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

๋กœ ํƒ€์ž…์€ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ26)]

Amenable 2023. 5. 23. 00:14

  ์ด๋ฒˆ ์žฅ(5์žฅ)๋ถ€ํ„ฐ๋Š” ์ œ๋„ค๋ฆญ์„ ๋‹ค๋ฃฌ๋‹ค. ํ˜น์‹œ๋‚˜ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๊ฐœ๋…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด์ „ ๊ธ€์„ ๋จผ์ € ๋ณด๊ณ  ์˜ค๋„๋ก ํ•˜์ž.

 

1. ๋กœ ํƒ€์ž… (Raw Type) ๊ฐœ๋… ๐Ÿ’ฝ

  ๋กœ ํƒ€์ž…์ด๋ž€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์—์„œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋ฅผ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด List<E>์˜ ๋กœ ํƒ€์ž…์€ List๋‹ค.

 

2. ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ  ๐Ÿ’พ

  ์ œ๋„ค๋ฆญ์ด ์•ˆ๊ฒจ์ฃผ๋Š” ์•ˆ์ „์„ฑ๊ณผ ํ‘œํ˜„๋ ฅ์„ ๊ณ ๋ คํ•  ๋•Œ ๋กœ ํƒ€์ž…์€ ์ ˆ๋Œ€๋กœ ์จ์„œ๋Š” ์•ˆ ๋œ๋‹ค.

  ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ(= ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ)์™€ ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ(= ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ)๋ฅผ ๋น„๊ตํ•ด ๋ณด์ž.

๐Ÿ“’ 1. ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์€ numbers์— ์ˆซ์ž๋ฅผ ๋„ฃ๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋“ค์–ด๊ฐ„ ์ˆซ์ž๋ฅผ ํ™•์ธํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ฝ”๋“œ๋‹ค. ์ˆซ์ž๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•˜์ง€๋งŒ ๋ฌธ์ž์—ด์ด ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ์— ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

// ๋กœ ํƒ€์ž… ์‚ฌ์šฉ O (Generic ์‚ฌ์šฉ X)
public static void main(String[] args) {


    List numbers = new ArrayList();
    numbers.add(10);
    numbers.add("amenable");

    for (Object number : numbers) {
        System.out.println((Integer) number); // ClassCastException
    }
}

  ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด์ด ๋“ค์–ด๊ฐ€๋”๋ผ๋„ ์ปดํŒŒ์ผ์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ž์—ด์„ Integer๋กœ ๋ฐ”๊ฟ€ ๋•Œ ClassCastException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

  ์˜ค๋ฅ˜๋Š” ๋Ÿฐํƒ€์ž„ ์ƒํ™ฉ์ด ์•„๋‹Œ ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€๋ฐ, ์œ„์˜ ๊ฒฝ์šฐ๋Š” ๊ทธ๊ฒƒ์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค.

๐Ÿ“’ 2. ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

// ๋กœ ํƒ€์ž… ์‚ฌ์šฉ X (Generic ์‚ฌ์šฉ O)
public static void main(String[] args) {

    List<Integer> numbers = new ArrayList<>();
    numbers.add(10);
    numbers.add("amenable"); // Compile Error ๋ฐœ์ƒ

    for (Integer number : numbers) {
        System.out.println(numbers);
    }
}

  ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž. ์ด ๊ฒฝ์šฐ์—๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ ๋ฐœ์ƒํ•œ๋‹ค. numbers์—๋Š” Integer๋งŒ ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์ง€ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋ฌธ์ž์—ด(String)์„ ๋„ฃ์œผ๋ ค๊ณ  ํ•ด์„œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

  1. ์ฆ‰, ์ด๋ ‡๊ฒŒ ์ปดํŒŒ์ผ ์‹œ์ ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋˜ํ•œ, 'List<Integer> numbers'๋ผ๊ณ  ์„ ์–ธํ•œ๋‹ค๋ฉด numbers์— Integer ํƒ€์ž…๋งŒ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ‘œํ˜„๋ ฅ ๋˜ํ•œ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. List VS List<Object> ๐Ÿ’ฟ

  List ๊ฐ™์€ ๋กœ ํƒ€์ž…์€ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋‚˜, List<Object>์ฒ˜๋Ÿผ ์ž„์˜ ๊ฐ์ฒด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์€ ๊ดœ์ฐฎ๋‹ค.

  List๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ์•„์˜ˆ ์•„๋‹ˆ๊ณ , List<Object>๋Š” Object๋ฅผ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, List<Object>๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜์‚ฌ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•œ๋‹ค.

  ๊ทธ๋ž˜์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ List๋ฅผ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ์— List<String>์„ ๋„˜๊ธธ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, List<Object>๋ฅผ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ์—๋Š” ๋„˜๊ธธ ์ˆ˜ ์—†๋‹ค. List<String>์€ ๋กœ ํƒ€์ž…์ธ List์˜ ํ•˜์œ„ ํƒ€์ž…์ด์ง€๋งŒ, List<Object>์˜ ํ•˜์œ„ ํƒ€์ž…์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  List์™€ List<Object>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๐Ÿ“’ 1. List

public static void main(String[] args) {
    List<String> strings = new ArrayList<>();
    unsafeAdd(strings, Integer.valueOf(27));
    String s = strings.get(0); // ClassCastException
}

private static void unsafeAdd(List list, Object o) {
    list.add(o);
}

  ํ•ด๋‹น ์ฝ”๋“œ์—์„œ strings.get(0)์˜ ๊ฒฐ๊ณผ๋ฅผ ํ˜•๋ณ€ํ™˜ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ClassCastException์ด ๋ฐœ์ƒํ•œ๋‹ค. 

  ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿ“’ 2. List<Object>

public static void main(String[] args) {
    List<String> strings = new ArrayList<>();
    safeAdd(strings, Integer.valueOf(27)); // Compile Error
    String s = strings.get(0);
}

private static void safeAdd(List<Object> list, Object o) {
    list.add(o);
}

  ๋ฐ˜๋ฉด์— List<Object>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Compile Error๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ์ปดํŒŒ์ผ์กฐ์ฐจ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

4. Set VS Set<?> ๐Ÿ“€

  ์œ„์—์„œ List<Object>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์›์†Œ์˜ ํƒ€์ž…์„ ๋ชฐ๋ผ๋„ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋กœ ํƒ€์ž…์ด ์•„๋‹Œ ๋น„ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…(unbounded wildcard type)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

  ์ฆ‰, ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์“ฐ๊ณ  ์‹ถ์ง€๋งŒ ์‹ค์ œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์‹ ๊ฒฝ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๋ฌผ์Œํ‘œ(?)๋ฅผ ์‚ฌ์šฉํ•˜์ž. ์ด๊ฒƒ์€ ์–ด๋–ค ํƒ€์ž…์ด๋ผ๋„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์ด๋‹ค.

  ๊ทธ๋Ÿฌ๋ฉด Set<?> ๋Œ€์‹  Set๋„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋Š”๋ฐ ์™œ Set<?>์„ ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? Set๊ณผ Set<?>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•ด ๋ณด์ž.

๐Ÿ“’ 1. Set

static int numElementsInCommon(Set s1, Set s2) {

    s1.add("4"); // UnsupportedOperationException

    int result = 0;
    for (Object o1 : s1) {
        if (s2.contains(o1)){
            result++;
        }
    }

    return result;
}

public static void main(String[] args) {

    System.out.println(Numbers.numElementsInCommon(Set.of(1, 2, 3), Set.of(1, 2)));
}

  ์œ„์˜ ์ฝ”๋“œ๋Š” Set์ธ s1๊ณผ s2์— ๊ณตํ†ต์ ์œผ๋กœ ์žˆ๋Š” ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜๋ ค๊ณ  ํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ฝ”๋“œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ˆซ์ž๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. (s1.add("4"))

  ์ฝ”๋“œ์—์„œ s1.add("1")์„ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ UnsupportedOperationException ๋ฐœ์ƒํ•œ๋‹ค. ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•œ๋‹ค.

  ์ฆ‰, ๋กœ ํƒ€์ž… ์ปฌ๋ ‰์…˜์— ์•„๋ฌด ์›์†Œ๋‚˜ ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์ด๋‹ค.

๐Ÿ“’ 2. Set<?>

static int numElementsInCommon(Set<?> s1, Set<?> s2) {

    s1.add(4); // Compile Error

    int result = 0;
    for (Object o1 : s1) {
        if (s2.contains(o1)){
            result++;
        }
    }

    return result;
}

public static void main(String[] args) {

    System.out.println(Numbers.numElementsInCommon(Set.of(1, 2, 3), Set.of(1, 2)));
}

  ๋ฐ˜๋ฉด, Collection<?>์—๋Š” null ์™ธ์—๋Š” ์–ด๋–ค ์›์†Œ๋„ ๋„ฃ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๋‹ค. s1.add(4)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Compile Error๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ์•ˆ์ „์„ฑ์„ ๊ณ ๋ คํ•˜์˜€์„ ๋•Œ Set์ด ์•„๋‹Œ Set<?>์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

5. ์˜ˆ์™ธ ๐Ÿ“ผ

  ๊ณ„์†ํ•ด์„œ ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ๊ณ  ๋งํ•ด์™”๋‹ค. ํ•˜์ง€๋งŒ ์—ญ์‹œ ๋กœ ํƒ€์ž…์„ ์“ฐ์ง€ ๋ง๋ผ๋Š” ๊ทœ์น™์—๋„ 2๊ฐ€์ง€ ์˜ˆ์™ธ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๐Ÿ“’ 1. class ๋ฆฌํ„ฐ๋Ÿด

  class ๋ฆฌํ„ฐ๋Ÿด์—๋Š” ๋กœ ํƒ€์ž…์„ ์จ์•ผ ํ•œ๋‹ค.

  ์ž๋ฐ” ๋ช…์„ธ๋Š” class ๋ฆฌํ„ฐ๋Ÿด์— ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ–ˆ๋‹ค. (๋ฐฐ์—ด๊ณผ ๊ธฐ๋ณธ ํƒ€์ž…์€ ํ—ˆ์šฉํ•œ๋‹ค.)

public class UserRawType<E> {

    private E e;
}

----------

public static void main(String[] args) {

    // ํ˜€์šฉ X
    System.out.println(UserRawType<Integer>.class);

    // ํ—ˆ์šฉ O
    System.out.println(UserRawType.class);
}

  ์ฆ‰, List.class, String[].class, int.class๋Š” ํ—ˆ์šฉํ•˜๊ณ  List<String>.class์™€ List<?>.class๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“’ 2. instanceof ์—ฐ์‚ฐ์ž

public class UserRawType<E> {

    private E e;
}

----------

public static void main(String[] args) {

    UserRawType<String> stringType = new UserRawType<>();

    // ํ—ˆ์šฉ O
    System.out.println(stringType instanceof UserRawType<String>);
    // ํ—ˆ์šฉ O
    System.out.println(stringType instanceof UserRawType);
}

  ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ instanceof์— ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ๋‹ค. ๋Ÿฐํƒ€์ž„์—๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ง€์›Œ์ง€๋ฏ€๋กœ ๋‘ ๊ฐœ ๋ชจ๋‘ ์™„์ „ํžˆ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

  ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ œ๋„ค๋ฆญ์ด ์•„๋ฌด๋Ÿฐ ์—ญํ•  ์—†์ด ์ฝ”๋“œ๋งŒ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ฐจ๋ผ๋ฆฌ ๋กœ ํƒ€์ž…์„ ์“ฐ๋Š” ํŽธ์ด ๊น”๋”ํ•˜๋‹ค.

 

ํ•ด๋‹น ๊ธ€์€ ๋ฐฑ๊ธฐ์„  ๋‹˜์˜ '์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” ์™„๋ฒฝ ๊ณต๋žต'์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.