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

์˜ต์…”๋„ ๋ฐ˜ํ™˜์€ ์‹ ์ค‘ํžˆ ํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ55)]
๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”

์˜ต์…”๋„ ๋ฐ˜ํ™˜์€ ์‹ ์ค‘ํžˆ ํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ55)]

2023. 12. 12. 10:16

๐Ÿ“™ 1. ์˜ต์…”๋„ ๊ฐœ๋…

  Optional<T>๋Š” null์ด ์•„๋‹Œ T ํƒ€์ž… ์ฐธ์กฐ๋ฅผ ํ•˜๋‚˜ ๋‹ด๊ฑฐ๋‚˜, ํ˜น์€ ์•„๋ฌด๊ฒƒ๋„ ๋‹ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต์€ T๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜์ง€๋งŒ ํŠน์ • ์กฐ๊ฑด์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•  ๋•Œ T ๋Œ€์‹  Optional<T>๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

  ์˜ต์…”๋„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ, null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์ž‘๋‹ค.

  ์ปฌ๋ ‰์…˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Optional๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

// Optional์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
public static <E extends Comparable<E>> E max(Collection<E> c) {
    if(c.isEmpty())
        throw new IllegalArgumentException("๋นˆ ์ปฌ๋ ‰์…˜");

    E result = null;
    for(E e : c)
        if(result == null || e.compareTo(result) > 0)
            result = Objects.requireNonNull(e);

    return result;
}

// Optional์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
public static <E extends Comparable<E>> Optional<E> max(Collection<E> c) {
    if(c.isEmpty())
        return Optional.empty();

    E result = null;
    for(E e : c)
        if(result == null || e.compareTo(result) > 0)
            result = Objects.requireNonNull(e);

    return Optional.of(result);
}

  ๋นˆ ์˜ต์…”๋„์€ Optional.empty()๋กœ ๋งŒ๋“ค๊ณ , ๊ฐ’์ด ๋“  ์˜ต์…”๋„์€ Optional.of(value)๋กœ ์ƒ์„ฑํ–ˆ๋‹ค. ๋งŒ์•ฝ, Optional.of(value)์— null์„ ๋„ฃ์œผ๋ฉด NullPointException์„ ๋˜์ง€๋‹ˆ ์ฃผ์˜ํ•˜์ž. 

  ์˜ต์…”๋„์€ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Œ์„ API ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํžˆ ์•Œ๋ ค์ค€๋‹ค. ์ฆ‰, ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ต์…”๋„์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ’์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์„ ๋•Œ ์ทจํ•  ํ–‰๋™์„ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ“™ 2. ์˜ต์…”๋„ ํ™œ์šฉ

  ์˜ต์…”๋„์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๐Ÿ“Œ 1. orElse

String lastWordInLexicon = max(words).orElse("๋‹จ์–ด ์—†์Œ...");

  ๊ฐ’์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์„ ๋•Œ ์ทจํ•  ํ–‰๋™์œผ๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ 2. orElseThrow

Toy myToy = max(toys).orElseThrowTemperTantrumException::new);

  ๊ฐ’์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์„ ๋•Œ ์ทจํ•  ํ–‰๋™์œผ๋กœ ์ƒํ™ฉ์— ๋งž๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ์—์„œ ์ฒ˜๋Ÿผ ์˜ˆ์™ธ ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํ•œ ์˜ˆ์™ธ ์ƒ์„ฑ ๋น„์šฉ์€ ๋“ค์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ“Œ 3. get

Element lastNobleGas = max(Elements.NOBLE_GASES).get();

  ๊ฐ’์ด ํ•ญ์ƒ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•œ๋‹ค๋ฉด ๋ฐ”๋กœ ๊ฐ’์„ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์ž˜๋ชป ํŒ๋‹จํ•œ ๊ฒƒ์ด๋ผ๋ฉด NoSuchElementException์ด ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿ“Œ 4. orElseGet

Connection connection = getConnection(dataSource).orElseGet(() -> getLocalConnection());

  ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋น„์šฉ์ด ์•„์ฃผ ์ปค์„œ ๋ถ€๋‹ด์ด ๋  ๊ฒฝ์šฐ์—๋Š” Supplier<T>๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š” orElseGet์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ’์ด ์ฒ˜์Œ ํ•„์š”ํ•  ๋•Œ Supplier<T>๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ดˆ๊ธฐ ์„ค์ • ๋น„์šฉ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ 5. ๊ทธ ์™ธ

  ๋” ํŠน๋ณ„ํ•œ ์“ฐ์ž„์— ๋Œ€๋น„ํ•œ ๋ฉ”์„œ๋“œ๋Š” filter, map, flatMap, ifPresent๊ฐ€ ์žˆ๋‹ค.

