Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ32)]
๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ32)]

2023. 6. 3. 10:23

1. ๊ฐ€๋ณ€์ธ์ˆ˜ & ์ œ๋„ค๋ฆญ ๐Ÿ’ช

  ๊ฐ€๋ณ€์ธ์ˆ˜(varargs)๋ž€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์˜ ๊ฐœ์ˆ˜์™€ ์ƒ๊ด€์—†์ด ๋™์ ์œผ๋กœ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ๊ธฐ๋Šฅํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ๋ฌธ๋ฒ•์„ ๋งํ•œ๋‹ค.

public PrintStream printf(String format, Object ... args) {
    return format(format, args);
}

  ๊ฐ€๋ณ€์ธ์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด์ด ์ž๋™์œผ๋กœ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

  ๋งŒ์•ฝ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

static void dangerous(List<String>... stringLists) { }

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

 

  ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†๋‹ค.

public static void main(String[] args) {

    // ์ปดํŒŒ์ผ ์—๋Ÿฌ
    // Generic array creation
    List<String>[] myList = new ArrayList<String>[10];
}

  ํ•˜์ง€๋งŒ ๊ฐ€๋ณ€์ธ์ˆ˜๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ œ๋„ค๋ฆญ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. ๋ฌผ๋ก , ์ปดํŒŒ์ผ ์—๋Ÿฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๊ธด ํ•œ๋‹ค.

// ๊ฒฝ๊ณ  ๋ฐœ์ƒ
// Possible heap pollution from parameterized vararg type
static void dangerous(List<String>... stringLists) { }

 

  ์•„์ดํ…œ 28์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ์•ฝ ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ํ—ˆ์šฉํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ „์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๊ทธ๋ž˜์„œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ์•„์˜ˆ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์•˜๋Š”๋ฐ, ์ง€๊ธˆ์ฒ˜๋Ÿผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ํ—ˆ์šฉํ•˜๊ฒŒ ๋˜์–ด์„œ ์ƒ๋‹นํžˆ ์œ„ํ—˜ํ•œ ์ฝ”๋“œ๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค.

 

  ๊ทธ๋Ÿฌ๋ฉด '์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ฐ์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์•„๋†“๋Š”๋ฐ ๋งž์ง€ ์•Š์„๊นŒ?'๋ผ๋Š” ์˜๋ฌธ์„ ํ’ˆ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ œ๋„ค๋ฆญ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์˜ varargs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์‹ค๋ฌด์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ—ˆ์šฉ์„ ํ•ด๋†“์€ ๊ฒƒ์ด๋‹ค.

  ์–ธ์–ด ์„ค๊ณ„์ž๊ฐ€ ์ด ๋ชจ์ˆœ์„ ์ˆ˜์šฉํ•˜๊ธฐ๋กœ ํ•œ ๊ฒƒ์ด๋‹ค. ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ์ด๋Ÿฐ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฟ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

Arrays.asList(T... a)
Collections.addAll(Collection<? super T> c, T... elements)
EnumSet.of(E first, E... rest)

 

  ์ œ๋„ค๋ฆญ varargs ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์Œ ๋‘ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•ด์•ผ ์•ˆ์ „ํ•˜๋‹ค.

  1. varargs ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ๊ทธ ๋ฐฐ์—ด(ํ˜น์€ ๋ณต์ œ๋ณธ)์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ์— ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

  ๋‘ ๊ฐœ์˜ ์กฐ๊ฑด์— ๋Œ€ํ•ด์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„๋ณด์ž.

 

 

2. ์กฐ๊ฑด (1). varargs ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๐Ÿฆพ

  varargs ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ์ €์žฅํ•˜๋ฉด varargs ๋ฉ”์„œ๋“œ๊ฐ€ ์•ˆ์ „ํ•ด์ง€์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

static void dangerous(List<String>... stringLists) {
    List<Integer> intList = List.of(10);
    Object[] objects = stringLists;
    objects[0] = intList; // ํž™ ์˜ค์—ผ ๋ฐœ์ƒ
    String s = stringLists[0].get(0); // ClassCaseException
}

  ๋ฐฐ์—ด์€ ๊ณต๋ณ€์ด๋ฏ€๋กœ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ์˜ค๋ธŒ์ ํŠธ ๋ฐฐ์—ด์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ, String s= stringLists[0].get(0);๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ์ž๋ฐ”๊ฐ€ String์œผ๋กœ ์บ์ŠคํŒ…์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ์ด๋•Œ Integer๋ฅผ String์œผ๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

 

  ์ œ๋„ค๋ฆญ์„ ์“ด ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„๋ถ€ํ„ฐ ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„์™€ ๊ฐ™์ด ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๊นจ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋ฌผ๋ก  ์ปดํŒŒ์ผ ํƒ€์ž„์—๋„ ํ™•์ธ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

  ํ•˜์ง€๋งŒ, ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด varargs ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉด ์ œ๋„ค๋ฆญ varargs ๋ฉ”์„œ๋“œ๋Š” ์•ˆ์ „ํ•˜๋‹ค.