// isPresent
Optional<ProcessHandle> parentProcess = ph.parent();
System.out.println("๋ถ€๋ชจ PID: " + (parentProcess.isPresent() ?
        String.valueOf(parentProcess.get().pid()) : "N/A"));

// map
System.out.println("๋ถ€๋ชจ PID: " +
        ph.parent().map(h -> string.valueOf(h.pid()))).orElse("N/A");

// filter
streamOfOptionals
        .filter(Optional::isPresent)
        .map(Optional::get)

// flatMap
streamOfOptionals
        .flatMap(Optional::stream)

 

๐Ÿ“™ 3. ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ

  ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์˜ต์…”๋„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์กฐ๊ฑด ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

  1. ์ปฌ๋ ‰์…˜, ์ŠคํŠธ๋ฆผ, ๋ฐฐ์—ด, ์˜ต์…”๋„ ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ ํƒ€์ž…์€ ์˜ต์…”๋„๋กœ ๊ฐ์‹ธ๋ฉด ์•ˆ ๋œ๋‹ค.
      ๋นˆ Optional<List<T>>๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋นˆ List<T>๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค. ๋นˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์— ์˜ต์…”๋„ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋„ฃ์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  2. ์˜ต์…”๋„ ๋ฐ˜ํ™˜์—๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋’ค๋”ฐ๋ฅด๋‹ˆ, ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ๋ฉ”์„œ๋“œ๋ผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ํŽธ์ด ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.
  3. ์˜ต์…”๋„์„ ์ปฌ๋ ‰์…˜์˜ ํ‚ค, ๊ฐ’, ์›์†Œ๋‚˜ ๋ฐฐ์—ด์˜ ์›์†Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ ์ ˆํ•œ ์ƒํ™ฉ์€ ๊ฑฐ์˜ ์—†๋‹ค.
      ์˜ต์…”๋„์„ ๋งต์˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณด์ž. ๋งต ์•ˆ์— ํ‚ค๊ฐ€ ์—†๋‹ค๊ณ  ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ 'ํ‚ค ์ž์ฒด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ'์™€ 'ํ‚ค๋Š” ์žˆ์ง€๋งŒ ๊ทธ ํ‚ค๊ฐ€ ์†์ด ๋นˆ ์˜ต์…”๋„์ธ ๊ฒฝ์šฐ'๋‹ค. ์ด๋Š” ๋ณต์žก์„ฑ๋งŒ ๋†’์—ฌ์„œ ํ˜ผ๋ž€๊ณผ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์„ ํ‚ค์šด๋‹ค.

 

ํ•ด๋‹น ๊ธ€์€ Joshua Bloch ๋‹˜์˜ 'Effective Java 3/E'๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

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

์ง€์—ญ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ผ - [8์žฅ. ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™(์•„์ดํ…œ57)]  (0) 2023.12.12
๊ณต๊ฐœ๋œ API์š”์†Œ์—๋Š” ํ•ญ์ƒ ๋ฌธ์„œํ™” ์ฃผ์„์„ ์ž‘์„ฑํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ56)]  (0) 2023.12.12
null์ด ์•„๋‹Œ, ๋นˆ ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ54)]  (0) 2023.12.11
๊ฐ€๋ณ€์ธ์ˆ˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ53)]  (0) 2023.12.11
๋‹ค์ค‘์ •์˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ52)]  (1) 2023.12.11
    '๐Ÿ“‚ JAVA/์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ์ง€์—ญ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ผ - [8์žฅ. ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›์น™(์•„์ดํ…œ57)]
    • ๊ณต๊ฐœ๋œ API์š”์†Œ์—๋Š” ํ•ญ์ƒ ๋ฌธ์„œํ™” ์ฃผ์„์„ ์ž‘์„ฑํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ56)]
    • null์ด ์•„๋‹Œ, ๋นˆ ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ54)]
    • ๊ฐ€๋ณ€์ธ์ˆ˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•˜๋ผ - [8์žฅ. ๋ฉ”์„œ๋“œ(์•„์ดํ…œ53)]
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

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