@SafeVarargs
static <T> List<T> flatten(List<? extends T>... lists) {
    List<T> result = new ArrayList<>();
    for(List<? extends T> list : lists)
        result.addAll(list);
    return result;
}

  ์•ˆ์ „ํ•˜๊ฒŒ ์“ฐ๋Š” ๊ฒฝ์šฐ์— @SuppressWarnings๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฉ”์„œ๋“œ ์ „์ฒด๊ฐ€ @SuppressWarings์— ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

  ์ด๋Ÿฐ ๊ฒฝ์šฐ @SafeVarargs๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋ณ€์ธ์ˆ˜๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ฐ€๋ณ€์ธ์ˆ˜ ์ด์™ธ์˜ ๊ฒฝ๊ณ ์— ๋Œ€ํ•ด์„œ๋Š” ์ฒดํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

3. ์กฐ๊ฑด (2). ๊ทธ ๋ฐฐ์—ด(ํ˜น์€ ๋ณต์ œ๋ณธ)์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ์— ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๐Ÿฆต

  ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๊ฐ€๋ณ€์ธ์ˆ˜๋กœ ๋„˜์–ด์˜จ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ๋ฐฐ์—ด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋‹ค.

static <T> T[] toArray(T... args) {
    return args;
}

  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” toArray์˜ return ํƒ€์ž…์„ Object๋ผ๊ณ  ํŒ๋‹จํ•œ๋‹ค. Object๊ฐ€ ๊ฐ€์žฅ ์ถ”์ƒ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ return ํ•˜๋Š” ๊ฒƒ์€ Object์˜ ๋ฐฐ์—ด์ด๋‹ค.

 

  toArray๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณด์ž.

public class PickTwo {

    static <T> T[] toArray(T... args) {
        return args;
    }

    static <T> T[] pickTwo(T a, T b, T c) {
        switch(ThreadLocalRandom.current().nextInt(3)) {
            case 0: return toArray(a, b);
            case 1: return toArray(a, c);
            case 2: return toArray(b, c);
        }

        throw new AssertionError(); // ๋„๋‹ฌํ•  ์ˆ˜ ์—†์Œ
    }
}

----------

public static void main(String[] args) {
    String[] attributes = pickTwo("great", "best", "good"); // ClassCastException
    System.out.println(Arrays.toString(attributes));
}

  pickTwo๋ฅผ ํ•  ๋•Œ์—๋Š” ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์˜€๊ณ , String์œผ๋กœ ํƒ€์ž…์„ ์„ค์ •ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๋Š” String์œผ๋กœ ํƒ€์ž…์บ์ŠคํŒ…์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

  toArray์—์„œ Object๋ฅผ return ํ•ด์ฃผ์—ˆ๊ณ , ์ด๊ฒƒ์„ ๋‹ค์‹œ pickTwo์—์„œ return ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ˜„์žฌ๋Š” Object ํƒ€์ž…์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ Object๋ฅผ String์œผ๋กœ ํƒ€์ž…์บ์ŠคํŒ…์„ ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

  ์ฆ‰, ๊ทธ ๋ฐฐ์—ด(ํ˜น์€ ๋ณต์ œ๋ณธ)์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ์— ๋…ธ์ถœํ•˜์ง€ ์•Š์•„์•ผ์ง€ ์ œ๋„ค๋ฆญ varargs ๋ฉ”์„œ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

4. ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ… - varargs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ List ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ”๊ฟ”๋ผ. ๐Ÿฆฟ

  ์ œ๋„ค๋ฆญ varargs ๋ฉ”์„œ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  @SafeVarargs ์• ๋„ˆํ…Œ์ด์…˜์„ ๋‹ค๋Š” ๊ฒŒ ์œ ์ผํ•œ ์ •๋‹ต์€ ์•„๋‹ˆ๋‹ค.

  ์•„์ดํ…œ 28(๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ)์˜ ์กฐ์–ธ์— ๋”ฐ๋ผ ์‹ค์ฒด๋Š” ๋ฐฐ์—ด์ธ varargs ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ List ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

// ๊ธฐ์กด ์ฝ”๋“œ
public class FlattenWithVarargs {

    @SafeVarargs
    static <T> List<T> flatten(List<? extends T>... lists) {
        List<T> result = new ArrayList<>();
        for(List<? extends T> list : lists)
            result.addAll(list);
        return result;
    }
}

----------

public static void main(String[] args) {
    List<Integer> flatList = flatten(List.of(1, 2), List.of(3, 4, 5), List.of(6, 7));

    System.out.println(flatList); // [1, 2, 3, 4, 5, 6, 7]
}
// ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ
public class FlattenWithList {

    static <T> List<T> flatten(List<List<? extends T>> lists) {
        List<T> result = new ArrayList<>();
        for(List<? extends T> list : lists)
            result.addAll(list);

        return result;
    }
}

----------

public static void main(String[] args) {
    List<Integer> flatList = flatten(List.of(
            List.of(1, 2), List.of(3, 4, 5), List.of(6, 7)
    ));

    System.out.println(flatList); // [1, 2, 3, 4, 5, 6, 7]
}

  ์ด ๋ฐฉ์‹์˜ ์žฅ์ ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ๋ฉ”์„œ๋“œ์˜ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ์žˆ๋‹ค. @SafeVarargs ์• ๋„ˆํ…Œ์ด์…˜์„ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋‹ฌ์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ์‹ค์ˆ˜๋กœ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•  ๊ฑฑ์ •๋„ ์—†๋‹ค.

  ๋‹จ์ ์ด๋ผ๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ์‚ด์ง ์ง€์ €๋ถ„ํ•ด์ง€๊ณ  ์†๋„๊ฐ€ ์กฐ๊ธˆ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ •๋„์ด๋‹ค.

 

  ๋˜ํ•œ, pickTwo์—๋„ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

// ๊ธฐ์กด ์ฝ”๋“œ
public class PickTwo {

    static <T> T[] toArray(T... args) {
        return args;
    }

    static <T> T[] pickTwo(T a, T b, T c) {
        switch(ThreadLocalRandom.current().nextInt(3)) {
            case 0: return toArray(a, b);
            case 1: return toArray(a, c);
            case 2: return toArray(b, c);
        }

        throw new AssertionError(); // ๋„๋‹ฌํ•  ์ˆ˜ ์—†์Œ
    }
}

----------

public static void main(String[] args) {
    String[] attributes = pickTwo("great", "best", "good"); // ClassCastException
    System.out.println(Arrays.toString(attributes));
}
// ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ
public class SafePickTwo {
    static <T> List<T> pickTwo(T a, T b, T c) {
        switch (ThreadLocalRandom.current().nextInt(3)) {
            case 0: return List.of(a, b);
            case 1: return List.of(a, c);
            case 2: return List.of(b, c);
        }

        throw new AssertionError();
    }
}

----------

public static void main(String[] args) {
    List<String> attributes = pickTwo("great", "best", "good");
    System.out.println(attributes);
}

 

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

'๐Ÿ“‚ JAVA > ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

int ์ƒ์ˆ˜ ๋Œ€์‹  ์—ด๊ฑฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ผ - [6์žฅ. ์—ด๊ฑฐ ํƒ€์ž…๊ณผ ์• ๋„ˆํ…Œ์ด์…˜(์•„์ดํ…œ34)] - (1)  (0) 2023.07.01
ํƒ€์ž… ์•ˆ์ „ ์ด์ข… ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ณ ๋ คํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ33)]  (1) 2023.06.10
ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด API ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ31)]  (0) 2023.06.01
์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ30)]  (0) 2023.05.31
์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ29)]  (1) 2023.05.30
    '๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • int ์ƒ์ˆ˜ ๋Œ€์‹  ์—ด๊ฑฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ผ - [6์žฅ. ์—ด๊ฑฐ ํƒ€์ž…๊ณผ ์• ๋„ˆํ…Œ์ด์…˜(์•„์ดํ…œ34)] - (1)
    • ํƒ€์ž… ์•ˆ์ „ ์ด์ข… ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ณ ๋ คํ•˜๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ33)]
    • ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด API ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ31)]
    • ์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๋ผ - [5์žฅ. ์ œ๋„ค๋ฆญ(์•„์ดํ…œ30)]
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”